翻译《The Old New Thing》 - How do I cover the taskbar with a fullscreen window?

How do I cover the taskbar with a fullscreen window? - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20050505-04/?p=35703

Raymond Chen 2005年5月5日


如何用全屏窗口覆盖任务栏?

很多时候,人们总是想得太多。如果你想创建一个覆盖任务栏的全屏窗口,只需创建一个全屏窗口,任务栏会自动让路。不要到处寻找任务栏并试图控制它;让任务栏自然地完成其功能。

一如既往,从我们的 scratch程序 开始,并添加以下代码:

cpp 复制代码
HWND CreateFullscreenWindow(HWND hwnd) {
    HMONITOR hmon = MonitorFromWindow(hwnd,
                                        MONITOR_DEFAULTTONEAREST);
    MONITORINFO mi = { sizeof(mi) };
    if (!GetMonitorInfo(hmon, &mi)) return NULL;
    return CreateWindow(TEXT("static"),
                       TEXT("something interesting might go here"),
                       WS_POPUP | WS_VISIBLE,
                       mi.rcMonitor.left,
                       mi.rcMonitor.top,
                       mi.rcMonitor.right - mi.rcMonitor.left,
                       mi.rcMonitor.bottom - mi.rcMonitor.top,
                       hwnd, NULL, g_hinst, 0);
}

void OnChar(HWND hwnd, TCHAR ch, int cRepeat) {
    if (ch == TEXT(' ')) {
        CreateFullscreenWindow(hwnd);
    }
}

HANDLE_MSG(hwnd, WM_CHAR, OnChar);

请注意,本示例程序并未处理销毁全屏窗口的逻辑,或者防止用户创建多个全屏窗口。它仅作为一个示例存在。关键之处在于观察 CreateFullScreenWindow 函数的编写方式。

我们利用 MonitorFromWindow 函数来确定应该在哪个监视器上实现全屏显示。在多监视器系统中,这可能与任务栏所在的监视器不同。幸运的是,我们无需担心此问题;任务栏自行处理。

我曾见过有人寻找任务栏窗口,然后对其执行 ShowWindow(hwndTaskbar, SW_HIDE)。这种做法有多种原因但不明智。

首先,当你评估此类技巧时,应始终进行一个思维练习:"如果两个程序尝试使用此技巧会怎样?"此时,两个程序都认为自己负责隐藏和显示任务栏,且两者之间没有协调。结果是混乱。一个程序隐藏了任务栏,紧接着另一个程序也这样做,然后第一个程序认为它已完成操作因此又显示了任务栏,但第二个程序尚未完成,它预期任务栏应该是隐藏的,却意外地发现任务栏是可见的。

事情只会由此变得更加糟糕。

其次,如果你的程序在有机会重新显示任务栏之前崩溃怎么办?任务栏将被永久隐藏,用户不得不注销并重新登录才能恢复任务栏。这显然不够友好。

第三,如果根本没有任务栏呢?在终端服务器场景中,通常在没有 Explorer 的情况下运行程序。在这种配置下,不存在 Explorer,也没有任务栏。或者你可能会在 Windows 的未来版本上运行程序,届时任务栏可能已被其他机制取代。

在这些情况下,你的程序将如何应对?

不要对任务栏进行任何不必要的操作。只需创建你的全屏窗口,让任务栏自动完成其应有的行为。

相关推荐
王维同学6 分钟前
IFEO Debugger、VerifierDlls 与 SilentProcessExit 配置
c++·windows·安全·注册表
小保CPP22 分钟前
OpenCV C++计算多边形的最大内切圆
c++·人工智能·opencv·计算机视觉
lueluelue472 小时前
八股临时总结
c++
您^_^2 小时前
使用技巧(十一):Claude Code 最强审问官 —— grill-me 深度指南,装完先别写代码
人工智能·windows·个人开发·claudecode·deepseek v4 pro
酉鬼女又兒3 小时前
[特殊字符]零基础入门AI:归纳演绎、假设空间、归纳偏好、NFL、过拟合与欠拟合、模型评估选择、超参数、性能度量、混淆矩阵、P-R曲线和F1
人工智能·windows·python·深度学习·安全·机器学习·矩阵
xvhao20133 小时前
T750414 【游戏】计算24点 题解
数据结构·c++·算法·游戏
草莓熊Lotso3 小时前
【LangChain】核心组件详解:文档加载器(Document Loaders)
开发语言·c++·python·langchain·软件工程
ysa0510304 小时前
优先队列贪心dp
c++·笔记·算法·板子
山城码农笑松哥4 小时前
C盘空间救星:一键无损迁移软件数据到其他盘
windows·c盘清理迁移
WangWei_CM4 小时前
IFEO Debugger、VerifierDlls 与 SilentProcessExit 配置
windows