浅谈无效化一个空窗口的后果

news2024/9/22 3:55:08

有时候,你可能会注意到这样一个现象:桌面上的所有窗口都刷新了自身并产生了闪烁。
导致这个现象的原因之一是一个所谓的空句柄窗口 Bug。

如果你研究过 Win32 SDK 编程,则你应该比较熟悉这个函数:InvalidateRect。
调用这个函数可以通知窗口管理器:某个窗口的内容发生了变化,需要重新绘制了。在这个函数中,你还可以传入一个矩形坐标来表明你希望将窗口上的哪个区域标记为无效。

这通常是在窗口中渲染的数据的状态发生了变化,并且你希望窗口使用新数据重新绘制时完成的。

但是,如果你将 NULL 作为窗口句柄传递给 InvalidateRect 函数,则将其视为与早期版本的 Windows 兼容的特殊情况:它使桌面上的所有窗口失效并重新绘制它们。

因此,如果你尝试使窗口无效,但错误检查或计时错误并最终错误地传递了NULL,则结果将是整个屏幕闪烁。

更奇怪的是,将 NULL 作为第一个参数 ValidateRect 传递具有使所有窗口无效的相同行为。(是的,它是“有效化”功能,但它却执行的是无效化)。这个行为也是出于相同的兼容性原因考虑。

这是另一个程序如何依赖错误或未文档化行为的例子,在这种情况下,由于没有严格的参数验证,早期版本的 Windows 处理 NULL 参数的特殊方式。

修改窗口管理器中的几乎任何内容都增加了很有可能会有许多程序依赖于旧行为,也许完全是偶然的,破坏这些程序意味着大公司的愤怒电话,因为他们的工厂控制软件停止了工作。那么,最好还是不要乱动这些古老的代码为妙。

总结

请立即全文搜索你的代码中的所有 InvalidateRect 调用,看看第一个参数是否为 NULL。
反正我等会就会去这样做。感谢作者给我解答了一个窗口闪烁的大谜团。

最后

Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
本文来自:《The consequences of invalidating the null window》

 

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

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

相关文章

C# PaddleInference 图片旋转角度检测

效果 项目 VS2022.net4.8 OpenCvSharp4Sdcb.PaddleInference 代码 using OpenCvSharp; using Sdcb.PaddleInference; using Sdcb.PaddleInference.Native; using System; using System.Drawing; using System.Globalization; using System.Linq; using System.Runtime.Interop…

14天学会:基于J2EE的JAVA WEB基础

系列文章 手把手教你:基于Django的新闻文本分类可视化系统(文本分类由bert实现) 手把手教你:基于python的文本分类(sklearn-决策树和随机森林实现) 手把手教你:岩石样本智能识别系统 一、学习…

港联证券|股票长线投资技巧?

股票长线出资主要是看股票长时间的开展,所以主张从以下几个方面来剖析: 1、经济环境 把握宏观经济大势。股市是宏观经济的风向标,它在宏观经济的大环境中开展,而且经济的变动趋势也会影响长时间出资的收益。假如出资者能够把握住…

【java】修改JsonObject中的属性值

Java修改JsonObject中的属性值 <!-- 阿里JSON解析器 --><dependency><groupId>com.alibaba.fastjson2</groupId><artifactId>fastjson2</artifactId><version>2.0.16</version></dependency>例子 public static void m…

设计师都在找的在线SVG编辑工具!赶快收藏

为了方便设计师编辑和修改SVG图形&#xff0c;本文将介绍5款易于使用的在线SVG编辑工具&#xff0c;一起来看看吧&#xff01; 1、即时设计 即时设计是一款强大的在线SVG编辑工具&#xff0c;它可以支持路径编辑、形状编辑、填充和边框编辑、文本编辑等多种编辑需求&#xff…

人工智能套装 Ai Kit 横向测评

本文涉及到的产品 1 mechArm 270 2 mycobot 280 3 mypalletizer 260 4 AI kit 主题内容 今天的文章的主题主要介绍一下跟aikit 套件搭配的三款机械臂&#xff0c;它们之间分别有什么不一样的地方。 前言 假如说你有一台机械臂的话&#xff0c;你会用它来干什么呢&#…

【Django学习】(十一)APIView_请求与响应_GenericAPIView

继承DRF中APIView之后&#xff0c;那么当前视图就具备了认证、授权、限流等功能 继承DRF中APIView之后&#xff0c;每一个实例方法中的request为Request对象 Request类拓展了Django中的HttpRequest类&#xff0c;具备很多额外优秀的功能Request类与HttpRequest类中的所有功能兼…

2022年06月份青少年软件编程Scratch图形化等级考试试卷二级真题(含答案)

2022-06 Scratch真题二级 分数&#xff1a;100 题数&#xff1a;37 一、单选题(共25题&#xff0c;共50分) 1.角色初始位置如图所示&#xff0c;下面哪个选项能让角色移到舞台的左下角&#xff1f;&#xff08; &#xff09;(2分) A. B. C. D. 2.点击绿旗&#xff0c;执…

【面试题27】Redis中的connect和pconnect如何使用,有什么区别

文章目录 一、背景二、connect函数三、pconnect函数四、区别和使用场景五、总结 一、背景 本文已收录于PHP全栈系列专栏&#xff1a;PHP面试专区。 计划将全覆盖PHP开发领域所有的面试题&#xff0c;对标资深工程师/架构师序列&#xff0c;欢迎大家提前关注锁定。 Redis是一个开…

六、HAL_Timer的PWM功能

1、开发环境 (1)Keil MDK: V5.38.0.0 (2)STM32CubeMX: V6.8.1 (3)MCU: STM32F407XGT6 2、PWM简介 2.1、什么是PWM (1)PWM是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用&#xff0c;方波的占空比被调制用来对一个具体模拟信号的电平进行编码。 (2)P…

Empirical Evaluation of Gated Recurrent Neural Networks on Sequence Modeling

感想&#xff1a;由于看不懂官方代码的原因&#xff0c;自己这方面耽误了一段时间&#xff0c;一方面&#xff0c;在AI与经济学之间犹豫了许久&#xff0c;另一方面&#xff0c;工作 了半年&#xff0c;也没发工资&#xff0c;没空找培训代码的课程&#xff0c;所以停止更新了三…

Nginx-代理服务器详解

本文已收录于专栏 《中间件合集》 目录 概念说明Nginx代理 提供服务总结提升 概念说明 Nginx Nginx是一个高性能的HTTP和反向代理web服务器&#xff0c;同时也提供了IMAP/POP3/SMTP服务。它具有很多非常优越的特性&#xff1a;在连接高并发的情况下&#xff0c;Nginx是Aoache服…

机器学习算法之决策树(decision tree)

1 决策树算法介绍 决策树(Decision Tree,又称为判定树)算法是机器学习中常见的一类算法&#xff0c;是一种以树结构形式表达的预测分析模型。决策树属于监督学习&#xff08;Supervised learning&#xff09;&#xff0c;根据处理数据类型的不同&#xff0c;决策树又为分类决策…

html 模板

模板王 - 10000免费网页模板&#xff0c;网站模板下载大全 (mobanwang.com)http://www.mobanwang.com/

C++ string中内置的字符串操作和标准库中常用字符处理函数

&#x1f4af; 博客内容&#xff1a;C读取一行内个数不定的整数的方式 &#x1f600; 作  者&#xff1a;陈大大陈 &#x1f680; 个人简介&#xff1a;一个正在努力学技术的准前端&#xff0c;专注基础和实战分享 &#xff0c;欢迎私信&#xff01; &#x1f496; 欢迎大家&…

Qt之QDialog 自定义标题栏

简述 Qt自带标题栏功能还是很强大的&#xff0c;但是确实不能百分百满足需求&#xff0c;除了丑以外还不能随意更改标题栏字体&#xff0c;也不能更改样式&#xff1b;所以为了满足自己的虚荣心让标题栏变得更加好用看好看&#xff0c;特地花时间做了以下测试&#xff1b; 支持…

SpringBoot通过获取请求参数或者Headers上的特殊标识实现i18n国际化

实现效果 我们大部分都是把i18n的标识放在Headers上面&#xff1b;而把标识放在参数上的话比较少&#xff0c;放参数上的话一般是在使用a标签下载某些文件不好配置请求头的时候才使用上 配置在Headers上面&#xff1a; 配置在params上面&#xff1a; 配置代码&#xff1a; /**…

Django_类视图(五)

目录 类视图优点 使用方法 定义类视图 添加类视图路由 类视图原理 类视图的二次封装 类视图二次封装代码如下 编写视图 配置路由 访问url结果 源码等资料获取方法 类视图优点 使用django的函数视图&#xff0c;如果要让同一个视图实现不同的请求方式实现不同的逻辑…

Android Studio实现内容丰富的安卓社交论坛平台

如需源码可以添加q-------3290510686&#xff0c;也有演示视频演示具体功能&#xff0c;源码不免费&#xff0c;尊重创作&#xff0c;尊重劳动。 项目编号085 1.开发环境 android stuido jdk1.8 eclipse mysql tomcat 2.功能介绍 安卓端&#xff1a; 1.注册登录 2.查看公告 3.视…

静态路由介绍

目录 静态路由配置方法&#xff08;基本配置&#xff09;&#xff1a; 静态路由的拓展配置 负载均衡 1.环回接口——测试 2.手工汇总——子网汇总 3.路由黑洞&#xff08;黑洞路由) 4.缺省路由 5.空接口——NULL 0 静态路由配置方法&#xff08;基本配置&#xff09;&#xff1…