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.