确定进程的输入线程 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=%xn", 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);
}
}
相关文章:
- 我应该在C++中打印线程 ID 吗?
- 我可以使用Qt线程ID为每个线程创建唯一的缓存吗?
- 这种基于线程 ID 的同步是否安全整洁?
- OpenMP:当我按线程 ID 访问共享变量时,我是否需要一个关键部分
- C 不同的线程在FreeBSD 10上具有相同的线程ID
- 如何获取正确的线程 ID 和值
- 调试器看到的输出线程 ID
- 是否可以向特定的线程 ID 发送信号?
- C++ 中 OpenMP 中的有序线程 ID
- 您可以在 OpenMP 中将特定线程 ID 分组到唯一的任务组中吗?
- 查找称为函数C 的线程ID
- 确定进程的输入线程 ID
- SetWindowShookex(WH_KEYBOARD)无法与线程ID一起使用
- 在性能方面获取线程 ID 是否昂贵
- 标准::线程::id的要求.可以雾化吗?
- 如何知道谁是给定线程 ID 的父线程
- 当OwningThread表示线程ID时,它为什么是HANDLE类型的CRITICAL_SECTION的成员
- 不确定我在提升日志中的线程 ID 是否正确
- 线程ID不存在的OpenThread
- 如果父线程 ID 没有作为pthread_create上的参数传入,是否可以从 C/C++ 中的线程中获取父线程 ID?