2013-02-08 51 views
4

我在開發中有一個基本的按鍵轉換器應用程序。轉換適用於以下:爲什麼不按下事件遮罩工作,但遮罩都行?

CFRunLoopSourceRef runLoopSource = NULL; 
CFMachPortRef eventTap = CGEventTapCreate(kCGHIDEventTap, kCGHeadInsertEventTap, kCGEventTapOptionDefault, kCGEventMaskForAllEvents, myCGEventCallback, NULL); 
runLoopSource = CFMachPortCreateRunLoopSource(kCFAllocatorDefault, eventTap, 0); 
CFRunLoopAddSource(CFRunLoopGetCurrent(), runLoopSource, kCFRunLoopCommonModes); 
CGEventTapEnable(eventTap, true); 

如你所料,kCGEventMaskForAllEvents不斷射擊任何移動鼠標或點擊除了鍵盤,我懷疑佔用系統資源。我嘗試用CGEventMaskBit(kCGEventKeyDown)替代,我最好從Quartz Event doc on Event Types得知它是我想要的,並且會清除鼠標移動和點擊。不幸的是,使用這個似乎只是吃擊鍵,而不是轉換它們。

我在做什麼錯?

以下的工作,但我仍然不明白爲什麼CGEventMaskBit(kCGEventKeyUp)本身不是正確的實施。

CGEventMaskBit(kCGEventKeyUp) | CGEventMaskBit(kCGEventKeyDown) | CGEventMaskBit(NX_SYSDEFINED) 
+0

我一直在尋找到這一點和IM不知道這就是答案與否。我也注意到當你看着你的東西。NX_SYSDEFINED似乎不適用於我 – Fallenreaper 2017-05-13 22:22:34

回答

2

因爲按鍵按鍵由KeyDown和關鍵了

+0

因此,KeyDown和KeyUp不是可以獨立檢測到的兩個獨立事件嗎?在iOS虛擬按鈕上,我可以將touchUpInside檢測爲與touchDown不同的事件。 – DenVog 2013-02-10 22:27:11

+0

取決於你如何處理它 - 向我們展示接收代碼 – 2013-02-11 08:05:31

0
  1. CGEventTapCreate文檔頁面的討論節說的:

    事件水龍頭接收如果滿足以下條件之一,則鍵入和按下事件:

    • 當前進程以root用戶身份運行。
    • 輔助設備訪問已啓用。在OS X v10.4中,您可以使用系統偏好設置,通用訪問面板,鍵盤視圖來啓用此功能。

    運行在root用戶對我確實是制訂(MacOS的塞拉利昂。)我沒有嘗試的輔助設備的方法。

  2. 要爲裏面的XCode root身份運行(我有8.3.3在這個時候),選擇產品/方案/編輯計劃... /運行/信息/調試過程作爲:根

    XCode's Edit Scheme dialog

  3. CGEventTapCreate調用中,將kCGEventMaskForAllEvents參數替換爲CGEventMaskBit(kCGEventKeyDown) | CGEventMaskBit(kCGEventKeyUp)。除了修飾鍵:shift,ctrl,cmd,某些功能鍵之外,現在您的回調會被大多數按鍵調用。

    要獲取修改鍵調用的回調,請添加CGEventMaskBit(kCGEventKeyDown) | CGEventMaskBit(kCGEventKeyUp) | CGEventMaskBit(NX_SYSDEFINED)。出於某種原因,通過這種改變,我也得到了爲鼠標按下按鈕而調用的回調。這可能是羅技鼠標驅動程序的一個副作用 - 我沒有調查。但通話量比以前低很多,不包括鼠標移動。

    Dave Keck's response to this CocoaBuilder thread得知這一點。