AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Code-Bibliothek Neuen Beitrag zur Code-Library hinzufügen Delphi Wie kann ich die Bildschirmauflösung ändern? [Erweiterung]

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

Ein Thema von Sunlight7 · begonnen am 29. Nov 2008
Antwort Antwort
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, 03: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
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +2. Es ist jetzt 03:06 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf