我正在尝试创建一个全局键盘钩子,用于读取热键程序中的按键,但我遇到了一些问题。首先,每当我激活我的钩子时,键盘就会变得迟缓。屏幕上出现的每个字符之间几乎有1秒钟的延迟。第二个问题是,我在DLL回调函数中编写的任何代码都没有被执行。
这是我的代码:
DLL cpp文件
#include<Windows.h>
#include "keyDLL.h"
using namespace std;
LRESULT CALLBACK HookProcedure(int code, WPARAM wParam, LPARAM lParam)
{
return CallNextHookEx(0, code, wParam, lParam);
}
DLL头文件
#include "windows.h"
extern "C" __declspec(dllexport) LRESULT CALLBACK HookProcedure(int code, WPARAM wParam, LPARAM lParam);
挂钩CPP文件
#include<Windows.h>
#include<iostream>
using namespace std;
HHOOK WINAPI SetWindowsHookEx(_In_ int idHook, _In_ HOOKPROC lpfn, _In_ HINSTANCE hMod, _In_ DWORD dwThreadId
static HINSTANCE dllHandle;
HOOKPROC address;
static HHOOK keyboard_hook;
int main()
{
dllHandle = LoadLibrary(TEXT("keyDLL.dll"));
address = (HOOKPROC)GetProcAddress(dllHandle, "HookProcedure");
cout << address << endl << dllHandle << endl;
keyboard_hook = SetWindowsHookEx(WH_KEYBOARD_LL, address, dllHandle, 0);
system("pause");
}
这个版本的代码只是一个简单的削减版,仅设置了键盘钩子。我删除了所有其他代码,以尝试找出导致问题的原因。根据我的理解(显然不是很多),这段代码应该挂钩键盘,但不对按键进行任何操作。我不明白为什么它会让我的键盘速度变慢。我使用dumpbin确保DLL导出函数没有名称混淆。我正在运行64位的Windows 8,我的DLL和exe文件都编译为64位。当我将地址和dllHandle变量输出到控制台时,我得到了内存地址,所以我知道至少代码的一部分在工作。感谢您提供任何帮助。
WH_KEYBOARD_LL
。它更安全、更高效。即使LowLevelKeyboardProc
文档 也这样说:“大多数需要使用低级别钩子的应用程序,应该监视原始输入。这是因为原始输入可以比低级别钩子更有效地异步监视其他线程目标的鼠标和键盘消息。” - Remy Lebeau