Как программно переключать режимы дисплея?
Олег Кулабухов делится опытом:
Нужно использовать EnumDisplaySettings() для получения полного списка доступных режимов. Затем ChangeDisplaySettings() - для изменения текущего режима. Обратите внимание, что многие драверы не меняют режим без перезагрузки.
unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Spin; type PdmArray = ^TDmArray; TDmArray = array[0..0] of TDeviceMode; type TForm1 = class(TForm) Memo1: TMemo; SpinEdit1: TSpinEdit; Button1: TButton; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure Button1Click(Sender: TObject); private lpDmArray : PDmArray; NumModes : integer; { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); var i : integer; // auto-initialized to zero MoreModes : bool; dm : TDeviceMode; begin Memo1.Lines.Clear; MoreModes := True; while MoreModes do begin MoreModes := EnumDisplaySettings(nil, i, dm); Memo1.Lines.Add('Mode ' + IntToStr(i) + ': ' + IntToStr(dm.dmBitsPerPel) + ' Bits Per Pixel ' + IntToStr(dm.dmPelsWidth) + ' x ' + IntToStr(dm.dmPelsHeight)); Inc(i); end; NumModes := i; SpinEdit1.MinValue := 0; SpinEdit1.MaxValue := NumModes; GetMem(lpDmArray, sizeof(TDeviceMode) * NumModes); FillChar(lpDmArray^, sizeof(TDeviceMode) * NumModes, #0); {$IFOPT R+} {$DEFINE CKRANGE} {$R-} {$ENDIF} for i := 0 to (NumModes - 1) do EnumDisplaySettings(nil, i, lpDmArray[i]); {$IFDEF CKRANGE} {$UNDEF CKRANGE} {$R+} {$ENDIF} end; procedure TForm1.Button1Click(Sender: TObject); var ReturnVal : LongInt; begin {$IFOPT R+} {$DEFINE CKRANGE} {$R-} {$ENDIF} ReturnVal := ChangeDisplaySettings(lpDmArray[SpinEdit1.Value], CDS_UPDATEREGISTRY); {$IFDEF CKRANGE} {$UNDEF CKRANGE} {$R+} {$ENDIF} with Memo1.Lines do begin case ReturnVal of DISP_CHANGE_SUCCESSFUL: Add('DISP_CHANGE_SUCCESSFUL'); DISP_CHANGE_RESTART : Add('DISP_CHANGE_RESTART'); DISP_CHANGE_BADFLAGS : Add('DISP_CHANGE_BADFLAGS'); DISP_CHANGE_FAILED : Add('DISP_CHANGE_FAILED'); DISP_CHANGE_BADMODE : Add('DISP_CHANGE_BADMODE'); DISP_CHANGE_NOTUPDATED: Add('DISP_CHANGE_NOTUPDATED'); end; end; end; procedure TForm1.FormDestroy(Sender: TObject); begin FreeMem(lpDmArray, sizeof(TDeviceMode) * NumModes); end; end. |
[001934]