翻译《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。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

matrix-breakout-2-morpheus vulnhub靶场

端口扫描 80 81 需要用户名密码登录 目录扫描 robots.txt 妹用 找不到利用点,换个扫描器再扫 发现新的文件 graffiti.txt graffiti.php 输入的数据Post后会回显到页面上 抓包看看,居然直接传文件路径 发现我们post的数据被写入了graffiti.…

yolov5-ros模型结合zed2相机部署在 Ubuntu系统

前言 本篇文章主要讲解yolov5-ros模型结合zed2相机进行实时检测,经改进实现了红绿灯检测,并输出检测类别与置信度! 目录 一、环境配置二、zed2驱动安装三、yolov5-ros功能包配置四、运行官方权重文件四、运行自己权重文件 一、环境配置 1、…

android睡眠分期图

一、效果图 做医疗类项目&#xff0c;经常会遇到做各种图表&#xff0c;本文做的睡眠分期图。 二、代码 引入用到的库 api joda-time:joda-time:2.10.1 调用代码 /*** 睡眠* 分期*/private SleepChartAdapter mAdapter;private SleepChartAttrs mAttrs;private List<SleepI…

不会制作企业版电子书?学会这几个步骤就好啦!

公司安排你制作一本专业的电子书&#xff0c;不知道如何下手&#xff1f;别担心&#xff0c;今天LookLook同学就来给大家分享一下如何轻松制作企业版电子书。参考这几个步骤&#xff0c;相信你一定能轻松搞定&#xff01; 第一步&#xff1a;明确电子书的目标和受众 在开始制作…

zeppelin 未授权任意命令执行漏洞复现

一、命令执行复现 访问http://ip:8080&#xff0c;打开zeppelin页面&#xff0c;&#xff08;zeppelin默认监听端口在8080&#xff09; 点击Notebook->create new note创建新笔记 在创建笔记的时候选择Default Interpreter为sh&#xff0c;即可执行sh命令 如下图&#x…

最新去水印小程序源码分享/无需后台/对接接口/支持全网去水印功能

最新去水印小程序源码分享&#xff1a;无需后台、对接接口&#xff0c;支持全网去水印功能&#xff0c;经过测试发现&#xff0c;该去水印小程序的解析接口需要付费使用。如果您有免费的解析接口&#xff0c;可以自行替换原有接口。 不过&#xff0c;不论是否付费&#xff0c;…

JAVA小案例-分别计算100以内奇数和偶数的和

JAVA小案例-分别计算100以内奇数和偶数的和 没啥可说的&#xff0c;就是for循环加if分支&#xff0c;也可以用while写。 代码如下&#xff1a; public class Jiouhe {/*** 分别计算100以内奇数和偶数的和* param args*/public static void main(String[] args){int sum10;in…

老程序员学习AI大模型的焦虑与机遇

前言 在这个科技飞速发展的时代&#xff0c;AI大模型成为了编程领域的热门话题。许多人都认为&#xff0c;学习AI大模型是获取高薪职位和实现职业发展的关键。然而&#xff0c;作为一名拥有十多年编程经验的老程序员&#xff0c;我不得不承认&#xff0c;面对这一新兴技术&…

WebGL开发地理信息系统

WebGL开发地理信息系统&#xff08;GIS&#xff09;是一项复杂且具有挑战性的任务&#xff0c;需要解决一系列技术难点。以下是一些主要的技术难点及其可能的解决方案。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1.大规模数据渲染…

SQL语句练习每日5题(一)

一、查询 题目1——查询所有列&#xff1a; 现在运营想要查看用户信息表中所有的数据&#xff0c;请你取出相应结果 答案&#xff1a; select * from user_profile 题目2——查询多列&#xff1a; 请取出用户的设备id对应的性别、年龄和学校的数据 答案&#xff1a;select …

QT:QML中使用Loader加载界面

目录 一.介绍 二.实现 三.效果展示 四.代码 一.介绍 在QML中使用Loader加载界面&#xff0c;可以带来诸多好处&#xff0c;如提高应用程序的启动速度、动态地改变界面内容、根据条件加载不同的组件、更有效地使用内存以及帮助分割应用逻辑等。 1.延迟加载&#xff1a;QML…

苹果不会在WWDC 2024中推出任何搭载M4芯片的Mac电脑

虽然苹果公司已在上月推出了首搭 M4 芯片的 iPad Pro&#xff0c;不过彭博社的马克・古尔曼在最近的实时通讯中透露苹果公司不会在即将进行的 WWDC 2024 开发者大会中推出任何搭载 M4 芯片的 Mac 电脑&#xff08;不会推出任何硬件产品&#xff09;。 此前报道&#xff0c;苹果…

linux命令别名与shell函数

# 修改网卡配置 alias vinetwork"vi /etc/sysconfig/network-scripts/ifcfg-ens33" 1. 方法和调用在同一个文件 # 定义shell函数,返回值通过$?获取 function say_hello(){ echo "hello shell" return 1 } # 使用shell函数 say_hello # 执行脚本后接收返…

公寓远程抄表系统:智能管理方法新的篇章

1.界定和功能 公寓远程抄表系统是一种前沿的自动化控制&#xff0c;它允许物业管理管理人员在远离现场部位收集和分析公寓里的电力能源使用数据&#xff0c;似水、电、气等。根据集成传感器、物联网产品和云计算&#xff0c;系统能实时检测并记录公寓的能耗状况&#xff0c;大…

可视化数据科学平台在信贷领域应用系列三:特征组合

现代各企业都提倡“降本增效”&#xff0c;所以越来越多优秀的工具诞生了。若想在特征加工这块工作上提升效率&#xff0c;建模人员也能有更多时间“偷懒”&#xff0c;都 “Sora”时代了&#xff0c;为啥不巧用工具呢&#xff1f;RapidMiner在信贷风控特征加工组合中是一把利器…

17 - 项目员工 I(高频 SQL 50 题基础版)

17 - 项目员工 I select-- round(sum(e.experience_years)/count(*),2) p.project_id,round(avg(e.experience_years),2) average_years from Project p left join Employee e on p.employee_ide.employee_id group by p.project_id;

智能座舱车载数字人解决方案,低资源占用

随着智能汽车的快速发展&#xff0c;人们对汽车的需求已经超越了单纯的交通工具定义&#xff0c;而是更加追求个性化、智能化的出行体验。在这样的背景下&#xff0c;美摄科技凭借其卓越的技术实力和创新能力&#xff0c;推出了面向企业的智能座舱车载数字人解决方案&#xff0…

Qt Creator常用的快捷键和常用功能

常用快捷键 新建项目&#xff0c;ctrl n 运行项目&#xff0c;ctrl r 构建项目&#xff0c;ctrl b 改变编辑器界面字体显示比例大小&#xff0c;ctrl 鼠标滚轮 对齐代码&#xff0c;ctrl a; ctrl i 跳转到上一行&#xff0c;ctrl shift enter 跳转到下一行&#xff0c;…

PhpStorm 2024 激活码 - JetBrains 高效智能PHP IDE

各位程序员&#xff0c;每天敲代码真的需要一款好用的 IDE&#xff0c;大名鼎鼎的 JetBrains 值得信赖&#xff01;PHP 开发看过来&#xff0c;PhpStorm 个人版首年订阅 618 限时特惠 7.1 折&#xff0c;有需要的朋友一定不要错过&#xff01; PhpStorm 汇集了众多效率功能和集…

Kaggle——Deep Learning(使用 TensorFlow 和 Keras 为结构化数据构建和训练神经网络)

1.单个神经元 创建一个具有1个线性单元的网络 #线性单元 from tensorflow import keras from tensorflow.keras import layers #创建一个具有1个线性单元的网络 modelkeras.Sequential([layers.Dense(units1,input_shape[3]) ]) 2.深度神经网络 构建序列模型 #构建序列模型 …