获得鼠标离开消息。

2023-05-16

要知道什么时候一个鼠标指针进入一个窗口或是在它上面移动是非常简单的,因为窗口会接收到WM_MOUSEMOVE消息.在Windows NT 4.0中初次亮相的::TrackMouseEvent函数使得确定什么时刻鼠标指针离开窗口或者是静止悬于窗口上变得同样的简单.该函数在Windows 98中也是支持的.通过使用::TrackMouseEvent,一个应用程序能够注册为当鼠标指针离开一个窗口时接收到WM_MOUSELEAVE消息,当鼠标指针悬于窗口上时接收到WM_MOUSEHOVER消息.

::TrackMouseEvent仅仅接收一个参数:一个指向TRACKMOUSEEVENT结构体的指针.该结构体在Winuser.h中定义为:


typedef struct tagTRACKMOUSEEVENT {
DWORD cbSize;
DWORD dwFlags;
HWND hwndTrack;
DWORD dwHoverTime;
} TRACKMOUSEEVENT;

 

cbSize保存者该结构体的大小.dwFlags估存着一些位标志,它指明了调用者想要干些什么:注册为接收WM_MOUSELEAVE消息(TME_LEAVE),注册为接收WM_MOUSEHOVER消息(TME_HOVER),取消WM_MOUSELEAVE和WM_MOUSEHOVER消息(TME_CANCEL),或者是让系统用当前的::TrackMouseEvent设定来填定TRACEMOUSEEVENT结构体的各个字段的值(TME_QUERY).hwndTrack是产生WM_MOUSELEAVE和WM_MOUSEHOVER消息的窗口的名柄.dwHoverTime是一个以毫秒为单位的时间值,它指明了鼠标指针必须静止多长时间才会有一个WM_MOUSEHOVER消息发送给它下面的窗口.

鼠标指针并不一定需要绝对的静止才会产生一个WM_MOUSEHOVER消息.如果鼠标指针停留在以SPI_GETMOUSEHOVERWIDTH为参数调用::SystemParametersInfo函数所得到的值为长,以SPI_GETMOUSEHOVERHEIGHT为参数调用::SystemParametersInfo函数所得到的值为宽的矩形内,并且它的停留毫秒数超过了以SPI_GETMOUSEHOVERTIME为参数调用::SystemParametersInfo所返回的值时,一个WM_MOUSEHOVER消息就会产生.如果你需要,你可以通过使用SPI_SETHOVERWIDTH,SPI_SETHOVERHEIGHT和SPI_SETHOVERTIME为参数调用::SystemParametersInfo函数来改变这些值.

::TrackMouseEvent更有意思的是,当一个WM_MOUSELEAVE或者WM_MOUSEHOVER消息产生时,它的作用便消失了.这就意味着如果你想在鼠标指针离开窗口或者是悬停于窗口上方的任意时候都收到这些消息,你必须在接收到WM_MOUSELEAVE或者WM_MOUSEHOVER消息后再一次调用::TrackMouseEvent.举例来说,下面的代码片断实现了无论何时当一个鼠标指针进入,离开或者悬停于一个窗口上时,都会向调试窗口输出"Mouse enter,""Mouse leave,"或者"Mouse hover"信息.m_bMouseOver是一个BOOL类型的CMainWindow成员变量.它应当在构造函数中被设定为FALSE.


// In the message map
ON_WM_MOUSEMOVE ()
ON_MESSAGE (WM_MOUSELEAVE, OnMouseLeave)
ON_MESSAGE (WM_MOUSEHOVER, OnMouseHover)


void CMainWindow::OnMouseMove (UINT nFlags, CPoint point)
{
if (!m_bMouseOver) {
TRACE (_T ("Mouse enter/n"));
m_bMouseOver = TRUE;

TRACKMOUSEEVENT tme;
tme.cbSize = sizeof (tme);
tme.dwFlags = TME_HOVER | TME_LEAVE;
tme.hwndTrack = m_hWnd;
tme.dwHoverTime = HOVER_DEFAULT;
::TrackMouseEvent (&tme);
}
}

LRESULT CMainWindow::OnMouseLeave (WPARAM wParam, LPARAM lParam)
{
TRACE (_T ("Mouse leave/n"));
m_bMouseOver = FALSE;
return 0;
}

LRESULT CMainWindow::OnMouseHover (WPARAM wParam, LPARAM lParam)
{
TRACE (_T ("Mouse hover (x=%d, y=%d)/n"),
LOWORD (lParam), HIWORD (lParam));

TRACKMOUSEEVENT tme;
tme.cbSize = sizeof (tme);
tme.dwFlags = TME_HOVER | TME_LEAVE;
tme.hwndTrack = m_hWnd;
tme.dwHoverTime = HOVER_DEFAULT;
::TrackMouseEvent (&tme);
return 0;
}

转载于:https://www.cnblogs.com/Dennis-mi/p/3370074.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

获得鼠标离开消息。 的相关文章

  • 计算机网络第一章总结

    目录 1 1计算机网络再信息时代中的作用 1 2互联网的概述 1 2 1网络 xff0c 互联网和因特网 1 2 2互联网基础结构的三个阶段 1 2 3互联网的标准化工作 1 3互联网的组成 1 3 1三种交换方式 1 4计算机网络的类别
  • Expression #3 of SELECT list is not in GROUP BY clause and contains nonaggregated column……报错的解决办法

    问题原因 xff1a 这个报错是执行有GROUP BY的语句时出现的 原因是MySQL启用了默认的only full group by SQL模式 导致GROUP BY语句报错 解决办法 xff1a 打开mysql的安装目录找到my ini
  • 【Linux安全管理】Firewalld详解

    目录 1 与iptables不同 2 配置防火墙 3 firewalld区域概念 4 filewalld 配置生效 5 firewalld服务 firewalld 端口映射 富规则 rich rule 1 与iptables不同 firew
  • C++之class和struct的区别

    在C语言中 xff0c struct是一个数据类型 xff0c 所以struct内不能定义函数 xff1b 在C 43 43 中保留了struct关键字 xff0c 并且进行了补充 xff0c struct类似于class xff0c 可以
  • QEMU使用virtio磁盘(Ubuntu/windows)

    环境 宿主环境 xff1a windows 10 pro QEMU版本 xff1a 3 1 客户机 xff1a windows2003 virtio是一种半虚拟化技术 xff0c window2003安装盘不带驱动程序 xff0c 所以首先
  • 创建一个ArrayList<String> 集合,通过反射向集合中添加Integer类型的数据

    1 思路 创建一个ArrayList lt String gt 集合 通过反射获取到ArrayList的Class对象通过Class类获取到ArrayList中的add方法 2 所需关键知识 获取Class类有三种方法 xff1a xff0
  • Git分支&标签

    目录 一 xff0c 分支 环境的的功能及特点 分支的策略 分支的相关指令 二 xff0c 标签 1 查看所有标签 2 创建tag 3 删除tag 4 分支与版本 一 xff0c 分支 1 分支的命名规范 dev test pre pro
  • java酒店管理系统小型项目

    前言 学习java这段时间以来 xff0c 给我的感觉是非常枯燥和乏味的 xff0c 因为学习编程这个过程就是这样 xff0c 除此之外我是自学 xff0c 所以遇到问题只能自己上网找资料 xff0c 或者看一些大佬的文章来解决问题 不过学
  • 基于智能优化算法的无人机路径规划(Matlab代码实现)

    目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现 1 概述 无人机作为一种现代航空设备 不仅作业速度快 成本低 还具有卓越的灵活性和时效性 常用于完成那些繁冗 危险 对灵活性要求较高 作业范围较大的任务 比如航空拍摄 农
  • 布谷鸟搜索算法的改进及其在优化问题中的应用(Matlab代码实现)

    x1f352 x1f352 x1f352 欢迎关注 x1f308 x1f308 x1f308 x1f4dd 个人主页 xff1a 我爱Matlab x1f44d 点赞 评论 收藏 61 61 养成习惯 xff08 一键三连 xff09 x1
  • 基于MATLAB中雷达和视觉合成数据的目标级传感器融合(Matlab)代码实现

    目录 x1f4a5 1 概述 x1f4da 2 运行结果 x1f389 3 参考文献 x1f468 x1f4bb 4 Matlab代码 x1f4a5 1 概述 本文使用MATLAB的场景生成器工具箱 xff0c 通过合成雷达和视觉观察创建一
  • Linux嵌入式开发——C编程

    文章目录 Linux嵌入式开发 C编程一 编写C程序1 1 设置vim编辑器1 2 编写C程序 二 编译C程序三 make工具和Makefile文件3 1 编写C程序C文件H文件 3 2 不使用make工具3 3 使用make工具和Make
  • C#中的接口

    一 什么是接口 含义 xff1a 接口是指定一组函数成员而不实现它们的引用类型 xff08 只能用类和结构实现接口 xff09 接口可以包含实例方法 属性 事件 索引器或这四种成员类型的任意组合 接口可以包含静态构造函数 xff08 不能创
  • VINS-MONO工程改造

    这篇是接着前文 主流VIO VSLAM系统改造与工程化落地 和 关于VIO零速更新 ZUPT 与控制三种约束的工程实践 的 xff0c 有时候想一出是一出 xff0c 导致写的东西还是太分散了 要做VINS改造首先要熟悉VSLAM和数学基础
  • DM-VIO简析

    今天主要是针对DMVIO DM VIO的简析 xff0c 中文网上有的东西都太少了 xff0c 只能靠看完论文和组员们一起改代码 Lukas组这个东西在中文网被称为有史以来最好的VIO xff0c 但是实际过程中我们还是发现了许多不完美的地
  • Hao to setup windbg on windows10 LTSC img

    Windows host Debugger install windbg https developer microsoft com en us windows downloads windows 10 sdk download the i
  • VINS/VIO的并行化与工程化(GPU篇)

    最近更新的这2篇应该是比较重的了 xff0c 先做GPU篇 xff0c 再做DSP篇 先友情提醒 xff0c 这篇文章很重很费时 xff0c 对各种软硬算的知识要求多多 主体知识来源于UZH和ETH的研究者Balazs Nagy组 xff0
  • 关于机器人状态估计8-VSLAM工程与VIO工程难点

    最近做产设和综述把头都整晕了 xff0c 本来想认真更新GPU那篇DSP的姊妹篇 xff0c 突然觉得太长了实在是没有写的欲望 xff0c 还是写篇杂文算了 一看这个标题就知道 首先如果没有 关于机器人状态估计 4 成长路径与能力提升这块基
  • VIO/VINS/VSLAM问题定位流程与思路

    首先假设读者是了解基础VSLAM xff0c 了解VIO基础 至少要会标定 xff0c 调过几个开源系统的 先说一下双目的VINS FUSION xff0c 大部分问题都是基线造成的问题 xff0c 简单点说就是如果使用较短的基线如5cm

随机推荐