2010-10-04 29 views
11

A menudo inicio mi PC con Windows 7 con el conmutador KVM conectado a otra computadora. Cuando cambio a la PC con arranque, la resolución de la pantalla es incorrecta (y el segundo monitor conectado no se detecta).¿Cómo puedo forzar la detección de pantalla en Windows?

Puedo corregir esto haciendo clic derecho en el escritorio, seleccionando Screen Resolution y haciendo clic en Detect. Esto hace que Windows detecte pantallas adjuntas y se ajuste a la resolución más óptima.

Me gustaría escribir una pequeña utilidad para hacer esto automáticamente. ¿Qué API de Win32 llama o objeto de C# debo usar?

+0

No tengo la opción Actualizar. Esto puede ser un complemento del fabricante de la tarjeta de video. –

+0

Lo siento, Hans, en realidad dice 'Detectar' - He editado la pregunta. Creo que es un botón estándar. –

Respuesta

1

Usted puede tratar de:

  1. Puede utilizar Spy ++ para buscar las ventanas que están abiertas y echar un vistazo a sus propiedades y mensajes.
  2. Utilice el proceso para iniciar "rundll32.exe shell32.dll, Control_RunDLL desk.cpl" o experimente con llamarlo directamente para ver si puede obtener un identificador de ventana, consulte el enlace a continuación para obtener ideas.
  3. Utilice el código "send button click to external app" y modifíquelo para buscar una ventana con el título "Resolución de pantalla" y envíe un BN_CLICK a la ventanilla para niños con el título "Detectar".
  4. Como la computadora ya está encendida, es posible que desee iniciarla automáticamente en el inicio de sesión, para eso use el programador de tareas.
+0

Si por algún motivo no funciona con el programador de tareas, intente configurarlo para que se ejecute como usuario y administrador, ya que Win7 UAC puede ser problemático. – Marlon

1

No estoy seguro si esto funcionará para usted, pero puede intentar algo como esto. Al menos puede ayudarte a empezar.

[StructLayout(LayoutKind.Explicit, Pack = 1, Size = 714)] 
public struct DISPLAY_DEVICE 
{ 
    [FieldOffset(0)] 
    public int cb; 
    [FieldOffset(4)] 
    public char DeviceName; 
    [FieldOffset(68)] 
    public char DeviceString; 
    [FieldOffset(324)] 
    public int StateFlags; 
    [FieldOffset(328)] 
    public char DeviceID; 
    [FieldOffset(584)] 
    public char DeviceKey; 
} 

[DllImport("User32.dll", SetLastError = true)] 
static extern Boolean EnumDisplayDevices(
     string lpDevice, 
     uint iDevNum, 
     ref DISPLAY_DEVICE lpDisplayDevice, 
     uint dwFlags 
); 

public void DetectDevices() 
{ 
    var flag = true; 
    for (uint i = 0; flag && i < 100; i++) 
    { 
     var device = new DISPLAY_DEVICE(); 
     device.cb = Marshal.SizeOf(device); 
     flag = EnumDisplayDevices(null, i, ref device, 1); 
    } 
} 
+0

gah y que podría haber sido un trazador de líneas en C/C++, ¿por qué las personas se molestan y salen de su camino con C# cuando C/C++ es la elección natural aquí? –

+1

Tal vez porque pidió C#. –

1

Esto le dará a mitad de camino:

Ejecutar: desk.cpl control.exe, Configuración, Configuración @

Esto abrirá el panel de resolución de pantalla directamente.

También podría sugerir una herramienta de scripting como http://en.wikipedia.org/wiki/Windows_Script_Host Y escribir una utilidad que abrirá el panel y haga clic en el botón.

Excepto que es posible que el panel de control llame directamente a un .dll de Windows que puede cargar e invocar directamente en el código, pero eso requeriría un poco de detección para detectar. (Puede comenzar ejecutando .cpl en un depurador y ver qué sucede cuando hace clic en Detectar).

1

¿Por qué no simplemente utiliza Do It Again y escribe una macro que restablece la resolución registrando las acciones del mouse y del teclado?

Cuestiones relacionadas