Delphi Programming / Object Pascal
サイトのトップページへ リンクのページへ ロゴマーク
[掲載 2010年07月07日] [更新 2013年11月11日] Delphi サンプルプログラム集
   
SystemParametersInfo 関数サンプル
S04_入力インターフェイス関係
動作確認等 Windows 7 U64(SP1) + Delphi XE Pro
S04_SystemParametersInfo_Interface.zip [9,905 KB] 2013年11月11版 (EXE 同梱)







01_警告ビープ音


警告音のオン・オフフの取得と設定です.


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

uiAction パラメータ uiParam と pvParam パラメータ
SPI_GETBEEP 取得
uiParam は 0
pvParam は BOOL 型変数へのポインタ
ビープ音がオンになっている場合は 0 以外の値が,オフになっている場合は 0 が格納される
SPI_SETBEEP 警告のビープ音の設定
uiParam が 0 以外ならオンに,0 の場合はオフとなる
pvParam は nil


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

リスト1
警告音の取得と設定
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button3: TButton;
    CheckBox1: TCheckBox;
    Button2: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button3Click(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_GETBEEP,
                       0,
                       @OrignalValue,
                       0);
  CheckBox1.Checked := OrignalValue;
end;

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

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

  Screen.Cursor := crDefault;
end;

//=============================================================================
//  BEEP音のテスト
//=============================================================================
procedure TForm1.Button2Click(Sender: TObject);
begin
  Beep;
end;

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

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

end.




02_システム既定の入力言語


システムの既定の入力言語ロケールの取得と変更のサンプルです.Windows XP では [地域と言語のオプション] ダイアログで設定する内容の一部です.ロケール値 (ロケールハンドルともいいます) は,上位ワードがデバイス識別子,下位ワードが言語識別子です.Windows のロケールには下表のようなものがありますが,このサンプルは入力ロケールの操作ということになります.

システムロケール OS のロケール
ユーザーロケール 環境設定で選択したロケール
UI 表示言語 環境設定で選択したダイアログやメッセージを表示するロケール
入力ロケール ユーザー入力用のロケール.キーボードやら IME の言語関係



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

uiAction パラメータ uiParam と pvParam パラメータ
SPI_GETDEFAULTINPUTLANG 取得
uiParam は 0
pvParam は HKL 型変数へのポインタ
この変数に入力ロケール識別子が格納される
SPI_SETDEFAULTINPUTLANG 設定
uiParam は 0
pvParam に言語の入力ロケール識別子 (HKL 型変数) を指定


Window 7 ではキーボードを詳細に設定できるようになっています.この状態が検出できていませんが,エクセル等,アプリを起動すると設定が有効となっています.
キーボードの設定内容は,マイクロソフトの記事にあるレジストリには書き込まれていません.別の場所なのかも知れません.これが設定できればコントロールパネルにも反映できるのかも知れません.


図2
Windows 7 での実行
  • 中国語に設定
図3
エクセル 2010 で入力中
  • ni を変換中
  • ロケールを変更してからエクセルを起動しないと有効にならない

リスト2
既定の入力言語の取得と設定
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Button1: TButton;
    Button2: TButton;
    ListBox1: TListBox;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private 宣言 }
    OrignalValue : HKL;
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

uses Registry, IMM;

{$R *.dfm}

//=============================================================================
//  システムに入力されている既定の言語のリストを取得して表示
//  HKLの値だけリストとしても意味不明なので
//
//  (1) レジストリからロケール識別子のリスト(これは文字列)を取得
//  (2) ロケール識別子に対応する説明文字列を取得
//
//  GetLocaleInfo関数の第2引数(このサンプルではLOCALE_SLANGUAGE)を変更すると
//  通貨形式や日付の表示形式,コードページ等が取得できる
//  指定可能な定数がWindows.pasにある(短いが英文の説明付き)
//
//  usesにRegistryとIMMが必要
//=============================================================================
procedure TForm1.FormCreate(Sender: TObject);
var
  AIndex   : Integer;
  SL       : TStringList;
  Reg      : TRegistry;
  ARegKey  : String;
  i        : Integer;
  AHKL     : HKL;
  StrGengo : array [0..MAX_PATH-1] of Char;
  IMEName  : array [0..MAX_PATH-1] of Char;
begin
  AIndex := -1;
  //現在設定されている入力言語ロケールを取得
  SystemParametersInfo(SPI_GETDEFAULTINPUTLANG,
                       0,
                       @OrignalValue,
                       0);

  Reg := TRegistry.Create;
  SL  := TStringList.Create;
  try
    Reg.Access  := KEY_READ;
    Reg.RootKey := HKEY_CURRENT_USER;
    ARegKey     := 'Keyboard Layout\Preload\';

    if Reg.OpenKeyReadOnly(ARegKey) then begin
      //このキー関連のデータ値の名前リストを取得
      Reg.GetValueNames(SL);
      Reg.CloseKey;

      //各々のデータ値から文字列として値を取得
      for i := 0 to SL.Count - 1 do begin
        Reg.OpenKeyReadOnly(ARegKey);
        SL[i] := Reg.ReadString(SL[i]);
        Reg.CloseKey;
      end;

      ListBox1.Items.BeginUpdate;
      ListBox1.Items.Clear;
      for i := 0 to SL.Count - 1 do begin
        //文字列からHKL値を取得
        AHKL := StrToInt('$' + SL[i]);

        //HKLから言語部分(下位ワード)の値を取出して言語名を取得
        FillChar(StrGengo, SizeOf(StrGengo), #0);
        GetLocaleInfo(($0000FFFF and AHKL),
                       LOCALE_SLANGUAGE,
                       StrGengo,
                       SizeOf(StrGengo));

        //HKL値からIMEのロケールのDescriptionを取得
        FillChar(IMEName, SizeOf(IMEName), #0);
        ImmGetDescription(AHKL, IMEName, Sizeof(IMEName));

        //取得したロケール値(16進)と言語名などを表示
        ListBox1.Items.AddObject(Format('%.8x', [AHKL]) + ' ' +
                                 StrGengo + ' ' +
                                 IMEName,
                                 TObject(AHKL));
        //現在のHKLと同じだったらそのIndexを記憶しておく
        AHKL := LoadKeyboardLayout(PChar(SL[i]), KLF_SUBSTITUTE_OK);
        if AHKL = OrignalValue then AIndex := i;
      end;
      ListBox1.Items.EndUpdate;
    end;
  finally
    FreeAndNil(Reg);
    FreeAndNil(SL);
  end;

  ListBox1.ItemIndex := AIndex;
end;

//=============================================================================
//  [設定]ボタン
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
  NewValue : HKL;
  AHKL     : HKL;
  StrHKL   : String;
begin
  if ListBox1.ItemIndex < 0 then exit;
  Screen.Cursor := crHourGlass;

  //選択したItemからHKL値を取得
  NewValue := Integer(ListBox1.Items.Objects[ListBox1.ItemIndex]);

  //既定の言語で使用するロケール値に変換
  //この値を取得しておいてListBoxのObjectプロパティに代入しておく方法もいいかも
  StrHKL := Format('%.8x', [NewValue]);
  AHKL := LoadKeyboardLayout(PChar(StrHKL), KLF_SUBSTITUTE_OK or KLF_ACTIVATE);

  //設定
  SystemParametersInfo(SPI_SETDEFAULTINPUTLANG,
                       0,
                       @AHKL,
                       SPIF_SENDCHANGE);
  Screen.Cursor := crDefault;
end;

//=============================================================================
//  元に戻す
//=============================================================================
procedure TForm1.Button2Click(Sender: TObject);
var
  AHKL   : HKL;
  StrHKL : String;
begin
  //既定の言語で使用するロケール値に変換
  StrHKL := Format('%.8x', [OrignalValue]);
  AHKL := LoadKeyboardLayout(PChar(StrHKL), KLF_SUBSTITUTE_OK or KLF_ACTIVATE);

  //設定
  SystemParametersInfo(SPI_SETDEFAULTINPUTLANG,
                       0,
                       @AHKL,
                       SPIF_SENDCHANGE);
  FormCreate(nil);
  Screen.Cursor := crDefault;
end;

end.




03_EnumSystemLocales 関数を使用した入力ロケール一覧


使用可能な言語のリストは,EnumSystemLocales 関数を使用しても取得できます.
そのテストプログラムです.

EnumSystemLocales 関数のコールバック関数内で GetLocaleInfo 関数を使用して各ロケールを取得していきます.GetLoacalInfo 関数では,その引数の値によって,OS 言語名,国名,通貨名や日付時刻の区切り文字等のシステムロケールとユーザロケール等の情報等が取得できます.
ロケールの設定には,SetLocaleInfo 関数も使用できます.
現在の入力ロケール識別子は GetKeyboardLayout 関数でも取得できます.


図4
地域と言語のロケールリスト
  • [ファイル名を指定して実行] でintl.cpl を実行すると表示できる
図5
インストール済みロケール
図6
代替えロケール

リスト3
EnumSystemLocales 関数を使用した入力ロケール一覧
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Panel1: TPanel;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

var
  ListLocale : TStringList;

{$R *.dfm}

//=============================================================================
//  フォーム生成時の処理
//=============================================================================
procedure TForm1.FormCreate(Sender: TObject);
begin
  ListLocale := TStringList.Create;
end;

//=============================================================================
//  終了処理
//=============================================================================
procedure TForm1.FormDestroy(Sender: TObject);
begin
  FreeAndNil(ListLocale);
end;

//-----------------------------------------------------------------------------
//  EnumSystemLocales関数のコールバック関数
//-----------------------------------------------------------------------------
function EnumLocalesProc(lpLocaleString: PChar): Integer;
var
  Buff   : array [0..MAX_PATH-1] of Char;
  AHKL   : HKL;
  StrHKL : String;
begin
  AHKL := StrToInt('$' + String(lpLocaleString));

  FillChar(Buff, SizeOf(Buff), #0);
  if GetLocaleInfo(AHKL, LOCALE_SLANGUAGE, Buff, SizeOf(Buff)) > 0 then begin
    StrHKL := Buff;

    if StrHKL <> '' then begin
      ListLocale.Add(StrHKL);
    end;
  end;

  Result := 1;
end;

//=============================================================================
//  使用可能な既定の入力ロケールの一覧
//  インストール済みのリスト
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
  i : Integer;
begin
  ListLocale.Clear;
  Memo1.Lines.BeginUpdate;
  Memo1.Clear;

  EnumSystemLocales(@EnumLocalesProc, LCID_INSTALLED);
  ListLocale.Sorted := True;

  for i := 0 to ListLocale.Count - 1 do begin
    Memo1.Lines.Add(ListLocale[i]);
  end;
  Memo1.Lines.EndUpdate;
end;

//=============================================================================
//  使用可能な既定の入力ロケールの一覧
//  Windowsがサポートしているリスト
//=============================================================================
procedure TForm1.Button2Click(Sender: TObject);
var
  i : Integer;
begin
  ListLocale.Clear;
  Memo1.Lines.BeginUpdate;
  Memo1.Clear;

  EnumSystemLocales(@EnumLocalesProc, LCID_SUPPORTED);
  ListLocale.Sorted := True;

  for i := 0 to ListLocale.Count - 1 do begin
    Memo1.Lines.Add(ListLocale[i]);
  end;
  Memo1.Lines.EndUpdate;
end;

//=============================================================================
//  代替並べ替えロケールIDのリスト
//  代替並べ替えロケールの意味は不明
//=============================================================================
procedure TForm1.Button3Click(Sender: TObject);
var
  i : Integer;
begin
  ListLocale.Clear;
  Memo1.Lines.BeginUpdate;
  Memo1.Clear;

  EnumSystemLocales(@EnumLocalesProc, LCID_ALTERNATE_SORTS);
  ListLocale.Sorted := True;

  for i := 0 to ListLocale.Count - 1 do begin
    Memo1.Lines.Add(ListLocale[i]);
  end;
  Memo1.Lines.EndUpdate;
end;

end.




04_入力ロケールの一覧をレジストリから取得


入力ロケールの一覧をレジストリから取得する例です.


図7
既定の入力ロケール一覧
図8
現ユーザが使用可能なロケール

リスト4
入力ロケールの一覧をレジストリから取得
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Panel1: TPanel;
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

uses Registry;

{$R *.dfm}

//=============================================================================
//  すべての既定バージョンの Windowsで使用可能な既定の入力ロケールの一覧
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
  Reg     : TRegistry;
  ARegKey : String;
  SL      : TStringList;
  i       : Integer;
  Str     : String;
begin
  Reg := TRegistry.Create;
  SL  := TStringList.Create;
  try
    Reg.Access  := KEY_READ;
    Reg.RootKey := HKEY_LOCAL_MACHINE;
    ARegKey     := 'SYSTEM\ControlSet001\Control\Keyboard Layouts\';

    if Reg.OpenKeyReadOnly(ARegKey) then begin
      Memo1.Lines.BeginUpdate;
      Memo1.Clear;

      //GetKeyNamesでサブキーをリストして
      Reg.GetKeyNames(SL);
      Reg.CloseKey;
      //各々のキーのLayout Text値を取得する
      for i := 0 to SL.Count - 1 do begin
        if Reg.OpenKeyReadOnly(ARegKey + SL[i]) then begin
          Str := Reg.ReadString('Layout Text');
          Memo1.Lines.Add(SL[i] + '  ' + Str);
          Reg.CloseKey;
        end;
      end;

      Memo1.Lines.EndUpdate;
    end;
  finally
    FreeAndNil(Reg);
    FreeAndNil(SL);
  end;
end;

//=============================================================================
//  現在のログオンユーザ(ログインユーザ)が使用可能な入力ロケールの一覧
//  。ロケール識別子 (LCID) は 32 ビットの値であり、
//
//  国別言語サポート
//  Windows 7では落ちる
//=============================================================================
procedure TForm1.Button2Click(Sender: TObject);
var
  Reg     : TRegistry;
  ARegKey : String;
  SL      : TStringList;
  i       : Integer;
  Str     : String;
  PS      : PChar;
begin
  Reg := TRegistry.Create;
  SL  := TStringList.Create;
  try
    Reg.Access  := KEY_READ;
    Reg.RootKey := HKEY_CURRENT_USER;
    ARegKey     := 'Keyboard Layout\Preload\';

    if Reg.OpenKeyReadOnly(ARegKey) then begin
      Memo1.Lines.BeginUpdate;
      Memo1.Clear;

      //このキー関連のデータ値の名前リストを取得
      Reg.GetValueNames(SL);
      Reg.CloseKey;

      //各々のデータ値から文字列として値を取得
      for i := 0 to SL.Count - 1 do begin
        Reg.OpenKeyReadOnly(ARegKey);
        SL[i] := Reg.ReadString(SL[i]);
        Reg.CloseKey;
      end;

      //システム既定の入力ロケールは以下のレジストリにロケールごとにキーがある
      //キー名は16進数で,これからキーボード名の文字列を取得して表示
      Reg.RootKey := HKEY_LOCAL_MACHINE;
      ARegKey     := 'SYSTEM\ControlSet001\Control\Keyboard Layouts\';
      for i := 0 to SL.Count - 1 do begin
        if Reg.OpenKeyReadOnly(ARegKey + SL[i]) then begin
          Str := Reg.ReadString('Layout Text');
          Memo1.Lines.Add(SL[i] + '  ' + Str);
          Reg.CloseKey;
        end;
      end;

      Memo1.Lines.EndUpdate;
    end;
  finally
    FreeAndNil(Reg);
    FreeAndNil(SL);
  end;
end;

end.




05_キー表示までの待ち時間


キーを押下してから,リピート開始までの待ち時間の取得と設定のサンプルです.
待ち時間は 0 から 3 の整数で指定します.0 の時はリピート入力を開始するまで 約 250 ms.3 の時は約 1 秒の待ち時間となりますが,ハードウェアによって異なることもあります.


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

uiAction パラメータ uiParam と pvParam パラメータ
SPI_GETKEYBOARDDELAY 取得
uiParam は 0
pvParam は整数型変数へのポインタ
この変数に待ち時間を示す値が格納される
SPI_SETKEYBOARDDELAY 設定
uiParam は 0, 1, 2, 3 のいずれかの値
pvParam は nil


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

リスト5
キー表示までの待ち時間の取得と設定
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    TrackBar1: TTrackBar;
    Label1: TLabel;
    Label2: TLabel;
    LabeledEdit1: TLabeledEdit;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormMouseWheel(Sender: TObject; Shift: TShiftState;
      WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
    procedure TrackBar1Change(Sender: TObject);
  private
    { Private 宣言 }
    OrignalValue : Integer;
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

uses CommCtrl;

{$R *.dfm}

//=============================================================================
//  プログラムを起動したら現在の設定を取得しておく
//
//  [コントロールパネル][キーボード]の表示とは逆なので注意
//  このサンプルプログラムでは左が「短い」に相当
//=============================================================================
procedure TForm1.FormCreate(Sender: TObject);
var
  AStyle : DWORD;
begin
  //TrackBarの初期設定
  with TrackBar1 do begin
    //Maxを先に設定しないとMinの設定が反映されない(要Max>Min)
    Max := 3;
    Min := 0;
    LineSize  := 1;
    PageSize  := LineSize;
    Frequency := LineSize;
  end;

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

  TrackBar1.Position := OrignalValue;
  Label2.Caption     := IntToStr(OrignalValue);

  //トラックバーの溝の幅を狭くしてみる
  //usesにCommCtrlが必要
  AStyle := GetWindowLong(TrackBar1.Handle, GWL_STYLE);
  AStyle := AStyle and (not TBS_ENABLESELRANGE);
  SetWindowLong(TrackBar1.Handle, GWL_STYLE, AStyle);
end;

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

  NewValue := TrackBar1.Position;

  SystemParametersInfo(SPI_SETKEYBOARDDELAY,
                       NewValue,
                       nil,
                       SPIF_SENDCHANGE);
  Screen.Cursor := crDefault;
end;

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

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

  Screen.Cursor := crDefault;
end;

//=============================================================================
//  マウスホイール使用禁止
//  このフォーム上には,他にマウスホイールでスクロールするものはないので
//  コードはHandled := True;だけ
//=============================================================================
procedure TForm1.FormMouseWheel(Sender: TObject; Shift: TShiftState;
  WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
begin
   Handled := True;
end;

//=============================================================================
//  トラックバーを移動したら現在の値を表示
//=============================================================================
procedure TForm1.TrackBar1Change(Sender: TObject);
begin
  Label2.Caption := IntToStr(TrackBar1.Position);
end;

end.




06_キーリピート回数


同じキーを押し続けた場合,1 秒間に繰り返す入力数の取得と設定のサンプルです.
リピート間隔は,0 ~ 31 の整数値で指定します.
0 の時は 1 秒につき約 2.5 回のリピート入力,31 の時は 1 秒につき約 30 回のリピート入力と規定されてますが,実際の値はハードウェアによって異なることがあります.


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

uiAction パラメータ uiParam と pvParam パラメータ
SPI_GETKEYBOARDSPEED 取得
uiParam は 0
pvParam は DWORD 型変数へのポインタ
この変数にリピート回数を示す値が格納される
SPI_SETKEYBOARDSPEED 設定
uiParam に設定値を指定 (0 ~ 31 の整数値)
pvParam は nil


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

リスト6
キーリピート回数の取得と設定
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    TrackBar1: TTrackBar;
    Label1: TLabel;
    Label2: TLabel;
    LabeledEdit1: TLabeledEdit;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormMouseWheel(Sender: TObject; Shift: TShiftState;
      WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
    procedure TrackBar1Change(Sender: TObject);
  private
    { Private 宣言 }
    OrignalValue : Integer;
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

uses CommCtrl;

{$R *.dfm}

//=============================================================================
//  プログラムを起動したら現在の設定を取得しておく
//=============================================================================
procedure TForm1.FormCreate(Sender: TObject);
var
  AStyle : DWORD;
begin
  //TrackBarの初期設定
  with TrackBar1 do begin
    //Maxを先に設定しないとMinの設定が反映されない(要Max>Min)
    Max := 31;
    Min := 0;
    LineSize  := 1;
    PageSize  := LineSize;
    Frequency := LineSize;
  end;

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

  TrackBar1.Position := OrignalValue;
  Label2.Caption     := IntToStr(OrignalValue);

  //トラックバーの溝の幅を狭くしてみる
  //usesにCommCtrlが必要
  AStyle := GetWindowLong(TrackBar1.Handle, GWL_STYLE);
  AStyle := AStyle and (not TBS_ENABLESELRANGE);
  SetWindowLong(TrackBar1.Handle, GWL_STYLE, AStyle);
end;

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

  NewValue := TrackBar1.Position;

  SystemParametersInfo(SPI_SETKEYBOARDSPEED,
                       NewValue,
                       nil,
                       SPIF_SENDCHANGE);
  Screen.Cursor := crDefault;
end;

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

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

  Screen.Cursor := crDefault;
end;

//=============================================================================
//  マウスホイール使用禁止
//  このフォーム上には,他にマウスホイールでスクロールするものはないので
//  コードはHandled := True;だけ
//=============================================================================
procedure TForm1.FormMouseWheel(Sender: TObject; Shift: TShiftState;
  WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
begin
   Handled := True;
end;

//=============================================================================
//  トラックバーを移動したら現在の値を表示
//=============================================================================
procedure TForm1.TrackBar1Change(Sender: TObject);
begin
  Label2.Caption := IntToStr(TrackBar1.Position);
end;

end.




07_アプリケーションのキーボードヘルプ表示


このフラグを利用して,作成するアプリケーション側で利用することができます.
これは,ユーザーがマウ スではなく,主にキーボードを使っていて,通常では表示されないキーボードインターフェイスを表示するような用途に利用するためのフラグです.
ユーザー補助の [アプリケーションにキー ボードのヘルプを追加する] の設定に相当します.


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

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


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

リスト7
キーボードヘルプのフラグの取得と設定
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_GETKEYBOARDPREF,
                       0,
                       @OrignalValue,
                       0);
  CheckBox1.Checked := OrignalValue;
end;

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

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

  Screen.Cursor := crDefault;
end;

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

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

end.




08_マウスカーソル移動速度


マウスカーソルの移動,加速の程度の設定値取得と設定のサンプルです.ただし,同じ値でも OS,ハードウェア (マウス),ドライバによっても違う場合があります.


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

uiAction パラメータ uiParam と pvParam パラメータ
SPI_GETMOUSE 取得
3 つの要素からなる整数型配列を用意.下表参照
uiParma は 0
pvParam は整数型配列へのポインタ
SPI_SETMOUSE 設定
3 つの要素からなる整数型配列を用意.下表参照
uiParam は 0
pvParam にこの整数型配列へのポインタを指定する


表7
この設定値はレジストリの HKEY_CURRENT_USER\Control Panel\Mouse に記録されている

配列要素 内容
[0]
MouseThreshold1
2 倍速になるまでのマウス移動量 (加速の閾値) で 0 - 10
移動量がこの値以上の時に 2 倍となる
[1]
MouseThreshold2
4 倍速になるまでのマウス移動量 (加速の閾値) で 0 - 12
移動量がこの値以上になると 4 倍速になる
通常 MouseThreshold1 より大きな値とする
[2]
MouseSpeed
加速の度合いで上記の加速の閾値を決定するために使用
値は 0 - 2.0 は加速なし


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

リスト8
マウスカーソル移動速度の取得と設定
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;
    SpinEdit2: TSpinEdit;
    SpinEdit3: TSpinEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private 宣言 }
    OrignalValue : array [0..2] of Integer;
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

//=============================================================================
//  プログラムを起動したら現在の設定を取得しておく
//=============================================================================
procedure TForm1.FormCreate(Sender: TObject);
begin
  with SpinEdit1 do begin
    MaxValue := 20;
    MinValue := 0;
  end;
  with SpinEdit2 do begin
    MaxValue := 20;
    MinValue := 0;
  end;
  with SpinEdit3 do begin
    MaxValue := 5;
    MinValue := 0;
  end;

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

  SpinEdit1.Value := OrignalValue[0];
  SpinEdit2.Value := OrignalValue[1];
  SpinEdit3.Value := OrignalValue[2];
end;

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

  //設定した値をセット
  NewValue[0] := SpinEdit1.Value;
  NewValue[1] := SpinEdit2.Value;
  NewValue[2] := SpinEdit3.Value;
  SystemParametersInfo(SPI_SETMOUSE,
                       0,
                       @NewValue,
                       SPIF_SENDCHANGE);

  //確認のために設定値を取得
  SystemParametersInfo(SPI_GETMOUSE,
                       0,
                       @SetValue,
                       SPIF_SENDCHANGE);
  SpinEdit1.Value := SetValue[0];
  SpinEdit2.Value := SetValue[1];
  SpinEdit3.Value := SetValue[2];

  Screen.Cursor := crDefault;
end;

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

  SystemParametersInfo(SPI_SETMOUSE,
                       0,
                       @OrignalValue,
                       SPIF_SENDCHANGE);
  FormCreate(nil);

  Screen.Cursor := crDefault;
end;

end.




09_マウスのホバーメッセージ発生に必要な幅


TrackMouseEvent 関数が WM_MOUSEHOVER メッセージ (ホバーメッセージ) を生成するために,マウスカーソルがとどまる範囲の幅 (ピクセル値) の取得と設定のサンプルです.


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

uiAction パラメータ uiParam と pvParam パラメータ
SPI_GETMOUSEHOVERWIDTH 取得
uiParam は 0
pvParam は UINT 型変数へのポインタ
この変数に幅が格納される
SPI_SETMOUSEHOVERWIDTH 設定
uiParam に設定する幅をピクセル値で指定
pvParam は nil


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

リスト9
マウスホバーメッセージ発生に必要な幅
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
  with SpinEdit1 do begin
    MaxValue := 20;
    MinValue := 0;
  end;

  //現在の設定値読出し
  SystemParametersInfo(SPI_GETMOUSEHOVERWIDTH,
                       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_SETMOUSEHOVERWIDTH,
                       NewValue,
                       nil,
                       SPIF_SENDCHANGE);

  //確認のために設定値を取得
  SystemParametersInfo(SPI_GETMOUSEHOVERWIDTH,
                       0,
                       @SetValue,
                       SPIF_SENDCHANGE);
  SpinEdit1.Value := SetValue;

  Screen.Cursor := crDefault;
end;

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

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

  Screen.Cursor := crDefault;
end;

end.




10_マウスのホバーメッセージ発生に必要な高さ


TrackMouseEvent 関数が WM_MOUSEHOVER メッセージ (ホバーメッセージ) を生成するために,マウスカーソルがとどまる範囲の高さ (ピクセル値) の取得と設定のサンプルです.


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

uiAction パラメータ uiParam と pvParam パラメータ
SPI_GETMOUSEHOVERHEIGHT 取得
uiParam は 0
pvParam は UINT 型変数へのポインタ
この変数に高さが格納される
SPI_SETMOUSEHOVERHEIGHT 設定
uiParam に設定する高さをピクセル値で指定
pvParam は nil 


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

リスト10
マウスホバーメッセージ発生に必要な高さ
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
  with SpinEdit1 do begin
    MaxValue := 20;
    MinValue := 0;
  end;

  //現在の設定値読出し
  SystemParametersInfo(SPI_GETMOUSEHOVERHEIGHT,
                       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_SETMOUSEHOVERHEIGHT,
                       NewValue,
                       nil,
                       SPIF_SENDCHANGE);

  //確認のために設定値を取得
  SystemParametersInfo(SPI_GETMOUSEHOVERHEIGHT,
                       0,
                       @SetValue,
                       SPIF_SENDCHANGE);
  SpinEdit1.Value := SetValue;

  Screen.Cursor := crDefault;
end;

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

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

  Screen.Cursor := crDefault;
end;

end.




11_マウスのホバーメッセージ発生に必要な時間


TrackMouseEvent 関数が WM_MOUSEHOVER メッセージ (ホバーメッセージ) を生成するために,マウスカーソルがとどまる時間 (ミリ秒) の取得と設定のサンプルです.


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

uiAction パラメータ uiParam と pvParam パラメータ
SPI_GETMOUSEHOVERTIME 取得
uiParam は 0
pvParam は UNIT 型変数へのポインタ
この変数に時間がミリ秒単位で格納される 
SPI_SETMOUSEHOVERTIME 設定
uiParam に設定する間をミリ秒で指定
pvParam は nil


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

リスト11
ホバーメッセージ発生に必要な最小時間
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
  with SpinEdit1 do begin
    MaxValue := 2000;
    MinValue := 0;
  end;

  //現在の設定値読出し
  SystemParametersInfo(SPI_GETMOUSEHOVERTIME,
                       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_SETMOUSEHOVERTIME,
                       NewValue,
                       nil,
                       SPIF_SENDCHANGE);

  //確認のために設定値を取得
  SystemParametersInfo(SPI_GETMOUSEHOVERTIME,
                       0,
                       @SetValue,
                       SPIF_SENDCHANGE);
  SpinEdit1.Value := SetValue;

  Screen.Cursor := crDefault;
end;

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

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

  Screen.Cursor := crDefault;
end;

end.




12_マウスの移動速度


マウスの移動速度の取得と設定のサンプルです.
マウスの速度は,マウスの移動距離に応じて,ポインタを移動させる距離を決定します.この値は [コントロールパネル] の「マウス] で確認できます.設定範囲は 1 (最も遅い) ~ 20 (最も速い) で,デフォルトは 10 です.これもハードウェアの影響を受けます.


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

uiAction パラメータ uiParam と pvParam パラメータ
SPI_GETMOUSESPEED 取得
uiParam は 0
pvParame は INT 型変数へのポインタ
この変数に値が格納される
SPI_SETMOUSESPEED 設定
uiParam は 0
pvParame に速度を整数値のポインタで指定する


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

リスト12
マウスの移動速度の取得と設定
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
  with SpinEdit1 do begin
    MaxValue := 20;
    MinValue := 1;
  end;

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

  SpinEdit1.Value := OrignalValue;
end;

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

  //設定した値をセット
  NewValue := SpinEdit1.Value;
  SystemParametersInfo(SPI_SETMOUSESPEED,
                       0,
                       Pointer(NewValue),
                       SPIF_SENDCHANGE);
  Screen.Cursor := crDefault;
end;

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

  SystemParametersInfo(SPI_SETMOUSESPEED,
                       0,
                       Pointer(OrignalValue),
                       SPIF_SENDCHANGE);
  FormCreate(nil);

  Screen.Cursor := crDefault;
end;

end.




13_マウスカーソルのボタンへの自動移動機能


[OK] や [適用] 等,OS が表示するダイアログのボタンの,既定のボタンに自動的にマウスカーソルを移動させる機能の取得と設定です.この設定は一般のアプリケーションでは機能しません.


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

uiAction パラメータ uiParam と pvParam パラメータ
SPI_GETSNAPTODEFBUTTON 取得
uiParam は 0
pvParam は BOOL 型変数へのポインタ
有効となっている場合は 0 以外の値が,無効の場合は 0
SPI_SETSNAPTODEFBUTTON 設定
uiParam が 0 以外の値は有効,無効にする時は 0
pvParam は nil


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

リスト13
マウスカーソルの自動移動機能
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_GETSNAPTODEFBUTTON,
                       0,
                       @OrignalValue,
                       0);
  CheckBox1.Checked := OrignalValue;
end;

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

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

  Screen.Cursor := crDefault;
end;

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

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

end.




14_マウスホイールのスクロール行数


スクロール行数の取得と設定です.Delphi ではマウスホイールのイベントで,独自にスクロール行数を設定するができます.デフォルト値は 3 です.
WHEEL_PAGESCSOLL を指定すると,スクロールバーのページアップ領域またはページダウン領域を 1 回クリックした場合と同じ動作となります.また0にするとホイールの回転でスクロールしません.


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

uiAction パラメータ uiParam と pvParam パラメータ
SPI_GETWHEELSCROLLLINES 取得
uiParam は 0
pvParam は UINT 型変数へのポインタ
この変数に行数が格納される
SPI_SETWHEELSCROLLLINES 設定
uiParam に設定行数を指定
pvParam は nil


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

リスト14
スクロール行数の取得と設定
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
  with SpinEdit1 do begin
    MaxValue := 100;
    MinValue := 1;
  end;

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

  SpinEdit1.Value := OrignalValue;
end;

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

  //設定した値をセット
  NewValue := SpinEdit1.Value;
  SystemParametersInfo(SPI_SETWHEELSCROLLLINES,
                       NewValue,
                       nil,
                       SPIF_SENDCHANGE);

  Screen.Cursor := crDefault;
end;

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

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

  Screen.Cursor := crDefault;
end;

end.




15_マウスのダブルクリックの間隔


ダブルクリックの間隔をミリ秒単位で設定,またはその値を取得します.ここで設定した時間内に 2 回目のクリックをしないとダブルクリックとはなりません.
SystemParametersInfo 関数では現在値の取得ができないので,GetDoubleClickTime 関数で取得しています.設定は SetDoubleClickTime 関数でもできます.


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

uiAction パラメータ uiParam と pvParam パラメータ
SPI_SETDOUBLECLICKTIME 設定
uiParam に時間をミリ秒単位で指定
pvParam は nil


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

リスト15
ダブルクリックの間隔の取得と設定
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
  with SpinEdit1 do begin
    MaxValue := 1000;
    MinValue := 100;
  end;

  //現在の設定値読出し
  OrignalValue := GetDoubleClickTime;
  SpinEdit1.Value := OrignalValue;
end;

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

  //設定した値をセット
  NewValue := SpinEdit1.Value;
  SystemParametersInfo(SPI_SETDOUBLECLICKTIME,
                       NewValue,
                       nil,
                       SPIF_SENDCHANGE);
  //確認のために設定値を取得して表示
  SpinEdit1.Value := GetDoubleClickTime;

  Screen.Cursor := crDefault;
end;

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

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

  Screen.Cursor := crDefault;
end;

end.




16_マウスの左右のボタン機能入換え


マウスの左右のボタン入換え機能のテストです.SystemParametersInf 関数には,この状態を取得するフラグがないので,SwapMouseButton 関数を使用しています.


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

uiAction パラメータ uiParam と pvParam パラメータ
SPI_SETMOUSEBUTTONSWAP 設定
uiParam が 0 以外の値は交換,0 の時は交換なし
pvParam は nil


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

リスト16
マウスの左右ボタンの機能を入換え
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
  OrignalValue := SwapMouseButton(False);
  CheckBox1.Checked := OrignalValue;

  //SwapMouseButtonをFalseで実行しているので元に戻る.そこで再設定
  if OrignalValue then SwapMouseButton(True);
end;

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

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

  Screen.Cursor := crDefault;
end;

//=============================================================================
//  元に戻す
//=============================================================================
procedure TForm1.Button2Click(Sender: TObject);
begin
  SwapMouseButton(OrignalValue);
  CheckBox1.Checked := OrignalValue;
end;

end.




17_マウスのダブルクリック位置の許容範囲の幅


2 回目のクリックの時,ここで設定した幅 (ピクセル) 以上にマウスカーソルが移動していると,ダブルクリックとは見なされません.この値の取得と設定のサンプルコードです.
設定値は GetSystemMetrics 関数の引数に SM_CXDOUBLECLK を指定して取得しています.


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

uiAction パラメータ uiParam と pvParam パラメータ
SPI_SETDOUBLECLKWIDTH 設定
uiParam に設定幅を指定
pvParam は nil


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

リスト17
マウスのダブルクリック位置の許容範囲の幅
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
  with SpinEdit1 do begin
    MaxValue := 20;
    MinValue := 0;
  end;

  //現在の設定値読出して表示
  OrignalValue := GetSystemMetrics(SM_CXDOUBLECLK);
  SpinEdit1.Value := OrignalValue;
end;

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

  //設定した値をセット
  NewValue := SpinEdit1.Value;
  SystemParametersInfo(SPI_SETDOUBLECLKWIDTH,
                       NewValue,
                       nil,
                       SPIF_SENDCHANGE);

  //確認のために設定値を取得
  SetValue := GetSystemMetrics(SM_CXDOUBLECLK);
  SpinEdit1.Value := SetValue;

  Screen.Cursor := crDefault;
end;

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

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

  Screen.Cursor := crDefault;
end;

end.




18_マウスのダブルクリック位置の許容範囲の高さ


2 回目のクリックの時,ここで設定した高さ (ピクセル) 以上にマウスカーソルが移動していると,ダブルクリックとは見なされません.この値の取得と設定のサンプルコードです.
現在の設定値は,GetSystemMetrics 関数の引数に SM_CYDOUBLECLK を指定して取得しています.


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

uiAction パラメータ uiParam と pvParam パラメータ
SPI_SETDOUBLECLKHEIGHT 設定
uiParam に設定する高さを指定
pvParama は nil


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

リスト18
マウスのダブルクリック位置の許容範囲の高さ
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
  with SpinEdit1 do begin
    MaxValue := 20;
    MinValue := 0;
  end;

  //現在の設定値読出して表示
  OrignalValue := GetSystemMetrics(SM_CYDOUBLECLK);
  SpinEdit1.Value := OrignalValue;
end;

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

  //設定した値をセット
  NewValue := SpinEdit1.Value;
  SystemParametersInfo(SPI_SETDOUBLECLKHEIGHT,
                       NewValue,
                       nil,
                       SPIF_SENDCHANGE);

  //確認のために設定値を取得
  SetValue := GetSystemMetrics(SM_CYDOUBLECLK);
  SpinEdit1.Value := SetValue;

  Screen.Cursor := crDefault;
end;

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

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

  Screen.Cursor := crDefault;
end;

end.




19_その他


その他,以下のものがあります.


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

uiAction パラメータ uiParam と pvParam パラメータ
SPI_GETKEYBOARDCUES
SPI_GETMENUUNDERLINES
メニューアクセスキーの下線の設定を取得
uiParam は 0
pvParam は BOOL 型変数
下線を付ける場合は 0 以外の値が,キーボードからメニューを呼び出したときのみ下線を付ける場合は 0
SPI_SETKEYBOARDCUES
SPI_SETMENUUNDERLINES
メニューアクセスキー文字の下線の設定
uiParam は 0
pvParam は BOOL 型変数
必ず下線を付ける場合は 0 以外の値を,メニューを呼び出したときのみ下線を付ける場合は 0 を指定
SPI_SETLANGTOGGLE 入力言語を切り替えるホットキーを読込む
uiParam は 0
pvParam は nil

実行後,[キーボードのプロパティ] の [言語] タブの表示が自動的に変更される ([地域と言語のオプション] のホットキーは予め登録されているものとする)