2009-10-27 46 views
10

有沒有辦法在可可中註冊全球鼠標移動事件?我能夠使用碳的InstallEventHandler()註冊事件,但更喜歡Cocoa等價物。我已經尋找NSNotificationCenter事件,但似乎沒有任何公開事件名稱(是否有私人的名稱?)全球鼠標在可可中移動事件

另外,有沒有辦法使用NSTrackingAreaclearColor背景的意見?

該應用程序只有雪豹。

回答

23

在SnowLeopard中有一個新的類方法NSEvent它正是你想要的:+ (id)addGlobalMonitorForEventsMatchingMask:(NSEventMask)mask handler:(void (^)(NSEvent*))block。你會想要mask = NSMouseMovedMask

+1

完美的,正是我所期待的。獎勵使用塊。 3行代碼,其他人需要20個。 – 2009-10-28 01:07:58

3

如果你想跟蹤鼠標,不管它在哪裏,你想要一個CGEventTap。沒有可可等價物。如果你只是想在應用程序中跟蹤它,那麼你應該解釋爲什麼你發現自己無法做得更徹底。

+0

事件水龍頭啓用事件水龍頭肯定要走的路。爲我完美工作。 – Leibowitzn 2009-10-27 03:10:41

+0

這確實適合我,但Ben的回答完全正是我所期待的。 – 2009-10-28 01:06:04

11

類似的問題已經被問在計算器上: How to make a transparent NSView subclass handle mouse events?

總之,tansparent視圖的方法沒有奏效。石英事件水龍頭似乎是最好的答案。

這裏是具有抽頭的工作的一些提示:

  1. CGEventTapCreate創建水龍頭。
    a)對於位置(第一個)參數,您可能需要使用kCGSessionEventTap
    b)對於放置(第二)參數,您可能需要kCGHeadInsertEventTap
    c)對於事件掩碼參數,請嘗試(1 << kCGEventMouseMoved)

  2. 使用CFMachPortCreateRunLoopSource創建一個運行循環源,傳遞事件觸發器作爲第二個參數。

  3. 將運行循環源添加到您的運行循環中。假設你希望將其添加到主運行循環,這樣做: CFRunLoopAddSource(CFRunLoopGetMain(), sourceFromStep2, kCFRunLoopDefaultMode);

  4. CGEventTapEnable

+0

感謝您的幫助。我明白現在事件會好一些。不過,我結束了使用Ben的NSEvent方法。 – 2009-10-28 01:06:47