2011-06-02 64 views
3

我在Carbon中使用全局热键玩了一下,我注册了一个热键。当按下热键,调用该函数:从C函数回调中访问ObjC对象

OSStatus myHotKeyHandler(EventHandlerCallRef nextHandler, EventRef anEvent, void *userData) { 
    ... 
} 

此功能是在同一个文件作为我的应用程序委托的定义。我现在如何在该函数的委托上调用一个ObjC方法?

[self aMethod]; 

我不能添加void*(是一个指向我的类的实例)的C函数,因为我不是一个调用它。

我试图将该方法转换为一个类方法,然后用[AppDelegate aFunction]调用它,它的工作原理,但我不能使用我的实例变量!

回答

5

注册事件处理函数时,将指向您的类实例的指针作为参数userData。然后你会将这个指针返回到处理程序中作为userData

+0

现在它的工作,谢谢。但我想我切换到包装 – 2011-06-02 20:42:50

8

你正在重新发明轮子。使用包装:

http://github.com/davedelong/DDHotKey

好也许不是一个,因为热键并非“微不足道”的概念。也许你正在重新创造差异?或者其他的东西? ;)

+0

感谢的是做到了也!我现在使用该包装 – 2011-06-02 20:42:17

3

示例代码

InstallApplicationEventHandler(&MyHotKeyHandler,1,&eventType,(void *)self,NULL); 
... 

OSStatus MyHotKeyHandler(EventHandlerCallRef nextHandler,EventRef theEvent, 
         void *userData) 
{ 
    [(yourAppDelegate *)userData dosomething]; 
}