2014-10-10 21 views
0

WH_KEYBOARD_LL掛鉤是否可以在我的應用程序/線程具有焦點時調用掛鉤函數?目前我即使在應用程序未處於活動狀態時也會收到呼叫。WH_KEYBOARD_LL僅在我的進程主線程中掛鉤

+1

爲什麼使用鉤子?當你的應用程序具有焦點時,鍵盤事件將傳遞到消息循環中。 – 2014-10-10 12:38:01

+0

因爲我希望我的代碼可重用,並且能夠在純WinAPI或Qt/Gtk +應用程序中使用它時攔截鍵盤。 – 2014-10-10 12:41:34

+1

它影響的全球化程度越低,它的可重用性就越高。是的,您可能需要在消息循環中添加一些消息預覽功能; Qt已經沒有這個了嗎? (您也可以查看.NET的['Application.AddMessageFilter'](http://msdn.microsoft.com/zh-cn/library/system.windows.forms.application.addmessagefilter.aspx)以獲得合理的設計) – 2014-10-10 12:47:09

回答

1

您無法安裝掛鉤,也無法應用某種形式的過濾器來抑制它在某些狀態下發射。安裝完成後,它會啓動。

因此,當您的應用程序處於不活動狀態時,您的掛鉤功能中不執行任何操作,或者在應用程序處於非活動狀態時移除掛鉤。或者,徹底取消掛鉤,並對到達消息隊列的消息作出響應。

3

當然,SetWindowsHookEx()的第四個參數可以是一個線程ID,以使其具有選擇性。通過一個你的UI線程,通過調用GetCurrentThreadId()來獲取它。

請注意,這通常不是很有用,您可以輕鬆攔截消息循環中的鍵盤消息。每個GUI類庫都支持這個功能,這是實現快捷鍵操作所必需的。即使是winapi也有這個,TranslateAccelerator()。強烈建議,調試一個鉤子是非常痛苦的,因爲鉤子回調中的斷點或回調所調用的任何函數都會導致鍵盤佔用達5秒,並且鉤子被破壞。