Fix: 修复拖动/点击桌宠时,主程序发生移动的问题

This commit is contained in:
2025-09-03 15:53:05 +08:00
parent a1183a35d3
commit 57b268008d
3 changed files with 44 additions and 20 deletions

View File

@ -87,7 +87,17 @@ function createWindow() {
// 当渲染进程传来这个事件时,就移动窗口 // 当渲染进程传来这个事件时,就移动窗口
ipcMain.on('move-window', (event, { x, y }) => { ipcMain.on('move-window', (event, { x, y }) => {
mainWindow.setPosition(x, y, true); // true 表示动画平滑移动 // 使用 Math.round 避免非整数坐标可能带来的问题
mainWindow.setPosition(Math.round(x), Math.round(y), false);
});
// 添加一个 handle用于响应前端获取窗口位置的请求
ipcMain.handle('get-window-position', () => {
if (mainWindow) {
const [x, y] = mainWindow.getPosition();
return { x, y };
}
return { x: 0, y: 0 };
}); });
if (process.env.NODE_ENV === "development") { if (process.env.NODE_ENV === "development") {

View File

@ -14,5 +14,7 @@ contextBridge.exposeInMainWorld('electronAPI', {
onUpdatePosition: (callback) => { onUpdatePosition: (callback) => {
ipcRenderer.on('update-position', (_, position) => callback(position)) ipcRenderer.on('update-position', (_, position) => callback(position))
}, },
moveWindow: (position) => ipcRenderer.send('move-window', position) moveWindow: (position) => ipcRenderer.send('move-window', position),
// 暴露获取窗口位置的函数
getWindowPosition: () => ipcRenderer.invoke('get-window-position')
}) })

View File

@ -36,22 +36,30 @@ const playRandomSound = async () => {
setTimeout(() => (showTooltip.value = false), 2000); setTimeout(() => (showTooltip.value = false), 2000);
}; };
// 新的拖拽与点击处理逻辑
const dragState = reactive({ const dragState = reactive({
isDragging: false, // 是否正在拖动 isDragging: false,
hasMoved: false, // 本次拖动是否真的移动了 hasMoved: false,
startX: 0, // 鼠标按下的起始 X 坐标 // 分别记录鼠标和窗口的起始位置
startY: 0, // 鼠标按下的起始 Y 坐标 mouseStartX: 0,
mouseStartY: 0,
windowStartX: 0,
windowStartY: 0,
}); });
// 鼠标按下事件 // 鼠标按下事件 (改为异步函数)
function handleMouseDown(event) { async function handleMouseDown(event) {
dragState.isDragging = true; // 在拖动开始时,先获取窗口的当前位置
dragState.hasMoved = false; // 重置移动状态 const { x, y } = await window.electronAPI.getWindowPosition();
dragState.startX = event.screenX; dragState.windowStartX = x;
dragState.startY = event.screenY; dragState.windowStartY = y;
// 记录鼠标的初始位置
dragState.mouseStartX = event.screenX;
dragState.mouseStartY = event.screenY;
dragState.isDragging = true;
dragState.hasMoved = false;
// 添加全局监听器
window.addEventListener('mousemove', handleMouseMove); window.addEventListener('mousemove', handleMouseMove);
window.addEventListener('mouseup', handleMouseUp); window.addEventListener('mouseup', handleMouseUp);
} }
@ -60,16 +68,20 @@ function handleMouseDown(event) {
function handleMouseMove(event) { function handleMouseMove(event) {
if (!dragState.isDragging) return; if (!dragState.isDragging) return;
const deltaX = event.screenX - dragState.startX; // 计算鼠标从起点移动的距离(偏移量)
const deltaY = event.screenY - dragState.startY; const deltaX = event.screenX - dragState.mouseStartX;
const deltaY = event.screenY - dragState.mouseStartY;
// 如果移动超过一个小阈值例如5像素我们才认为这是一次“拖动” if (!dragState.hasMoved && (Math.abs(deltaX) > 5 || Math.abs(deltaY) > 5)) {
if (Math.abs(deltaX) > 5 || Math.abs(deltaY) > 5) {
dragState.hasMoved = true; dragState.hasMoved = true;
} }
// 实时通知主进程移动窗口 // 计算窗口的新位置 = 窗口初始位置 + 鼠标偏移量
window.electronAPI.moveWindow({ x: event.screenX, y: event.screenY }); const newWindowX = dragState.windowStartX + deltaX;
const newWindowY = dragState.windowStartY + deltaY;
// 将计算出的正确位置发送给主进程
window.electronAPI.moveWindow({ x: newWindowX, y: newWindowY });
} }
// 鼠标抬起事件 // 鼠标抬起事件