Windowsのディスプレイ(モニター)設定の拡大率を取得する(VCL) ~Delphiでお手軽プログラミング

Windowsのディスプレイ(モニター)設定の拡大率を取得する(VCL) ~Delphiでお手軽プログラミング

プロジェクトの作成

Delphi IDEを起動し、「ファイル」⇒「Windows VCLアプリケーション -Delphi」をクリックします。
フォームにTButtonを1個と、TMemoを1個をドラッグ&ドロップします。
Delphi IDE

ソースコードの記述

Button1をダブルクリックして以下ソースコードを記述します。
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs,
  Vcl.StdCtrls, Winapi.ShellScaling, Winapi.ShlObj;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private 宣言 }
    //DPIが変更された時に以下関数が呼び出される
    procedure DPIChanged(var msg:TMessage);message WM_DPICHANGED;
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var i:Integer;
    mon:TMONITOR;
    dsf:DEVICE_SCALE_FACTOR;
begin
  Memo1.Clear;

  //このアプリのウィンドウのあるモニターを選択(最も近いモニターを選択)
  mon:=Screen.MonitorFromWindow(Self.Handle, TMonitorDefaultTo.mdNearest);
  //モニターの拡大率を取得する
  GetScaleFactorForMonitor(mon.Handle, dsf);
  Memo1.Lines.Add( Format('モニターの拡大率:%d%%',[Ord(dsf)]) );

  //全てのモニタの拡大率を取得する
  Memo1.Lines.Add('モニターの数:'+IntToStr(Screen.MonitorCount));
  for i := 0 to Screen.MonitorCount-1 do
  begin
    GetScaleFactorForMonitor(Screen.Monitors[i].Handle, dsf);
    Memo1.Lines.Add(Format('  モニター[%d]の拡大率:%d%%',[i+1, Ord(dsf)]));
  end;
end;

procedure TForm1.DPIChanged(var msg: TMessage);
var mon:TMONITOR;
    dsf:DEVICE_SCALE_FACTOR;
begin
  //全てのモニタの拡大率を取得する
  Memo1.Lines.Add('モニターのDPI設定が変更されました');
  //このアプリのウィンドウのあるモニターを選択(最も近いモニターを選択)
  mon:=Screen.MonitorFromWindow(Self.Handle, TMonitorDefaultTo.mdNearest);
  //モニターの拡大率を取得する
  GetScaleFactorForMonitor(mon.Handle, dsf);
  Memo1.Lines.Add( Format('モニターの拡大率:%d%%',[Ord(dsf)]) );
end;

end.

実行する

実行ボタンを押すとコンパイルされ実行ファイルが生成して実行します。
Button1をクリックしたり、ディスプレイの拡大率を変更すると、Memo1に拡大率が表示されます。
Display Magnification