文章目录

  • 前言
  • 一、自定义用户消息
  • 二、创建全局钩子
  • 效果图

前言

前段时间试过用OnActivate方法来检测对话框外部的鼠标点击(为了达到对话框失去焦点后自动隐藏的效果),当nState参数为WA_INACTIVE时表示有外部点击,然而这种方式在使用过程中偶尔会出现未响应的情况(有时连按两次win+D之后点击外部就不会响应OnActivate消息了),于是我转而使用鼠标hook实现该效果。以下为实现方式:


一、自定义用户消息

声明部分(.h)

#define WM_MOUSEBUTTONDOWN WM_USER+777
afx_msg LRESULT OnMouseButtonDown(WPARAM wParam, LPARAM lParam);

实现部分(.cpp)

BEGIN_MESSAGE_MAP(CdailycompletionDlg, CBaseTaskDlg)//。。。ON_MESSAGE(WM_MOUSEBUTTONDOWN, OnMouseButtonDown)//。。。
END_MESSAGE_MAP()

获取对话框的客户矩形区域,并转换到屏幕空间下,以此判断鼠标是否点击的是对话框外:

LRESULT CdailycompletionDlg::OnMouseButtonDown(WPARAM wParam, LPARAM lParam)
{if (!IsWindowVisible())return 0;CRect rc;GetClientRect(&rc);ClientToScreen(&rc);// 判断点击窗口外if (!rc.PtInRect(*(POINT*)lParam)){// ...}return 0;
}

二、创建全局钩子

这里的对话框直接定义为单例了,如果不是单例需要一个全局变量来保存对话框指针。

// 鼠标钩子
HHOOK glHook = NULL;
LRESULT CALLBACK MouseProc(int nCode, WPARAM msg, LPARAM lparam)
{if (msg == WM_LBUTTONDOWN){auto glWnd = CdailycompletionDlg::Instance();if (glWnd && IsWindow(glWnd->GetSafeHwnd())){PMOUSEHOOKSTRUCT mh = (PMOUSEHOOKSTRUCT)lparam;POINT pt;pt.x = mh->pt.x;pt.y = mh->pt.y;glWnd->SendMessage(WM_MOUSEBUTTONDOWN, 0, (LPARAM)&pt);}}return CallNextHookEx(glHook, nCode, msg, lparam);
}

在OnInitDialog中注册钩子

// 注册鼠标钩子
glHook = SetWindowsHookEx(WH_MOUSE_LL, MouseProc, GetModuleHandle(NULL), 0);

在OnDestroy中释放钩子

if (glHook) UnhookWindowsHookEx(glHook);

三、效果图

以上就是今天要讲的内容,本文仅仅简单介绍了鼠标hook的使用,能使我们快速便捷地处理鼠标键盘的响应事件。

【mfc】通过鼠标钩子检测对话框外的点击相关推荐

  1. 游戏修改器制作教程二:键盘鼠标钩子

    本教程面向有C\C++基础的人,最好还要懂一些Windows编程知识 代码一律用Visual Studio 2013编译,如果你还在用VC6请趁早丢掉它... 写这个教程只是为了让玩家更好地体验所爱的 ...

  2. 低级鼠标钩子WH_MOUSE_LL

    翻MSDN可知,鼠标钩子类型有两个,一个是WH_MOUSE,另一个是WH_MOUSE_LL, 至于它们的区别,百度了一下: 1.WH_MOUSE只能监控钩子所在模块的鼠标事件. 2.WH_MOUSE_ ...

  3. MFC中,如何获得对话框控件相对于父窗口(对话框窗口)的位置

    在MFC中,如何获得对话框控件相对于父窗口(对话框窗口)的位置: CRect  r; pWnd->GetWindowRect(&r); 这样获得的r是控件相对于屏幕的坐标,然后用Scre ...

  4. 小小黑客从鼠标钩子开始,密码看看看

    引论 什么是黑客,不同于骇客,黑客一词来源于"Hacker",意思是劈,斩,对于黑客来说学会入侵和破解是提升自己和学习的过程,最重要的是编程能力,因为依赖大多数工具是体现不出自己水 ...

  5. 使用钩子函数[3] - 建立一个全局的鼠标钩子

    分两步: 一.建立 DLL, 并在 DLL 实现钩子的设置.释放和钩子函数; 二.再建一个工程调用测试. 第一步: 做 DLL 先建立一个 DLL 工程, 自动初始的代码如下(去掉注释了): libr ...

  6. 用Delphi实现Windows的鼠标钩子函数

    用Delphi实现Windows的鼠标钩子函数 Delphi是基于PASCAL语言的Windows编程工具,功能十分强大.然而在Delphi的帮助 文件中,对Windows API函数的说明沿袭了 V ...

  7. [转]VSTO Office二次开发应用程序键盘鼠标钩子

    可能在使用VSTO技术对Office的相关程序进行操作时,会碰到用程序去控制一些快捷键的操作,可以对键盘进行挂钩,此时使用P/Invoke函数实现. 原文链接:<VSTO应用程序中加入键盘钩子& ...

  8. 【IPC-钩子】WM_COPYDATA和鼠标钩子小程序

    [IPC-钩子]WM_COPYDATA和鼠标钩子小程序 作者:  来自:  阅读次数: 218 [大 中 小] -------------------------------------------- ...

  9. MFC实现弹出模态对话框和非模态对话框(基于对话框)

    模态对话框:当它弹出后,本应用程序其他窗口将不再接受用户输入,只有该对话框响应用户输入,在对它进行相应操作退出后,其他窗口才能继续与用户交互.(比如:word中的"另存为") 非模 ...

  10. VSTO Office二次开发键盘鼠标钩子使用整理

    VSTO Office二次开发键盘鼠标钩子使用整理 可能通过程序控制键盘的操作和控制鼠标的一些操作,网上提供比较多的也是比较好的就是通过钩子(Hook)的方式实现. 简单整理了一下,没有找到很好的程序 ...

最新文章

  1. HDU 4888 Redraw Beautiful Drawings(网络流求矩阵的解)
  2. 新浪微博oauth2.0弹出验证dialog中输入框被输入法覆盖的解决办法
  3. [Python爬虫] 之十二:Selenium +phantomjs抓取中的url编码问题
  4. 关于递归三要素的理解
  5. docker 初体验
  6. ASP.NET Core中的OWASP Top 10 十大风险-SQL注入
  7. 美发新造型 名家创意示范集锦(图)
  8. CentOS 6.5忘记root密码,怎么办?
  9. 利用Wireshark分析UDP数据包
  10. Java技术体系概述
  11. VSCODE常用快捷键
  12. 恶意程序行为特征总汇
  13. 单U盘 clonezilla 克隆ubuntu16.04系统
  14. python re span_python—模块-re正则表达式
  15. 大脑皮层由神经组织构成,大脑神经网络结构图片
  16. 高德地图API POI分类编码表(mysql版)
  17. ieee 802.3学习笔记-MII
  18. 迁移学习和模型的微调
  19. draft伦理第三章
  20. codeforces#375(div.2)723D - Lakes in Berland dfs+bfs

热门文章

  1. 【PC工具】更新电脑考证题库,消防考试题库,司法考试,大学英语四六级题库,教师资格考试题库等...
  2. 畅捷教育系统服务器,畅捷教育云平台使用手册一、学生操作流程图-畅捷通.PDF...
  3. cdrx7拼版工具在哪里_Coreldraw x7/x8/2017/2018高版本保存为CDR 8.0低版本插件
  4. Anaconda spyder下载第三方包
  5. 南航大学计算机专业硕士学历,南航计算机科学与技术学院导师介绍:戴群
  6. python图像处理(十一)——图像锐化与边缘检测之Roberts算子、Prewitt算子、Sobel算子、Laplacian算子
  7. 机器视觉光源知识总结(二)
  8. SiamFC 文章阅读
  9. Cadence OrCAD Capture TCL/TK脚本实例
  10. linux能运行关关采集器吗,杰奇linux采集器,基本能用且速度还行