es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

La posición de la ventana devuelta por las APIs de chrome.windows para la extensión de Chrome está descentrada (aproximadamente por unos 8px).

Estoy teniendo problemas para determinar en qué monitor físico está una ventana de Chrome. Esta es mi solución actual:

// Esto es solo para un alias más corto
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á desplazado aproximadamente en 8 píxeles. Por ejemplo, esto es cuando lo coloco en un monitor de 1080×1920 a la izquierda del monitor principal:

Valor de [currWin.left, currWin.top, currWin.width, currWin.height]:
[-1088, -460, 1096, 1888]

Valor de monitor.workArea:
{height: 1872, left: -1080, top: -452, width: 1080}

Como puedes ver, el valor está “desplazado” aproximadamente en 8 píxeles. Supongo que esto se debe al borde de la ventana. Estoy utilizando Windows 11 Pro.

¿Es poner un desplazamiento de 8 píxeles una buena solución? ¿Es el valor diferente en diferentes sistemas operativos? ¿Hay alguna solución buena en general?


Actualización: Me parece interesante que luego el número se incluya en width y height. Por ejemplo, si quiero establecer el tamaño de una ventana en un valor determinado, tengo que poner el desplazamiento para width y height 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",
    });
}
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    No se recomienda utilizar un desplazamiento estático de 8px como solución, ya que el tamaño de los bordes de la ventana puede variar en diferentes sistemas operativos o configuraciones de pantalla. Una mejor solución podría ser utilizar la propiedad outerBounds de la ventana de Chrome en lugar de la propiedad workArea del monitor. La propiedad outerBounds incluye los bordes de la ventana y la barra de título, y debería proporcionar valores más precisos para la posición en la pantalla. Aquí tienes un ejemplo de cómo utilizarlo:

    const currWin = await chrome.windows.getCurrent({populate: true});
    const bounds = currWin?.bounds ?? null;
    
    if (bounds) {
      const monitors = await new Promise<chrdispinfo[]>((resolve) => {
        chrome.system.display.getInfo((info) => resolve(info?.displays ?? []));
      });
    
      let activeMonitor = monitors.find((monitor) => {
        const outer = monitor.bounds;
        return (
          bounds.left >= outer.left &&
          bounds.right <= outer.right &&
          bounds.top >= outer.top &&
          bounds.bottom <= outer.bottom
        );
      });
    
      if (!activeMonitor) {
        activeMonitor = monitors.find((monitor) => monitor.isPrimary) || monitors[0];
      }
    
      return activeMonitor;
    }
    

    Ten en cuenta que se llama a chrome.windows.getCurrent con la opción populate para obtener la propiedad bounds de la ventana. A continuación, el código verifica si la ventana se ajusta dentro de los bounds de cada monitor utilizando la propiedad outerBounds. Si ninguno de los monitores coincide, se establece en el monitor principal de forma predeterminada. Este enfoque debería ser más confiable en diferentes plataformas y configuraciones de pantalla.</chrdispinfo[]>

Comments are closed.