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 同梱) |
スクリーンセーバー機能の有効性の取得と設定のサンプルです.この値が有効になっていないと,スクリーンセーバのタイムアウトの設定は無効となり,スクリーンセーバは起動しません. |
表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
[スクリーンセーバー] が [なし] だとスクリーンセーバーは起動しない |
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.
スクリーンセーバーが起動するまでの時間の取得と設定のサンプルです.スクリーンセーバの機能が有効になっていないと機能しません.0 にするとスクリーンセーバは動作しません. |
表2
uiAction パラメータは SystemParametersInfo 関数の第 1 引数
uiParam は第 2 引数で,pvParam は第 3 引数 |
uiAction パラメータ |
uiParam と pvParam パラメータ |
SPI_GETSCREENSAVETIMEOUT |
取得
uiParam は 0
pvParam は整数型変数へのポインタ
この変数に待ち時間が秒単位で格納される |
SPI_SETSCREENSAVETIMEOUT |
設定
uiParam に新しい待ち時間を秒単位で指定する
pvParam は nil |
|
図3
起動すると現在の設定を表示 |
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.
スクリーンセーバーが動作中かを取得する uiAction パラメータのテストプログラムです.スクリーンセーバが起動すると,ビープ音を鳴らします. |
表3
uiAction パラメータは SystemParametersInfo 関数の第 1 引数
uiParam は第 2 引数で,pvParam は第 3 引数 |
uiAction パラメータ |
uiParam と pvParam パラメータ |
SPI_GETSCREENSAVERRUNNING |
取得
uiParam は 0
pvParam は BOOL 型変数へのポインタ
スクリーンセーバーが動作している場合は 0 以外の値,それ以外の場合は 0 が格納される |
|
図4
実行
- タイムアウトの設定をして [テスト] ボタンをクリック
- フォームを閉じると元の値に戻る
|
|
図5
20 秒後にスクリーンセーバ起動 |
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.
SystemParametersInfo 関数を使用したサンプルではありませんが,スクリーンセーバーはブロードキャスト,HWND_BROADCAST (トップレベルのウィンドウ) にスクリーンセーバのコマンドを送ると直ちに起動できます. |
//=============================================================================
// スクリーンセーバー起動
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
begin
PostMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_SCREENSAVE, 0);
end;
|