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

C++ Flutter Windows应用从托盘恢复调用ShowWindow后窗口空白需交互才显示

Flutter Win32窗口隐藏后恢复显示空白问题解决方案

问题根因

当你调用ShowWindow(hwnd, SW_HIDE)隐藏窗口时,Flutter桌面端的Win32嵌入层会暂停渲染逻辑以降低资源占用。你直接调用ShowWindow(hwnd, SW_NORMAL)仅通知系统显示窗口,没有标记窗口区域需要重绘,也没有触发Flutter引擎恢复渲染,所以窗口会显示空白,直到有交互事件触发重绘流程。你之前调用UpdateWindow()无效是因为没有提前标记窗口的无效区域,UpdateWindow仅会重绘被标记为无效的区域,无无效区域时就不会执行任何操作。

解决方案

修改两处恢复窗口的代码逻辑,补全激活窗口、标记无效区域、触发重绘的逻辑:

1. 修改托盘左键点击逻辑

else if (LOWORD(lparam) == WM_LBUTTONDOWN) { // 左键点击托盘图标
    ShowWindow(window, SW_NORMAL);
    // 新增代码开始
    SetForegroundWindow(window);
    InvalidateRect(window, nullptr, TRUE);
    UpdateWindow(window);
    // 新增代码结束
}

2. 修改托盘菜单Show选项点击逻辑

else if (wmId == IDM_SHOW) {
    ShowWindow(window, SW_NORMAL);
    // 新增代码开始
    SetForegroundWindow(window);
    InvalidateRect(window, nullptr, TRUE);
    UpdateWindow(window);
    // 新增代码结束
}

代码说明

  • SetForegroundWindow:将窗口激活并提到前台,通知Flutter引擎恢复正常渲染状态
  • InvalidateRect:传入nullptr表示标记整个窗口区域为待重绘的无效区域,第三个参数为TRUE表示重绘前先清除背景
  • UpdateWindow:立即向窗口发送WM_PAINT消息,触发重绘逻辑,不需要等待消息队列空闲

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.20 04:15:03