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

如何让Windows Win32应用启动即无标题栏及窗口控制按钮

解决Flutter Win32窗口启动时显示标题栏边框的问题

问题背景

开发Flutter跨平台应用时,需要启动一个位于屏幕右下角、背景半透明且无标题栏和窗口控制按钮的Win32窗口。当前实现中,应用启动时会先显示完整的边框和标题栏,仅在调整窗口大小后才呈现预期效果:

  • 启动时窗口状态:显示完整标题栏(含最小化、最大化、关闭按钮)和窗口边框
  • 预期窗口状态:无标题栏和控制按钮,仅保留可调整大小的边框,位于屏幕右下角

问题原因

当前代码先以包含标题栏、系统菜单的WS_OVERLAPPEDWINDOW样式创建窗口,之后再修改窗口样式,但样式变更不会自动触发窗口重绘,只有当窗口大小调整时才会刷新,导致启动时显示不符合预期的状态。

解决方案

方案1:创建窗口时直接指定正确样式

直接在CreateWindow调用中使用不含标题栏和系统菜单的样式,从根源避免后续修改:

// 获取屏幕工作区,计算右下角窗口位置
RECT workArea;
SystemParametersInfo(SPI_GETWORKAREA, 0, &workArea, 0);
int winX = workArea.right - Scale(size.width, scale_factor);
int winY = workArea.bottom - Scale(size.height, scale_factor);

HWND window = CreateWindow(
    window_class, title.c_str(),
    // 保留可调整大小的边框,去掉标题栏和控制按钮相关样式
    WS_OVERLAPPED | WS_THICKFRAME,
    winX, winY,
    Scale(size.width, scale_factor), Scale(size.height, scale_factor),
    nullptr, nullptr, GetModuleHandle(nullptr), this);

方案2:修改样式后强制刷新窗口

如果必须保留原创建逻辑,在修改窗口样式后调用SetWindowPos强制窗口应用新样式:

HWND window = CreateWindow(
    window_class, title.c_str(), WS_OVERLAPPEDWINDOW,
    Scale(origin.x, scale_factor), Scale(origin.y, scale_factor),
    Scale(size.width, scale_factor), Scale(size.height, scale_factor),
    nullptr, nullptr, GetModuleHandle(nullptr), this);

// 隐藏窗口控制按钮和标题栏
SetWindowLong(window, GWL_STYLE, GetWindowLong(window, GWL_STYLE) & ~(WS_SYSMENU | WS_CAPTION));

// 强制窗口刷新样式,让修改立即生效
SetWindowPos(window, nullptr, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_FRAMECHANGED);

补充:实现背景半透明效果

若要添加背景半透明,可将窗口设置为分层窗口并调整透明度:

// 开启窗口分层属性
SetWindowLong(window, GWL_EXSTYLE, GetWindowLong(window, GWL_EXSTYLE) | WS_EX_LAYERED);
// 设置透明度(200为半透明值,范围0-255,值越小越透明)
SetLayeredWindowAttributes(window, 0, 200, LWA_ALPHA);

内容的提问来源于stack exchange,提问作者Lau Dijksterhuis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 10:42:36