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
相关产品推荐
相关产品推荐

