Files
Leo 59cf9825d1 fix(t75 ④⑤): 連線精靈不再清空輸入+Windows 不再每幾秒閃 console 視窗
leo 同事真機實測撞到的兩個最嚴重問題。

④ 連線失敗會清空使用者輸入(leo:「很糟糕」)
   真兇:失敗後呼叫 showConnectWizard(),註解寫著「不要把他丟回空白畫面」
   **但行為與註解相反**——它重建整個對話框,urlEntry 是全新的,
   而 cfg.CypherURL 因連線失敗根本沒寫入 ⇒ 欄位就是空的 ⇒ 使用者整段重打。
   修:改 showConnectWizardWith(prevURL, prevEmail) 帶回上次輸入,
   讓他只改錯的那個字。密碼不帶回(打錯時重打較安全,也少留記憶體)。

⑤ daemon 開著時每幾秒閃一個方框(約半螢幕)
   真兇:arcrun-collector.exe 是 console 型執行檔,supervisor 每輪 exec 起它,
   **Windows 預設會為 console 程式配可見視窗** ⇒ 每輪閃一次。
   Mac/Linux 無此概念故開發期完全沒想到。
   修:新增 hidewindow_windows.go(HideWindow + CREATE_NO_WINDOW)
   +hidewindow_other.go(no-op),編譯期分平台不寫 runtime.GOOS 判斷。
   註:-H windowsgui 是連結期選項(管自己有沒有視窗),與此(管起別人時給不給視窗)
   是兩件事,兩者都要做才乾淨。

驗證:Mac 與 Windows 交叉編譯皆 exit=0 且產物生成;collector 全測試綠。
⚠️ 未真機驗——⑤ 的效果必須在真 Windows 上確認方框消失。
2026-07-28 00:42:12 +08:00

32 lines
1.3 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
//go:build windows
package supervisor
import (
"os/exec"
"syscall"
)
// CREATE_NO_WINDOW:起子行程時不要配一個新的 console 視窗。
//
// 為什麼需要(t752026-07-28 leo 同事在真 Windows 上實測撞到):
// 使用者回報「**daemon 開啟時每幾秒螢幕會閃一個方框,大概有螢幕一半大,關閉它就消失**」。
// 根因=`arcrun-collector.exe` 是 **console 型執行檔**`PE32+ (console)`),
// supervisor 每輪起它一次,**Windows 預設會為 console 程式配一個可見的視窗** ⇒ 每輪閃一下。
//
// **Mac/Linux 沒有這個概念**,所以這個跨平台差異在開發期完全沒被想到——
// 這也是為什麼「真機驗證」不能只驗自己改過的東西(見 t75 教訓)。
//
// 注意:`-H windowsgui` 是**連結期**選項,只影響「這支程式自己有沒有視窗」;
// 這裡處理的是「**我起別人時要不要給它視窗**」,是不同一件事,兩者都要做才乾淨。
const createNoWindow = 0x08000000
// hideChildWindow 讓子行程不要彈出 console 視窗(僅 Windows 有效)。
func hideChildWindow(cmd *exec.Cmd) {
if cmd.SysProcAttr == nil {
cmd.SysProcAttr = &syscall.SysProcAttr{}
}
cmd.SysProcAttr.HideWindow = true
cmd.SysProcAttr.CreationFlags |= createNoWindow
}