You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过HWND实现第三方应用全屏并完全覆盖任务栏?

寻求可靠一致的第三方窗口全屏实现方案(覆盖任务栏)

我正在为Glazewm窗口管理器项目寻找一种可靠且一致的第三方窗口全屏实现方式,目标是让全屏窗口完全覆盖任务栏。

我当前的实现方式是将窗口位置和尺寸设置为匹配当前显示器的参数。这种方法对部分窗口有效,但对另一些窗口来说,任务栏会遮挡窗口底部区域。具体实现代码如下:

use windows::Win32::{
  Foundation::HWND,
  Graphics::Gdi::{
    GetMonitorInfoW, MonitorFromWindow, MONITORINFOEXW,
    MONITOR_DEFAULTTONEAREST,
  },
  UI::WindowsAndMessaging::{
    SetWindowPos, HWND_NOTOPMOST, SWP_FRAMECHANGED, SWP_NOACTIVATE,
    SWP_NOCOPYBITS, SWP_NOSENDCHANGING,
  },
};

pub fn set_fullscreen(window_handle: isize) -> anyhow::Result<()> {
  let monitor_handle = unsafe {
    MonitorFromWindow(HWND(window_handle), MONITOR_DEFAULTTONEAREST)
  };

  let mut monitor = MONITORINFOEXW::default();
  monitor.monitorInfo.cbSize =
    std::mem::size_of::<MONITORINFOEXW>() as u32;

  unsafe {
    GetMonitorInfoW(monitor_handle, &mut monitor as *mut _ as _)
  }
  .ok()?;

  let monitor_rect = monitor.monitorInfo.rcMonitor;

  unsafe {
    SetWindowPos(
      HWND(window_handle),
      HWND_NOTOPMOST,
      monitor_rect.left,
      monitor_rect.top,
      monitor_rect.right - monitor_rect.left,
      monitor_rect.top - monitor_rect.bottom,
      SWP_FRAMECHANGED
        | SWP_NOACTIVATE
        | SWP_NOCOPYBITS
        | SWP_NOSENDCHANGING,
    )
  }?;

  Ok(())
}

我还参考过Raymond Chen的全屏实现文章,尝试了另外两种方法:

  • 移除WS_OVERLAPPEDWINDOW样式:这种方法确实能让窗口覆盖任务栏,但属于侵入式修改,有时会导致窗口出现异常。
  • 将窗口Z序设置为HWND_TOPMOST:这种方法也能覆盖任务栏,但强制窗口始终置顶并不理想。

有趣的是,部分窗口(如Spotify和Visual Studio)即使带有WS_OVERLAPPEDWINDOW样式,也能成功覆盖任务栏。以下是多款应用在普通模式和内置F11全屏模式下的窗口样式对比:

  • VS Code(普通模式)- 当前实现的全屏可覆盖任务栏 ✅
    • styles: MaximizeBox | Group | SizeBox | Caption | ClipSiblings | Visible
    • styles ex: WindowEdge
  • VS Code(内置F11全屏)
    • styles: MaximizeBox | Group | ClipSiblings | Visible
    • styles ex: Left
  • Chrome(普通模式)- 当前实现的全屏无法覆盖任务栏 ❌
    • styles: OverlappedWindow | ClipChildren | ClipSiblings | Visible
    • styles ex: WindowEdge
  • Chrome(内置F11全屏)
    • styles: MaximizeBox | Group | SysMenu | ClipChildren | ClipSiblings | Visible
    • styles ex: Left
  • Obsidian(普通模式)- 当前实现的全屏可覆盖任务栏 ✅
    • styles: MaximizeBox | Group | SizeBox | Caption | ClipSiblings | Visible
    • styles ex: WindowEdge
  • Obsidian(内置F11全屏)
    • styles: MaximizeBox | Group | ClipSiblings | Visible
    • styles ex: Left
  • Spotify(普通模式)- 当前实现的全屏可覆盖任务栏 ✅
    • styles: OverlappedWindow | ClipChildren | ClipSiblings | Visible
    • styles ex: WindowEdge
  • 文件资源管理器(普通模式)- 当前实现的全屏无法覆盖任务栏 ❌
    • styles: OverlappedWindow | ClipSiblings | Visible
    • styles ex: WindowEdge
  • 文件资源管理器(内置F11全屏)
    • styles: Group | SysMenu | ClipSiblings | Visible
    • styles ex: Left
  • Visual Studio(普通模式)- 当前实现的全屏可覆盖任务栏 ✅
    • styles: OverlappedWindow | ClipChildren | ClipSiblings | Visible
    • styles ex: WindowEdge | AppWindow
  • Visual Studio(内置F11全屏)- 有趣的是,样式无变化
    • styles: OverlappedWindow | ClipChildren | ClipSiblings | Visible
    • styles ex: WindowEdge | AppWindow

既然部分带有WS_OVERLAPPEDWINDOW样式的应用能正常实现全屏覆盖任务栏,我想知道是否存在一种能在所有窗口上一致实现该效果的方法。

请问让窗口全屏并完全覆盖任务栏的最可靠、最一致的方法是什么?

内容的提问来源于stack exchange,提问作者L. Berger

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 05:34:49