gpt4 book ai didi

c++ - SetWindowsHookEx(WH_KEYBOARD) 不使用线程 ID

转载 作者:太空宇宙 更新时间:2023-11-04 14:32:08 26 4
gpt4 key购买 nike

我有一个被进程调用的 dll,现在我想在 dll 中实现输入检查以对应用程序中发生的某些输入使用react。

SetWindowsHookEx()KeyboardProc函数似乎是一个可能的解决方案,所以我实现了它。

dll 中的代码大概是这样的:

static HHOOK hhk = NULL;
LRESULT CALLBACK keyboardProc(int code, WPARAM wParam, LPARAM lParam)
{
if(code == HC_ACTION && ((DWORD)lParam & 0x80000000) == 0) // if there is an incoming action and a key was pressed
{
switch(wParam)
{
case VK_SPACE:
printf("Space was pressed\n");
break;
}
}
return CallNextHookEx(hhk, code, wParam, lParam);
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
if(ul_reason_for_call == DLL_PROCESS_ATTACH)
{
if(AllocConsole()){
freopen("CONOUT$", "w", stdout); // redirect output to console for debugging
}
printf("Dll loaded, lastError = %i\n", GetLastError());
printf("lastError = %i\n", GetLastError());
// sidenote: for some reason the first GetLastError() returns 0 while the second one returns 6 (invalid handle)

hhk = SetWindowsHookEx(WH_KEYBOARD, keyboardProc, hModule, GetCurrentThreadId());
}
else if (ul_reason_for_call == DLL_PROCESS_DETACH)
{
printf("\nCleaning up...");
FreeConsole();
UnhookWindowsHookEx(hhk);
}
return TRUE;
}

但是,当我按任意键时,控制台窗口中没有任何反应(或打印)。它甚至看起来不像是在任何时候访问 keyboardProc 函数。

当我将 NULL 而不是 GetCurrentThreadId() 传递给 SetWindowsHookEx() 时,它确实有效。但这会导致 Hook 在全局范围内工作,这意味着每当我在另一个应用程序中按下一个键时,就会弹出一个控制台窗口(因为 dll 被再次调用)并且他会检查那里的键输入。显然这不是我们想要的,我希望仅使用最初调用 dll 的进程来完成这项工作。

我已经检查过 GetCurrentThreadId() 是否返回有效 ID,它似乎确实是最初调用 dll 的进程的主线程 ID(使用 Process Explorer 检查)。

所以现在我的问题是可能是什么问题,更重要的是,我该怎么做才能让它发挥作用?

最佳答案

[DllImport("user32.dll", SetLastError = true)]
static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);

uint process_id;
uint thread_id = GetWindowThreadProcessId(windowHandle, out process_id);
hhook = SetWindowsHookEx(WH_KEYBOARD, a_KeyboardProc, hInstance, 0);

我已经使用上面的代码获取了某个进程的主 thread_ID。好的部分是,SetWindowsHookEx 函数给出了逻辑输出。不幸的是,不好的部分是,如果在已 Hook 的线程中按下某个键,该线程将停止工作。

具体来说,在我的例子中,对于非低级键盘事件,SetWindowsHoookEx 函数的 idHook 参数设置为 2(而不是 13)。至少在我看来,LL 对应于低级别,其中 keyboardProc 应该带有 WH_KEYBOARD 而不是 WH_KEYBOARD_LL。

我现在不确定我的回答与您的问题有何关联。希望我们通过讨论得到我们需要的东西。

关于c++ - SetWindowsHookEx(WH_KEYBOARD) 不使用线程 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21576748/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com