在64位应用程序中使用的等效Carbon 32位调用 - GetApplicationEventTarget()

时间:2010-05-28 13:24:12

标签: objective-c cocoa macos-carbon

我正在编写64位Cocoa应用程序。我需要注册全球关键事件。所以我写了这段代码:

- (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);
}

但是因为64位应用程序不支持GetApplicationEventTarget(),所以我遇到了错误。如果我声明它,那么我没有得到任何错误,但应用程序崩溃。

在{64}应用程序中是否有GetApplicationEventTarget()(在Carbon框架中定义)的等效方法。

或者有没有办法使用cocoa调用来获取全局关键事件?

感谢任何帮助。

谢谢, Dheeraj。

3 个答案:

答案 0 :(得分:0)

我为Carbon热键编写了一个Cocoa包装器(据我的测试显示,它适用于64位应用程序),你可以在github上找到它:http://github.com/davedelong/DDHotKey

我正在使用GetEventDispatcherTarget()进行热键注册。

答案 1 :(得分:0)

我认为在64位时不支持GetApplicationEventTarget是一个文档错误。如果您查看CarbonEvents.h(来自10.6 SDK),您会看到GetUserFocusEventTarget的声明被#if !__LP64__ ... #endif括起来,但就在它之上,GetApplicationEventTarget的声明不是。 GetApplicationEventTarget可能不是导致崩溃的原因。在你的代码中,gMyHotKeyRef和gMyHotKeyID看起来像是全局变量,但它们是本地变量。

答案 2 :(得分:-1)

64位应用程序不支持Carbon。有关如何在Cocoa中以受支持的方式使用CGEventTap来执行此操作的信息,请参阅this question的答案。