【mfc】通过鼠标钩子检测对话框外的点击
文章目录
- 前言
- 一、自定义用户消息
- 二、创建全局钩子
- 效果图
前言
前段时间试过用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】通过鼠标钩子检测对话框外的点击相关推荐
- 游戏修改器制作教程二:键盘鼠标钩子
本教程面向有C\C++基础的人,最好还要懂一些Windows编程知识 代码一律用Visual Studio 2013编译,如果你还在用VC6请趁早丢掉它... 写这个教程只是为了让玩家更好地体验所爱的 ...
- 低级鼠标钩子WH_MOUSE_LL
翻MSDN可知,鼠标钩子类型有两个,一个是WH_MOUSE,另一个是WH_MOUSE_LL, 至于它们的区别,百度了一下: 1.WH_MOUSE只能监控钩子所在模块的鼠标事件. 2.WH_MOUSE_ ...
- MFC中,如何获得对话框控件相对于父窗口(对话框窗口)的位置
在MFC中,如何获得对话框控件相对于父窗口(对话框窗口)的位置: CRect r; pWnd->GetWindowRect(&r); 这样获得的r是控件相对于屏幕的坐标,然后用Scre ...
- 小小黑客从鼠标钩子开始,密码看看看
引论 什么是黑客,不同于骇客,黑客一词来源于"Hacker",意思是劈,斩,对于黑客来说学会入侵和破解是提升自己和学习的过程,最重要的是编程能力,因为依赖大多数工具是体现不出自己水 ...
- 使用钩子函数[3] - 建立一个全局的鼠标钩子
分两步: 一.建立 DLL, 并在 DLL 实现钩子的设置.释放和钩子函数; 二.再建一个工程调用测试. 第一步: 做 DLL 先建立一个 DLL 工程, 自动初始的代码如下(去掉注释了): libr ...
- 用Delphi实现Windows的鼠标钩子函数
用Delphi实现Windows的鼠标钩子函数 Delphi是基于PASCAL语言的Windows编程工具,功能十分强大.然而在Delphi的帮助 文件中,对Windows API函数的说明沿袭了 V ...
- [转]VSTO Office二次开发应用程序键盘鼠标钩子
可能在使用VSTO技术对Office的相关程序进行操作时,会碰到用程序去控制一些快捷键的操作,可以对键盘进行挂钩,此时使用P/Invoke函数实现. 原文链接:<VSTO应用程序中加入键盘钩子& ...
- 【IPC-钩子】WM_COPYDATA和鼠标钩子小程序
[IPC-钩子]WM_COPYDATA和鼠标钩子小程序 作者: 来自: 阅读次数: 218 [大 中 小] -------------------------------------------- ...
- MFC实现弹出模态对话框和非模态对话框(基于对话框)
模态对话框:当它弹出后,本应用程序其他窗口将不再接受用户输入,只有该对话框响应用户输入,在对它进行相应操作退出后,其他窗口才能继续与用户交互.(比如:word中的"另存为") 非模 ...
- VSTO Office二次开发键盘鼠标钩子使用整理
VSTO Office二次开发键盘鼠标钩子使用整理 可能通过程序控制键盘的操作和控制鼠标的一些操作,网上提供比较多的也是比较好的就是通过钩子(Hook)的方式实现. 简单整理了一下,没有找到很好的程序 ...
最新文章
- HDU 4888 Redraw Beautiful Drawings(网络流求矩阵的解)
- 新浪微博oauth2.0弹出验证dialog中输入框被输入法覆盖的解决办法
- [Python爬虫] 之十二:Selenium +phantomjs抓取中的url编码问题
- 关于递归三要素的理解
- docker 初体验
- ASP.NET Core中的OWASP Top 10 十大风险-SQL注入
- 美发新造型 名家创意示范集锦(图)
- CentOS 6.5忘记root密码,怎么办?
- 利用Wireshark分析UDP数据包
- Java技术体系概述
- VSCODE常用快捷键
- 恶意程序行为特征总汇
- 单U盘 clonezilla 克隆ubuntu16.04系统
- python re span_python—模块-re正则表达式
- 大脑皮层由神经组织构成,大脑神经网络结构图片
- 高德地图API POI分类编码表(mysql版)
- ieee 802.3学习笔记-MII
- 迁移学习和模型的微调
- draft伦理第三章
- codeforces#375(div.2)723D - Lakes in Berland dfs+bfs
热门文章
- 【PC工具】更新电脑考证题库,消防考试题库,司法考试,大学英语四六级题库,教师资格考试题库等...
- 畅捷教育系统服务器,畅捷教育云平台使用手册一、学生操作流程图-畅捷通.PDF...
- cdrx7拼版工具在哪里_Coreldraw x7/x8/2017/2018高版本保存为CDR 8.0低版本插件
- Anaconda spyder下载第三方包
- 南航大学计算机专业硕士学历,南航计算机科学与技术学院导师介绍:戴群
- python图像处理(十一)——图像锐化与边缘检测之Roberts算子、Prewitt算子、Sobel算子、Laplacian算子
- 机器视觉光源知识总结(二)
- SiamFC 文章阅读
- Cadence OrCAD Capture TCL/TK脚本实例
- linux能运行关关采集器吗,杰奇linux采集器,基本能用且速度还行