Tengo problemas para determinar en qué monitor (físico) se encuentra una ventana de Chrome. Esta es mi solución actual:
// This is just for shorter alias type ChrDispInfo = chrome.system.display.DisplayInfo; private async getActiveMonitorAsync(monitors: ChrDispInfo[]) { const currWin = await chrome.windows.getCurrent(); for (let monitor of monitors) { const a = monitor.workArea; if (currWin.left >= a.left && currWin.left <= a.left + a.width && currWin.top >= a.top && currWin.top <= a.top + a.height) { return monitor; } } return monitors.find(q => q.isPrimary) || monitors[0]; }Sin embargo, noto que no siempre funciona, especialmente cuando una ventana está maximizada o cuando la muevo manualmente cerca del borde superior izquierdo. El valor está fuera de aproximadamente 8px. Por ejemplo, esto es cuando lo coloco en un monitor de 1080x1920 a la izquierda del monitor principal:
[currWin.left, currWin.top, currWin.width, currWin.height] value: [-1088, -460, 1096, 1888] monitor.workArea value: {height: 1872, left: -1080, top: -452, width: 1080}Como puede ver, el valor está "apagado" en aproximadamente 8 px. Supongo que esto se debe al borde de la ventana. Estoy ejecutando en Windows 11 Pro.
¿Es una buena solución poner un desplazamiento de 8px? ¿El valor es diferente en diferentes sistemas operativos? ¿Hay alguna buena solución en general?
Actualización: me parece interesante que luego se incluya el número en width y height . Por ejemplo, si quiero configurar una ventana a un cierto tamaño, tengo que poner el desplazamiento de ancho y alto dos veces :
const BorderSize = 8; async updateWinAsync(window: ChrWin, monArea: chrome.system.display.Bounds, winSetting: Rect) { await chrome.windows.update(window.id, { left: winSetting[0] * monArea.width + monArea.left - BorderSize, top: winSetting[1] * monArea.height + monArea.top - BorderSize, width: winSetting[2] * monArea.width + BorderSize * 2, height: winSetting[3] * monArea.height + BorderSize * 2, state: "normal", }); }