翻译《The Old New Thing》- What’s with this MSH_MOUSEWHEEL message?

What's with this MSH_MOUSEWHEEL message? - The Old New Thing (microsoft.com)icon-default.png?t=N7T8https://devblogs.microsoft.com/oldnewthing/20080806-00/?p=21353

Raymond Chen 2008年06月06日


MSH_MOUSEWHEEL 消息是怎么回事?

        硬件团队正在研发一种鼠标滚轮设备,并需要一种方法让应用程序支持这种鼠标。一种方法是说:“我们将开始销售这种带滚轮的鼠标,但在下一代Windows发布之前,没有任何应用程序可以使用它。”当然,这意味着要等到Windows NT 4发布,而谁也不知道那会是什么时候。此外,这意味着人们必须升级Windows才能利用他们的新鼠标。可以想象,他们对“等几年”的计划并不满意。

        在此期间,他们为应用程序响应鼠标滚轮提出了一种临时机制。于是引入了zmouse.h头文件及其注册消息MSH_MOUSEWHEEL。当你安装滚轮鼠标驱动程序时,它会监听硬件的滚轮事件,并在鼠标滚轮转动时发布这个新消息,应用程序只需响应WM_MOUSEWHEEL消息(如果运行在支持该消息的Windows版本上)或MSH_MOUSEWHEEL消息(如果运行在不支持该消息的旧版Windows上)。不幸的是,这两个消息的行为不同,所以不是简单地编写:

if (uMsg == WM_MOUSEWHEEL || uMsg == g_msgWheel) {
  // 处理滚轮事件
}

(下面几段总结了MSDN中已经明确的内容;如果已经知道这些消息的工作原理,可以跳过。)

        首先,让我们看看WM_MOUSEWHEEL。这个消息被传递到拥有焦点的窗口(在SetFocus的意义上)。如果窗口过程不处理这个消息,只是将其传递给DefWindowProc函数,那么DefWindowProc函数会将这个消息转发给窗口的父窗口。通过这种方式,WM_MOUSEWHEEL消息自动地从焦点窗口“向外冒泡”到父窗口链,直到有人最终处理这个消息(或者根本没有被处理)。

        另一方面,MSH_MOUSEWHEEL消息从外部向内部工作。它被传递到前景窗口(在SetForegroundWindow的意义上)。如果窗口过程不想处理这个消息,它可以将消息转发给它选择的子窗口,直到其中一个返回TRUE表示消息已被处理,或者直到没有更多的候选者。

        我将以表格形式总结这些差异,因为人们似乎非常喜欢表格。

WM_MOUSEWHEELMSH_MOUSEWHEEL
传播方向内向外外向内
传播机制DefWindowProcSendMessage
处理自动手动:应用程序检查从子窗口返回的值以确定接下来要做什么
如果已处理的返回值TRUE
如果未处理的返回值DefWindowProcFALSE

        注意WM_MOUSEWHEEL更简单,内向外的传播机制保留了其他消息(如WM_CONTEXTMENUWM_SETCURSOR)的精神。

        为什么MSH_MOUSEWHEEL不能以相同的方式进行?

        首先,MSH_MOUSEWHEEL没有修改DefWindowProc函数的特权。毕竟,引入这个消息的整个目的,是因为我们正试图向一个早于鼠标滚轮的旧操作系统添加滚轮支持。换句话说,如果我们能修改DefWindowProc来处理MSH_MOUSEWHEEL消息,那么我们一开始就不需要MSH_MOUSEWHEEL消息;我们只需要修改DefWindowProc来处理WM_MOUSEWHEEL消息。

        前一段中的论点是一个令人沮丧的常见问题。面对问题X和变通方法Y,有人会问:“为什么不用方法Z?”然而,如果你看看方法Z,你会发现它受到与问题X完全相同的问题。

这里有一个“困惑的变通方法”的真实世界例子:

“由于I-90桥关闭了,我不能乘坐550公交车从贝尔维尤到安全球场。相反,我将乘坐230到雷德蒙德,然后换乘545。”

——嗯,那很傻。为什么不乘坐245到东门,然后换乘554呢?这样更快。

“嗯,554也使用I-90桥。”

        好的,所以你不能更改DefWindowProc,但为什么不至少从内向外传播MSH_MOUSEWHEEL而不是从外向内呢?

        从焦点窗口开始的假设是你可以找出焦点窗口是什么,但如果你注意到了《每个Win32程序员都应该知道的五件事》,你就会知道每个线程都有自己的焦点窗口。(不是吹毛求疵的真,但足够真。)因此,当注入MSH_MOUSEWHEEL消息的帮助程序调用GetFocus时,它只会得到自己的焦点窗口,而不是控制前景窗口的线程的焦点窗口。(记住,我们谈论的是1996年,远在GetGUIThreadInfo函数发明之前。历史爱好者可以更多地了解鼠标滚轮的发明者。)由于内部向外是不可能的,这基本上就迫使了外部向内部。

        现在你知道鼠标滚轮消息是如何工作的,你可以解释这位客户看到的行为:

我注意到WM_MOUSEWHEEL消息被传递到了错误的子窗口。 我有一个父窗口和两个子窗口。 即使我把鼠标指针移动到子窗口1上, WM_MOUSEWHEEL却发送到了子窗口2。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/685862.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

14 个必须了解的微服务设计原则

想象一下,一个机场有各种各样的业务,每个部门都是一个精心设计的微服务,专门用于预订、值机和行李处理等特定操作。机场架构必须遵循这个精心设计的架构的基本设计原则,反映微服务的原则。 例如,航空公司独立运营&…

什么是视频号招商团长?如何加入成为视频号招商团长

视频号招商团长,是通过微信视频号平台的线上和线下活动,撮合商家和达人进行合作,帮助商家、达人在视频号成长发展;同时还可以通过邀请内容创作者入驻微信视频号并为其提供支持;从而获取佣金收益的,而其作用…

【西瓜书】4.决策树

1 递归返回情况 (1)结点包含样本全为同一类别 (2)属性集为空,没有属性可供划分了 或 有属性,但是在属性上划分的结果都一样 (3)结点为空结点 **结束时判定该结点的类别遵循如下规则&…

Orange Pi AI Pro 开箱 记录

香橙派 AIpro(OrangePi AIpro)是一款面向AI开发的强大开发板,提供了高性能和多功能的开发环境。我将结合自己的开发经验,详细介绍这款开发板的性能、适用场景及使用体验。 一、产品概述 香橙派 AIpro配备了强大的硬件配置&#…

101、对称二叉树

给你一个二叉树的根节点 root , 检查它是否轴对称。 题解:要确认是否对称,其实就是要同时遍历左右两边的子树,若某一侧的某个节点与其对称的节点不同,则返回false。 先比较根节点的左右节点,若相同则开始递…

Python 识别图片形式pdf的尝试(未解决)

想识别出pdf页面右下角某处的编号。pdf是图片形式页面。查了下方法,有源码是先将页面提取成jpg,再用pytesseract提取图片文件中的内容。 直接用图片来识别。纯数字的图片,如条形码,可识别。带中文的不可以,很乱。 识别…

uniapp小程序src引用服务器图片时全局变量与图片路径拼接

理论上&#xff0c;应该在main.js中定义一个全局变量&#xff0c;然后在页面的<image>标签上的是src直接使用即可 main.js 页面上 看上去挺靠谱的&#xff0c;实际上小程序后台会报一个错 很明显这种方式小程序是不认的&#xff0c;这就头疼了&#xff0c;还想过另外一个…

Linux本地搭建DataEase并发布公网远程访问进行数据分析

文章目录 前言1. 安装DataEase2. 本地访问测试3. 安装 cpolar内网穿透软件4. 配置DataEase公网访问地址5. 公网远程访问Data Ease6. 固定Data Ease公网地址 前言 DataEase 是开源的数据可视化分析工具&#xff0c;帮助用户快速分析数据并洞察业务趋势&#xff0c;从而实现业务…

MySQL之查询性能优化(八)

查询性能优化 MySQL查询优化器的局限性 MySQL的万能"嵌套循环"并不是对每种查询都是最优的。不过还好&#xff0c;MySQL查询优化器只对少部分查询不适用&#xff0c;而且我们往往可以通过改写查询让MySQL高效地完成工作。还有一个好消息&#xff0c;MySQL5.6版本正…

JavaWeb3 Ajax+Axios+Element+Nginx部署

Ajax 异步JS和XML 1.数据交换&#xff1a;给服务器发送请求&#xff0c;并获取服务器相应的数据 2.异步交互&#xff1a;在不重新加载整个页面的情况下&#xff0c;与服务器交换数据并更新部分网页 同步与异步 原生Ajax <!DOCTYPE html> <html> <body><…

德国80%的统计学教授都会答错的6个与P值有关的问题!

小编阅读了一篇发表于2002年关于P值的一项问卷调查研究 [1]&#xff0c;作者在6所德国大学中邀请了3组不同的受试者&#xff0c;分别为: 心理学专业的学生(n 44)&#xff1b;主要从事科学研究但不进行统计相关教学的教授和讲师(n 39)&#xff1b;进行统计相关教学的教授和讲师…

vs2022专业版永久密钥

vs2022专业版永久密钥&#xff1a; vs2022专业版永久密钥&#xff1a; Visual Studio 2022 Enterprise&#xff1a;VHF9H-NXBBB-638P6-6JHCY-88JWH Visual Studio 2022 Professional&#xff1a;TD244-P4NB7-YQ6XK-Y8MMM-YWV2J

大模型高级 RAG 检索策略之混合检索

古人云&#xff1a;兼听则明&#xff0c;偏信则暗&#xff0c;意思是要同时听取各方面的意见&#xff0c;才能正确认识事物&#xff0c;只相信单方面的话&#xff0c;必然会犯片面性的错误。 在 RAG&#xff08;Retrieval Augmented Generation&#xff09;应用中也是如此&…

UE Editor API 整理

UE Editor API 整理 过一下 https://github.com/20tab/UnrealEnginePython/blob/master/docs/&#xff0c;熟悉一下编辑器 API&#xff0c;方便后续编辑器脚本开发 后续的目标是所有编辑器操作应该都可以脚本化&#xff08;自动化&#xff09;&#xff0c;这样把 GPT 接进 UE…

WEB-Wordlist-Generator:为扫描后的Web应用生成相关联的字典

关于WEB-Wordlist-Generator WEB-Wordlist-Generator是一款功能强大的字典生成工具&#xff0c;该工具旨在帮助广大研究人员扫描目标Web应用程序并生成与之相关联的字典文件&#xff0c;从而允许我们对相关的网络威胁行为执行预备性应对策略。 功能介绍 当前版本的WEB-Wordli…

CAN总线学习笔记-CAN帧结构

数据帧 数据帧&#xff1a;发送设备主动发送数据&#xff08;广播式&#xff09; 标准格式的11ID不够用了&#xff0c;由此产生了扩展格式 SOF&#xff1a;帧起始&#xff0c;表示后面一段波形为传输的数据位 ID&#xff1a;标识符&#xff0c;区分功能&#xff0c;同时决定优…

旭日X3与英伟达Orin NX通过TCP传输图片

观前提醒&#xff1a;本文主要内容为使用Python在局域网内建立TCP连接并传输图片信息&#xff0c;计算机为一块旭日X3和一块英伟达Orin NX。 一、什么是TCP TCP&#xff08;传输控制协议&#xff09;是一种可靠的、面向连接的协议&#xff0c;它确保数据包的顺序传输和完整性…

工厂设备数采对接数字化平台

在数字化转型的浪潮下&#xff0c;工厂设备数据采集与数字化平台对接已成为提升生产效率、降低运维成本的关键手段。HiWoo Cloud作为工业物联网软件平台&#xff0c;以其卓越的性能和丰富的功能&#xff0c;为众多企业提供了全面、高效的设备数采对接数字化平台解决方案。本文将…

hutool工具实践-缓存

简介 依赖引入 <dependency><groupId>cn.hutool</groupId><artifactId>hutool-cache</artifactId><version>5.8.17</version></dependency> hutool工具既可以像上一章hutool工具实践-验证码-CSDN博客所说直接全部引入&#x…

用idea将java文件打成jar包

一、用idea将java文件打成jar包 1、在idea上选择file—Project Structure 2、Artifacts —点–JAR—From modules with dependencies 3、选择要打包的java文件 4、Build — Build Artifacts 5、找到刚才添加的Artifacts直接Build 6、生成jar包文件