2011-06-02 47 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]; 
} 
相關問題