【发布时间】:2016-06-03 15:35:35
【问题描述】:
我试图钩住一个进程的键盘,但是当我按下任意键时,钩子代码不会被执行并且进程会冻结。 我的代码基于以下帖子:How to hook external process with SetWindowsHookEx and WH_KEYBOARD
这是我的 dll 代码:
#include <windows.h>
#include <iostream>
#include <stdio.h>
HINSTANCE hinst = NULL;
#pragma data_seg(".shared")
HHOOK hhk = NULL;
#pragma data_seg()
#pragma comment(linker, "/SECTION:.shared,RWS")
LRESULT CALLBACK wireKeyboardProc(int code, WPARAM wParam, LPARAM lParam) {
return CallNextHookEx(hhk, code, wParam, lParam);
}
extern "C" __declspec(dllexport) void install(unsigned long threadID) {
hhk = SetWindowsHookEx(WH_KEYBOARD, wireKeyboardProc, hinst, threadID);
}
BOOL WINAPI DllMain(__in HINSTANCE hinstDLL, __in DWORD fdwReason, __in LPVOID lpvReserved) {
hinst = hinstDLL;
return TRUE;
}
编辑: 加载 dll 后,我执行函数 install(),它会自动创建钩子,但由于某种原因,当按下键并且进程冻结时,函数 wireKeyboardProc 不会被执行。知道为什么会这样吗?
编辑 2: 这里也是我的 exe 代码:
unsigned long threadID = GetWindowThreadProcessId(hWnd, &ProcessId);
HINSTANCE hinst;
hinst = LoadLibrary(_T("hookKbd32.dll"));
if (hinst) {
typedef void(*Install)(unsigned long);
Install install = (Install)GetProcAddress(hinst, "install");
install(threadID);
}
【问题讨论】:
-
如果它“冻结”,那么你有很好的证据表明这个钩子确实有效。这段代码无法为任何人重现问题,这往往可以解释为它不是真正的代码,因为它没有做任何事情,或者您的反恶意软件产品不重视键盘记录器。
-
@HansPassant 我认为不存在这个问题,因为我没有使用任何反恶意软件产品,而且我尝试将 cout 放在那里,但它没有产生任何输出。我认为函数 wireKeyboardProc 没有出于任何原因执行。
-
您没有显示任何使用这些函数的代码。鉴于您发布的代码,none 您的函数会被调用。另请参阅:minimal reproducible example
-
@theB 我试图编辑我的帖子以使其更清晰。感谢帮助。 :)
-
“注入DLL后”这句话让我很担心。如果我理解正确,SetWindowsHookEx 会为您将 DLL 加载到目标进程中——您不应该注入它。但是您确定在使用发布的代码时会崩溃吗?例如,如果您的真实代码调用了
cout,则可能会导致崩溃。无论如何,发布的代码似乎没有任何问题,所以问题可能出在调用 install() 的代码上,请发布整个程序。
标签: c++ windows hook freeze setwindowshookex