[英]How do I know id thread of interface window?
帶有gui的第三方進程在其中運行多個線程。 需要將鍵盤掛鈎設置為線程gui這個過程。 我做如下:
processID = 8888; //pid
HWND hWnd = GetForegroundWindow();
DWORD threadID = GetWindowThreadProcessId(hWnd, &processID);
hHook = SetWindowsHookEx(WH_KEYBOARD_LL, (HOOKPROC)&KeyboardProc, GetModuleHandle(NULL), threadID);
從任務管理器中手動插入processId
(進行調試,然后他將返回腳本)。 如果我將最后一行的threadID
選項替換為0,則該鈎子有效,但無論在瀏覽器中還是可以使用。 我究竟做錯了什么?
根據MSDN ,使用WH_KEYBOARD_LL不可能僅將一個線程作為目標:
“鈎子的范圍取決於鈎子類型。某些鈎子只能使用全局范圍設置;其他鈎子也可以僅針對特定線程設置,如下表所示。”
...
WH_KEYBOARD_LL僅全局
...
注意:也不能將從GetModuleHandle(NULL)到達的當前.exe過程實例作為SetWindowsHookEx的第三個參數傳遞(此處應為DLL句柄或NULL)。
在我的任務中,我需要這樣做,以便將設置鈎和KeyboardProc位於單個區域(.cpp文件)中。 我找到了答案:
1)制作全局變量processID
2)在設置掛鈎方法
processID = GetCurrentProcessId();
hHook = SetWindowsHookEx(WH_KEYBOARD_LL, (HOOKPROC)&KeyboardProc, NULL, 0);
3)在KeyboardProc方法中:
DWORD actProcess;
HWND hwnd = GetForegroundWindow();
GetWindowThreadProcessId(hwnd, &actProcess);
if (nCode == HC_ACTION)
{
if (processID == actProcess)
{
//do something
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.