fix(client): 开机自启隐藏窗口在原生 runner 层跳过首帧 Show()(1.0.29)

1.0.28 的 Dart hide() 早于 Flutter Windows runner 首帧回调的 Show(),被覆盖,
窗口仍弹出。改在 flutter_window.cpp 检测命令行 --autostart 时不注册首帧 Show()
回调,窗口(WS_OVERLAPPEDWINDOW 无 WS_VISIBLE)保持隐藏;Dart hide() 保留以同步
window_manager 状态。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
wangjia
2026-06-29 20:20:55 +08:00
parent 49bef2fb27
commit 701d9eb095
3 changed files with 13 additions and 5 deletions
+11 -3
View File
@@ -1,6 +1,7 @@
#include "flutter_window.h"
#include <optional>
#include <cwchar>
#include "flutter/generated_plugin_registrant.h"
@@ -27,9 +28,16 @@ bool FlutterWindow::OnCreate() {
RegisterPlugins(flutter_controller_->engine());
SetChildContent(flutter_controller_->view()->GetNativeWindow());
flutter_controller_->engine()->SetNextFrameCallback([&]() {
this->Show();
});
// 开机自启(命令行带 --autostart):跳过首帧的 Show(),窗口保持隐藏到托盘。
// 窗口以 WS_OVERLAPPEDWINDOW(不含 WS_VISIBLE)创建,本就隐藏,只靠这个回调显示;
// 不注册回调即一直不显示。否则首帧回调的 Show() 会覆盖 Dart 侧的 hide(),窗口仍弹出。
const wchar_t* cmd = GetCommandLineW();
const bool autostart = cmd != nullptr && wcsstr(cmd, L"--autostart") != nullptr;
if (!autostart) {
flutter_controller_->engine()->SetNextFrameCallback([&]() {
this->Show();
});
}
// Flutter can complete the first frame before the "show window" callback is
// registered. The following call ensures a frame is pending to ensure the