|
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 同梱) |
表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
起動すると現在の設定を表示 |
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.
システムの既定の入力言語ロケールの取得と変更のサンプルです.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 を変換中
- ロケールを変更してからエクセルを起動しないと有効にならない
|
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.
入力ロケールの一覧をレジストリから取得する例です. |
|
図7
既定の入力ロケール一覧 |
|
図8
現ユーザが使用可能なロケール |
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.
キーを押下してから,リピート開始までの待ち時間の取得と設定のサンプルです.
待ち時間は 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
起動すると現在の設定を表示 |
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.
同じキーを押し続けた場合,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
起動すると現在の設定を表示 |
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.
このフラグを利用して,作成するアプリケーション側で利用することができます.
これは,ユーザーがマウ スではなく,主にキーボードを使っていて,通常では表示されないキーボードインターフェイスを表示するような用途に利用するためのフラグです.
ユーザー補助の [アプリケーションにキー ボードのヘルプを追加する] の設定に相当します. |
表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
起動すると現在の設定を表示 |
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.
マウスカーソルの移動,加速の程度の設定値取得と設定のサンプルです.ただし,同じ値でも 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
起動すると現在の設定を表示 |
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.
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
起動すると現在の設定を表示 |
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.
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.
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
起動すると現在の設定を表示 |
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.
マウスの移動速度の取得と設定のサンプルです.
マウスの速度は,マウスの移動距離に応じて,ポインタを移動させる距離を決定します.この値は [コントロールパネル] の「マウス] で確認できます.設定範囲は 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
起動すると現在の設定を表示 |
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.
[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
起動すると現在の設定を表示 |
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.
スクロール行数の取得と設定です.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
起動すると現在の設定を表示 |
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.
ダブルクリックの間隔をミリ秒単位で設定,またはその値を取得します.ここで設定した時間内に 2 回目のクリックをしないとダブルクリックとはなりません.
SystemParametersInfo 関数では現在値の取得ができないので,GetDoubleClickTime 関数で取得しています.設定は SetDoubleClickTime 関数でもできます. |
表14
uiAction パラメータは SystemParametersInfo 関数の第 1 引数
uiParam は第 2 引数で,pvParam は第 3 引数 |
uiAction パラメータ |
uiParam と pvParam パラメータ |
SPI_SETDOUBLECLICKTIME |
設定
uiParam に時間をミリ秒単位で指定
pvParam は nil |
|
図19
起動すると現在の設定を表示 |
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.
マウスの左右のボタン入換え機能のテストです.SystemParametersInf 関数には,この状態を取得するフラグがないので,SwapMouseButton 関数を使用しています. |
表15
uiAction パラメータは SystemParametersInfo 関数の第 1 引数
uiParam は第 2 引数で,pvParam は第 3 引数 |
uiAction パラメータ |
uiParam と pvParam パラメータ |
SPI_SETMOUSEBUTTONSWAP |
設定
uiParam が 0 以外の値は交換,0 の時は交換なし
pvParam は nil |
|
図20
起動すると現在の設定を表示 |
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.
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.
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.
表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
実行後,[キーボードのプロパティ] の [言語] タブの表示が自動的に変更される ([地域と言語のオプション] のホットキーは予め登録されているものとする) |
|