Delphi Programming / Object Pascal
サイトのトップページへ リンクのページへ ロゴマーク
[掲載 2010年07月07日] [更新 2018年12月17日] Delphi サンプルプログラム集
SystemParametersInfo 関数サンプル
S07_スクリーンセーバ関係
動作確認等 Windows 7 U64(SP1) + Delphi XE Pro
S07_SystemParametersInfo_ScreemSaver.zip [2,187 KB] 2018年12月17日版 (EXE 同梱)







01_スクリーンセーバーの設定状態


スクリーンセーバー機能の有効性の取得と設定のサンプルです.この値が有効になっていないと,スクリーンセーバのタイムアウトの設定は無効となり,スクリーンセーバは起動しません.


表1
uiAction パラメータは SystemParametersInfo 関数の第 1 引数
uiParam は第 2 引数で,pvParam は第 3 引数

uiAction パラメータ uiParam と pvParam パラメータ
SPI_GETSCREENSAVEACTIVE 取得
uiParam は 0
pvParam は BOOL 型変数へのポインタ
有効の場合は 0 以外の値,無効の場合は 0
SPI_SETSCREENSAVEACTIVE 設定
uiParam を 0 以外にすると有効に,0 なら無効となる
pvParam は nil


図1
起動すると現在の設定を表示

スクリーンセーバーの設定ダイアログは,次のコマンドで表示できます.このダイアログで [スクリーンセーバー] が [なし] になっていると,本サンプルでスクリーンセーバーを有効にしてもスクリーセーバーは起動しません.
SPI_SETSCREENSAVEACTIVE パラメータは,このダイアログの [スクリーンセーバー] のコンボボックスを設定するものではありません.

%SystemRoot%\System32\control.exe desk.cpl,,1


図2
[スクリーンセーバー] が [なし] だとスクリーンセーバーは起動しない

リスト1
スクリーンセーバーの設定状態
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    CheckBox1: TCheckBox;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private 宣言 }
    OrignalValue : Boolean;
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

//=============================================================================
//  プログラムを起動したら現在の設定を取得しておく
//=============================================================================
procedure TForm1.FormCreate(Sender: TObject);
begin
  SystemParametersInfo(SPI_GETSCREENSAVEACTIVE,
                       0,
                       @OrignalValue,
                       0);
  CheckBox1.Checked := OrignalValue;
end;

//=============================================================================
//  [設定]ボタン
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
begin
  Screen.Cursor := crHourGlass;

  SystemParametersInfo(SPI_SETSCREENSAVEACTIVE,
                       Ord(CheckBox1.Checked),
                       nil,
                       SPIF_SENDCHANGE);

  Screen.Cursor := crDefault;
end;

//=============================================================================
//  元に戻す
//=============================================================================
procedure TForm1.Button2Click(Sender: TObject);
begin
  Screen.Cursor := crHourGlass;

  SystemParametersInfo(SPI_SETSCREENSAVEACTIVE,
                       Ord(OrignalValue),
                       nil,
                       SPIF_SENDCHANGE);
  FormCreate(nil);
  Screen.Cursor := crDefault;
end;

end.




02_スクリーンセーバーのタイムアウト値


スクリーンセーバーが起動するまでの時間の取得と設定のサンプルです.スクリーンセーバの機能が有効になっていないと機能しません.0 にするとスクリーンセーバは動作しません.


表2
uiAction パラメータは SystemParametersInfo 関数の第 1 引数
uiParam は第 2 引数で,pvParam は第 3 引数

uiAction パラメータ uiParam と pvParam パラメータ
SPI_GETSCREENSAVETIMEOUT 取得
uiParam は 0
pvParam は整数型変数へのポインタ
この変数に待ち時間が秒単位で格納される
SPI_SETSCREENSAVETIMEOUT 設定
uiParam に新しい待ち時間を秒単位で指定する
pvParam は nil


図3
起動すると現在の設定を表示

リスト2
スクリーンセーバーのタイムアウト値
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, ComCtrls, Spin;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    SpinEdit1: TSpinEdit;
    Label1: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private 宣言 }
    OrignalValue : Integer;
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

//=============================================================================
//  プログラムを起動したら現在の設定を取得しておく
//=============================================================================
procedure TForm1.FormCreate(Sender: TObject);
begin
  //現在の設定値読出し
  SystemParametersInfo(SPI_GETSCREENSAVETIMEOUT,
                       0,
                       @OrignalValue,
                       0);

  SpinEdit1.Value := OrignalValue;
end;

//=============================================================================
//  [設定]ボタン
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
  NewValue : Integer;
  SetValue : Integer;
begin
  Screen.Cursor := crHourGlass;

  //設定した値をセット
  NewValue := SpinEdit1.Value;
  SystemParametersInfo(SPI_SETSCREENSAVETIMEOUT,
                       NewValue,
                       nil,
                       SPIF_SENDCHANGE);
  //設定の確認
  SystemParametersInfo(SPI_GETSCREENSAVETIMEOUT,
                       0,
                       @SetValue,
                       0);
  SpinEdit1.Value := SetValue;

  Screen.Cursor := crDefault;
end;

//=============================================================================
//  元に戻す
//=============================================================================
procedure TForm1.Button2Click(Sender: TObject);
begin
  Screen.Cursor := crHourGlass;

  SystemParametersInfo(SPI_SETSCREENSAVETIMEOUT,
                       OrignalValue,
                       nil,
                       SPIF_SENDCHANGE);
  FormCreate(nil);

  Screen.Cursor := crDefault;
end;

end.




03_スクリーンセーバーの動作状況


スクリーンセーバーが動作中かを取得する uiAction パラメータのテストプログラムです.スクリーンセーバが起動すると,ビープ音を鳴らします.


表3
uiAction パラメータは SystemParametersInfo 関数の第 1 引数
uiParam は第 2 引数で,pvParam は第 3 引数

uiAction パラメータ uiParam と pvParam パラメータ
SPI_GETSCREENSAVERRUNNING 取得
uiParam は 0
pvParam は BOOL 型変数へのポインタ
スクリーンセーバーが動作している場合は 0 以外の値,それ以外の場合は 0 が格納される


図4
実行
  • タイムアウトの設定をして [テスト] ボタンをクリック
  • フォームを閉じると元の値に戻る
図5
20 秒後にスクリーンセーバ起動

リスト3
スクリーンセーバーの動作状況テスト
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, ComCtrls, Spin;

type
  TForm1 = class(TForm)
    Button1: TButton;
    SpinEdit1: TSpinEdit;
    Label1: TLabel;
    Timer1: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure Button1Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private 宣言 }
    OrignalValue : Integer;
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

//=============================================================================
//  プログラムを起動したら現在の設定を取得しておく
//=============================================================================
procedure TForm1.FormCreate(Sender: TObject);
begin
  Timer1.Enabled := False;

  //現在の設定値読出し
  SystemParametersInfo(SPI_GETSCREENSAVETIMEOUT,
                       0,
                       @OrignalValue,
                       0);

  //テストなので20秒に設定
  SpinEdit1.Value := 20;
end;

//=============================================================================
//  フォームを閉じる時には,スクリーンセーバのタイムアウト値を元に戻す
//=============================================================================
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  SystemParametersInfo(SPI_SETSCREENSAVETIMEOUT,
                       OrignalValue,
                       nil,
                       SPIF_SENDCHANGE);
end;

//=============================================================================
//  [テスト]ボタン
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
begin
  Timer1.Interval := 100;
  Timer1.Enabled  := True;

  SystemParametersInfo(SPI_SETSCREENSAVETIMEOUT,
                       SpinEdit1.Value,
                       nil,
                       SPIF_SENDCHANGE);

end;

//=============================================================================
//  タイマーイベント
//=============================================================================
procedure TForm1.Timer1Timer(Sender: TObject);
var
  Value : Integer;
begin
  SystemParametersInfo(SPI_GETSCREENSAVERRUNNING, 0, Value, SPIF_SENDCHANGE);
  if Value <> 0 then begin
    Beep;
  end;
end;

end.




04_スクリーンセーバーの起動


SystemParametersInfo 関数を使用したサンプルではありませんが,スクリーンセーバーはブロードキャスト,HWND_BROADCAST (トップレベルのウィンドウ) にスクリーンセーバのコマンドを送ると直ちに起動できます.


リスト4
スクリーンセーバーの起動
//=============================================================================
//  スクリーンセーバー起動
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
begin
  PostMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_SCREENSAVE, 0);
end;