2010-06-18 42 views
0

爲了在GUI應用程序中使用SetWindowsHookEx,通常需要在底線中在發生事件時調用線程中的函數。因此,例如,如果我正在製作一個軟件來顯示系統上正在按下的所有按鍵,我希望以某種方式讓我的GUI應用程序在每次按下按鍵時都會調用功能AddKeyToList(int vkeycode)在我的線程環境中創建`SetWindowsHookEx`調用函數

我不是Windows內部專家,但是如果我正確理解文檔,則在線程的上下文中調用由SetWindowsHookEx安裝的掛鉤,從而導致它們掛鉤的事件。因此,爲了做什麼,我所描述的,人們需要:

  1. 創建其中將包含鉤子函數,並創造有所有線程都將共享,並通過它進行相互通信的共享內存區域中的DLL。

  2. 在鉤子函數和GUI程序中創建一個pInvoke類似的機制。在我們的例子中,鉤子函數會將按下的按鍵發送給我們的GUI程序,並且GUI程序將在其自己的上下文中調用AddKeyToList函數。

這是一個相對簡單的類極其複雜的(比較的擴展記錄擴展在UNIX世界),它甚至是不可能的,如果你使用類似Qt

有哪些已經落實這些機制的任何庫(最好是開源),並讓我使用了「門面」的,例如,將在我的線程上下文每當WH_KEYBOARD_LL發生調用函數

我的分析正確嗎?還是有更簡單的方法來實現我所描述的?

Qt庫可以幫我完成這個任務嗎?

回答

1

這已經是WH_KEYBOARD_LL掛鉤的默認行爲。該回調在調用SetWindowsHookEx()的同一個線程中調用。該線程還必須抽取一個消息循環,以便在您使用UI線程時自動正常工作。回調代碼也不需要存在於DLL中,它不是需要DLL注入的全局鉤子。

沒有額外的工作需要完成。

+0

+1對於提及無需回調在DLL中的無證事實 – Hut8 2010-08-06 19:03:06