fix(lyric-window): 锁定状态启动时同步穿透并禁用 resize

- 重启应用恢复锁定时, 主进程主动 setIgnoreMouseEvents(true), 修复鼠标无法穿透
- 锁定时 setResizable(false), 隐藏窗口边缘 resize 光标
- 由 set-lyric-lock-state IPC 统一驱动, 后续 polling 按位置精细纠正
This commit is contained in:
alger
2026-04-19 15:42:25 +08:00
parent 6b22713854
commit 7282e876f4
2 changed files with 7 additions and 5 deletions
+7 -3
View File
@@ -10,7 +10,7 @@ let isDragging = false;
// 添加窗口大小变化防护
let originalSize = { width: 0, height: 0 };
// 轮询只在 "锁定 + 窗口可见" 时启用解锁态下 DOM 事件足够,避免常驻 50ms 轮询
// 鼠标位置轮询仅在"锁定 + 可见"时启用解锁态下 DOM 事件足够
let mousePresenceTimer: ReturnType<typeof setInterval> | null = null;
let lastMouseInside: boolean | null = null;
let isLyricLocked = false;
@@ -170,7 +170,6 @@ const createWin = () => {
}
});
// 窗口可见性变化时同步轮询状态,避免最小化/隐藏时空转
lyricWindow.on('show', () => {
isLyricWindowVisible = true;
syncMousePresenceTracking();
@@ -285,9 +284,14 @@ export const loadLyricWindow = (ipcMain: IpcMain, mainWin: BrowserWindow): void
}
});
// 渲染端同步锁定状态 → 决定主进程是否需要轮询鼠标位置
ipcMain.on('set-lyric-lock-state', (_, isLocked: boolean) => {
isLyricLocked = isLocked;
if (lyricWindow && !lyricWindow.isDestroyed()) {
// 锁定时禁用 resize,避免鼠标移到边缘仍显示调整光标
lyricWindow.setResizable(!isLocked);
// 设置初始穿透状态,后续 polling 会按实际位置纠正
lyricWindow.setIgnoreMouseEvents(isLocked, { forward: true });
}
syncMousePresenceTracking();
});
-2
View File
@@ -401,7 +401,6 @@ watch(
// 锁定时自动关闭主题色面板
showThemeColorPanel.value = false;
}
// 通知主进程,按需启停鼠标位置轮询
windowData.electron.ipcRenderer.send('set-lyric-lock-state', newLock);
}
);
@@ -797,7 +796,6 @@ onMounted(() => {
}
);
// 同步初始锁定状态到主进程,使其按需启动鼠标位置轮询
windowData.electron.ipcRenderer.send('set-lyric-lock-state', lyricSetting.value.isLock);
});