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:
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
name: pangolin_vpn
|
name: pangolin_vpn
|
||||||
description: 穿山甲 · Pangolin — 极简、稳定、跨平台网络加速客户端。
|
description: 穿山甲 · Pangolin — 极简、稳定、跨平台网络加速客户端。
|
||||||
publish_to: "none"
|
publish_to: "none"
|
||||||
version: 1.0.28+29
|
version: 1.0.29+30
|
||||||
|
|
||||||
environment:
|
environment:
|
||||||
sdk: ^3.5.0
|
sdk: ^3.5.0
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
; 前置: 先在 client/ 跑 `flutter build windows`(Release),产物在
|
; 前置: 先在 client/ 跑 `flutter build windows`(Release),产物在
|
||||||
; ..\..\build\windows\x64\runner\Release
|
; ..\..\build\windows\x64\runner\Release
|
||||||
#define MyAppName "穿山甲 Pangolin"
|
#define MyAppName "穿山甲 Pangolin"
|
||||||
#define MyAppVersion "1.0.28"
|
#define MyAppVersion "1.0.29"
|
||||||
#define MyAppPublisher "Pangolin"
|
#define MyAppPublisher "Pangolin"
|
||||||
#define MyAppExeName "pangolin_vpn.exe"
|
#define MyAppExeName "pangolin_vpn.exe"
|
||||||
#define BuildDir "..\..\build\windows\x64\runner\Release"
|
#define BuildDir "..\..\build\windows\x64\runner\Release"
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
#include "flutter_window.h"
|
#include "flutter_window.h"
|
||||||
|
|
||||||
#include <optional>
|
#include <optional>
|
||||||
|
#include <cwchar>
|
||||||
|
|
||||||
#include "flutter/generated_plugin_registrant.h"
|
#include "flutter/generated_plugin_registrant.h"
|
||||||
|
|
||||||
@@ -27,9 +28,16 @@ bool FlutterWindow::OnCreate() {
|
|||||||
RegisterPlugins(flutter_controller_->engine());
|
RegisterPlugins(flutter_controller_->engine());
|
||||||
SetChildContent(flutter_controller_->view()->GetNativeWindow());
|
SetChildContent(flutter_controller_->view()->GetNativeWindow());
|
||||||
|
|
||||||
|
// 开机自启(命令行带 --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([&]() {
|
flutter_controller_->engine()->SetNextFrameCallback([&]() {
|
||||||
this->Show();
|
this->Show();
|
||||||
});
|
});
|
||||||
|
}
|
||||||
|
|
||||||
// Flutter can complete the first frame before the "show window" callback is
|
// Flutter can complete the first frame before the "show window" callback is
|
||||||
// registered. The following call ensures a frame is pending to ensure the
|
// registered. The following call ensures a frame is pending to ensure the
|
||||||
|
|||||||
Reference in New Issue
Block a user