模仿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 ...
随机推荐
- Spring Batch 4.2 新特性
Spring Batch 4.2 的发行版主要增强了下面的改进: 使用 Micrometer 来支持批量指标(batch metrics) 支持从 Apache Kafka topics 读取/写入( ...
- 日照学习提高班day3测试
A 思路: 一看到'#''.'什么的就想到搜索怪我怪我... 这道题勉强说是搜索别打我qwq 1)因为不重复,所以首先要判断是否%5==0,若不满足,直接输出NO 2)弄个vis数组记录是否被搜过,如 ...
- NOI 2017滚粗退役记
NOI 2017 游记 又到了OIer退役了的季节 Day -1 今天是报到日. 中午11点多的动车.动车上和dick32165401和runzhe2000谈笑风生.顺便用dick32165401的流 ...
- nu.random.seed()如何理解
结论: np.random.seed(a) # 按照规定的顺序生成随机数 # 参数a指定了随机数生成的起始位置: # 如果两处都采用了np.random.seed(a),且两处的参数a相同,则生成的随 ...
- Spring——JdbcTemplate
一.JdbcTemplate介绍: 为了使 JDBC 更加易于使用,Spring 在 JDBCAPI 上定义了一个抽象层, 以此建立一个JDBC存取框架,Spring Boot Spring Data ...
- 使用powershell管理域用户
在域内环境中,常常需要使用命令行管理域用户,此时可以使用Active Directory中的命令行工具Dsquery.exe,或CSVE,以及Ldifde等,其实,使用Windows Powershe ...
- Git本地安装
1 Git简介 Git是一个开源的分布式版本控制系统,可以有效.高速的处理从很小到非常大的项目版本管理. Git是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码 ...
- 记一次期待已久的渗透 从phpcms到thinkphp
0X01 前言 这是刚刚开始学习渗透的一个目标吧 这个站从刚开始学的那一天起,就想把他日下来. 可能是自己的信息收集能力太差了吧,导致一直无从下手 没有进展.这是需要慢慢积累的过程.还需努力学习. 0 ...
- Java日志系统---Logger之简单入门
Java 中自带的日志系统,今天抽空了解了一点,算是入了门,所以将自己的一些心得记录下来,以备日后查看,有兴趣的朋友,看到此文章,觉得有错误或需要添加的地方,请在下方评论留言,大家可以共同进步,谢谢: ...
- Mybatis内置的日志工厂提供日志功能
Mybatis内置的日志工厂提供日志功能,具体的日志实现有以下几种工具: SLF4J Apache Commons Logging Log4j 2 Log4j JDK logging 具体选择哪个日志 ...