Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Neuen Beitrag zur Code-Library hinzufügen (https://www.delphipraxis.net/33-neuen-beitrag-zur-code-library-hinzufuegen/)
-   -   Delphi Wie kann ich die Bildschirmauflösung ändern? [Erweiterung] (https://www.delphipraxis.net/125019-wie-kann-ich-die-bildschirmaufloesung-aendern-%5Berweiterung%5D.html)

Sunlight7 29. Nov 2008 02:31


Wie kann ich die Bildschirmauflösung ändern? [Erweiterung]
 
Eine kleine Erweiterung, um die Auflösung von Multimonitoren zu ändern.

Delphi-Quellcode:
type
  TMultiMonFlag=(mmfTest, mmfStoreInRegistry, mmfResolution, mmfFrequency, mmfBitsPerPixel);
  TMultiMonFlags=set of TMultiMonFlag;

function MultiMonitorChangeResolution(const MonitorID:Byte; const Width, Height:Word; const Frequency, BitsPerPixel:Byte; var DisplayName:String; const Flags:TMultiMonFlags):Boolean;
   var DevMode:TDeviceMode;
       DispDev:TDisplayDevice;
       cdsFlags:DWord;
begin
   SetLastError(0);
   DisplayName:='<Error>';

   DispDev.cb:=SizeOf(DispDev);
   Result:=EnumDisplayDevices(nil, MonitorID, DispDev, 0);
   If not Result then
      Exit;

   DisplayName:=DispDev.DeviceName;

   ZeroMemory(@DevMode, SizeOf(DevMode));
   DevMode.dmSize:=SizeOf(DevMode);
   DevMode.dmPelsWidth:=Width;
   DevMode.dmPelsHeight:=Height;
   DevMode.dmBitsPerPel:=BitsPerPixel;
   DevMode.dmDisplayFrequency:=Frequency;
   DevMode.dmFields:=0;
   If mmfResolution in Flags then
      DevMode.dmFields:=DM_PELSWIDTH or DM_PELSHEIGHT;
   If mmfFrequency in Flags then
      DevMode.dmFields:=DevMode.dmFields or DM_DISPLAYFREQUENCY;
   If (mmfBitsPerPixel in Flags) and (BitsPerPixel in [8, 16, 24, 32]) then
      DevMode.dmFields:=DevMode.dmFields or DM_BITSPERPEL;

   cdsFlags:=CDS_FULLSCREEN;
   If mmfTest in Flags then cdsFlags:=CDS_TEST;
   If mmfStoreInRegistry in Flags then cdsFlags:=CDS_UPDATEREGISTRY;
   SetLastError(ChangeDisplaySettingsEx(DispDev.DeviceName, DevMode, 0, cdsFlags, nil));
   Result:=(GetLastError=DISP_CHANGE_SUCCESSFUL);
end;

Delphi-Quellcode:
function MultiMonitorChangeResolution(const MonitorID:Byte; const Width, Height:Word; const Frequency, BitsPerPixel:Byte; var DisplayName:String; const Flags:TMultiMonFlags):Boolean;
MonitorID: Welcher Monitor soll umgeschalten werden? (0=Primärer)
Width: Breite in Pixeln
Height:Höhe in Pixeln
Frequency: Bildwiederholfrequenz
BitsPerPixel: Farbtiefe (8, 16, 24, 32 Bit)
DisplayName: Rückgabe des Monitornamens

Flags:
- mmfTest: Prüfen, ob Einstellungen möglich sind (nichts wird verändert)
- mmfStoreInRegistry: Einstellungen ändern und bei Erfolg speichern
- mmfResolution: Auflösung entsprechend Width & Height setzen
- mmfFrequency: Bildwiederholfrequenz setzen
- mmfBitsPerPixel: Farbtiefe setzen

Wird weder mmfTest noch mmfStoreInRegistry in Flags angegeben, so werden die Einstellung nur Temporär übernommen.



Anwendungsbeispiel:

Den 2. Monitor auf 800 x 600 Pixel bei 72 Hz und 32 Bit Farbtiefe setzen
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
   var DisplayName:String;
begin
   MultiMonitorChangeResolution(1, 800, 600, 72, 32, DisplayName, [mmfStoreInRegistry, mmfResolution, mmfFrequency, mmfBitsPerPixel]);

   Case GetLastError of
      DISP_CHANGE_SUCCESSFUL: Label2.Caption:='DISP_CHANGE_SUCCESSFUL';
      DISP_CHANGE_RESTART: Label2.Caption:='DISP_CHANGE_RESTART';
      DISP_CHANGE_FAILED: Label2.Caption:='DISP_CHANGE_FAILED';
      DISP_CHANGE_BADMODE: Label2.Caption:='DISP_CHANGE_BADMODE';
      DISP_CHANGE_NOTUPDATED: Label2.Caption:='DISP_CHANGE_NOTUPDATED';
      DISP_CHANGE_BADFLAGS: Label2.Caption:='DISP_CHANGE_BADFLAGS';
      DISP_CHANGE_BADPARAM: Label2.Caption:='DISP_CHANGE_BADPARAM';
      else Label2.Caption:=SysErrorMessage(GetLastError);
   end;

   Label1.Caption:=DisplayName;
end;
Achtung!
Das setzen falscher Bildschirmeinstellungen kann sehr sehr alte Monitore beschädigen!
Aktuelle Monitore schalten sich bei Überlast normalerweise ab, notfalls muß im abgesichterten Modus neu gestartet weerden um die Einstellungen zurückzusetzen.

Der 2. Monitor muß nicht zwingend die ID 1 haben, um herauszufinden welche ID Dein Wunschmonitor hat gehe in der Systemsteuerung auf Anzeige, wechslse zu Einstellungen und klicke Identifizieren.
Ziehe von der angezeigten Zahl auf dem Wunschmonitor 1 ab und Du hast Deine ID.
Gibst Du eine nicht vorhandene ID als Parameter an, so ist der Rückgabewert von DisplayName '<Error>'

Sonstige Fehler kannst Du mit GetLastError abfragen:
Zitat:

Zitat von MSDN
Return Values
The function returns one of the following values.

Value Meaning
DISP_CHANGE_SUCCESSFUL The settings change was successful.
DISP_CHANGE_BADDUALVIEW Windows XP: The settings change was unsuccessful because the system is DualView capable.
DISP_CHANGE_BADFLAGS An invalid set of flags was passed in.
DISP_CHANGE_BADMODE The graphics mode is not supported.
DISP_CHANGE_BADPARAM An invalid parameter was passed in. This can include an invalid flag or combination of flags.
DISP_CHANGE_FAILED The display driver failed the specified graphics mode.
DISP_CHANGE_NOTUPDATED Windows NT/2000/XP: Unable to write settings to the registry.
DISP_CHANGE_RESTART The computer must be restarted for the graphics mode to work.



Alle Zeitangaben in WEZ +1. Es ist jetzt 07:31 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz