处理WM_KILLFOCUS消息时需要注意的地方

news2024/9/25 11:13:37

之前我在一篇文章中曾经提过,不应该利用 WM_KILLFOCUS 消息中对表单的字段进行有效性校验。
今天的文章,我将介绍另外一个反面例子,来表现当使用 WM_KILLFOCUS 消息处理焦点相关的问题时所带来的混乱。

假设,有一个编辑框控件使用了气球提示来显示反馈信息。举个例子,对于一个密码输入控件,当键盘上的 CapsLock 按键按下时,它会提示用户,以防止用户输入错误的密码。作为开发者,你可能希望,当用户将输入焦点从密码输入框移动到另外一个控件时,将气球提示移除,这是合情合理的。因为向用户给出一个他完全不会使用到的控件提示,会让用户感到莫名其妙。可以通过对输入控件子类化来实现上述的需求,如下图所示:

使用上面的代码进行初步测试,一切如预期般正常工作,只是有一个问题:当用户点击气球提示时,编辑框的输入光标会意外的消失,这是为啥?

发生的事情是,你通过破坏焦点要去的窗口来破坏焦点变化过程!焦点更改过程如下所示:
> 将焦点移动至新的窗口。
> 发送 WM_KILLFOCUS 消息给丢失焦点的窗口(如果有的话)
> 发送 WM_SETFOCUS 消息给新的焦点窗口(如果有的话)

但是在上面的第二步,我们销毁了新的窗口。当焦点窗口被销毁后,Windows 窗口管理器会尝试找另外一个焦点窗口,最终它将输入焦点设置到了输入框控件本身。这将启动一个递归式的焦点更改过程,告知编辑控件它现在再次具有输入焦点。

让我们看一下当用户单击工具提示窗口时焦点变化流程。
> 设置焦点到工具提示。
> 发送 WM_KILLFOCUS 消息到输入框。
> EditSubclass 销毁了工具提示窗口。
> Windows 窗口管理器将焦点设置到输入框。
> WM_KILLFOCUS 不会发送给任何窗口。
> 发送 WM_SETFOCUS 给输入框。
> EditSubclass 将 WM_SETFOCUS 消息传递给原始窗口过程。
> EditSubclass 将 WM_KILLFOCUS 传递给原始窗口过程。

你看到这里面的问题了吗?

下面是到达原始编辑框窗口过程的消息流程:
> WM_SETFOCUS(源自嵌套的焦点变化过程)
> WM_KILLFOCUS(源自原始的焦点变化过程)

就编辑控件而言,它获得了焦点,然后失去了焦点。因此,它不会显示输入光标,因为编辑控件仅在具有焦点时才显示光标,并且递归焦点变化会导致编辑控件认为它没有焦点,即使它有焦点。

摆脱这种混乱的方法有很多。

首先,请注意,你不需要对编辑控件进行子类化,你可以对 EN_KILLFOCUS 通知做出反应。其次,你还可以通过向自己发布消息并在收到该发布消息后销毁工具提示来响应 EN_KILLFOCUS。通过发布的消息执行此操作,你可以避免递归焦点变化,因为你的工作现在正在焦点更改周期之外完成的。

总结

请不要忽视这些细枝末节的问题,资深用户会感受到你的程序里的各种细节。
如果是好的细节,你的程序会加分,万一是不那么好的细节,那就不是一件好玩的事儿了,你的用户会慢慢离你而去。

最后

Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
本文来自:《The dangers of playing focus games when handling a WM_KILLFOCUS message》

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

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

相关文章

编写 MBR 主引导记录

文章目录前言mbs.S代码实验操作前言 本博客记录《操作系统真象还原》第二章最后一节的实验操作~ 实验需要安装Bochs软件,具体可食用Bochs下载安装博客。 实验环境:ubuntu18.04VMware 实验内容:在屏幕上打印字符串“1 MBR”,背…

C进阶_C语言_指针进阶_C语言指针进阶

除了自己的无知,我什么都不懂。 ——苏格拉底 *此博客为进阶指针详解,需要有一定的初阶指针基础。 我们知道,指针就是个变量,用来存放地址,地址唯一标识一块内存空间。 指针的大小是固定的4/8个字节。在32位平台上是…

003-Ensp-实验-配置DHCP

实验要求 1. 根据网络结构开DHCP服务&#xff0c;使PC1 / PC2 自动获取IP地址并可以互Ping 网络结构 实验步骤 1. 配置AR2路由器g0/0/0接口IP&#xff0c;开启DHCP <Huawei>system-view [Huawei]dhcp enable [Huawei]interface g0/0/0 [Huawei-GigabitEthernet0/0/0]…

公司变更名称很麻烦吗?来来来,心周小编教你小技巧

我们都知道&#xff0c;公司如果拥有一个好的名字&#xff0c;对公司的推广会带来很大的便利&#xff0c;让客户更容易记住公司&#xff0c;记住公司的产品及相关性能&#xff0c;比如奥迪汽车公司&#xff0c;大家能一下子想到奥迪车&#xff0c;想到奥迪车的设计&#xff0c;…

UG/NX二开Siemens官方实例解析 4.3 EX_Curve_CreateSpline(创建样条曲线)

前言本系列文章主要讲解NXOpen UF API&#xff08;简称ufun函数&#xff09;的使用&#xff0c;之前看教学视频大都建议用ufun进行开发&#xff0c;这里西门子官方还专门给了一套系列文章来讲&#xff0c;说明官方也是特别推崇ufun。本人从事二开也有一段时间了&#xff0c;我的…

EasyCRM V5客户关系管理系统源码,全功能全插件带手机版无加密开源版,集成OA系统

这个是Easycrm v5最新版本&#xff0c;程序代码全部大量重写&#xff0c;运行效率提升100倍。轻松负载500w以上数据量。 代码全部明文开源&#xff0c;便于二次开发和部署。 网上其他地方的版本都是很遗憾的告诉你&#xff0c;没有手机版&#xff0c;没有财务管理等功能插件。…

【Unity3D编辑器扩展】Unity3D中实现UI界面控制,UI界面的显示和隐藏实现

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客QQ群&#xff1a;1040082875 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 在开发中&#xff0c;可能遇到管理…

EMP v2.5三级共享深度定制对ESM 的支持

版本背景 1 Module Federation 共享逻辑CDN复用性不高2 ESM兼容性日益成熟&#xff0c;性能表现越来越好3 市面上针对 ESM 的模块共享实现不完善4 开发、正式环境结合共享的开发体验不佳 ESM 概念 ESM - ES modules 是 JavaScript 官方的标准化模块系统。相比于 CommonJS 和 …

mysql知识点总结(网安必备)

目录 数据库介绍 数据库基本概念 数据库类型 MySql数据库管理系统 SQL语言 概述 常见操作 表的完整性约束 非外键约束 外键约束 单表查询 函数 多表查询 事务 事务隔离级别 视图 数据库介绍 数据库基本概念 数据&#xff1a;所谓数据&#xff08;Data&#xf…

什么是融合通信?

近年来融合通信概念被广泛提起&#xff0c;那么&#xff0c;什么是融合通信&#xff1f;融合通信可以融合哪些设备或者系统呢&#xff1f; 近代通信技术得益于电话网的出现&#xff0c;人们通过电话实现了跨越式的通信。随着计算机和互联网的出现&#xff0c;人们可以利用互联网…

谷粒学院——十三章、登录与注册

用户登陆业务介绍 单一服务器模式 早期单一服务器&#xff0c;用户认证。 缺点&#xff1a;单点性能压力&#xff0c;无法扩展。 SSO 模式&#xff08;单点登陆&#xff09; 分布式&#xff0c;SSO(single sign on)模式&#xff0c;也叫单点登陆模式。 优点: 用户身份信…

【C++高阶数据结构】图

&#x1f3c6;个人主页&#xff1a;企鹅不叫的博客 ​ &#x1f308;专栏 C语言初阶和进阶C项目Leetcode刷题初阶数据结构与算法C初阶和进阶《深入理解计算机操作系统》《高质量C/C编程》Linux ⭐️ 博主码云gitee链接&#xff1a;代码仓库地址 ⚡若有帮助可以【关注点赞收藏】…

代码随想录拓展day7 649. Dota2 参议院;1221. 分割平衡字符串;5.最长回文子串;132. 分割回文串 II;673.最长递增子序列的个数

代码随想录拓展day7 649. Dota2 参议院&#xff1b;1221. 分割平衡字符串&#xff1b;5.最长回文子串&#xff1b;132. 分割回文串 II&#xff1b;673.最长递增子序列的个数 贪心和动态规划的题目。因为贪心其实没什么规律&#xff0c;所以就简要记录了。 649. Dota2 参议院 …

数据可视化系列-04数据大屏基础知识

文章目录5.销售数据看板5.1 了解数据大屏基础知识1.数据大屏简介&#xff1a;2.数据大屏使用场景3.数据大屏分类5.2 数据大屏的设计&#xff1a;1.大屏前端设计流程2.数据大屏设计尺寸解析3.可视化视觉设计5.3 大屏开发工具DataV&#xff1a;1.DataV数据可视化简介2.优势3.Data…

植物大战僵尸:遍历向日葵的生产速度

找到向日葵的吐出阳光的速度&#xff0c;向日葵生产阳光是一个周期性的,所以其内部是有一个计时器控制的,我们只要找到这个计时器并改写它的定时时间即可完成无限吐阳光的作用 向日葵的遍历技巧: 首先种下一个向日葵 -> 然后CE马上搜索->未知初始化回到游戏->然后在…

关于单相智能多用户远程预付费控系统的优化设计研究

摘要&#xff1a;由于现有系统仅对电表数据进行读取操作&#xff0c;存在成本较高和耗时较长的问题&#xff0c;为此对单相智能多用户远程预付费控系统优化设计进行研究。选择电能表子系统作为优化对象&#xff0c;选取78KO527A微控制器作为电能表子系统的控制核心&#xff0c;…

Java 并发编程 (三)Phaser

#Phaser 功能介绍 CyclicBarrier 解决了 CountDownLatch的缺点&#xff0c;但是其本身也仍然具备一定的缺陷&#xff0c;比如不可以动态添加parties 调用一次await 仅占用1个parties public class MyPhaser {private Phaser phaser new Phaser(3);public void testA(){System…

微信过期文件怎么找回?2个方法,轻松解决

现在很多小伙伴都喜欢使用微信发送文字、图片、语音、照片、文件等内容给对方。可是在其中&#xff0c;文件内容比较特殊。如果没有及时进行查看&#xff0c;过了一段时间就会变成过期文件&#xff0c;无法再进行查看了。微信过期文件怎么找回&#xff1f;今天小编分享2个简单好…

微型消防站一体化指挥作战解决方案

一、政策要求 近年政府对社区微型消防站提出了新的建设要求&#xff1a; 1、 大力发展多种形式消防队伍&#xff0c;逐步加强现役消防力量建设&#xff0c;发展政府专职消防队&#xff0c;企业事业单位专职消防队和志愿消防队。 2、 明确城市消防安全布局和公共消防设施的消…

vue 可视化表单设计器 自定义组件

有一款基于vue的可视化表单编辑器&#xff0c;直接双击或者拖拽组件&#xff0c;便可以创建一个表单&#xff0c;非常方便。今天为大家介绍这款编辑器&#xff1a; 官方地址&#xff1a;Variant Form - 可视化低代码表单 github地址&#xff1a;https://github.com/vform666/…