获取当前活动窗口的线程ID

时间:2019-04-13 10:18:14

标签: windows winapi

我需要获取活动窗口的线程ID。是否有Windows API函数可以让我获取此信息?

有一个GetCurrentThreadId函数,但是它返回调用线程的ID,而不是活动窗口线程的ID,因此对于此目的没有用。

编辑:

建议编辑我的问题以提供有关我为什么需要它的更多信息,这里是:

我正在实现LowLevelKeyboardProc来捕获键盘输入,并且由于键盘布局可能因程序而异,所以我想确保为处理键盘的活动窗口获取布局:

代码段:

HWND active_window = GetForegroundWindow();
DWORD thread_id = GetWindowThreadProcessId(active_window, nullptr);
HKL hLayout = GetKeyboardLayout(thread_id);

现在对于活动窗口具有正确的键盘布局,我可以翻译键:

BYTE pKeyState[256];
GetKeyboardState(pKeyState)

wchar_t result;
PKBDLLHOOKSTRUCT pKbd = reinterpret_cast<PKBDLLHOOKSTRUCT>(lParam);
ToUnicodeEx(pKbd->vkCode, pKbd->scanCode, pKeyState, &result, 1, 2, hLayout);

提供的答案满足了我的需要,因为如果将零传递给GetKeyboardLayout函数,则如果用户在程序执行过程中更改键盘布局,键盘布局将是错误的(相同的)。 传递活动的窗口线程ID是解决方法。

1 个答案:

答案 0 :(得分:3)

您可以获取在活动窗口中创建的线程的ID,尽管自创建以来当然还可能涉及其他线程。

如果您要这样做,请使用let rec g (m, n) = let rec gAcc m i a = if i >= 0 then gAcc m (i-1) (a+i+m) else a gAcc m n 0