2010-06-01 21 views
1

我試圖使用該代碼的全球重要事件寄存器:問題與CGEventTapCreate()調用

void function() 
{ 
    CFMachPortRef keyUpEventTap = CGEventTapCreate(kCGHIDEventTap,kCGHeadInsertEventTap,kCGEventTapOptionListenOnly,CGEventMaskBit(kCGEventKeyUp),&keyUpCallback,NULL); 


CFRunLoopSourceRef keyUpRunLoopSourceRef = CFMachPortCreateRunLoopSource(NULL, keyUpEventTap, 0); 
    CFRelease(keyUpEventTap); 

    CFRunLoopAddSource(CFRunLoopGetCurrent(), keyUpRunLoopSourceRef, kCFRunLoopDefaultMode); 
    CFRelease(keyUpRunLoopSourceRef); 
} 

應用程序崩潰在執行CFMachPortCreateRunLoopSource()調用。我認爲當我創建事件點擊時,崩潰是因爲CGEventMaskBit(kCGEventKeyUp)。

但是,如果我使用CGEventTapCreate(kCGHIDEventTap,kCGHeadInsertEventTap,kCGEventTapOptionListenOnly,CGEventMaskBit(kCGEventFlagsChanged),&keyUpCallback,NULL)創建事件點擊,應用程序工作正常。它不會崩潰。當任何修改鍵被按下時,我會得到回調。但我需要按回車鍵來刪除鍵。

任何想法?

謝謝,

Dheeraj。

+0

你有沒有試過看的按鍵事件? – JWWalker 2010-06-01 05:13:02

+0

是的,我也嘗試過關鍵事件。關鍵和關鍵崩潰。 – Dheeraj 2010-06-01 07:32:01

回答

5

我想你需要特殊的權限來註冊鍵盤事件。我忘記了那是什麼,但要測試它以root身份運行程序,看看它是否仍然崩潰。

編輯:

根據this article您必須運行該程序的根或啓用輔助設備。

崩潰可能只是因爲CGEventTapCreate返回NULL。

+0

非常感謝您的回覆。 是的,當我將CGEventMaskBit(kCGEventKeyUp)作爲參數傳遞但是可以正常使用CGEventMaskBit(kCGEventFlagsChanged)作爲參數時,返回的CGEventTapCreate爲空。 如果它與以root身份運行的進程相關,那麼這兩個選項都應該返回NULL?如果我錯了,請糾正我。 可能是什麼問題? – Dheeraj 2010-06-01 07:24:42

+0

只有按鍵和按鍵事件需要特殊許可。鼠標和修飾鍵事件不受保護。 – drawnonward 2010-06-01 17:59:35

+0

這是一件安全的事情。鍵盤記錄器對輸入的實際字符感興趣,所以這就需要更高的權限,以便在應用程序鍵入記錄時注意到。選項或輪班鍵輸入的密碼只包含較少的信息。 – uliwitness 2017-03-24 15:36:39