前一阵子换了一个好看的桌面,但是图标太多挡住了很不高兴,在桌面点右键,隐藏桌面图片很麻烦,于是想做一个小软件一键隐藏、显示桌面图标,好让我欣赏壁纸。

鉴于这阵子学习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;}elselastTime=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学习相关推荐

  1. PC微信hook学习笔记(一)—— 获取个人信息

    PC微信hook学习笔记(一)-- 获取微信个人信息 1 起步 2. 获取基址 2.1 用CE查看个人信息 2.1.1 获取昵称基址 2.1.2 dll模块基址 2.2 用OD查看个人信息 2.3 内 ...

  2. 如何实现listbox选项,然后双击鼠标实现选项的删除

    如何实现双击鼠标左键然后删除列表框中的选项呢? 只需要两步: 第一步,建立listbox控件与鼠标事件的绑定并给一个跳转函数; 如本例中的listbox控件,绑定事件'<Double-Butto ...

  3. 在VMware中,双击鼠标左键,ctrl键粘滞问题

    在虚拟机下开发程序时,发现键盘输入异常.后发现是双击鼠标左键时,ctrl键粘滞所致. 网上搜索解决方案是: 在VMvare中 选择"虚拟机" -> "设置" ...

  4. vue判断是否双击_vue双击事件2.0事件监听(点击-双击-鼠标事件)和事件修饰符操作...

    Vue 事件处理方法 可以用 v-on 指令监听 DOM 事件,并在触发时运行一些 JavaScript 代码. v-on:click 单击事件 + + - - v-on:dblclick 双击事件 ...

  5. JavaScript---解决单击、双击鼠标冲突

    问题描述:一般情况下,双击鼠标一次会执行两次单击鼠标事件和一次双击鼠标事件,那么在双击鼠标时如何阻止两次单击鼠标事件的发生呢? 解决方法:设置定时器,当第一次点击鼠标时,记录下点击的时间,并设置单击事 ...

  6. 桌面文件夹和计算机打不开怎么办,电脑双击鼠标无法打开桌面文件或文件夹怎么办...

    我们在使用电脑的时候,都知道一个最基本的常识,就是打开软件必须需要双击图标,然后程序就会自动运行,但是有时候我们双击却意外弹出了程序的属性界面,不能直接打开,必须右击程序,选择打开程序才能运行程序,这 ...

  7. JavaScript 双击鼠标滚动屏幕的代码

    uusee下载,uusee2012pptv下载usee播放器精美图片中国无线论坛电脑知识与技术vagaa哇嘎电影,vagaa哇嘎电影下载sou狗麦克疯破解版uusee网络电视2011pipi 下载uu ...

  8. 天正双击墙体不能编辑_VBA让双击鼠标干点别的事情

    今天早上,微信群有人咨询 选中单元格后,双击不再编辑,而是复制,能不能用vba做到? 这个是可以的. 在excel中,如果直接双击单元格,会进入单元格的编辑状态,然后可以开始输入内容或者修改单元格的内 ...

  9. python opencv 双击鼠标绘制圆

    10-python opencv 双击鼠标绘制圆 10-python opencv 双击鼠标绘制圆 概述 实现过程 引用与创建空图 设置回调函数 回调上述函数 显示图像 源代码 运行结果 参考 概述 ...

最新文章

  1. TCP 为什么是三次握手,而不是两次或四次?
  2. DataGridView使用小结
  3. MS的.net源码地址
  4. 关于这周工作中遇到的关于缓存问题的记录
  5. 从web编辑器 UEditor 中单独提取图片上传,包含多图片单图片上传以及在线涂鸦功能...
  6. python整数加法计算器_Python应用实例赏析2.1简单计算
  7. python文本聚类分析_python机器学习kmeans算法——对文本进行聚类分析
  8. dHedge DAO和一些顶级基金向基金管理者投资14.5万sUSD
  9. jdbc连接带密码的access数据库
  10. 神经网络预测模型基本原理与编程实现
  11. 原生ajax上传获取进度,ajax上传图片获取进度
  12. 树莓派 树莓派 编c++_如何建立一个树莓派冰箱的冷冻监视器
  13. vim插件管理利器:pathogen
  14. 洛谷P4147 玉蟾宫(单调栈解决)
  15. HTML快速入门-02-css
  16. Win10电脑开机后黑屏只有鼠标怎么办?
  17. SQL查询优化方法 提高SQL查询效率 数据库的哪些字段适合添加索引
  18. 考研快题平面图,如何用马克笔去上色?
  19. java对图片的各种操作(压缩、加水印(文字或图片)、旋转)
  20. Qt扫盲-QDebug理论总结

热门文章

  1. 指数函数泰勒展开式与泰勒展开公式
  2. PayPal创始人:北京创业氛围仅次于硅谷
  3. Cinder块存储服务
  4. Gateway断言工厂配置
  5. 如何截取视频作为封面图
  6. Floyd算法求解最短距离
  7. Flash9.ocx彻底删除的最佳方法
  8. LQ-630K/LQ-635K 打印过程中出现卡纸故障的分析与处理
  9. HTTP错误 403.14 - Forbidden 错误的解决方法
  10. 一元线性回归分析与建模