diff --git a/src/main/lyric.ts b/src/main/lyric.ts index 61e9925..46b31e9 100644 --- a/src/main/lyric.ts +++ b/src/main/lyric.ts @@ -10,7 +10,7 @@ let isDragging = false; // 添加窗口大小变化防护 let originalSize = { width: 0, height: 0 }; -// 轮询只在 "锁定 + 窗口可见" 时启用:解锁状态下 DOM 事件足够,避免常驻 50ms 轮询 +// 鼠标位置轮询仅在"锁定 + 可见"时启用,解锁态下 DOM 事件已足够 let mousePresenceTimer: ReturnType | 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(); }); diff --git a/src/renderer/views/lyric/index.vue b/src/renderer/views/lyric/index.vue index 56536fb..b189fb9 100644 --- a/src/renderer/views/lyric/index.vue +++ b/src/renderer/views/lyric/index.vue @@ -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); });