2012-01-19 50 views
0

我在玩SetWindowsHookEx,特別是我想能夠找到關於的任何窗口(在我的桌面上),它們是通過鼠標或鍵盤激活的。SetWindowsHook Global不是很全球

通過MSDN文檔讀取SetWindowsHookEx,看起來WH_CBT類型可以完成這項工作。我創建了一個dll並將所有代碼放在那裏,我從一個gui應用程序(它也處理unhook)控制。

但我似乎只是激活我的GUI應用程序時激活代碼,但我激活的任何其他應用程序將被忽略。

在我的DLL我有設置代碼和CBTProc像這樣:

LRESULT WINAPI CBTProc(int Code, WPARAM W, LPARAM L) { 
    if(Code<0) CallN.... 

    if (Code == HCBT_ACTIVATE) { // never get unless I activate my app 
     HWND a = reinterpret_cast<HWND>(W); 
     TRACE("this window was activated %d\n", a); 
    } 

    CallNext.... 
} 

EXPORTED HHOOK WINAPI Setup(HWND MyWind) { 
    ... 
    // gDllUInstance set in dllmain 
    return SetWindowsHookEx(WH_CBT, CBTProc, gDllUInstance, 0); 
} 

所有非常簡單的東西,我已經試過移動設置了DLL的,但我仍然得到同樣的效果。

這樣看來,該dll被越來越加載到其他進程,我就指望DLL_PROCESS_ATTACHs我得到和可以看到它的上升(不是很科學,我知道的數量。

注意,這是在32位操作系統上運行32位代碼 - WIN2K3

是我的鉤子機制錯誤的期望,我應該只讓我的應用程序的激活或我需要一個不同類型的鉤子

編輯:的?跟蹤功能寫入文件告訴我什麼送我激活

TIA。

TIA。

+2

目前還不清楚你的TRACE宏是什麼。然而,由於它在另一個過程中運行,您可能無法看到其副作用。 –

+0

特別是,它可能會記錄到與您所期望的目錄不同的目錄中的文件。 –

+0

TRACE是否關閉您正在寫入的文件的句柄?由於不同的進程無法獲取寫入鎖,因此您可能會遇到併發問題。 –

回答

0

如Hans指出的,我只是沒有看到來自其他進程的調試器輸出,如果我放入一些額外的跟蹤代碼 - 每個附加進程一個跟蹤文件 - 我可以看到可以看到所有事情都在起作用。

非常感謝您的回覆。