模仿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 ...
随机推荐
- React Native 项目常用第三方组件汇总
React Native 项目常用第三方组件汇总 https://www.jianshu.com/p/d9cd9a868764?utm_campaign=maleskine&utm_conte ...
- brute爆破
0X01明文传输的表单爆破用户名和密码 不存在任何加密 直接爆破即可 当不存在用户名时: 当存在用户名时,密码错误: 这里由于靶场关了 所以我们用dvwa演示 但是dvwa没有以上的差别 所以我们默认 ...
- 撩测试MM神器cypress使用入门
不很久不很久以前 据说某家公司有两位前端,天天撸bug,为啥嘞?只怪测试MM倾人国,轻语哥哥有bug.✧(๑•̀ㅂ•́)و✧ 可是最近两位有点犯愁 Σ(っ °Д °;)っ.测试MM有几次提了紧急bug ...
- ajax 415
ajax 发送post请求是出现415错误,是ajax的格式有问题,如下. $.ajax({ type: 'POST', url: '/login', data: { "username&q ...
- HashMap三两事
前言 JDK8中对HashMap做了优化,依然是用数组存储数据,但是扩容时采用双链表的方式避免了高并发情况下导致出现循环链表的问题,另外也引入了红黑树,提高碰撞元素的搜索速度. 一段代码 下面这段代码 ...
- MessageBox 弹框
模拟系统的消息提示框而实现的一套模态对话框组件,用于消息提示.确认消息和提交内容. 从场景上说,MessageBox 的作用是美化系统自带的 alert.confirm 和 prompt,因此适合展 ...
- 【VBA】多条件去重
Function kaidan(txt)Dim i As IntegerDim arrSet d = CreateObject("scripting.dictionary")For ...
- Mysql强制修改密码
windows: 1,停止MYSQL服务,CMD打开DOS窗口,输入 net stop mysql 2,在CMD命令行窗口,进入MYSQL安装目录 比如E:\Program Files\MySQL\M ...
- centos6密钥验证
密钥验证: 公钥(服务器上)私钥(客户端)在远程登录软件上可生成SSH密钥对.在服务器上建目录.SSH 再在其中建文件authorized_keys,复制公钥到服务器上此文件中. (1)selinux ...
- 动态加载、移除css文件
修改样式有通过修改class属性来更改,也可以通过动态引入外部的css文件来改变对应的样式展示. 这里就介绍动态引入.移除css文件 ///添加平板样式文件 function loadStyles() ...