首页 > 其他分享 >用户自定义消息及层次划分

用户自定义消息及层次划分

时间:2023-12-06 10:08:02浏览次数:31  
标签:管理器 层次 自定义 WM 用户 应用程序 消息 窗口


有些人对术语 WM_USER 表示消息范围基的名称有不同的意见,因为 WM_USER 是由窗口类的实现者来定义的。他们抱怨的是,用户不能使用它们,因为它们属于窗口类定义的一部分。

但是,问题是,”这里的用户是谁?” 换句话说,当我们说”用户自定义”这个词的时候,做自定义操作的这个用户到底是指谁?

在上面这个问题中,总共有四个不同的组件涉及其中,每个组件都有它自己的消息范围。

> 窗口管理器处理 WM_USER 之下的消息。
> 窗口类的实现者处理 WM_USER 到 WM_APP – 1 之间的消息。
> 应用程序(具体来说,就是创建窗口的代码)处理 WM_APP 到 MAXINTATOM – 1 之间的消息。
> 所有其他组件通过 RegisterWindowMessage 处理 MAXINTATOM 到 MAXWORD 之间的消息。

用户是谁?这取决于你是站在哪个角度来如何理解这个问题的。

从窗口管理器的角度来看,窗口类的实现者是用户,因为窗口类的代码会调用窗口管理器。

从窗口类的实现者的角度来看,应用程序是用户,因为它调用了窗口类。

那如果从应用程序的角度来看,所有的外部代码就是用户了,因为外部代码会调用应用程序。

相反,你可以“向上”查找列表,并观察到从每个组件的角度来看,属于其上方组件的消息是“保留”的。

从类实现者的角度来看,窗口管理器消息是保留的。从应用程序的角度来看,类实现者的消息是保留的。从所有外部程序的角度来看,应用程序的消息是保留的。
让我们来看看下图,帮助理解。

>> 请移步至 topomel.com 以查看图片 <<

每个框将属于其内框的消息视为保留;相反,每个内框将下一个外框视为其“用户”。

由于 winuser.h 头文件是由窗口管理器团队编写的,因此他们从窗口管理器的角度看世界也就不足为奇了。因此,窗口管理器外部的所有内容都是“用户定义的”,窗口管理器内部的所有内容都是“保留的”。

当然,如果从类实现者的角度来看,那么“保留”和“用户”这两个词的上下文就会发生变化。例如,你可以在对话框常量 DWLP_USER 中看到这一点,该常量是对话框的“用户”可以使用的窗口字节的索引;即,通过应用程序的对话过程。

总结

简化一个复杂的问题,可以通过划分层次的思路来将其分成一个一个的小问题。
人生也是如此。

最后

Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
本文来自:《When something is available for the user, which user are we talking about?》

用户自定义消息及层次划分_windows

标签:管理器,层次,自定义,WM,用户,应用程序,消息,窗口
From: https://blog.51cto.com/u_15805075/8699702

相关文章

  • 用户体验设计:产品设计从需求到交互 -03
    第三部分:结构层面的用户体验设计这部分介绍了产品设计的结构层面,包括信息架构、交互设计、界面设计等内容。作者讲解了如何通过良好的信息架构和交互设计来提升产品的可用性和用户体验,以及如何设计清晰、直观的用户界面。读书笔记:良好的信息架构和交互设计是确保产品易用性和用户......
  • 手机被植入了木马,银行APP显示切换用户
    前几天一个大哥找我咨询,说跟之前的合作伙伴发生了矛盾,后来怀疑他的手机被监控了,问了几个问题:大哥问:我的银行APP显示切换用户,对方是不是利用短信接持了我的短信,登录了我的银行app。我答:显示切换了用户是否有转账呢?如果能短信劫持到你的短信大概率你手机上的任何app都能利用劫持的短......
  • SSM框架中各层次作用及其关系(三)
    SSM框架中各层次作用及其关系(三)DAO层与持久层的关系DAO(DataAccessObject)层和持久层在软件开发中是相关但不完全相同的概念。下面解释一下它们的关系:DAO层(DataAccessObject):DAO是一种设计模式,它的目标是将数据访问的逻辑从业务逻辑中分离出来,使得数据的访问操作更加模......
  • SSM框架中各层次作用及其关系(二)
    SSM框架中各层次作用及其关系(二)在SSM框架(Spring+SpringMVC+MyBatis)中,各层次分工协作,形成了一种分层架构,有助于提高代码的可维护性和可扩展性。以下是SSM框架中各层次的作用及其关系:表现层(PresentationLayer):使用SpringMVC框架进行开发,负责处理用户的请求和响应。控......
  • mapstruct 高级用法自定义转换规则
    https://svip888.blog.csdn.net/article/details/115706803?spm=1001.2101.3001.6650.15&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-15-115706803-blog-117566307.235%5Ev39%5Epc_relevant_3m_sort_dl_base3&depth_1-utm_sourc......
  • Sequelize的聚合查询查出messsage表中userId字段再user表中的用户信息
    这里记个一对多的,其他类似模型正常写,然后:入口文件main.js//...importmodelRelationfrom"./services/modelRelation";//...//同步模型和数据库modelRelation();modelRelation.js//import{Sequelize}from"sequelize";importsequelizefrom"./pool&quo......
  • 自定义Windows服务启动失败
     一、报错内容“无法从命令行或调试器启动服务,必须首先安装Windows服务(使用installutil.exe),然后用ServerExplorer、Windows服务器管理工具或NET START命令启动它” 二、解决方案管理员身份运行cmd 进入到InstallUtil.exe的路径,使用cd命令。我的目录为C:\Window......
  • vue3使用虚拟化表格自定义表格并动态生成表头
    elementPlus的虚拟化表格用的是lang=tsx,先安装cnpmi@vitejs/plugin-vue-jsx然后去vite.config.ts里加配置importvueJsxfrom'@vitejs/plugin-vue-jsx'plugins:[vue(),vueJsx(),]再去tsconfig.json中加东西//不要把compilerOptio......
  • vue项目:如何在编辑用户信息后,能够及时更新layout下的navar组件中的用户名,而不是手动刷
    问题描述:layout下的navar组件中展示用户名,初始化时进入layout层会进入mouted中请求接口数据展示名称,但是在编辑弹框中编辑成功后,关闭弹框,此时不会走layout的mouted,因为layout组件的mouted已经加载过一次了,不手动刷新浏览器是不会走mouted生命周期的。那怎么解决这个不能及时更新数......
  • 用户和组管理
    用户和组管理概念linux中用户是通过uid来区别的管理员为0通常名称为root1-1000为daemon进程用户,对守护进程获取资源进行权限分配1000以后给用户进行交互式登录使用linux中组是通过gid来区别的管理员组通常为0一个用户至少有一个组,默认创建用户时会生成和其同名组一个组......