如何创建全屏窗口使同显示器任务栏自动隐藏?
实现单显示器任务栏自动隐藏的全屏窗口方案
核心思路是完全依赖Windows系统原生的全屏窗口识别机制,不需要手动修改任务栏状态,就能实现类似Chrome F11的效果:仅隐藏当前显示器的任务栏,窗口失活时自动恢复。
创建真正的全屏窗口
不要手动调整窗口大小后再去修改任务栏状态,直接创建覆盖目标显示器的无框全屏窗口:- 获取窗口所在显示器的完整区域:用
MonitorFromWindow拿到对应显示器句柄,再通过GetMonitorInfoW获取MONITORINFO里的rcMonitor(包含任务栏在内的整个显示器矩形区域)。 - 修改窗口样式为
WS_POPUP | WS_VISIBLE,去掉标题栏、边框,让系统识别为全屏窗口。 - 调用
SetWindowPos将窗口置顶并铺满整个显示器,确保覆盖所有区域。
- 获取窗口所在显示器的完整区域:用
核心代码片段
切换到全屏的关键代码:// 获取当前窗口所属显示器 HMONITOR hMonitor = MonitorFromWindow(hwnd, MONITOR_DEFAULTTONEAREST); MONITORINFO mi = { sizeof(MONITORINFO) }; GetMonitorInfoW(hMonitor, &mi); // 保存原有窗口状态(用于退出全屏时恢复) LONG originalStyle = GetWindowLongPtrW(hwnd, GWL_STYLE); RECT originalRect; GetWindowRect(hwnd, &originalRect); // 切换为全屏样式 SetWindowLongPtrW(hwnd, GWL_STYLE, WS_POPUP | WS_VISIBLE); SetWindowPos(hwnd, HWND_TOPMOST, mi.rcMonitor.left, mi.rcMonitor.top, mi.rcMonitor.right - mi.rcMonitor.left, mi.rcMonitor.bottom - mi.rcMonitor.top, SWP_FRAMECHANGED | SWP_NOOWNERZORDER);退出全屏恢复状态的代码:
SetWindowLongPtrW(hwnd, GWL_STYLE, originalStyle); SetWindowPos(hwnd, HWND_NOTOPMOST, originalRect.left, originalRect.top, originalRect.right - originalRect.left, originalRect.bottom - originalRect.top, SWP_FRAMECHANGED | SWP_NOOWNERZORDER);为什么不用App Bar接口
你之前使用ABM_SETSTATE或修改Shell托盘窗口的自动隐藏状态,本质是全局修改任务栏配置,所以会影响所有显示器。而系统原生的全屏窗口机制是基于单个显示器和窗口激活状态的:当全屏窗口激活时,系统自动隐藏该显示器的任务栏;窗口失活或退出全屏时,任务栏自动恢复,完全匹配Chrome的表现。额外注意事项
- 不需要监听任务栏相关消息,系统会根据窗口激活状态自动处理任务栏的显示/隐藏。
- 确保窗口没有保留任何边框或标题栏元素,否则系统可能不会将其识别为全屏窗口。
内容的提问来源于stack exchange,提问作者RDH
相关产品推荐
相关产品推荐

