C++用钩子模仿按键精灵录制键盘鼠标的功能

news/2024/10/17 10:28:29/

最近需要做个跟按键精灵类似的软件,模仿键盘鼠标的动作,然后重播一次,最开时候的时候用键盘钩子和鼠标钩子做的,虽然实现了功能,但是鼠标移动速度非常快,所以换成WH_JOURNALPLAYBACK 和WH_JOURNALRECORD 钩子来做


WH_JOURNALPLAYBACK 
使应用程序可以插入消息到系统消息队列。可以使用这个Hook回放通过使用WH_JOURNALRECORD Hook记录下来的连续的鼠标和键盘事件。只要WH_JOURNALPLAYBACK Hook已经安装,正常的鼠标和键盘事件就是无效的。
是全局Hook,它不能象线程特定Hook一样使用。 WH_JOURNALPLAYBACK Hook返回超时值,这个值告诉系统在处理来自回放Hook当前消息之前需要等待多长时间(毫秒)。这就使Hook可以控制实时事件的回放。
是system-wide local hooks,它们不会被注射到任何行程位址空间。


WH_JOURNALRECORD 
用来监视和记录输入事件。典型的,可以使用这个Hook记录连续的鼠标和键盘事件,然后通过使用WH_JOURNALPLAYBACK Hook来回放。


具体原理就是定义两个全局钩子 一个用来记录 一个用来回放 话不多说 看代码

void CKMHookDll::InstallHook(bool bIsKeyDown,bool bIsMouseDown,bool bIsMouseMove/*HWND hwnd*/)
{if (!m_pVecAction->empty()){m_pVecAction->clear();}m_bIsKeyDown = bIsKeyDown;m_bIsMouseDown = bIsMouseDown;m_bIsMouseMove = bIsMouseMove;m_hRecHook = SetWindowsHookEx(WH_JOURNALRECORD,(HOOKPROC)RecHook,m_hInst,0);
}

这段代码会开启WH_HOURANLRECORD钩子,会记录键盘 鼠标事件 我把它们保存在vector中,

钩子过程如下

LRESULT CALLBACK RecHook(int code,WPARAM wParam,LPARAM lParam)
{static int recOK = 1;if(code<0){return CallNextHookEx(CKMHookDll::GetInstance()->GetRecHook(),code,wParam,lParam);}else if(code==HC_SYSMODALON){recOK = 0;}else if(code==HC_SYSMODALOFF){recOK = 1;}else if(recOK && (code==HC_ACTION)){EVENTMSG action = *(EVENTMSG*)lParam;CKMHookDll::GetInstance()->AddEvent(action);}return 0;
}
每个键盘 鼠标事件都被保存在vector中,等待回放,开启回放的钩子代码如下

void CKMHookDll::RunScript()
{m_nPlayedEvent = 0;m_hPlayHook = SetWindowsHookEx(WH_JOURNALPLAYBACK,(HOOKPROC)PlayHook,m_hInst,0);
}


回调过程如下:

LRESULT CALLBACK PlayHook(int code,WPARAM wParam,LPARAM lParam)
{static BOOL fDelay;static int playOK = 1;if(code<0){return CallNextHookEx(CKMHookDll::GetInstance()->GetPlayHook(),code,wParam,lParam);}else if(code==HC_SYSMODALON){playOK = 0;}else if(code==HC_SYSMODALOFF){playOK = 1;}else if(playOK && (code==HC_GETNEXT)){if(fDelay){fDelay = FALSE;return 50;}*((EVENTMSG*)lParam) = CKMHookDll::GetInstance()->GetVecAt(CKMHookDll::GetInstance()->GetPlayedEvent());}else if(playOK && (code==HC_SKIP)){fDelay = TRUE;CKMHookDll::GetInstance()->IncPlayedEvent();}if(CKMHookDll::GetInstance()->GetPlayedEvent()>=CKMHookDll::GetInstance()->GetVecSize()){UnhookWindowsHookEx(CKMHookDll::GetInstance()->GetPlayHook());}return 0;
}


整个工程下载:

http://download.csdn.net/detail/mrxiao95/9471394


http://www.ppmy.cn/news/533394.html

相关文章

LR11录制回放HTTPS时的问题

背景&#xff1a;使用LoadRunner11录制HTTPS网页&#xff0c;测试性能 环境&#xff1a;LoadRunner11 Patch4 Win7 Firefox45 问题&#xff1a;录制时&#xff0c;出现启动了浏览器但地址栏无URL&#xff0c;页面空白&#xff1b;或者能打开页面但无event的情况。 目录 目…

selenium+java如何录制脚本及回放

本文以百度网址搜索信息为例&#xff0c;用Katalon Automation Recorder进行简单的脚本录制。1&#xff09;首先下载火狐浏览器&#xff0c;我用的是56.0版本的。对应的驱动 geckodriver-v0.20.1-win64.zip&#xff08;48版本及以上均可用&#xff09;&#xff0c;下载地址参考…

JMeter录制与回放脚本问题

1、JMeter录制脚本 由于JMeter和Badboy安装比较简单&#xff0c;可以直接百度&#xff0c;这里不记录 。 JMeter录制脚本有两种方式&#xff1a;Badboy和JMeter使用Http代理服务器录制。 &#xff08;1&#xff09;使用Badboy录制脚本时&#xff0c;由于各个浏览器的内置编码…

loadrunner如何录制与回放脚本

1、录制时&#xff1a;记录下浏览器客户端和服务器二者之间的对话&#xff08;请求包、应答包&#xff09;&#xff1b; -- 使用真实的客户端浏览器&#xff1a;IE、firefox等等来录制 2、回放时&#xff1a;按照脚本去回放&#xff0c;当然脚本需要先编译、再增强&#xff0…

游戏的录制与回放

首先&#xff0c;要搞清楚一种设计模式&#xff1a;命令模式 我对命令模式的理解&#xff1a;将所有的操作都封装为对象 游戏的录制&#xff1a;游戏录制其实很简单&#xff0c;就是重新开一把游戏&#xff0c;然后把所有的命令重新执行一遍。 那游戏回放呢&#xff0c;是不…

【得物技术】GOREPLAY流量录制回放实战

GoReplay 简介 随着应用程序的复杂度的增长&#xff0c;测试它所需要的工作量也呈指数级增长。 GoReplay 为我们提供了复用现有流量进行测试的简单想法。GoReplay是一个用golang开发的简单的流量录制插件&#xff0c;支持多种方式的过滤&#xff0c;限流放大&#xff0c;重写等…

UI自动化录制与回放系统

目录 一、本系统对传统UI自动化工作的改进二、系统架构粗略情况三、使用路径及进展情况四、使用效果&#xff08;已新增批量执行及报告查看、已支持用例嵌套&#xff09;1.录制过程2.单用例回放及远程监控3.多用例批量回放及报告生成4.Webdriver云多节点接入&#xff0c;执行记…

LoadRunner12.XX录制-回放脚本步骤

我安装的版本是LoadRunner12.55&#xff0c;软件支持对谷歌浏览器的录制&#xff0c;如果是其他版本&#xff0c;需要进行代理设置才可以录制谷歌浏览器。 1.首先进行软件的安装&#xff0c;安装步骤请自行百度 2.打开Virtual User Generator&#xff0c;新建一个脚本 根据项目…