【问题标题】:Equivalent Carbon 32-bit call for using in 64-bit application - GetApplicationEventTarget()在 64 位应用程序中使用的等效 Carbon 32 位调用 - GetApplicationEventTarget()
【发布时间】:2011-02-25 03:17:38
【问题描述】:

我正在编写一个 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(),所以我遇到了错误。如果我声明它,那么我不会收到任何错误,但应用程序会崩溃。

GetApplicationEventTarget()(在 Carbon 框架中定义)是否有任何等效方法可以在 64 位应用程序中使用。

或者有什么方法可以使用 cocoa 调用获取全局关键事件?

感谢任何帮助。

谢谢, 迪拉杰。

【问题讨论】:

  • 您的 OS X 版本是什么?

标签: objective-c cocoa macos-carbon


【解决方案1】:

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

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

【讨论】:

  • 非常感谢 Dave 的回复。我尝试使用 GetEventDispatcherTarget()。当我按下热键时,代码也编译得很好,控制权进入了注册的函数,但之后应用程序崩溃了。这是调用堆栈:(某种递归调用的)在DispatchEventToHandlers#0 0x8009eba9#1 0x8009e4bf在SendEventToEventTargetInternal#2 0x8009e339在SendEventToEventTargetWithOptions在ToolboxEventDispatcherHandler#3 0x800c0582#4 0x8009f38e在DispatchEventToHandlers在SendEventToEventTargetInternal#5 0x8009e4bf .......(并且继续。)可能出了什么问题?
【解决方案2】:

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

【讨论】:

  • 但对我来说 GetApplicationEventTarget() 在 #if !__LP64__ ... #endif 块内。
  • 这很奇怪。哪个SDK?哪个版本的 Xcode? (注意的是 Xcode 3.2.2,我检查了 10.5 和 10.6 SDK。)
  • /* * GetApplicationEventTarget() * * 讨论:* 返回应用程序的 EventTargetRef。一旦你获得 * * 可用性:* Mac OS X:在版本 10.0 和更高版本中的 Carbon.framework [仅限 32 位] * 非碳 CFM:不可用 */ 我什至检查了文档。提到该调用仅支持 32 位应用程序。 XCode 版本:3.1.2 SDK:10.5 感谢您的回复。 :)
【解决方案3】:

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

【讨论】:

  • 这并不完全正确。一些 Carbon 升级到了 64 位。但是,例如,碳 UI 的东西不是。
  • 非常感谢您回复亚历克斯。我尝试按照上面链接中的说明使用 CGEventTap。但是,如果我注册 CGEventMaskBit(kCGEventKeyUp) 或 CGEventMaskBit(kCGEventKeyDown),应用程序会崩溃,但如果我使用 CGEventMaskBit(kCGEventFlagsChanged),则可以正常工作。应用程序在这一行崩溃: CFRunLoopSourceRef keyUpRunLoopSourceRef = CFMachPortCreateRunLoopSource(NULL, keyUpEventTap, 0);可能是什么问题?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-27
  • 1970-01-01
  • 2019-03-07
  • 1970-01-01
  • 2012-03-06
  • 1970-01-01
相关资源
最近更新 更多