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
+1 -1
View File
@@ -1,7 +1,7 @@
name: pangolin_vpn
description: 穿山甲 · Pangolin — 极简、稳定、跨平台网络加速客户端。
publish_to: "none"
version: 1.0.28+29
version: 1.0.29+30
environment:
sdk: ^3.5.0
+1 -1
View File
@@ -3,7 +3,7 @@
; 前置: 先在 client/ 跑 `flutter build windows`(Release),产物在
; ..\..\build\windows\x64\runner\Release
#define MyAppName "穿山甲 Pangolin"
#define MyAppVersion "1.0.28"
#define MyAppVersion "1.0.29"
#define MyAppPublisher "Pangolin"
#define MyAppExeName "pangolin_vpn.exe"
#define BuildDir "..\..\build\windows\x64\runner\Release"
+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