我已经编写了一个小的DLL,它被注入到游戏中以应用运行时修复。我决定添加一些键盘侦听器:
while (1)
if (AsyncKeyState(...)) (...)然而,这占用了CPU的使用,并引入了一些引人注目的口吃。因此,我决定使用MSDN通过SetWindowsHookExA建议的回调方法和KeyboardProc回调。起初,我通过SetWindowsHookExA(WH_Keyboard, KeyboardProc, NULL, 0)运行该方法,但得到了错误代码ERROR_HOOK_NEEDS_HMOD (0x594)。所以我改变了我的代码变成这样:
bool APIENTRY DllMain(HMODULE hModule, DWORD reason, LPVOID lpRes)
{
HHOOK hook_ = nullptr;
switch (reason)
{
case DLL_PROCESS_ATTACH:
if (!(hook_ = SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, hModule, 0)))
{
char x[100];
sprintf(x, "Failed To Hook Keyboard FN: 0x%X", GetLastError());
MessageBox(NULL, x, "Error", MB_ICONERROR);
}
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
UnhookWindowsHookEx(hook_);
break;
}
return true;
}这不再是错误了,我的挂钩键盘功能运行得很好。然而,一个非常意外的副作用是,所有正在运行的应用程序中的所有键盘捕获都被忽略了。我注意到这段来自MSDN的引用,所以我将它添加到代码中:
如果代码大于或等于零,并且钩子过程没有处理消息,强烈建议您调用CallNextHookEx并返回它返回的值;否则,安装了WH_KEYBOARD钩子的其他应用程序将不会接收钩子通知,因此可能会行为错误。如果钩子过程处理消息,它可能返回一个非零值,以防止系统将消息传递给钩子链的其余部分或目标窗口过程。
这解决了键盘问题,但现在还有另一个问题,就是我无法删除我创建的DLL。当我试图删除它时,它会说"dll正在Explorer.exe中运行“。当我杀死explorer.exe时,它说"dll在SteamHelper.exe中运行“。当我杀死steamhelper.exe时,它说"dll在Chrome.exe中运行“。这向我展示了我以某种方式连接到了每一个运行中的应用程序中?
我无法解决这个问题,也找不到任何帮助。任何洞察力都是非常感谢的!
发布于 2021-01-27 17:03:14
您是在挂起每个应用程序进程,因为您正在安装钩子全局,方法是将SetWindowsHookEx()的dwThreadId参数设置为0:
dwThreadId
类型: DWORD
与钩子过程相关联的线程的标识符。对于桌面应用程序,,如果此参数为零,则钩子过程与运行在同一个桌面上的与调用线程相同的所有现有线程相关联。有关Windows应用程序,请参见备注部分。
相反,应该将该参数设置为要挂钩事件的游戏线程的实际线程ID。
https://stackoverflow.com/questions/65922595
复制相似问题