2010-08-16 149 views
4

我已經看到很多關於鉤子的教程和文章,但我不太明白。主要是因爲每個示例都使用不同的解決方案。C++的全局鍵盤鉤子

我知道我將不得不實施一些措施,以保持活力。通常這是一種循環。問題1:如果這個循環是在某個帶有回調的類中,它會阻止線程執行它們嗎?

我知道這將需要一段時間,但我非常感謝一些很好解釋的全局鍵盤鉤子的例子。或者乾脆將我鏈接到工作示例與二進制文件。 (相信我,我一直試圖谷歌最後幾個小時)。

謝謝

+0

什麼操作系統? – humbagumba 2010-08-16 09:46:22

+0

Windows 7,Vista分別。 – 2010-08-16 09:49:03

回答

3

我知道我將要實施的東西,將保持鉤活

不,這不是一個問題。全局鉤子需要一個帶回調的DLL。該DLL被注入到所有正在運行的進程中。它將保持加載過程中,直到您調用UnHookWindowsHookEx()或該過程終止,以先到者爲準。

請注意,您也可以用WH_KEYBOARD_LL鉤住鍵盤。這是而不是一個全局鉤子,Windows會切換上下文到你的程序並進行回調。它使用起來更容易,因爲你不需要全局鉤子需要的注入DLL的IPC機制。低級別掛鉤會保持活動狀態,直到您解除掛鉤,擁有該消息隊列的線程終止或您的進程終止,以先到者爲準。

+0

我試過使用WH_KEYBOARD_LL,但它在幾秒鐘後停止調用回調。除了循環之外,還有什麼竅門讓它活着嗎? – 2010-08-16 12:16:02

+1

如果您的回調沒有在合理的時間內完成,則這是自動的。 Windows決定它有問題並禁用該掛鉤。你的回調代碼出了問題,無法猜測它可能是什麼。 – 2010-08-16 12:18:56

+0

我猜嗶(0x500,300);即使調試,速度太慢...... – 2010-08-16 12:20:12

2

有骨骼鍵盤鉤子上我的網站here下載的代碼(注意在頁面底部的「下載」按鈕)。本文將討論一些您需要了解的內容,例如共享部分,並通知您關於Kyle Marsh在Win32掛鉤上的優秀文章(如果MSDN中的一些白癡現在還沒有把它拿下來,因爲沒有足夠的.netty)。

源代碼在這個例子中,它只需要一個makefile/sln構建它(我不知道你將使用什麼編譯器/版本)。代碼與在運輸商業產品中十年一直很相似,所以我知道它的工作原理。

請注意,完整性級別問題可以降低在Vista和W7中掛鉤的效用。

1

您的程序需要在掛鉤期間保持活躍狀態​​。你的程序是調用SetWindowsHookEx/UnSetWindowsHookEx(或者其他名稱)的程序。在這些調用之間,你將確實有一個消息循環(這可能是你正在討論的while循環),就像任何典型的Windows程序一樣。

但是因爲你的程序是一個不同於你正在鉤的程序,你的消息循環不會導致其他進程掛起。這就是所謂的多任務:)