![]() |
Monitor X per ChangeDisplaySettingsEx (A) akivieren ?
Hallo,
ich versuche einen 2. Monitor ( inaktiv ) per API zu aktiviern, leider geht das nicht so wie gewollt. Zitat:
Delphi-Quellcode:
Die Daten, des Index nicht aktiven Monitors, aus der Registry.
EnumDisplaySettingsExA( PChar('\\.\Display'+IntToStr(Index)), ENUM_REGISTRY_SETTINGS, DevModeExA, 0);
Leider liefert:
Delphi-Quellcode:
immer nur : DISP_CHANGE_FAILED !
ChangeDisplaySettingsExA(PChar('\\.\DISPLAY'+IntToStr(Index)), DevModeExA, 0, 0, nil);
Das Lesen aller Daten geht ************************************************** ***************************************** 1. Wide viewing angle & High density FlexView Display 1600x1200 on ATI MOBILITY FIRE GL T2 primary, 1600 x 1200 @ 0,0 - 32-bit - 60 Hz workspace: 0,0 - 1600,1136 HMONITOR: 0x10001 Device: \\.\DISPLAY1\Monitor3 2. (Standardmonitor) on ATI MOBILITY FIRE GL T2 disabled, 1024 x 768 @ 1600,0 - 32-bit - 60 Hz Device: \\.\DISPLAY2\Monitor0 ************************************************** ****************************************** Vielen Dank für euren Input. Rumpi |
Re: Monitor X per ChangeDisplaySettingsEx (A) akivieren ?
Moin!
Dumme Frage, aber sind die Werte für dmFields, dmPelsWidth und dmPelsHeight ordentlich gesetzt vor dem Aufruf von ChangeDisplayEx ? Weil das auslesen der Informationen sagt noch lange nicht aus, dass die Bits in dmFields ordentlich gesetzt sind. MfG Muetze1 |
Re: Monitor X per ChangeDisplaySettingsEx (A) akivieren ?
kann der monitor mit windows aktiviert werden ? falls der treiber garnet funzt oderso
|
Re: Monitor X per ChangeDisplaySettingsEx (A) akivieren ?
Hallo,
Zitat:
Gruss Rumpi |
Re: Monitor X per ChangeDisplaySettingsEx (A) akivieren ?
Moin!
Zitat:
Das es unter einer ganz anderen Situation (Monitor ist aktiviert) funktioniert hilft uns in der Problemsituation (Monitor nicht aktiviert) nicht weiter. Es wird/muss/gibt einen Unterschied - grundlegend schonmal die Situation. Das wäre wie eine Frage warum der Ball nicht nass wird bei Regen wenn er im Haus liegt. Wenn er draussen ist und es regnet wird er ja schliesslich auch nass. Nach dieser Logik ist vieles unerklärlich... MfG Muetze1 |
Re: Monitor X per ChangeDisplaySettingsEx (A) akivieren ?
Moin Mütze,
JA,
Delphi-Quellcode:
Ich hole mir die Daten wenn der Monitor nicht aktiv ist aus der Registry.
Result := EnumDisplaySettingsExA( PChar('\\.\Display'+IntToStr(Index)), ENUM_CURRENT_SETTINGS, DevModeExA, 0);
if Not Result then Result := EnumDisplaySettingsExA( PChar('\\.\Display'+IntToStr(Index)), ENUM_REGISTRY_SETTINGS, DevModeExA, 0); if Result then ... DevModeExA.dmFields := DM_POSITION; dmField ist auch gesetzt. Das Ändern mit ChangeDisplaySettingsEx oder ChangeDisplaySettingsExA geht. Aber das deaktivieren mit dmPelsWidth und dmPelsHeight auf 0 geht nicht. Ich kann von 800x600 auf 1024x768 umschalten aber nicht auf 0x0, was zu einem deaktivieren des Monitors führen soll, lt. MSDN. Gruss Rumpi |
Re: Monitor X per ChangeDisplaySettingsEx (A) akivieren ?
Hi,
Deaktivieren geht nun! Man muss, wenn dmPelsWidth und dmPelsHeight 0 sind (deaktivieren) unbedingt ChangeDisplaySettingsEx mit dwflags "CDS_UPDATEREGISTRY" aufrufen. Beim ändern der Auflösung ist das nicht zwingend nötig! Aktivieren geht aber immer noch nicht... Gruss Rumpi |
Re: Monitor X per ChangeDisplaySettingsEx (A) akivieren ?
Hallo,
ich bekomme es einfach nicht hin den 2. Monitor via ChangeDisplaySettingsEx zu aktivieren. Nicht mal bei google kann man was dazu finden. Das deaktiviern geht ja, aber den deaktivierten Monitor wieder zu aktivieren geht bis dato noch nicht. Jede Hilfe ist willkommen. Gruss Rumpi |
Re: Monitor X per ChangeDisplaySettingsEx (A) akivieren ?
Moin!
Also bei mir funktioniert es - ich habe es endlich mal zeitlich hinbekommen dies auszuprobieren. Grundlegendes: 1. Was meinst du die ganze Zeit mit dmPelsWidth und dmPelsHeight? Das ist die Auflösung des Monitors und nicht seine Position im MultiMon System und bedeutet daher auch nicht die Aktivierung/Deaktivierung. 2. Die TDevMode[A/W] in Delphi (zumindes in Delphi 5 bei mir) ist fehlerhaft - besser: nicht vollständig - und daher kann man kein dmPosition angeben. Ich vermute mal ganz stark du hast einfach nach einem ähnlichen Member der struct gesucht. 3. Nach der MSDN gibt es einen Teil der Strukt wo an gleicher Stelle Monitorinformationen und Papier/Druckerinformationen liegen. Darunter fällt auch die dmPosition die ich mir dann mal definiert habe:
Delphi-Quellcode:
Die Struktur ist sogar gleich gross wie die TDevModeA (bzw. DEVMODEA) und ist somit kompatibel. Die Definition hätte man bestimmt auch anders hinbekommen, aber das war mir erstmal egal.
Type
TPOINTL = Packed Record x : DWORD; y : DWORD; End; TPrinterMonitor = Packed Record Case Integer Of 0 : (Paper: Packed Record dmOrientation: SHORT; dmPaperSize: SHORT; dmPaperLength: SHORT; dmPaperWidth: SHORT; dmScale: SHORT; dmCopies: SHORT; dmDefaultSource: SHORT; dmPrintQuality: SHORT; End;); 1 : (Monitor: Packed Record dmPosition : TPOINTL; dmDisplayOrientation : DWORD; dmDisplayFixedOutput : DWORD; End;) End; TDevModeA_new = packed record dmDeviceName: array[0..CCHDEVICENAME - 1] of AnsiChar; dmSpecVersion: Word; dmDriverVersion: Word; dmSize: Word; dmDriverExtra: Word; dmFields: DWORD; /// !!! Dual : TPrinterMonitor; /// !!! dmColor: SHORT; dmDuplex: SHORT; dmYResolution: SHORT; dmTTOption: SHORT; dmCollate: SHORT; dmFormName: array[0..CCHFORMNAME - 1] of AnsiChar; dmLogPixels: Word; dmBitsPerPel: DWORD; dmPelsWidth: DWORD; dmPelsHeight: DWORD; dmDisplayFlags: DWORD; dmDisplayFrequency: DWORD; dmICMMethod: DWORD; dmICMIntent: DWORD; dmMediaType: DWORD; dmDitherType: DWORD; dmICCManufacturer: DWORD; dmICCModel: DWORD; dmPanningWidth: DWORD; dmPanningHeight: DWORD; end; 4. Deaktiviern eines Monitors funktioniert über das setzen des Monitors per DM_POSITION in Flags und setzen von dmPosition auf 0,0. Dieses funktioniert nur bei nicht primären Monitore! Primäre Monitor kann man nicht deaktivieren, da deren dmPosition immer bei 0,0 liegen. Um einen primären Monitor zu deaktivieren müsste man einen aktiven secondären Monitor auf dmPosition (0,0) setzen und (CDS_PRIMARY Or CDS_UPDATEREGISTRY) damit dieser Primär wird - danach kann man den nun neuen sekundären (bis zuvor noch primären) Monitor deaktivieren. 5. Ohne Angabe von CDS_UPDATEREGISTRY kann man keine Änderungen am MultiMon-System vornehmen - man muss es immer dauerhaft speichern - dynamische Änderungen sind dabei nicht zulässig. 6. Meine Routine um einen deaktivierten sekundären Monitor zu aktivieren:
Delphi-Quellcode:
HTH
procedure TForm1.Button1Click(Sender: TObject);
Var lDevMode : TDevModeA_new; lRes : Cardinal; begin FillChar(lDevMode, SizeOf(lDevMode), 0); lDevMode.dmSize := SizeOf(lDevMode); lDevMode.dmBitsPerPel := 32; lDevMode.dmDisplayFrequency := 85; // alles hard kodiert für meinen 2. Monitor lDevMode.dmPelsWidth := 1280; lDevMode.dmPelsHeight := 1024; lDevMode.Dual.Monitor.dmPosition.x := 1280; // die Weite/Auflösung des primären Monitors bzw. Lage des Monitors in Relation zum primären Monitor mit 0,0 oben links lDevMode.Dual.Monitor.dmPosition.y := 0; lDevMode.dmFields := DM_BITSPERPEL Or DM_DISPLAYFREQUENCY Or DM_PELSWIDTH Or DM_PELSHEIGHT Or DM_POSITION; lRes := ChangeDisplaySettingsEx( PChar('\\.\DISPLAY2'), TDevMode(lDevMode), 0, CDS_UPDATEREGISTRY, 0); If lres <> 0 Then ShowMessage('hat nicht geklappt'); end; MfG Muetze1 |
Re: Monitor X per ChangeDisplaySettingsEx (A) akivieren ?
Hallo Muetze,
vielen Dank, das es bei dir funktioniert finde ich super! Ich hatte mir auch einen neuen TDeviceModeEx Type generiert. Das verändern der Position ect. eines primären oder aktiven sekundären Monitors geht ja auch. Aber bei meiner ATI Fire GL kann ich selbst mit deinem Sourcecode in dem ich nur die
Delphi-Quellcode:
auf
lDevMode.Dual.Monitor.dmPosition.x := 1280;
Delphi-Quellcode:
verändert habe, da Monitor 1 bei mir 1600x1200 hat, den 2. Monitor
lDevMode.Dual.Monitor.dmPosition.x := 1600;
Delphi-Quellcode:
nicht aktivieren.
ChangeDisplaySettingsEx( PChar('\\.\DISPLAY2'),
TDevMode(lDevMode), 0, CDS_UPDATEREGISTRY, 0); Es sieht so aus als ob das Problem bei meinem Grafik Treiber liegt? Gruss Rumpi |
Re: Monitor X per ChangeDisplaySettingsEx (A) akivieren ?
Moin!
Ist \\.\DISPLAY2 auch der 2. Monitor/Grafikkartenausgang und nicht vielleicht der TV Out Ausgang? Schonmal die Bits zu den Einträgen angeschaut?
Delphi-Quellcode:
Mach mal ein Testprogramm und pack den Aufruf da mal mit rein und schau mal nach welche Flags danach in der lbMonitorList ListBox stehen. Das wäre so dies was mir denn dazu noch einfällt. Eine Fehlermeldung kommt auch nicht (so ala falsche Flags o.ä.)??
Procedure TForm1.FillMonitorList;
Var Cntr : Cardinal; Info : TDisplayDevice; AdapterName : PChar; OldPos : Integer; Const DISPLAY_DEVICE_ATTACHED_TO_DESKTOP = $00000001; DISPLAY_DEVICE_MULTI_DRIVER = $00000002; DISPLAY_DEVICE_PRIMARY_DEVICE = $00000004; DISPLAY_DEVICE_MIRRORING_DRIVER = $00000008; DISPLAY_DEVICE_VGA = $00000010; Begin lbMonitorList.Items.Add('------------------ Displays ----------------'); Cntr := 0; Info.cb := SizeOf(Info); While EnumDisplayDevices(Nil, Cntr, Info, 0) Do Begin lbMonitorList.Items.Add('* Device '+IntToStr(Cntr)+':'); lbMonitorList.Items.Add(' DeviceName : '+Info.DeviceName); lbMonitorList.Items.Add(' DeviceString: '+Info.DeviceString); OldPos := lbMonitorList.Items.Add(' StateFlags: '); If ( Info.StateFlags And DISPLAY_DEVICE_ATTACHED_TO_DESKTOP ) = DISPLAY_DEVICE_ATTACHED_TO_DESKTOP Then lbMonitorList.Items.Add(' + Display Device Attached To Desktop') Else lbMonitorList.Items.Add(' - Display Device Attached To Desktop'); If ( Info.StateFlags And DISPLAY_DEVICE_MULTI_DRIVER ) = DISPLAY_DEVICE_MULTI_DRIVER Then lbMonitorList.Items.Add(' + Display Device Multi Driver') Else lbMonitorList.Items.Add(' - Display Device Multi Driver'); If ( Info.StateFlags And DISPLAY_DEVICE_PRIMARY_DEVICE ) = DISPLAY_DEVICE_PRIMARY_DEVICE Then lbMonitorList.Items.Add(' + Display Device Primary Device') Else lbMonitorList.Items.Add(' - Display Device Primary Device'); If ( Info.StateFlags And DISPLAY_DEVICE_MIRRORING_DRIVER ) = DISPLAY_DEVICE_MIRRORING_DRIVER Then lbMonitorList.Items.Add(' + Display Device Mirroring Driver') Else lbMonitorList.Items.Add(' - Display Device Mirroring Driver'); If ( Info.StateFlags And DISPLAY_DEVICE_VGA ) = DISPLAY_DEVICE_VGA Then lbMonitorList.Items.Add(' + Display Device VGA') Else lbMonitorList.Items.Add(' - Display Device VGA'); AdapterName := StrAlloc(SizeOf(Info.DeviceName)); StrCopy(AdapterName, Info.DeviceName); EnumDisplayDevices(AdapterName, 0, Info, 0); lbMonitorList.Items.Insert(OldPos, ' Monitorname : ' + Info.DeviceString); StrDispose(AdapterName); Inc(Cntr); End; End; MfG Muetze1 |
Re: Monitor X per ChangeDisplaySettingsEx (A) akivieren ?
vielen dank für your code sample.
please note that while trying to set a negative position for my monitor lDevMode.dmPosition.x := -1280; I had to change the TPOINTL record to TPOINTL = Packed Record x : Integer; y : Integer; End; thanks again. |
Re: Monitor X per ChangeDisplaySettingsEx (A) akivieren ?
Zitat:
|
Re: Monitor X per ChangeDisplaySettingsEx (A) akivieren ?
Zitat:
Bei delphi 2009 bringt diese Zeile lRes := ChangeDisplaySettingsEx( PChar('\\.\DISPLAY2'), TDevMode(lDevMode), 0, CDS_UPDATEREGISTRY, 0); einen Typenumwandlungsfehler, wie muss es denn geändert werden das es auch mit delphi 2009 geht? Martin |
AW: Re: Monitor X per ChangeDisplaySettingsEx (A) akivieren ?
Zitat:
Das Record TPrinterMonitor ist ja nicht viel mehr als eine Erweiterung von Windows.TDevMode. Wenn man nun den ganzen Verweisen folgt, sieht man, dass TDevMode in älteren Delphi-Versionen letztendlich auf TDeviceModeA verweist. Durch die ganze Unicode-Umstellung ab Delphi 2009 verweist es nun aber auf TDeviceModeW. Man muss also folgende Zeilen ändern, um TDevModeA_new zuweisungskompatibel zu TDeviceModeW zu machen:
Delphi-Quellcode:
TDevModeW_new = packed record // Name wurde der Konsistenz halber geändert, ist aber nicht unbedingt nötig
dmDeviceName: array[0..CCHDEVICENAME - 1] of WideChar; ... dmFormName: array[0..CCHFORMNAME - 1] of WideChar; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:54 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz