前面已经写过API注入的Hook应用场景,本文则展示Hook的另一个应用场景:监控mouse事件(包括keyboard等输入事件)。
问题背景:
一个工具多个版本(比如V1,V2)根据输入文件动态切换,要求V1能切到V2,V2也能切回V1。
但切换控制代码只能在最新版(比如V2)上添加,V1已发布且稳定不能做更改。
解决思路:
V2上响应输入button事件时判断是否需要切到V1;
如果不切,则显示V2主界面;
如果要切,则隐藏V2界面、创建V1进程、安装WH_MOUSE钩子,并创建线程监控V1的运行状况(主要是mouse输入事件);
Mouse钩子运行后检查V1中鼠标输入条件是否触发文件选择button,如果触发则终止V1并激活显示V2(结束mouse hook);
同时,V1激活时用户如果关闭V1,则必须hook到此事件并关闭V2(即退出工具)
具体实现:
直接上代码Hook.dll
/*自定义结构,V2与V1的数据交换*/
typedef struct
{
DWORD HookPID;/*V1进程pid*/
BOOL HookActived;/*hook是否有效*/
BOOL MouseDown;/*mouse是否被按下*/
RECT Client; /*V1待hook的button坐标区域*/
}HOOK_SHARED_MEM;
/*安装钩子*/
HOOK WINAPI InstallHook(int nID, HINSTANCE hInstance, LPVOID pAppSharedMem)
{
HANDLE hMemMap = ::Ope