Einzelnen Beitrag anzeigen

Benutzerbild von Sunlight7
Sunlight7

Registriert seit: 17. Sep 2006
Ort: Sonnensystem, Zentral
1.522 Beiträge
 
Delphi 5 Standard
 
#1

Wie kann ich die Bildschirmauflösung ändern? [Erweiterung]

  Alt 29. Nov 2008, 02:31
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;

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 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.
Windows: Ja - Microsoft: Nein -> www.ReactOS.org
  Mit Zitat antworten Zitat