VC++ Hook截取鼠标点击窗口消息的问题!全局钩子,高手进!
发布网友
发布时间:2022-05-23 15:30
我来回答
共5个回答
热心网友
时间:2023-10-27 12:01
你需要截获 按钮 HWND 的 WM_LBUTTONDOWN 函数。
好几种方法实现。
比较简单的一种:
采用SetWindowLong子类化该HWND,即设置该窗口的消息处理函数,然后判断消息是不是按钮被按下了,做好处理之后再去调用老的消息处理函数。
但是,每个进程都有各自的私有4G空间,而你要截获的是远进程窗口消息,因此,你不能简单的直接使用SetWindowLong,因为你传过去的参数,对于远进程来说,是没有意义的。
因此,第一步,你需要将实现写入DLL,然后将DLL注入远进程。(注,DLL的DLLMain函数中实现SetWindowLong等实现)。
这种方法要比全局钩子的方法效率高。而且也很容易写。
热心网友
时间:2023-10-27 12:02
我写了一个框架,你只需把响应动作添加到回调函数中即可。
导出函数都已经写好了,可以在主程序中LoadLibrary动态加载调用。
#include <windows.h>
// 建立数据段
#pragma data_seg("HookData")
HHOOK g_hHook = NULL; // 钩子句柄
HINSTANCE g_hInstDLL = NULL; // 模块句柄
#pragma data_seg()
// 设置数据段为可读可写可共享
#pragma comment(linker,"/SECTION:HookData,RWS")
// 入口函数
BOOL APIENTRY DllMain(HINSTANCE hInstDLL,
DWORD fdwReason,
LPVOID lpvReserved)
{
if(fdwReason == DLL_PROCESS_ATTACH)
g_hInstDLL = hInstDLL; // 初始化模块句柄
return TRUE;
}
// 钩子回调函数
LRESULT WINAPI HookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
// TODO: 在这里添加响应动作
// 将事件传递到下一个钩子
return CallNextHookEx(g_hHook, nCode, wParam, lParam);
}
// 安装钩子
extern "C" __declspec(dllexport) DWORD InstallHook(void)
{
DWORD dwRet = 0;
g_hHook = SetWindowsHookEx(WH_MOUSE, HookProc, g_hInstDLL, 0);
if(g_hHook == NULL)
dwRet = GetLastError();
return dwRet;
}
// 卸载钩子
extern "C" __declspec(dllexport) DWORD KillHook(void)
{
if(UnhookWindowsHookEx(g_hHook))
return 0;
else
return GetLastError();
}
热心网友
时间:2023-10-27 12:02
SetWindowsHookEx
热心网友
时间:2023-10-27 12:03
4125
热心网友
时间:2023-10-27 12:04
程序发你邮箱,如果有用,请加分;谢谢!