Как отказаться от команды command+shift+Q в коде цели Mac OS X c?

Я пытаюсь реализовать симулятор заставки в Mac OS X, мне удалось отключить эффект нажатия команды + Q, который вызывал выход приложения, поэтому теперь, если он находится в полноэкранном режиме, он не будет реагировать на выход Сочетание клавиш.

Но моя проблема заключается в обработке ярлыка ( Command + Shift + Q), который вызывает диалоговое окно подтверждения Max OS X, которое предупреждает о выходе из всех приложений и регистрации системы.

Может ли кто-нибудь помочь мне предотвратить эффект сочетания клавиш command+shift+q в полноэкранном режиме?

спасибо


person Ahmed Saad    schedule 08.05.2013    source источник


Ответы (1)


Это лучший ответ на этот вопрос

Сначала в вашей функции applicationDidFinishedLoad добавьте этот кусочек кода, чтобы создать отвод события, и добавьте отвод события в текущий цикл выполнения.

    CFMachPortRef      eventTap;
CGEventMask        eventMask;
CFRunLoopSourceRef runLoopSource;

// Create an event tap. We are interested in key presses.
eventMask = ((1 << kCGEventKeyDown) | (1 << kCGEventKeyUp));
eventTap = CGEventTapCreate(kCGSessionEventTap, kCGHeadInsertEventTap, 0,
                            eventMask, myCGEventCallback, NULL);
if (!eventTap) {
    fprintf(stderr, "failed to create event tap\n");
    exit(1);
}

// Create a run loop source.
runLoopSource = CFMachPortCreateRunLoopSource(
                    kCFAllocatorDefault, eventTap, 0);

// Add to the current run loop.
CFRunLoopAddSource(CFRunLoopGetCurrent(), runLoopSource,
                   kCFRunLoopCommonModes);

// Enable the event tap.
CGEventTapEnable(eventTap, true);

затем в вашем классе вы можете реализовать функцию обратного вызова с именем myCGEventCallback, как это

    CGEventRef myCGEventCallback(CGEventTapProxy proxy, CGEventType type,
              CGEventRef event, void *refcon)
    {
// Paranoid sanity check.
// type will be key down or key up, you can discard the command + q by setting the     kecode to be -1 like this  

if (((type == kCGEventKeyDown) || (type == kCGEventKeyUp)))
{
    CGEventSetIntegerValueField(
                                event, kCGKeyboardEventKeycode, (int64_t)-1);
    return event;
}

// The incoming keycode.
CGKeyCode keycode = (CGKeyCode)CGEventGetIntegerValueField(
                                   event, kCGKeyboardEventKeycode);

// Swap 'a' (keycode=0) and 'z' (keycode=6).
if (keycode == (CGKeyCode)0)
    keycode = (CGKeyCode)6;
else if (keycode == (CGKeyCode)6)
    keycode = (CGKeyCode)0;

// Set the modified keycode field in the event.
CGEventSetIntegerValueField(
    event, kCGKeyboardEventKeycode, (int64_t)keycode);

// We must return the event for it to be useful.
return event;
}

исходный код проверьте здесь

Спасибо

person Ahmed Saad    schedule 13.05.2013