Hook任务栏时钟窗口
来源:互联网 发布:mac淘宝上传工具 编辑:程序博客网 时间:2024/05/22 13:33
用过一些日历软件的小伙伴应该都知道它们都实现了在时钟窗口上的Hook,也就是屏蔽了系统原有的功能,实现自己的功能
某日历软件Hook时钟窗口后的效果
经过一番研究,发现原理其实很简单,就是注入DLL到时钟窗口进程(explorer.exe),然后接管窗口处理过程实现自己的功能
第一步是判断当前操作系统架构,是x86还是x64,你别指望一个x64的explorer.exe会加载你x86的DLL
第二步就是查找时钟窗口的进程(explorer.exe)
然后根据系统架构的不同注入不同架构的DLL,至于怎么注入我这里就不讲了,这个网上搜索一下有太多文章
下面直接给出DLL完整代码,VS2013 + Win7 x64 编译测试通过
#include <windows.h>// 保存模块句柄,释放DLL时需要用到static HMODULE gLibModule = 0;// 用于保存时钟窗口原始处理过程,DLL卸载时应该还原static LONG_PTR gOldWndProc = 0;// 查找时钟窗口句柄static HWND FindClockWindow(){HWND h = FindWindow(TEXT("Shell_TrayWnd"), nullptr);if (IsWindow(h)){h = FindWindowEx(h, 0, TEXT("TrayNotifyWnd"), nullptr);if (IsWindow(h)){return FindWindowEx(h, 0, TEXT("TrayClockWClass"), nullptr);}}return 0;}static DWORD WINAPI FreeSelf(LPVOID param){FreeLibraryAndExitThread(gLibModule, EXIT_SUCCESS);}static void RestoreWndProc(){if (gOldWndProc != 0)SetWindowLongPtr(FindClockWindow(), GWLP_WNDPROC, gOldWndProc);}// 新的窗口处理过程,核心工作都在这里LRESULT CALLBACK ClockWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam){// 为了能收到鼠标左击右击的消息,必须让Windows以为我们"命中"了工作区if (uMsg == WM_NCHITTEST)return HTCLIENT;// 处理鼠标左击事件if (uMsg == WM_LBUTTONUP){ShellExecute(0, TEXT("open"), TEXT("http://blog.csdn.net/aqtata"), nullptr, nullptr, SW_SHOW);return 0;}// 处理鼠标右击事件,这里我们卸载DLL(自身)if (uMsg == WM_RBUTTONUP){RestoreWndProc();CloseHandle(CreateThread(nullptr, 0, (LPTHREAD_START_ROUTINE)FreeSelf, nullptr, 0, nullptr));return 0;}return WNDPROC(gOldWndProc)(hWnd, uMsg, wParam, lParam);}BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved){switch (ul_reason_for_call){case DLL_PROCESS_ATTACH:{gLibModule = hModule;HWND hClock = FindClockWindow();if (IsWindow(hClock)){gLibModule = hModule;gOldWndProc = GetWindowLongPtr(hClock, GWLP_WNDPROC);if (gOldWndProc != 0){SetWindowLongPtr(hClock, GWLP_WNDPROC, (LONG_PTR)&ClockWndProc);}}break;}case DLL_PROCESS_DETACH:{RestoreWndProc();break;}}return TRUE;}
以上代码实现了处理鼠标左击和右击的逻辑,为了展示实现原理所以没有实现复杂的功能,如果你愿意,可以在上面绘图、创建右键菜单甚至窗口等。
8 0
- Hook任务栏时钟窗口
- 时钟中断hook
- 在任务栏隐藏窗口
- 窗口全屏,覆盖任务栏
- 窗口全屏,覆盖任务栏
- 任务栏多窗口重叠
- 任务栏窗口隐藏
- hook监视窗口
- HOOK 窗口过程函数
- hook 窗口消息队列
- C++HOOK呼出窗口-
- C# 实现任务栏通知窗口
- C#实现任务栏通知窗口
- 窗口在任务栏不显示。
- C# 最小化窗口到任务栏
- 去除任务栏窗口对应按钮
- 窗口最大化禁止遮挡任务栏
- dos窗口模拟时钟
- 物化视图
- 232电平和TTL电平
- VisualStudio 2010 SP1安装时提示计算机环境导致无法安装的解决办法 (非常感谢 http://hi.baidu.com/imtoby)
- UIKit Dynamics入门
- 教你如何迅速秒杀掉:99%的海量大数据处理面试题
- Hook任务栏时钟窗口
- JS中将JSON的字符串解析成JSON数据格式
- ACE中UDP通信ACE_INET_Addr类ACE_SOCK_Acceptor类ACE_SOCK_Connector类ACE_SOCK_Stream
- Oracle 10g Scheduler 全面介绍
- iOS的主要框架介绍
- 微内核与宏内核
- FTCoreText
- Enter The Matrix
- 面试题目总结