翻译《The Old New Thing》- 如何创建一个与屏幕大小相同的窗口,而不会被当作全屏窗口处理?

How can I create a window the size of the screen without it being treated as a fullscreen window? - The Old New Thinghttps://devblogs.microsoft.com/oldnewthing/20250522-00/?p=111211


问题描述

        任务栏允许全屏窗口覆盖它。这样,当你在放映幻灯片或进行演示时,屏幕底部不会显示任务栏。自动检测算法在大多数情况下工作得相当好:如果窗口的客户区覆盖了整个屏幕,那么它就被认为是全屏窗口。

        但你可能会发现,任务栏有时会将你的窗口误认为是全屏窗口,尽管你并不希望如此;或者当你希望窗口被视为全屏时,任务栏却未能将其识别为全屏。

        一种你不想让屏幕大小的窗口被当作全屏窗口的情况是,如果你的窗口试图对屏幕应用某种效果,比如显示一个 50% 透明度的黑色窗口以实现暗化效果,就像“查找我的鼠标”PowerToy 所使用的那样。而一种你希望强制将屏幕大小的窗口当作全屏窗口的情况是,如果你的窗口有标题栏,因为标题栏是非客户区,而全屏计算只考虑客户区。

        你有两种方法可以影响这一决策,这两种方法都在同一页面上有文档说明:一种是使用 ITaskbarList2::MarkFullscreenWindow另一种是使用 NonRudeHWND 窗口属性。

        这两种设置在某种程度上是互补的,它们有各自适用的场合。

译注

MarkFullscreenWindowNonRudeHWND 这两种设置在功能上是相互补充的,但它们的作用方向是相反的:

  • MarkFullscreenWindow

    • 作用:当你调用 MarkFullscreenWindow 并传递 TRUE 时,明确地告诉任务栏“这个窗口是全屏窗口”。任务栏会根据这个声明将窗口视为全屏,并相应地隐藏任务栏。

    • 这个设置倾向于让任务栏将窗口识别为全屏窗口。

    • 例子:如果你有一个带有标题栏的全屏窗口,任务栏可能会因为标题栏的存在而不将其视为全屏窗口。通过调用 MarkFullscreenWindow(TRUE),你可以强制任务栏将窗口视为全屏。

  • NonRudeHWND

    • 作用:当你设置 NonRudeHWND 属性为 1 时,你明确地告诉任务栏“这个窗口不是全屏窗口”。任务栏会根据这个声明将窗口视为非全屏,并相应地显示任务栏。

    • 这个设置倾向于让任务栏将窗口识别为非全屏窗口。

    • 例子:如果你有一个覆盖整个屏幕的窗口,但你希望任务栏仍然可见(比如为了显示某些状态信息),通过设置 NonRudeHWND 属性为 1,你可以强制任务栏将窗口视为非全屏。

举个例子

  • 场景1:你有一个全屏窗口,但任务栏没有将其识别为全屏窗口(可能是因为窗口的某些非客户区部分导致任务栏误判)。

    • 解决方案:调用 MarkFullscreenWindow(TRUE),明确告诉任务栏这个窗口是全屏的。

  • 场景2:你有一个覆盖整个屏幕的窗口,但你希望任务栏仍然可见(比如为了显示某些状态信息)。

    • 解决方案:设置 NonRudeHWND 属性为 1,明确告诉任务栏这个窗口不是全屏的。

        如果你向 ITaskbarList2::MarkFullscreenWindow 传递 TRUE,那么你就是在声明你的窗口是一个全屏窗口。¹ 如果你传递 FALSE,那么你就是在取消这一声明。注意,传递 FALSE 并不意味着“我声明这不是一个全屏窗口”。相反,它的意思是“我没有声明这是一个全屏窗口”。

        你可以在显示窗口之前调用 MarkFullscreenWindow,也可以在窗口已经显示的情况下调用它,这种情况下它会立即生效。然而,一旦你隐藏了窗口,你应用的任何设置都会丢失。如果你想让它在窗口下一次显示时继续生效,你需要再次设置它。如果资源管理器崩溃,标记也会丢失,因此要监听 TaskbarCreated 消息并重新应用你的标记。

        当窗口显示时,或者当系统检测到你的窗口可能是一个全屏窗口时(比如当它改变大小以覆盖屏幕时),会咨询 NonRudeHWND 属性。在决策做出后更改该值,直到系统需要做出新的决策之前都不会有任何效果,比如如果你隐藏你的窗口然后再显示它。如果 NonRudeHWND 属性被设置为 1,那么你就是在声明你的窗口肯定不是一个全屏窗口。移除该属性并不会强制你的窗口被当作全屏窗口;相反,它的意思是“继续你正常的全屏检测逻辑”。

        各种情况总结如下:

MarkFullscreenWindowNonRudeHWND
设置后的效果窗口被视为全屏窗口被视为非全屏
最佳调用时机在显示或调整窗口大小之前
调用频率每次显示窗口时一次即可
如果在窗口可见时更改生效无事发生
如果 TaskbarCreated需要再次调用不需要

¹ 窗口仍然必须满足一些基本标准,比如,你知道的,窗口需要实际上覆盖了屏幕(窗口的客户区(client area)必须覆盖整个屏幕。换句话说,窗口的大小和位置必须使得它看起来像是一个全屏窗口)。你不能创建一个小小的 1×1 窗口并宣称“我是一个全屏窗口!”

好吧,你非要也可以,反正别人会嘲笑你。🤪

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

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

相关文章

深分页末日救星:MySQL延迟关联原理与实战手册

MySQL 深分页(如 LIMIT 100000, 10)本质是 高代价的偏移量扫描,可通过以下方案优化,附核心原理和实操示例: 一、深分页为什么慢? SELECT * FROM orders ORDER BY id DESC LIMIT 100000, 10; 执行过程&…

前端技术栈 —— HTML、CSS和JavaScirpt执行环境

以下内容由GLM回答生成,不保证正确性。 前端技术栈 —— HTML、CSS和JavaScirpt执行环境 JavaScript 的执行环境HTML 和 CSS 的执行环境HTML 和 CSS 是否可以在其他环境中执行?总结 JavaScript 是一种 解释型语言,但它也可以被编译。JavaScr…

多项式带余除法——线性代数题目为例

一、多项式带余除法的定义 二、例题 使用方法将在例题中展示:

学习日记-spring-day40-7.3

知识点: 1.自动装配Resource(3) 知识点 核心内容 重点 Autowired与Resource注入规则 默认注入逻辑:未指定参数时,Resource优先按属性名匹配(by name),失败后按类型匹配&#xf…

重新认识JNIEnv

引言 抛开一堆概念,我们从本质出发。 java 调用c 我们开发移动端或者后端服务 ,都是用的java 或者kotlin 语言。有时候我们需要用c的一些库(ocr识别/导航的算法/ 等) 因为一些跟硬件相关的接口或者系统的api 都是c写的。 C调用J…

人工智能训练师——智能语音识别ASR

人机对话——ASR 概念 ASR(Automatic Speech Recognition,自动语音识别)是一种将人类语音转换为文本的技术。它使得计算机能够“听”懂人类的语音指令或对话,并将其转换成可读、可编辑的文本形式。ASR技术是人机交互领域中的一个…

Compose 常用命令详解——AI教你学Docker

3.3 Compose 常用命令详解 Docker Compose 通过一系列命令高效管理多容器应用。理解这些命令,可以让你灵活地启动、停止、查看、调试、扩缩容和配置 Compose 项目。 一、核心命令详解 1. docker compose up 功能:启动并构建所有服务,生成网…

Mausezahn - 网络流量生成与测试工具(支持从链路层到应用层的协议模拟)

Mausezahn 是一个 网络流量生成与测试工具,主要用于模拟各种网络协议行为、测试网络设备性能、验证安全策略或进行故障排查。它支持从底层链路层(如 Ethernet、VLAN)到高层应用层(如 HTTP、DNS)的协议模拟,…

08-three.js Textures

Three.js Journey — Learn WebGL with Three.jsThe ultimate Three.js course whether you are a beginner or a more advanced developerhttps://threejs-journey.com/?c=p3 使用原生 JavaScript 首先是静态页面的放置位置,如果使用Vite模版配置,可以直接放在 /static/ …

git 仓库取消合并的分支

要取消 Git 仓库中某次特定的分支合并(例如第一次合并),同时保留其他分支的合并,需要通过 Git 的版本控制功能来操作。以下是具体的步骤和方法,假设你想撤销某次合并(例如某个提交),并确保其他合并不受影响: 背景假设 你有一个 Git 仓库,主分支(例如 main)上已经合…

【从历史数据分析英特尔该如何摆脱困境】

与大多数其他分析师不同,自2013年以来,笔者就一直在积极强调英特尔未来将遭遇冰山,最终我们预测英特尔将在试图执行其之前的战略时破产。尽管我们更愿意采用与英特尔不同的代工厂方法(即与台积电成立合资企业)&#xf…

【PyTorch】PyTorch中张量(Tensor)微分操作

PyTorch深度学习总结 第六章 PyTorch中张量(Tensor)微分操作 文章目录 PyTorch深度学习总结前言一、torch.autograd模块二、主要功能和使用方法1. 张量的 requires_grad 属性2. backward() 方法3. torch.no_grad() 上下文管理器三、函数总结前言 上文介绍了PyTorch中张量(Ten…

Rust 项目实战:Flappy Bird 游戏

Rust 项目实战:Flappy Bird 游戏 Rust 项目实战:Flappy Bird 游戏理解 Game loop开发库:bracket-libbracket-terminalCodepage 437导入 bracket-lib 创建游戏游戏的模式添加玩家添加障碍最终效果项目源码 Rust 项目实战:Flappy Bi…

Gin 中间件详解与实践

一、中间件的核心概念 定义 中间件是Web开发中非常重要的概念,它可以在请求到达最终处理函数之前或响应返回客户端之前执行一系列操作。Gin 框架支持自定义和使用内置的中间件,让你在请求到达路由处理函数前进行一系列预处理操作。 它是介于请求与响应处…

非接触式DIC测量系统:助力汽车研发与测试的创新技术应用

近年来,随着新能源汽车品牌的快速崛起,新车发布的节奏加快,层出不穷的新产品,给消费者带来了全新的使用体验。与此同时,变革的产品体验也让一些过往的汽车测试和评价标准变得不再适用,尤其是与过往燃油车型…

FOC学习笔记(7)锁相环(PLL)原理及其在电机控制中的应用

1. 锁相环(PLL)概述 锁相环(Phase-Locked Loop, PLL)是一种闭环控制系统,用于使输出信号的相位与输入参考信号的相位同步。PLL广泛应用于通信、电机控制、频率合成、时钟恢复等领域。在电机无传感器控制(Sensorless Control&…

鸿蒙自定义相机的拍照页面

1、权限申请 "requestPermissions": [{"name": "ohos.permission.CAMERA","reason": "$string:reason_camera","usedScene": {"abilities": ["EntryAbility"]}},{"name": "oh…

greenplum7.2并行备份及恢复

1.并行备份 pg_dump -Fd --gp-syntax -U gpadmin -p 5432 -h 172.19.0.2 -d postgres -j 4 -f /opt/greenplum/data/postgres_backup_$(date %Y-%m-%d) 参数 含义 -Fd 使用 directory 格式(支持并行) --gp-syntax 使用 Greenplum 特定语法(…

备赛2025年初中古诗文大会:练习历年真题,吃透知识点(0703)

初中古诗文大会的比赛内容古诗词、文言文各占比50%左右,从历年的比赛来看,中考语文的古诗文部分(35分)涉及到的古诗词、文言文知识点都在初中古诗文大会中考过。这些知识点掌握了,对于将来高中、高考也有直接的帮助。 …

BRAKER:真核微生物cds和蛋白注释

https://github.com/Gaius-Augustus/BRAKER 安装 # 第一次打开会pull这个docker docker run --user 1000:100 --rm -it teambraker/braker3:latest bash bash /opt/BRAKER/example/docker-tests/test3.sh braker.gtf:BRAKER 的最终基因集。 braker.codingseq&am…