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; 
 
         
         
         
         
        
         
         
         
        
  |