我需要获取活动窗口的线程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是解决方法。
答案 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