使用WH_MOUSE_LL钩子来判断按键是否是mouse_event模拟的
来源:互联网 发布:instagram类似社交软件 编辑:程序博客网 时间:2024/05/21 09:27
在玩游戏时,我们可能需要一些快捷工具,比如左键连点,效果就是在按下鼠标左键后将会以一个很快的速度一直模拟点击鼠标左键,松开后就会自动停止。网上也有很多这样的工具,从前我也自己尝试开发过,但是总会有一个严重的问题——如何判定真正的鼠标左键是否被按下。
一直以来,我都是用如下代码模拟鼠标左键的点击。
mouse_event(MOUSEEVENTF_LEFTDOWN, NULL, NULL, NULL, NULL);mouse_event(MOUSEEVENTF_LEFTUP, NULL, NULL, NULL, NULL);
同时通过WH_MOUSE_LL钩子来判断鼠标的按键。
LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam){ switch (wParam) { case WM_LBUTTONDOWN: { //这里写代码 break; } case WM_LBUTTONUP: { //这里写代码 break; } default: break; } return CallNextHookEx(hMouse, nCode, wParam, lParam);}
本以为会使用很复杂的API才能实现对真实按键和模拟按键的识别,没想到在不经意的测试之中发现原来钩子本身就带有许多有用的信息。
在WH_MOUSE_LL钩子的消息中,lParam指向一个MOUSEHOOKSTRUCT结构,MOUSEHOOKSTRUCT定义如下:
typedef struct tagMOUSEHOOKSTRUCT { POINT pt; HWND hwnd; UINT wHitTestCode; ULONG_PTR dwExtraInfo;} MOUSEHOOKSTRUCT, FAR *LPMOUSEHOOKSTRUCT, *PMOUSEHOOKSTRUCT;
其中的wHitTestCode参数,在真实按键时为0,而在使用mouse_event模拟时,它将为1。因此我们可以定义一个变量来保存鼠标左键是否真正被按下。
BOOL MouseDown = FALSE;LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam){ MOUSEHOOKSTRUCT mhs = *((PMOUSEHOOKSTRUCT)lParam); //将lParam指向的内容拷贝到mhs中 switch (wParam) { case WM_LBUTTONDOWN: { if (!mhs.wHitTestCode) //如果wHitTestCode为0 { MouseDown = TRUE; } break; } case WM_LBUTTONUP: { if (!mhs.wHitTestCode) //如果wHitTestCode为0 { MouseDown = FALSE; } break; } default: break; } return CallNextHookEx(hMouse, nCode, wParam, lParam);}//其他代码已省略
这样就能准确地判断是否真正按下了鼠标左键了。
0 0
- 使用WH_MOUSE_LL钩子来判断按键是否是mouse_event模拟的
- 使用mouse_event来模拟一次选中文本框中的文本
- 使用mouse_event来模拟一次选中文本框中的文本
- 使用mouse_event来模拟一次选中文本框中的文本
- 使用mouse_event来模拟一次选中文本框中的文本
- WH_MOUSE_LL钩子函数
- 低级鼠标钩子WH_MOUSE_LL
- 低级鼠标钩子WH_MOUSE_LL
- keybd_event,mouse_event 模拟产生键盘事件、鼠标事件的使用
- 用Mouse_event()来模拟鼠标操作
- 用Mouse_event()来模拟鼠标操作
- 实现使用正则表达式来判断指定的字符串是否是合法的E-mail地址
- 使用webview.copyBackForwardList()来进行判断是否是在当前页打开的链接
- android 使用webview.copyBackForwardList()来进行判断是否是在当前页打开的链接
- 使用mouse_event来模拟一次选中文本框中的文本(转)
- 判断系统使用的是否是luajit
- 【QTP】使用SendKeys来模拟键盘按键
- 利用json和prototype来做用户是否正确的判断,传统的方式是提交后做判断,这里使用的是ajax异步传输的方式。
- 在Ubuntu中安装Circos
- 智慧医疗解决方案
- vs2033安装遇到an unhandled exception has been caught by the vsw exception filter
- Linux下使用git命令及github项目
- 笔记--ThinkPHP的URL模式
- 使用WH_MOUSE_LL钩子来判断按键是否是mouse_event模拟的
- LeetCode 68 Text Justification (字符串格式处理)
- 静态变量
- git commit ammend 修改已经提交的注释
- 关于weak和assign那点事儿
- c++实现2的n次方
- PHP获取程序执行时间
- 462 字节 C 代码实现雅虎 logo ACSII 动画
- Linux下使用命令解压.war文件的问题