大家好,又见面了,我是你们的朋友全栈君。
注意事项
1. SetWindowsHookEx 设置好全局键盘钩子后 一定要 使用 PeekMessage 或 GetMessage 来处理信息,不然程序会 卡死 ,或者 键盘失灵,反正就是 不执行 钩子例程
2. 网上多数看到 设置全局键盘钩子 而没有 PeekMessage 或 GetMessage 处理消息 过程 是因为 他们使用 MFC 编程, MFC中 自带 消息处理过程,而这里直接 空程序 走起则需要自己处理消息
3. 设置 全局键盘钩子 可以不使用 dll ,完全可以直接在一个exe中调用
4. CallNextHookEx 的 第一个 参数 是 忽略 的,MSDN https://msdn.microsoft.com/en-us/library/ms644974(VS.85).aspx 中可以发现
5. 在XP以后的系统中已经无法拦截系统功能键 Ctrl+Alt+Delete
6. 如果要检测 a-z 键,要使用大写 A-Z 不然会无效并且检测到其他按键,小写的 a-z 与其他VK_键重叠
附上一个简单完整的钩子例程,屏蔽 a 键
关掉窗口结束程序
#include <Windows.h>
#include <iostream>
using namespace std;
HHOOK keyboardHook = 0;
LRESULT CALLBACK HookCallback(int code, WPARAM wParam, LPARAM lParam)
{
KBDLLHOOKSTRUCT *ks = (KBDLLHOOKSTRUCT*)lParam;
if(ks->vkCode == 'A')
{
cout << "已拦截A键" << endl;
return 1;
}
return CallNextHookEx(0, code, wParam, lParam);
}
int main()
{
keyboardHook = SetWindowsHookExA(WH_KEYBOARD_LL, HookCallback, GetModuleHandleA(0), 0);
if (keyboardHook == 0)
{
cout << "挂钩键盘失败" << endl;
return -1;
}
cout << "程序正常运行" << endl;
//不可漏掉消息处理,不然程序会卡死
MSG msg;
while(1)
{
if (PeekMessageA(&msg, 0, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessageW(&msg);
}
else
Sleep(0); //避免CPU全负载运行
}
UnhookWindowsHookEx(keyboardHook);
cout << "程序正常退出" << endl;
return 0;
}
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/135211.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...