2008-10-24 13 views

Odpowiedz

13

MSDN Device Context Functions

Co to w zasadzie trzeba zrobić:

użyć EnumDisplayDevices() wywołanie API wyliczyć urządzeń wyświetlających na system i szukać tych, które nie mają DISPLAY_DEVICE_ATTACHED_TO_DESKTOP flag set (będzie to obejmować wszelkie urządzeń mirroring więc nie wszystko będzie wyświetlacze fizyczne). Po znalezieniu urządzenie wyświetlające będziesz musiał dostać prawidłowy tryb wyświetlania, aby zmienić, cię można znaleźć to poprzez wywołanie EnumDisplaySettingsEx() wywołanie API - Generalnie chcesz wyświetlić wszystkie dostępnych trybach i pozwalają użytkownikowi wybrać jednak w Twoim przypadku to brzmi jak to może być możliwe do twardego i zapisać kod kolejny krok. W przypadku przyszłej aplikacji ze względu na to, że sugeruję, że ma ona tę łatwą do zmienienia, bez konieczności każdorazowego przeszukiwania źródła za pomocą , klucz rejestru byłby oczywistym wyborem . Gdy masz że klasyfikowane się zapełnić DEVMODE wyświetlacz strukturę z informacjami o pozycjonowania wyświetlacza (ustaw PelsWidth/wysokość, stanowisko, DisplayFrequency i BitsPerPel właściwości), a następnie ustawić te flagi w człon pola. Na koniec wywołaj ChangeDisplaySettingsEx() z tą strukturą ustawień i pamiętaj, aby wysłać zresetować i zaktualizować flagi rejestru. To powinno być wszystko, czego potrzebujesz, to pomaga nadzieję,

DISPLAY_DEVICE struktury importu przy użyciu PInvoke

EnumDisplayDevices import funkcja

EnumDisplaySettingsEx import funkcja

itd funkcje reszta z nich może można znaleźć za pomocą prostego wyszukiwania według nazwy.

+0

Hi Pop, mogę użyć metody, jeśli drugi monitor jest już włączony, ale nie mogę” • użyj go do włączenia metody wtórnej, zawsze zawiedzie. Czy ta metoda powinna być w stanie to zrobić? –

+0

Może to być problem specyficzny dla sterownika, sterownik nie włącza automatycznie monitora, gdy niektóre ustawienia monitora są ustawione jako poprawne. W moim przypadku pracowałem z jakąś starą kartą Matrox i nie miałem tego problemu. Przydatne może być sprawdzenie niektórych dokumentów producenta. –

+0

Lub jeszcze lepiej, zadaj pytanie na forach rozwoju sterowników MSDN :) –

2

nie mam pełnej odpowiedzi tutaj, ale jestem prawie pewien, że będzie musiał zadzwonić z .NET to zrobić. Będziesz musiał użyć Pinvoke, aby wywołać niezarządzaną bibliotekę dll. Doskonałym źródłem tego jest pinvoke.net.

Zrobiłem szybkie wyszukiwanie i znaleźć http://www.pinvoke.net/default.aspx/user32/ChangeDisplaySettings.html który prawdopodobnie nie jest dokładnie to, co chcesz, ale prawdopodobnie będzie go znaleźć gdzieś na pinvoke.net

1

Szukam tego samego rozwiązania.Napisałem następujący kod, aby zadzwonić ChangeDisplaySettingsEx z PInvoke:

DEVMODE dm = new DEVMODE(); 
dm.dmSize = (short)Marshal.SizeOf(dm); 
dm.dmPelsWidth = 1680; 
dm.dmPelsHeight = 1050; 
dm.dmBitsPerPel = 32; 
dm.dmDisplayFrequency = 60; 
dm.dmFields = DevModeFields.DM_BITSPERPEL | DevModeFields.DM_PELSWIDTH | 
       DevModeFields.DM_PELSHEIGHT | DevModeFields.DM_DISPLAYFREQUENCY; 
int res = ChangeDisplaySettingsEx(@"\\.\DISPLAY2", ref dm, IntPtr.Zero, CDS_RESET | CDS_UPDATEREGISTRY, IntPtr.Zero); 
Console.WriteLine("result = " + res.ToString()); 

Jeśli monitor jest już włączony, to zmienia rozdzielczość pomyślnie. Ale jeśli monitor nie jest już podłączony do komputera, to go nie aktywuje. Czy ktoś ma przykład kodu, który działa?

11

Jeśli masz Windows 7, a potem po prostu rozpocząć proces:

private static Process DisplayChanger = new Process 
    { 
     StartInfo = 
     { 
      CreateNoWindow = true, 
      WindowStyle = ProcessWindowStyle.Hidden, 
      FileName = "DisplaySwitch.exe", 
      Arguments = "/extend" 
     } 
    }; 

następnie DisplayChanger.Start();

+0

Działa, aby włączyć 1 monitor na pierwszej karcie graficznej, ale nie na drugiej karcie graficznej. –

1

Aby włączyć monitor, ustawić swoją pozycję na coś innego niż 0,0, podobnie jak pokazano:

POINTL enabledPosition = new POINTL(); 
enabledPosition.x = -1280; 
enabledPosition.y = 0; 

dm.dmPosition = enabledPosition; 
dm.dmFields = DM.Position; 
res = ChangeDisplaySettingsEx(d.DeviceName, ref dm, IntPtr.Zero, (uint) DeviceFlags.CDS_UPDATEREGISTRY, IntPtr.Zero);