双击鼠标HOOK学习
来源:互联网 发布:巨人网络收购投哪网 编辑:程序博客网 时间:2024/04/30 14:11
前一阵子换了一个好看的桌面,但是图标太多挡住了很不高兴,在桌面点右键,隐藏桌面图片很麻烦,于是想做一个小软件一键隐藏、显示桌面图标,好让我欣赏壁纸。
鉴于这阵子学习C语言,就用C++写一个程序。暂定为双击鼠标右键,隐藏桌面图标。
查询得知,需要关键的技术为HOOK。于是开始动工。
首先,要解决的是如何执行隐藏操作。
鉴于之前做过一个类似的C#程序,我先尝试了模拟按键:找到桌面的句柄后,依次按下,鼠标右键(或菜单键)、查看(快捷键V)、显示桌面图标(快捷键D)。经过百般尝试,最终得出结论,我对桌面发送右键可以执行,紧接着的模拟键盘都不成功,按键应该对应菜单项的句柄才能发送。我暂时放弃了这个方法。
然后经过SPY++捕捉系统消息,查阅msdn得出了一个消息ShowWindow(hwnd,SW_HIDE); 这个消息可以隐藏桌面,测试通过。
然后,解决响应鼠标双击。
写了一个简单的HOOK程序,使用MH_MOUSE_LL全局鼠标钩子,无需DLL注入。测试单击左键右键,配合ShowWindow这个消息,已经可以显示隐藏桌面图标了。但是对于双击鼠标,程序始终没有响应。查阅资料得知,MH_MOUSE_LL方法虽然省事,但是他能捕获到的鼠标消息只有,单击,移动,并没有双击这个消息。
我还走了一段弯路,以为console程序就不支持鼠标双击事件,还写了一个MFC窗口,才发现,支持的双击仅限于在窗口本身操作,并是不我想要的HOOK全局双击。
既然没有双击,解决方案就两种,一是自己写个计时器,来监控两次单击的时间间隔;另一种是改用MH_GETMESSAGE DLL注入全局拦截双击事件。这里我选用第一种,最终完成,代码如下。
#include "stdafx.h"#include <windows.h>DWORD lastTime; BOOL lastIsRight=FALSE; BOOL isHiden=FALSE; //定义为全局变量,每次点击保证重新载入值LRESULT CALLBACK LowLevelMouseProc( int nCode, WPARAM wParam, LPARAM lParam ){typedef void (WINAPI *PSWITCHTOTHISWINDOW) (HWND,BOOL);PSWITCHTOTHISWINDOW SwitchToThisWindow;HMODULE hUser32=GetModuleHandle(_T("user32"));//载入窗口前置函数SwitchToThisWindow=(PSWITCHTOTHISWINDOW)GetProcAddress(hUser32,"SwitchToThisWindow");HWND hwnd =FindWindow(_T("Progman"),NULL); hwnd = FindWindowEx(hwnd, NULL, _T("SHELLDLL_DefView"), NULL);hwnd = FindWindowEx(hwnd, NULL, _T("SysListView32"), NULL);//桌面句柄查找if(hwnd!=NULL){if (nCode>=0) { if(wParam==WM_RBUTTONUP) { if(!lastIsRight) { lastTime=::GetTickCount(); lastIsRight=TRUE; } else { DWORD nowTime=::GetTickCount(); if(nowTime-lastTime<350)//时间间隔为350ms {if(!isHiden) {ShowWindow(hwnd,SW_HIDE);isHiden=TRUE;}else {ShowWindow(hwnd,SW_SHOW);isHiden=FALSE;}lastIsRight=FALSE; } else lastTime=nowTime; } } }}return CallNextHookEx(0,nCode,wParam,lParam);}int _tmain(int argc, _TCHAR* argv[]){MSG msg;SetWindowsHookExW(WH_MOUSE_LL,LowLevelMouseProc,GetModuleHandleW(0),0);while(GetMessageW(&msg,0,0,0))DispatchMessageW(&msg);return 0;}
- 双击鼠标HOOK学习
- Revit API Hook 之 拦截鼠标双击元素事件
- 鼠标双击
- 鼠标HOOK
- Java鼠标双击事件
- Java鼠标双击事件
- 另一种鼠标双击事件
- 判断鼠标双击
- 鼠标双击事件
- 双击鼠标滚动屏幕
- JTree 鼠标双击事件
- silverlight鼠标双击
- silverlight鼠标双击
- 鼠标双击事件
- 鼠标双击变单击
- 实现鼠标双击事件
- 双击鼠标屏幕滚动
- unity鼠标双击
- poj2411Mondriaan's Dream(状态压缩dp)
- 算法集合
- c调用c++函数(包括类成员函数)的方法
- ApplePay申请MerchantID及证书配置
- redis-cli 命令总结
- 双击鼠标HOOK学习
- 破解版 Sublime text3破解版下载以及安装emmet插件,前端开发神器
- 高等数学:第一章 函数与极限(3)无穷小 连续性 间断点 连续函数
- JVM > 运行时数据区域
- 给一个类增加xib文件
- Fusion 360 API : 调用MFC对话框
- Activity开发之Activity的启动模式(二)
- javaweb使用POI导出导出excel表格
- 使用bindview自动安装passthru驱动的调试笔记