修正被 VS Code 蓋住:定期重新宣告置頂
摘要: 每 2 秒重新宣告一次置頂,並在螢幕配置變動與啟動後各補一次。 根本原因: Windows 會把視窗踢出 topmost band,卻留著 WS_EX_TOPMOST 樣式位元。 以 Win32 檢查實際情況:寵物視窗的 exStyle 是 0x08280028(含 WS_EX_TOPMOST), 但 z-order 排在 Z=4,而兩個 TOPMOST=false 的 VS Code 視窗排在 Z=1 與 Z=2, 也就是它們蓋在寵物上面。Electron 這邊仍以為自己是置頂的, setAlwaysOnTop 已經在建立視窗時與勾選選單時都設過,所以不會自己修好。 影響: 寵物被 VS Code 之類的一般視窗蓋住,只能重啟或重新勾一次選單的「永遠置頂」。 修法: - 新增 reassertTopmost():setAlwaysOnTop(true, "screen-saver") 之後再呼叫 moveTop()。 單靠 setAlwaysOnTop 不夠——狀態沒變時它可能不會真的呼叫 SetWindowPos; moveTop() 會強制 SetWindowPos,對 WS_EX_TOPMOST 的視窗即為插回 topmost band 最上面。 視窗是 WS_EX_NOACTIVATE + focusable:false(已用 Win32 確認),不會搶焦點。 - 每 TOPMOST_REASSERT_MS(2000)呼叫一次;display-metrics-changed / added / removed 也各接一次,因為螢幕配置變動最容易觸發降級。 - ready-to-show 的 showInactive 後補一次;選單勾選置頂時也補一次。 - 拖曳中(dragTimer 存在)跳過,避免和每 16 ms 的位置更新打架。 - 結束時清掉 timer。 驗證: - 先從外部對執行中的視窗呼叫 SetWindowPos(HWND_TOPMOST) 確認這正是有效解: 寵物由 Z=4 移到 Z=0,兩個 VS Code 視窗退到 Z=5、Z=6。 - 再以改好的版本實測守護行為,用 SetWindowPos(HWND_BOTTOM) 模擬 Windows 的降級: 基準 petZ=0 TOPMOST=true 上方 0 個;強制降級後 petZ=17 TOPMOST=false 上方 4 個 (VS Code 兩個、CM 等);1 秒後回到 petZ=0 TOPMOST=true 上方 0 個;3 秒後維持。 - 以 ELECTRON_RUN_AS_NODE 讀打包後 app.asar,確認版本 2.0.8 與八項改動都在出貨檔案裡。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Generated
+2
-2
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"name": "claude-pet",
|
||||
"version": "2.0.7",
|
||||
"version": "2.0.8",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "claude-pet",
|
||||
"version": "2.0.7",
|
||||
"version": "2.0.8",
|
||||
"devDependencies": {
|
||||
"electron": "^43.4.1",
|
||||
"electron-builder": "^26.0.12"
|
||||
|
||||
Reference in New Issue
Block a user