[英]Determine Input Thread ID of a Process
有誰知道確定進程輸入線程的方法?
這種情況是我想調用GetKeyboardLayout ,從單獨的應用程序(可以是任何程序)中傳入輸入線程 ID。 每個線程都可以有自己的鍵盤輸入語言集,但是為另一個進程找到合適的輸入線程 ID 似乎是不可能的。
例如,我創建了一個函數,將記事本的進程 ID 傳遞給該函數,該函數在內部確定輸入線程 ID 並從 GetKeyboardLayout 返回值。 然后,此函數的調用者將在屏幕上顯示為記事本選擇的輸入語言。
你們中的任何一個好人有什么想法嗎?
Windows 不需要進程具有與用戶交互的特定線程。 它不一定是進程的啟動線程,盡管它經常是。 並且它不會將程序限制為單個線程,盡管它通常只使用一個線程。
您需要首先找到窗口。 使用諸如 FindWindow、FindWindowEx 或 EnumWindows 之類的 api 函數。 一旦你得到了它,你就可以用 GetWindowThreadProcessId() 找出哪個線程擁有這個窗口。 注意工作線程可能創建的隱藏幫助窗口。 Spy++ 是您在這里的基本調試工具。
您可以嘗試這樣做,它會遍歷所有頂級窗口並搜索屬於進程 ID 的窗口:
// complle and link with: cl layout.cxx user32.lib
#include <windows.h>
#include <stdio.h>
#include <assert.h>
DWORD desiredProcId;
BOOL CALLBACK enumCallBack(HWND hwnd, LPARAM lParam) {
DWORD procId;
DWORD winThread=GetWindowThreadProcessId(hwnd, &procId);
if (procId==desiredProcId) {
HKL hkl=GetKeyboardLayout(winThread);
char buf[1000];
GetWindowText (hwnd, buf, sizeof(buf));
printf ("hwnd=%x name=%s, winThread=%x, HKL=%x\n", hwnd, buf, winThread, hkl);
return false;
}
return true;
}
int main (int argc, char *argv[]) {
if (argc==1) {
printf ("usage: %s processId (in decimal like from taskmanager)\n", argv[0]);
}
else {
sscanf (argv[1], "%d", &desiredProcId);
EnumWindows (enumCallBack, 0);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.