WM_MOUSEHOVER(非客户区消息为WM_NCMOUSEHOVER)消息表示鼠标在客户区悬浮消息,WM_MOUSELEAVE(非客户区消息为WM_NCMOUSELEAVE)为鼠标离开客户区消息,这四个消息都需要提前调用TrackMouseEvent函数设置捕获。

  Windows API函数定义为:

BOOL WINAPI TrackMouseEvent(
_Inout_ LPTRACKMOUSEEVENT lpEventTrack
);

  在设置TrackMouseEvent函数前需要定义TRACKMOUSEEVENT结构体,参数含义为:

cbSize: sizeof(TRACKMOUSEEVENT)

dwFlags: TME_CANCEL(取消捕获,需配合TME_HOVER或TME_LEAVE或TME_NONCLIENT使用)、TME_HOVER(捕获WM_MOUSEHOVER)、TME_LEAVE(捕获WM_MOUSELEAVE)、TME_NONCLIENT(捕获WM_NCMOUSEHOVER和WM_NCMOUSELEAVE)、TME_QUERY

hwndTrack: 窗口句柄

dwHoverTime: 如果是WM_MOUSEHOVER消息,设置触发该消息的时间,或者使用系统默认HOVER_DEFAULT,单位ms

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

     TrackMouseEvent函数在设置后,如果成功捕获消息后,设置会立马失效,如果下次还需要捕获消息,需重新调用TrackMouseEvent设置。

  下例为通过一个布尔变量bTrackFlag 避免频繁的调用TrackMouseEvent设置,在捕获消息后重置bTrackFlag 变量,以便下次能重新捕获消息。

 //窗口消息处理过程
LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam,LPARAM lParam)
{
//...
  switch (message)
  {
    case WM_MOUSEMOVE:
    {
if(!bTrackFlag ){
TRACKMOUSEEVENT tme;
tme.cbSize = sizeof(TRACKMOUSEEVENT);
tme.dwFlags = TME_LEAVE|TME_HOVER;
tme.hwndTrack = m_hwnd; //窗口句柄
tme.dwHoverTime = ;
::TrackMouseEvent(&tme);
bTrackFlag = TRUE;
}
    }
    break;
case WM_MOUSELEAVE:
{
bTrackFlag = FALSE;
//...
}
break;
case WM_MOUSEHOVER:
{
bTrackFlag = FALSE;
//...
}
//...    
  }
}

参考资料:

a): TrackMouseEvent function: https://msdn.microsoft.com/zh-tw/library/windows/desktop/ms646265(v=vs.85).aspx

b): TRACKMOUSEEVENT structure: https://msdn.microsoft.com/zh-tw/library/windows/desktop/ms645604(v=vs.85).aspx

设置TrackMouseEvent捕获WM_MOUSEHOVER和WM_MOUSELEAVE消息的更多相关文章

  1. 设置EditText控件中提示消息hint的字体颜色和大小

    设置EditText控件中提示消息hint的字体颜色和大小 1.设置字体大小 代码例: public void init(){ hint= (EditText) findViewById(R.id.i ...

  2. iOS TabBarItem设置红点(未读消息)

    实现原理: 其实是自定义一个view,将view添加到UITabBar上面,也可以是一个按钮,设置背景图片,和label.废话少说直接上代码搞一个UITabBar的分类 #import <UIK ...

  3. Hotkeys.js 2.0.2 发布,JS 网页快捷键设置,捕获键盘输入和输入的组合键快捷键,它没有依赖

    这是一个强健的 Javascript 库用于捕获键盘输入和输入的组合键,它没有依赖,压缩只有只有(~3kb),gzip:1.9k. 更新内容: 添加测试用例: 添加更多特殊键支持: 修复bug. __ ...

  4. Postman设置自动捕获传递Cookie教程

    目录 前言 一.安装 1.Postman安装Install Interceptor Bridge 2.谷歌浏览器安装扩展Postman Interceptor 二.使用 1. 打开Capture Co ...

  5. EMQ 学习---订阅$SYS主题,捕获客户端上下线消息

    acl.config文件定义了可订阅$SYS主题的权限. {allow, {user, "dashboard"}, subscribe, ["$SYS/#"]} ...

  6. PyQt学习随笔:通过自定义类重写QApplication的notify方法捕获应用的所有消息

    PyQt程序通过调用QApplication类的exec_()(sys.exit(app.exec_()) 进入程序主循环,开始处理事件,它从事件队列中获取本地窗口系统事件,将它们转化为 QEvent ...

  7. MFC使用TRACKMOUSEEVENT触发mouseHover和mouseLeave

    为对话框添加WM_MOUSEHOVER或WM_MOUSELEAVE消息并不会响应.MFC需要特殊处理,其中一法就是使用TRACKMOUSEEVENT void CmfcDlgDlg::OnMouseM ...

  8. Windows开发进阶之VC++中如何实现对话框的界面重绘

    技术:Windows 系统+Visual studio 2008   概述 应用程序界面是用户与应用程序之间的交互的桥梁和媒介,用户界面是应用程序中最重要的组成部分,也是最为直观的视觉体现.对用户而言 ...

  9. Windows 开发之VC++垃圾清理程序软件

    概述 本程序软件的主要实现垃圾文件清理的功能,即对指定的文件格式的临时文件或垃圾文件进行遍历.扫描.显示.删除清理等功能.在程序界面设计方面,对默认对话框重新自定义绘制,主要包括标题栏的重绘.对话框边 ...

随机推荐

  1. 从零开始理解JAVA事件处理机制(2)

    第一节中的示例过于简单<从零开始理解JAVA事件处理机制(1)>,简单到让大家觉得这样的代码简直毫无用处.但是没办法,我们要继续写这毫无用处的代码,然后引出下一阶段真正有益的代码. 一:事 ...

  2. Sql的连接表补充

        连接条件可在FROM或WHERE子句中指定,建议在FROM子句中指定连接条件.WHERE和HAVING子句也可以包含搜索条件,以进一步筛选连接条件所选的行.             连接可分为 ...

  3. 演讲小技巧iPhone+Keynote

    原文发布在简书上:http://www.jianshu.com/p/a45538ca611f 今天在公司里分享了一个技术雷达里关于 ECMAScript 2017 的小 Session,分享加问答总共 ...

  4. iOS,Android,Jave后台AES加密解密

    AES256 在iOS和Android上的相关代码: http://www.tuicool.com/articles/RVFbmmU 里面可以下载相关的代码. 我们遇到的问题是: 把Android的代 ...

  5. HTTPS系列干货(一):HTTPS 原理详解

    HTTPS(全称:HyperText Transfer Protocol over Secure Socket Layer),其实 HTTPS 并不是一个新鲜协议,Google 很早就开始启用了,初衷 ...

  6. 解决Ubuntu开关机动画不正常方法

    联想的笔记本,显卡NVIDIA GT218M,默认使用开源的驱动,但挂起后,再唤醒就黑屏回不到桌面. 1.解决办法:安装NVIDIA专有驱动 $sudo apt-get install nvidia- ...

  7. Vue-cli 记录

    出自http://www.cnblogs.com/nutritious/p/6494479.html 先给出能正确安装的步骤: 1.进盘符 2,为啥不用npm,这是国外的东西,有些电脑无法FQ,会导致 ...

  8. Spring+TaskExecutor实例

    1 taskExcutor package com.test; import org.springframework.core.task.TaskExecutor; public class Main ...

  9. RabbitMQ~开篇与环境部署

    想写这篇文章很久了,今天终于有时间总结一下,一个大型的系统里,消息中间件是必不可少的,它将并发环境处理的数据异步进行处理,有效的提高了系统的并发能力,有很多系统的瓶颈点都在于此,而消息中间件在这个时候 ...

  10. 使用mongodb作为Quartz.Net下的JobStore实现底层的持久化机制

    我们都知道默认的Quartz底层采用的是RAMJobStore,所有的Job,Trigger,Calendar都是用Dictionary,SortSet等等这样的数据结构进行储存,相对来说性能肯 定快 ...