2010-10-04 19 views
11

Często uruchamiam komputer z systemem Windows 7 z podłączonym przełącznikiem KVM, koncentrującym się na innym komputerze. Kiedy przełączam się na komputer z uruchomionym systemem, rozdzielczość wyświetlania jest błędna (a drugi podłączony monitor nie jest wykryty).Jak wymusić wykrywanie ekranu w systemie Windows?

Mogę to poprawić, klikając prawym przyciskiem myszy pulpit, wybierając Screen Resolution i klikając Detect. To sprawia, że ​​Windows wykrywa załączone wyświetlacze i dostosowuje się do najbardziej optymalnej rozdzielczości.

Chciałbym napisać małe narzędzie, aby zrobić to automatycznie. Którego wywołania Win32 API lub obiektu C# należy użyć?

+0

Nie mam opcji Odśwież. Może to być dodatek od producenta karty graficznej. –

+0

Przepraszam, Hans, mówi "Wykryj" - zredagowałem to pytanie. Uważam, że jest to standardowy przycisk. –

Odpowiedz

1

Można spróbować:

  1. Można użyć Spy ++, aby szukać okien, które są otwarte i spojrzeć na ich właściwości i wiadomości.
  2. Skorzystaj z procesu, aby uruchomić "rundll32.exe shell32.dll, Control_RunDLL desk.cpl" lub poeksperymentować z wywołaniem go bezpośrednio, aby zobaczyć, czy możesz uzyskać uchwyt okna, sprawdź poniżej link do pomysłów.
  3. Użyj kodu "send button click to external app" i zmodyfikuj go, aby wyszukać okno z napisem "Rozdzielczość ekranu" i wysłać BN_CLICK do okna potomnego z napisem "Wykryj".
  4. Ponieważ komputer jest już włączony, możesz chcieć go automatycznie uruchomić podczas logowania, w tym celu użyj harmonogramu zadań.
+0

Jeśli z jakiegoś powodu nie działa z terminarzem zadań, spróbuj ustawić go tak, aby działał jako twój użytkownik i jako administrator, ponieważ UAC Win7 może być kłopotliwy. – Marlon

1

Nie jestem pewien, czy to zadziała, ale możesz spróbować czegoś takiego. Przynajmniej może ci zacząć.

[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 i to może być jedna linijka w C/C++, dlaczego ludzie zawracają sobie głowę i wychodzą z C#, gdy C/C++ jest tutaj naturalnym wyborem? –

+1

Może dlatego, że poprosił o C#. –

1

To będzie Ci pół drogi tam:

Execute: Control.exe Desk.cpl, Ustawienia, Ustawienia @

To spowoduje wyświetlenie panelu Rozdzielczość ekranu bezpośrednio.

Mogę również zaproponować narzędzie do skryptowania, takie jak http://en.wikipedia.org/wiki/Windows_Script_Host I napisać narzędzie, które otworzy panel i kliknie przycisk.

Blokowanie możliwości bezpośredniego wywołania panelu sterowania do pliku windows .dll, który można załadować i wywołać bezpośrednio w kodzie, ale wymagałoby to wykrycia jakiegoś szabla. (możesz zacząć od uruchomienia .cpl w debugerze i zobaczyć, co się stanie, gdy klikniesz na wykrycie).

1

Dlaczego po prostu nie używać Do It Again i pisać makro, które resetuje dla Ciebie rozdzielczość, rejestrując działania myszy i klawiatury?

Powiązane problemy