Эквивалентный 32-битный вызов углерода для использования в 64-битном приложении - GetApplicationEventTarget () - PullRequest
1 голос
/ 28 мая 2010

Я пишу 64-битное приложение Какао. Мне нужно зарегистрироваться на глобальные ключевые события. Итак, я написал этот кусок кода:

- (void)awakeFromNib
{
    EventHotKeyRef gMyHotKeyRef;
    EventHotKeyID gMyHotKeyID;
    EventTypeSpec eventType;
    eventType.eventClass=kEventClassKeyboard;
    eventType.eventKind=kEventHotKeyPressed;
    eventType.eventClass=kEventClassKeyboard;
    eventType.eventKind=kEventHotKeyPressed;
    InstallApplicationEventHandler(&MyHotKeyHandler,1,&eventType,NULL,NULL);
    gMyHotKeyID.signature='htk1';
    gMyHotKeyID.id=1;
    RegisterEventHotKey(49, cmdKey+optionKey, gMyHotKeyID,
     **GetApplicationEventTarget**(), 0, &gMyHotKeyRef);
}

Но так как GetApplicationEventTarget() не поддерживается для 64-битных приложений, я получаю ошибки. Если я это объявляю, я не получаю никаких ошибок, но приложение вылетает.

Существует ли какой-либо эквивалентный метод для GetApplicationEventTarget() (определенный в Carbon framework) для использования в 64-битных приложениях.

Или есть ли способ получить события глобального ключа, используя вызовы какао?

Любая помощь приветствуется.

Спасибо, Dheeraj.

Ответы [ 3 ]

0 голосов
/ 28 мая 2010

Я написал оболочку Cocoa для горячих клавиш Carbon (и, как показало мое тестирование, она работает в 64-битных приложениях), и вы можете найти ее на github здесь: http://github.com/davedelong/DDHotKey

Я использую GetEventDispatcherTarget() для регистрации горячих клавиш.

0 голосов
/ 29 мая 2010

Я думаю, что это ошибка документации, когда говорится, что GetApplicationEventTarget не поддерживается в 64 битах. Если вы посмотрите в CarbonEvents.h (из 10.6 SDK), то увидите, что объявление GetUserFocusEventTarget заключено в скобки #if !__LP64__ ... #endif, но чуть выше него - объявление GetApplicationEventTarget. GetApplicationEventTarget, вероятно, не является причиной сбоя. В вашем коде gMyHotKeyRef и gMyHotKeyID выглядят так, как будто они были глобальными переменными, но они локальные.

0 голосов
/ 28 мая 2010

Углерод не поддерживается в 64-битных приложениях. См. Ответ на этот вопрос для получения информации о том, как использовать CGEventTap, чтобы сделать это поддерживаемым способом в Какао.

...