模仿Spy++抓某窗口消息
核心函数
SetWindowsHookExA
API文档:https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-setwindowshookexa
https://docs.microsoft.com/zh-cn/previous-versions/windows/desktop/legacy/ms644981(v=vs.85)
核心代码:
1、写一个dll。
HWND g_MainWnd = NULL;
HHOOK g_hook = NULL; #ifdef __cplusplus
extern "C" { //only need to export C interface if
// used by C++ source code
#endif
__declspec(dllexport) void SetHHook(HHOOK hook) //此函数废弃
{
g_hook = hook;
} __declspec(dllexport) LRESULT GetMsgProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode == HC_ACTION && wParam == PM_REMOVE)
{
//must process and lParam is MSG struct
MSG* msg = (MSG*)lParam;
if (g_MainWnd)
{
PostMessage(g_MainWnd, WM_USER + + msg->message, msg->wParam, msg->lParam);
}
} //晕,第一个参数被忽略的,可以直接传NULL
return CallNextHookEx(g_hook, nCode, wParam, lParam);
} #ifdef __cplusplus
}
#endif BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
//try to get the windows
g_MainWnd = FindWindow(NULL, L"EasySpy");
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
2、 调用函数
//查看捕获的窗口句柄
HWND hCaptured = ::WindowFromPoint(point);
DWORD dwThreadId;
HOOKPROC hkprcSysMsg=NULL;
dwThreadId = GetWindowThreadProcessId(hCaptured, NULL);
if (g_lastHook)
{
UnhookWindowsHookEx(g_lastHook);
}
//尝试去loaddll
if (!g_module)
{
g_module = LoadLibrary(TEXT("E:\\代码\\开源代码\\hookdemo\\trunk\\EasySpy\\Debug\\DllInject.dll"));
}
if (g_module)
{
hkprcSysMsg = (HOOKPROC)GetProcAddress(g_module, "GetMsgProc");
}
if (hkprcSysMsg)
{
//这里去拦截消息
g_lastHook = SetWindowsHookEx(WH_GETMESSAGE, hkprcSysMsg, g_module, dwThreadId);
}
完整代码Demo见github:https://github.com/xuhuajie-NetEase/EasySpy
有兴趣的同学可以优化下代码,做成跟spy++更像的。我只是研究下Hook技术,就不再优化了了。
模仿Spy++抓某窗口消息的更多相关文章
- spy++捕获窗口消息
打开spy++,窗口截图如下,点击窗口搜索按钮(红框标识) ,如果找不到对应的窗口,鼠标右键刷新即可. 鼠标左键点击窗口搜索图标,按住不放,拖到需要抓取消息的窗口上: spy++会自动在列表中高亮定位 ...
- MFC窗口消息PostMessage和SendMessage
以前这些消息用得比较少,但是今天碰到了个事儿,我看非用消息不可. 事情是这样的,我在线程中需要刷新对话框上面的内容,但是每每执行到UpdateData时就出现了断言错误. 查了相关资料,发现这个可能是 ...
- Qt5 托盘模仿qq闪烁,弹消息框实现
在别人代码基础上做的,课设刚好用上了,贴出来分享Qt5.5.1实现. 图片自己找. #ifndef DIALOG_H #define DIALOG_H #include <QDialog> ...
- Windows窗口消息大全(转)
Windows窗口消息大全,全不全自己看 ////////////////////////////////////////////////////////////////////////// #inc ...
- Windows窗口消息大全
////////////////////////////////////////////////////////////////////////// #include "AFXPRIV.H& ...
- 【转】Windows消息投递流程:一般窗口消息投递(WM_LBUTTONCLICK)
原文网址:http://blog.csdn.net/hyhnoproblem/article/details/6182646 本例通过在单文档程序的视图中添加WM_LBUTTONCLICK消息处理函数 ...
- VCL控件组件大都应该重载TWinControl的虚函数WndProc来进行处理窗口消息的工作
TWinControl的构造函数中会调用MakeObjectInstance并且传递MainWndProc作为窗口消息处理函数,而MainWndProc则会调用虚函数WndProc来处理窗口消息.留个 ...
- Win32窗口消息机制 x Android消息机制 x 异步执行
如果你开发过Win32窗口程序,那么当你看到android代码到处都有的mHandler.sendEmptyMessage和 private final Handler mHandler = new ...
- 2019-11-12-WPF-添加窗口消息钩子方法
title author date CreateTime categories WPF 添加窗口消息钩子方法 lindexi 2019-11-12 18:46:53 +0800 2019-06-05 ...
随机推荐
- CSS3—HSL与HSLA属性
㈠HSL(H,S,L) ⑴通过对色相(H).饱和度(S).明度(L)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色 ⑵取值 H:Hue(色调).0(或360)表示红色,120表示绿色,2 ...
- ListView如何获取点击单元格内容
Point m_MBRpt = listView1.PointToClient(Control.MousePosition); ListViewItem lstrow = lis ...
- Linux—查看远程Linux系统运行时间
[选择题]在Shell环境下,如何查看远程Linux系统运行了多少时间? A.scp user@被监控主机ip "uptime" B.ssh user@被监控主机ip " ...
- Object.keys 返回由一个给定对象的自身可枚举属性组成的数组
在实际开发中,我们有时需要知道对象的所有属性, 原生js给我们提供了一个很好的方法:Object.keys(),该方法返回一个数组 http://blog.csdn.net/u014035151/ar ...
- vue-cli3项目中引入jquery 以及如何引进bootstrap
1.安装jquery npm install jquery --save 2.或则在package.json中指定版本号,然后运行npm install命令 "dependencies&qu ...
- LOJ #2734 Luogu P3615 [JOI2016春季合宿]Toilets (结论、贪心)
题目链接 (loj) https://loj.ac/problem/2734 (luogu) https://www.luogu.org/problem/P3615 题解 嗯,考场上肝了\(3h\)然 ...
- 深入使用Vue + TS
深入使用TS 支持 render jsx 写法 这里一共分两步 首先得先让 vue 支持 jsx 写法 再让 vue 中的 ts 支持 jsx 写法 让 vue 支持 jsx 按照官方做法,安装Bab ...
- ETL-拉链算法-1
参考链接:http://blog.csdn.net/nisjlvhudy/article/details/8559518 自己的理解: 主要针对数据的状态变化 表:原表:source 目标表:targ ...
- HTTP服务器(1)
import socket def service_client(new_socket): """为这个客户端返回数据""" # 1. 接收 ...
- TCP主动打开 之 第二次握手-接收SYN+ACK
假设客户端执行主动打开,已经经过第一次握手,即发送SYN包到服务器,状态变为SYN_SENT,服务器收到该包后,回复SYN+ACK包,客户端收到该包,进行主动打开端的第二次握手部分:流程中涉及到的函数 ...