簡體   English   中英

確定進程的輸入線程 ID

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

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