簡體   English   中英

當我的應用程序不在最前面時,如何在NSStatusWindowLevel窗口中獲取鍵盤事件?

[英]How do I get keyboard events in an NSStatusWindowLevel window while my application is not frontmost?

在創建半透明窗口( 基於Matt Gemmell的示例代碼 )之后,我想在此窗口中獲取鍵盤事件。 當我的應用程序是活動應用程序時,似乎只有鍵盤事件,而我想要鍵盤事件,即使我的應用程序不活動但窗口可見。

基本上我想要Quicksilver應用程序(blacktree)提供的行為。

有沒有人對如何做到這一點有任何暗示?

有兩種選擇:

  1. 使用帶有固定碳運行循環的GetEventMonitorTarget()來獲取鍵盤事件。 CocoaDev在此頁面上提供了示例代碼。

  2. 使用CGEventTapCreate注冊事件陷阱。 可以在Apple開發人員郵件列表的此主題中找到示例代碼。

編輯:請注意,只有在“Universal Access”偏好設置面板中選中“為輔助設備啟用訪問權限”時,這些方法才有效。

一個更適合您的更簡單的路線是讓您的應用僅限背景。 關於LSUIElement plist鍵的CocoaDev的討論解釋了如何設置它。 基本上,您的應用程序不會出現在Dock或應用程序切換器中,並且在激活時不會替換當前應用程序的菜單欄。 從用戶的角度來看,它永遠不是“活動”應用程序,但是您打開的任何窗口都可以被激活並正常響應事件。 唯一需要注意的是,您永遠不會顯示您的菜單欄,因此您可能需要設置一個NSStatusItem(顯示在菜單欄右側的其中一個圖標菜單)來控制(即退出) ,提出prefs等)你的申請。

編輯:我完全忘記了Interface Builder中的非激活面板復選框。 您需要使用NSPanel而不是NSWindow來獲得此選擇。 此設置可讓您的面板接受點擊和鍵盤輸入而無需激活您的應用程序。 我打賭這個設置和Carbon Hot Keys API的混合是QuickSilver用於他們的UI。

更新:
蘋果實際上似乎已經從10.5 BTW(我最近升級並且我的示例代碼不像以前那樣工作)再次改變了一切。

現在,您確實只能捕獲設置事件點擊的keydown事件,如果您是root或輔助設備已啟用,無論您計划捕獲哪個級別,無論您選擇捕獲(允許您修改甚至丟棄事件)或者只是傾聽。 當標志發生變化(實際上甚至更改這些)和其他事件時,您仍然可以獲取信息,但在其他任何情況下都無法獲得keydown。

但是,使用碳事件處理程序和方法RegisterEventHotKey()允許您注冊一個熱鍵,並在按下它時收到通知,您既不需要為root,也不需要啟用輔助設備。 我認為Quicksilver可能正是這樣做的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM