Obteniendo el área de trabajo precisa del monitor en los cambios de configuración de la pantalla
Trabajando en una aplicación que escucha cambios en la configuración de la pantalla (por ejemplo, conexiones y desconexiones de monitores). El problema con el que me estoy encontrando es que el área de trabajo de un monitor (los límites del monitor excluyendo las barras de tareas y otros espacios reservados para la visualización) no es precisa cuando se dispara el evento.
Usando ya sea la API de Screen
o GetMonitorInfo
de user32.dll
retorna límites inexactos.
Supongo que toma un corto tiempo para que la barra de tareas reserve espacio cuando se cambian los monitores. Si configuro un temporizador corto y luego utilizo los mismos métodos, los límites son precisos, pero esto parece ser una solución muy frágil.
Para reproducir el problema:
using Microsoft.Win32;
using System;
using System.Windows.Forms;
static class Program
{
[STAThread]
static void Main()
{
SystemEvents.DisplaySettingsChanged += new EventHandler(OnDisplaySettingsChanged);
Application.Run();
}
private static void OnDisplaySettingsChanged(object sender, EventArgs e)
{
foreach (var screen in Screen.AllScreens)
{
// <code>screen.WorkingArea</code> no es preciso aquí - no incluye el espacio reservado por la barra de tareas.
}
}
}
¿Existe alguna manera de obtener de manera confiable el área de trabajo de un monitor cuando se cambian la configuración de la pantalla? Alternativamente, ¿existe una manera de escuchar cambios en el área de trabajo de un monitor?
davy.ai
Una solución potencial es usar un
Timer
para retrasar la obtención del área de trabajo del monitor hasta que el sistema haya actualizado completamente sus configuraciones de pantalla:Este código utiliza un
Timer
para esperar 1 segundo antes de llamar aGetWorkingAreas
y obtener las áreas de trabajo precisas del monitor. Se utiliza la funciónGetMonitorInfo
deuser32.dll
para acceder a la información del área de trabajo. La estructuraMONITORINFOEX
representa la información del monitor y es utilizada por la funciónGetMonitorInfo
.Otra opción es utilizar una biblioteca de terceros, como WMI o Windows API Code Pack, que proporcionan un mejor acceso a eventos e información relacionados con el monitor. Sin embargo, esto puede introducir una complejidad adicional y dependencias al proyecto.