2

有谁知道确定进程输入线程的方法?

场景是我想调用GetKeyboardLayout,从单独的应用程序(可以是任何程序)中传入输入线程 ID。每个线程都可以有自己的键盘输入语言集,但是为另一个进程找到合适的输入线程 ID 似乎是不可能的。

例如,我创建了一个函数,向其中传递记事本的进程 ID,该函数在内部确定输入线程 ID,并从 GetKeyboardLayout 返回值。然后,此函数的调用者将在屏幕上显示为记事本选择的输入语言。

各位好心人有什么想法吗?

4

2 回答 2

2

Windows 不需要进程具有与用户交互的特定线程。它不一定是进程的启动线程,尽管它经常是。它并不将程序限制为单个线程,尽管它通常只使用一个线程。

您需要首先找到窗口。使用 FindWindow、FindWindowEx 或 EnumWindows 等 api 函数。一旦你知道了,你可以用 GetWindowThreadProcessId() 找出哪个线程拥有窗口。注意工作线程可能创建的隐藏帮助窗口。Spy++ 是您的基本调试工具。

于 2012-11-24T16:12:55.260 回答
1

你可以试试,它会遍历所有顶层窗口并搜索属于 process-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);
  }
}
于 2012-11-24T16:24:38.623 回答