2011-09-20 219 views
0

我搜索註冊全局熱鍵的方法,所以我可以在按鍵時觸發一個方法。在Windows CE中註冊全局熱鍵

它需要與Windows CE和Windows Mobile> = 5一起使用。

[編輯:它也需要工作,當應用程序被隱藏和/或形式沒有焦點]

+0

我發現奇怪的是'RegisterHotkey'不起作用。它是專門爲全球熱鍵而設計的,當你的應用程序沒有焦點時,它可以工作。 – CodesInChaos

回答

1

如果RegisterHotKey由於某種原因未能做到您想要的,請將其放入keyboard hook。掛鉤不是「正式」支持的,但對於鍵盤,它們工作得很好。

+0

如果'RegisterHotkey'有效,我會避免這種情況。如果因爲某些原因無法使用RegisterHotkey,這只是最後一招。如果這是一個桌面應用程序,我會低估,但我不知道WinCE是否有必要在那裏。 – CodesInChaos

+0

當然,他應該嘗試RegisterHotKey。不知道你最初對SetWindowsHook的反感是什麼,但是爲Windows CE設備開發了十多年,我知道我會走哪條路。 – ctacke

+0

低級別鍵盤鉤子的問題在於,所有鍵盤輸入都需要經過它,並且可能由於線程不能很快響應而延遲。舉一個例子,我完全認爲這是一個愚蠢地使用高優先級的遊戲,並且餓死了另一個具有低級別鍵盤鉤子的程序。這導致了多秒輸入滯後。我自己使用了LL鍵盤鉤子,但只在'RegisterHotkey'不是選項的情況下。 – CodesInChaos

1

您可以使用coredll定義RegisterHotKey功能。在devbuzz論壇上,您可以找到一個帖子,名稱爲:code for c# hotkey register/unregister其中顯示了一個實現

另一種方法是運行一個單獨的線程並在具有可接受的休眠時間的循環中調用GetAsyncKeyStateGetAsyncKeyState應該獨立於鍵盤焦點。

+0

也嘗試了這一點,但它在應用程序在後臺運行時不起作用。 – mabstrei

+0

我已經更新了包含GetAsyncKeyState的答案 – 2011-09-20 08:49:56

+2

'GetAsyncKeyState'是一個可疑的選擇。例如,它不能查看是否同時按下了多個組合鍵,這會導致意外觸發。至少在桌面窗口中還有其他問題,例如檢查熱鍵的代碼不會被識別爲應用程序可以從當前前臺程序竊取焦點的地方。 – CodesInChaos

0

可以使用RegisterHotKey功能

注意:此API是完整的Windows CE操作系統軟件包的一部分,由微軟提供。特定平臺的功能由原始設備製造商(OEM)確定,某些設備可能不支持此API。