2010-10-08 36 views
1

我使用SetWindowsHookExWH_KEYBOARD_LL以幾種語言(AutoIt,C#)實現了鍵盤掛鉤。我也知道有幾個C++程序有相同的問題。MS是否改變了Windows Vista或7中的鍵盤掛鉤?

我沒有發佈任何代碼,因爲他們在Windows XP中完美工作。但是,在Windows 7下,某些時候鉤子會「卸載」或停止處理任何其他鍵。它似乎可能與低內存條件有關,但我不確定。

Microsoft是否改變了鍵盤在Vista或7中的工作方式以添加一些在特定情況下可以卸載第三方鉤子的邏輯?


相關問題:

how to restart a mouse hook?
Detecting Keyboard Hooks

回答

3

好吧,它已經修修補補充沛時UAC在Vista中實現。儘管如此,這不是一個普遍的抱怨。是的,Windows很有可能停止回撥掛鉤回叫。內置的功能可以防止操作系統在沒有及時處理回調的情況下出現無響應。它會在沒有任何診斷的情況下自動從回調列表中刪除。

這是基於超時,並且確實可以在操作系統資源開始不足時跳閘。就像沒有足夠的內存和運行大量進程一樣,獲得大量的分頁。更有可能使用Windows的更新版本,因爲它們需要更多的RAM,並且由於磁盤碎片問題(尤其是分頁文件)而升級而不是在安裝之前被擦除,因此它們往往會受到影響。

可通過添加HKCU \ Control Panel \ Desktop \ LowLevelHooksTimeout值(DWORD,比方說10000)來調整超時設置。在superuser.com上詢問更多關於它的問題

+0

這很有道理。我已經讀過LowLevelHooksTimeout的內容,但是我並沒有在低RAM和系統之間建立聯繫。有沒有什麼好的方法來編程檢測我的鉤子何時未註冊? – jnylen 2010-10-08 16:27:16

+0

是的,你不會得到回調:) – 2010-10-08 16:30:54

+0

不,我的意思是...有沒有一種方式我的程序可以檢測何時Windows已經註銷我的鉤子,以便我可以重新註冊並繼續接收回調? – jnylen 2010-10-08 16:59:59

1

我遇到了你在前幾天寫我自己的鍵盤鉤時描述的同樣的超時問題。爲了解決這個問題,我編寫了我的hookcallback proc,以便它異步調用按鍵事件並立即返回。

Here's a link to my code,如果你有興趣。