fix(client/windows): 任务栏图标 + 关闭窗口不再断连接

- 关闭窗口断连接:onExitRequested 原先无条件 _teardownVpn 再退出;Windows 点 X
  会触发该回调拆隧道,而 window_manager 的 preventClose 又把窗口仅隐藏到托盘
  → 出现「一关就断网、进程还在」。改为 Windows 下点 X/Alt+F4 取消退出+隐藏,
  保持隧道;真正退出只走托盘「退出」(onBeforeQuit 标记 _isQuitting 再拆隧道)。
  macOS Cmd+Q 仍正常拆隧道退出。
- 任务栏图标没换:仅靠 WNDCLASS.hIcon(LoadIcon 单尺寸)任务栏可能拿不到正确
  尺寸。窗口创建后用 LoadImage 按系统 SM_CXICON/SM_CXSMICON 各取一份,
  WM_SETICON 显式设 ICON_BIG(任务栏/Alt-Tab)+ ICON_SMALL(标题栏)。
- 版本 1.0.1 → 1.0.2。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
wangjia
2026-06-22 17:53:34 +08:00
parent 94993b21b4
commit 5ea4e1ae03
4 changed files with 37 additions and 4 deletions
+19
View File
@@ -144,6 +144,25 @@ bool Win32Window::Create(const std::wstring& title,
return false;
}
// 显式给窗口设大/小两种图标:任务栏 / Alt-Tab 用 ICON_BIG(32px),标题栏用
// ICON_SMALL(16px)。仅靠 WNDCLASS.hIcon(LoadIcon 取单一尺寸)时,任务栏可能
// 拿不到正确尺寸而沿用旧/默认图标 —— 从多尺寸 app_icon.ico 按系统尺寸各取一份。
HINSTANCE instance = GetModuleHandle(nullptr);
HANDLE big_icon = LoadImage(instance, MAKEINTRESOURCE(IDI_APP_ICON), IMAGE_ICON,
GetSystemMetrics(SM_CXICON),
GetSystemMetrics(SM_CYICON), LR_DEFAULTCOLOR);
HANDLE small_icon = LoadImage(instance, MAKEINTRESOURCE(IDI_APP_ICON), IMAGE_ICON,
GetSystemMetrics(SM_CXSMICON),
GetSystemMetrics(SM_CYSMICON), LR_DEFAULTCOLOR);
if (big_icon) {
SendMessage(window, WM_SETICON, ICON_BIG,
reinterpret_cast<LPARAM>(big_icon));
}
if (small_icon) {
SendMessage(window, WM_SETICON, ICON_SMALL,
reinterpret_cast<LPARAM>(small_icon));
}
UpdateTheme(window);
return OnCreate();