2008-10-24 14 views

Antwort

13

MSDN Device Context Functions

Was im Grunde tun müssen, finden Sie:

Verwenden Sie die EnumDisplayDevices() API-Aufruf die Anzeigegeräte auf das System und sucht diejenigen aufzuzählen, die dienicht haben zu tunDISPLAY_DEVICE_ATTACHED_TO_DESKTOP -Flag gesetzt (dies beinhaltet alle Spiegelgeräte so dass nicht all physischer Displays sein wird.) Sobald Sie das Anzeigegerät gefunden haben, die Sie benötigen, ein gültiger Anzeigemodus zu erhalten, um es, Sie zu ändern dies durch den Aufruf der EnumDisplaySettingsEx() API-Aufruf finden können - im Allgemeinen würden Sie alle verfügbaren Modi angezeigt werden und der Benutzer wählen aber in Ihrem Fall erlauben es klingt wie dies möglich sein kann, zu hart Code und sparen Sie einen zusätzlichen Schritt. Für die aus Gründen der Zukunftssicherheit Ihre Anwendung obwohl ich würde vorschlagen dies leicht änderbar, ohne , durch die Quelle, jedes Mal zu graben ein Registrierungsschlüssel würde die offensichtliche Wahl sein. Sobald Sie haben die aussortiert eine DevMode Anzeige Struktur füllen mit den Informationen über die Anzeige Positionierung (die PelsWidth/Höhe, Position, DisplayFrequency und BitsPerPel Eigenschaften) setzte dann diese Flags in die Feldern Mitglied. Schließlich Call ChangeDisplaySettingsEx() mit dieser Einstellungen Struktur und sicher sein, senden Sie die Reset-und Update-Registrierung Flags. Das ist alles was Sie brauchen sollte, hoffen, dass diese hilft,

DISPLAY_DEVICE Importstruktur mit PInvoke

EnumDisplayDevices Funktion Import

EnumDisplaySettingsEx Funktion Import

usw. der Rest Funktionen von ihnen können mit einer einfachen Suche nach Namen gefunden werden.

+0

Hallo Pop, ich Ihre Methode, wenn der sekundäre Monitor bereits aktiviert ist verwenden können, aber ich kann‘ t es verwenden, um die sekundäre Methode zu aktivieren, schlägt es immer fehl. Sollte diese Methode das können? –

+0

Dies könnte ein treiberspezifisches Problem sein, der Treiber aktiviert einen Monitor nicht automatisch, wenn die API einige gültige Monitoreinstellungen festlegt. In meinem Fall arbeitete ich mit einer alten Matrox-Karte, und ich hatte dieses Problem nicht. Es könnte nützlich sein, einige spezifische Herstellerdokumente nachzuschlagen. –

+0

Oder besser noch, stellen Sie die Frage in MSDN Treiber-Entwicklung Foren :) –

2

Ich habe nicht die vollständige Antwort hier, aber ich bin mir fast sicher, dass Sie aus .Net müssen nennen, dies zu tun. Sie müssen Pinvoke verwenden, um eine nicht verwaltete DLL aufzurufen. Eine großartige Ressource dafür ist pinvoke.net.

Ich habe eine schnelle Suche und http://www.pinvoke.net/default.aspx/user32/ChangeDisplaySettings.html gefunden, die wahrscheinlich nicht genau das, was Sie wollen, aber Sie werden es wahrscheinlich irgendwo auf pinvoke.net

1

Ich bin auf der Suche nach der gleichen Lösung.Ich habe den folgenden Code geschrieben ChangeDisplaySettingsEx mit PInvoke zu nennen:

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()); 

Wenn der Monitor bereits aktiviert ist, ändert dies erfolgreich die Auflösung. Wenn der Monitor jedoch nicht bereits mit dem Desktop verbunden ist, wird er nicht aktiviert. Hat also jemand ein Codebeispiel, das funktioniert?

11

Wenn Sie Fenster haben 7, dann starten Sie einfach einen Prozess:

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

dann DisplayChanger.Start();

+0

Funktioniert, um 1 Monitor auf dem ersten Display-Adapter, aber nicht auf dem zweiten Display-Adapter zu aktivieren. –

1

einen Monitor zu aktivieren, setzen seine Position auf etwas anderes als 0,0, wie wie folgt:

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); 
Verwandte Themen