{
Get and Set Display Device Modes.
Changing the display mode settings
(resolution and color depth) from Delphi code

Article:
. http://delphi.about.com/library/weekly/aa011100a.htm

********************************************
Zarko Gajic
About.com Guide to Delphi Programming
http://delphi.about.com
email: delphi.guide@about.com
********************************************
}


unit uChangeDisplay;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TForm1 = class(TForm)
    ListBox1: TListBox;
    Button1: TButton;
    Label1: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure ListBox1Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    procedure WMDisplayChange(var Message: TMessage); message WM_DISPLAYCHANGE;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}
procedure TForm1.WMDisplayChange(var Message: TMessage);
begin
  ShowMessage('Changes in display detected!');
  inherited;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  i       : Integer;
  DevMode : TDeviceMode;
begin
  i:=0;
  {$IFOPT R+}
   {$DEFINE CKRANGE}
   {$R-} //range-checking of
  {$ENDIF}
  while EnumDisplaySettings(nil,i,DevMode) do begin
    with Devmode do
      ListBox1.Items.Add(Format('%dx%d %d Colors',[dmPelsWidth,dmPelsHeight,1 shl dmBitsperPel]));
    Inc(i);
  end;
  {$IFDEF CKRANGE}
   {$UNDEF CKRANGE}
   {$R+}  //range-checking on
  {$ENDIF}
end;

procedure TForm1.ListBox1Click(Sender: TObject);
begin
  Button1.Enabled := Listbox1.ItemIndex >= 0;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  DevMode    : TDeviceMode;
  liRetValue : Longint;
begin
  {$IFOPT R+}
   {$DEFINE CKRANGE}
   {$R-} //range-checking of
  {$ENDIF}
  if EnumDisplaySettings(nil,Listbox1.ItemIndex,Devmode) then
  liRetValue := ChangeDisplaySettings(DevMode,0);

  SendMessage(HWND_BROADCAST,
              WM_DISPLAYCHANGE,
              SPI_SETNONCLIENTMETRICS,
              0); 

  {$IFDEF CKRANGE}
   {$UNDEF CKRANGE}
   {$R+}  //range-checking on
  {$ENDIF}

  case liRetValue of
    DISP_CHANGE_SUCCESSFUL: ShowMessage('DISP_CHANGE_SUCCESSFUL: The settings change was successful.');
    DISP_CHANGE_RESTART   : ShowMessage('DISP_CHANGE_RESTART: The computer must be restarted in order for the graphics mode to work.');
    DISP_CHANGE_BADFLAGS  : ShowMessage('DISP_CHANGE_BADFLAGS: An invalid set of flags was passed in.');
    DISP_CHANGE_FAILED    : ShowMessage('DISP_CHANGE_FAILED: The display driver failed the specified graphics mode');
    DISP_CHANGE_BADMODE   : ShowMessage('DISP_CHANGE_BADMODE: The graphics mode is not supported');
    DISP_CHANGE_NOTUPDATED: ShowMessage('DISP_CHANGE_NOTUPDATED: Unable to write settings to the registry.');
  end;
end;

end.
