我正在编写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。
答案 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的答案。