如何跟踪电子拖动BrowserWindow?

我有一个BrowserWindow的实例。 我想知道当窗口被拖动/移动在屏幕上。

我已经尝试使用移动的事件,但该事件仅在窗口移动后被触发。 当窗口被拖动时它不会被触发。

如何跟踪窗口被拖动的时间?

我有同样的问题,我用另一种方式解决。 我创build了一个无框浏览器窗口,我用我想要的图标和我想要在网页中加载的这个窗口中的侦听器来制作我的“系统栏”。

这工作正常,并不昂贵。

let wX; let wY; let dragging = false; $('#systembar').mousedown(function (e) { ipcRenderer.send('asynchronous-message', 'down') dragging = true; wX = e.pageX; wY = e.pageY; }); $(window).mousemove(function (e) { e.stopPropagation(); e.preventDefault(); if (dragging) { var xLoc = e.screenX - wX; var yLoc = e.screenY - wY; try { remote.BrowserWindow.getFocusedWindow().setPosition(xLoc, yLoc); } catch (err) { console.log(err); } } }); $('#systembar').mouseup(function () { dragging = false; ipcRenderer.send('asynchronous-message', 'up') }); 

Electron API在拖动过程中似乎没有提供对实际窗口位置的跟踪。

但是,并非试图追踪窗口本身的新位置,而是可以在可拖动窗口区域中追踪鼠标光标在mousedown期间的移动。

代码大纲:

  • 检测拖动事件
  • 拖动区域范围内的拖动事件
  • 使用mousemove事件跟踪鼠标光标移动

您可以不断检查window.screenXwindow.screenY值是否已更改。 有以下几点:

 function onScreenMove(cb) { var lastScreenX; var lastScreenY; function detectScreenMove() { if (lastScreenY !== window.screenY || lastScreenX !== window.screenX) { lastScreenY = window.screenY; lastScreenX = window.screenX; cb(); } requestAnimationFrame(detectScreenMove); } requestAnimationFrame(detectScreenMove); } onScreenMove(function() { // do something }); 

据我所知,读取screenX / screenY值的过程并不是很昂贵,所以你不会杀死处理器。

不幸的是, Object.observe()从v50开始已经离开了Chrome浏览器,所以看起来没有比检查window属性更改更“ Object.observe() ”的方式了。

每当窗口移动一个像素时, BrowserWindowmove (和moved )事件BrowserWindow发出。 如果窗口被拖动并移动,则move事件将不断被触发,直到鼠标停止。

当检测到move时,可以获得窗口的位置

 let position = window.GetPosition(); let x = position[0]; let y = position[1]; 

然后根据需要使用这些位置