簡體   English   中英

我怎么知道界面窗口的id線程?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM