Fix: 修复拖动/点击桌宠时,主程序发生移动的问题
This commit is contained in:
12
main/main.js
12
main/main.js
@ -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") {
|
||||||
|
@ -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')
|
||||||
})
|
})
|
@ -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 });
|
||||||
}
|
}
|
||||||
|
|
||||||
// 鼠标抬起事件
|
// 鼠标抬起事件
|
||||||
|
Reference in New Issue
Block a user