Delphi Programming / Object Pascal
[掲載 2005年03月25日] [更新 2016年12月31日] Delphi サンプルプログラム集
360_グローバルホットキーの登録とショートカットキー
動作確認等
Windows 7 U64(SP1) + Delphi XE(UP1) Pro
360_GlobalHotKey.zip [3,753 KB] 2016年12月31日版 (EXE 同梱)
2013年10月03日
コードと記事を整備
THotKey コンポーネントを使用したサンプルを追加
あるキーの組み合わせを押下したら,何かの動作をさせたい.しかも,システム全体で有効にしたい場合は,グローバルホットキーの機能が利用できます.
あるキーの組み合わせをグローバルホットキーとしてシステムに登録すると,そのキーの組み合わせを押下すると,WM_HOTKEY メッセージが発生します.このメッセージを処理します.
Delphi では,WM_HOTKEY メッセージの型は,コード補完の機能を利用してメッセージの実装部を作成すると,次のような TWMHotkey 型となります.本ページのサンプルでは,これを TMessage 型に変更して使用しています.そうすることにより,ホットキーの情報取得の際,下位ワード,上位ワードの値の取得が容易になり便利です.
TWMHotKey = record
Msg: Cardinal;
MsgFiller: TDWordFiller;
HotKey: WPARAM;
Unused: LPARAM;
Result: LRESULT;
end ;
ホットキーの登録には,キーの組み合わせを意味する文字列を,システムのアトムと呼ばれるテーブルに登録します.登録すると,システムで一意で認識可能な ID 値が取得できます.WM_HOTKEY メッセージでは,この ID 値でキー押下を知ることができます.
したがって,メッセージ ID が HotKeyID とした場合,WM_HOTKEY メッセージの基本的な処理コードは次のようになります.
procedure TForm1.WMHotKey(var Message: TMessage);
begin
if Message.WParam = HotKeyID then begin
// ホットキーが押された時の処理
end ;
end ;
次のサンプルは,起動してもメインフォームを表示しません.実行開始時に [Ctrl] + [Shift] + [A] を登録し,これらのキーの組合わせを押すと,メインフォームを表示します.
ホットキーは,いくつでもシステムに登録できますが,変数をいくつも用意するよりも,配列を使用した方が扱いやすいと思われます.
図1
実行画面
実行開始時はフォームは非表示となっている
登録したホットキーを押したら表示
表示は登録キーの組合わせ
リスト1
グローバルなホットキープロジェクトのソースコード
copy code
// =============================================================================
// 起動時はApplication.ShowMainForm := Falseで非表示にしている
// オブジェクトインスペクタのVisibleもFalseに設定
// =============================================================================
begin
Application.Initialize;
// Delphi2007以上
{$IF CompilerVersion > 18.49}
Application.MainFormOnTaskbar := True;
{$IFEND}
Application.CreateForm(TForm1, Form1);
Application.ShowMainForm := False;
Application.Run;
end .
copy code
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls;
type
TForm1 = class (TForm)
Panel1: TPanel;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
protected
procedure WMHotKey(var Message: TMessage); message WM_HOTKEY;
private
{ Private 宣言 }
FHotKeyID : integer;
public
{ Public 宣言 }
end ;
var
Form1 : TForm1;
implementation
{$R *.DFM}
// =============================================================================
// フォーム生成時の処理
//
// ここでは[Ctrl]+[Shift]+[A]を登録
// =============================================================================
procedure TForm1.FormCreate(Sender: TObject);
var
LHotKeySet : Cardinal;
LHotKeyShifts : Cardinal;
begin
LHotKeySet := Ord('A' );
LHotKeyShifts := MOD_CONTROL or MOD_SHIFT;
// ホットキーをグローバルアトムのテーブルに追加
// 文字列を識別する一意の値をホットキーIDとして取得
FHotKeyID := GlobalAddAtom('Myhotkey' );
// そのID値でホットキーを登録する
RegisterHotKey(Handle, FHotKeyID, LHotKeyShifts, LHotKeySet);
end ;
// =============================================================================
// フォーム破棄時の処理
// =============================================================================
procedure TForm1.FormDestroy(Sender: TObject);
begin
if FHotKeyID <> 0 then begin
// ホットキーの登録解除
UnregisterHotKey(Handle, FHotKeyID);
// アトムに関連付けられている文字列を、アトムテーブルから削除
GlobalDeleteAtom(FHotKeyID);
end ;
end ;
// =============================================================================
// WM_HOTKEYメッセージの処理
// ここではフォーム上に配置したパネルに,押下したキーを表示
// =============================================================================
procedure TForm1.WMHotKey(var Message: TMessage);
var
LShifts : string ;
begin
// 登録したホットキーが押された時の処理
if Message.WParam = FHotKeyID then begin
LShifts := '' ;
if (Message.LParamLo and MOD_CONTROL) <> 0 then LShifts := LShifts + '[ Ctrl ] ' ;
if (Message.LParamLo and MOD_SHIFT) <> 0 then LShifts := LShifts + ' [ Shift ] ' ;
if (Message.LParamLo and MOD_Alt) <> 0 then LShifts := LShifts + ' [ Alt ] ' ;
// このフォームを表示
Show;
SetForegroundWindow(Handle);
Panel1.Caption := LShifts + ' [ ' + Chr(Message.LParamHi) + ' ]' ;
end ;
end ;
end .
02_ THotkey コンポを使用したグローバルホットキーの登録
上のサンプルでは,ホットキーは,コード内で設定した固定の組み合わせでした.
実行時に任意のホットキーを登録するには,Delphi 付属の THotKey コンポーネントを利用すると便利です.このコンポーネントにフォーカスを移動し,キーを押下すると,そのキーの文字が表示されるようになっています.これを利用します.
このコンポーネントを使用したサンプルです.
図2
設計時画面
Alt + A と表示しているのが THotkey コンポ
図3
実行画面
EXE 実行後,Button1 をクリック
他のアプリにフォーカス移動して,[Alt] + [A] を押下
リスト3
THotkey コンポを使用したグローバルホットキーの登録
copy code
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, ComCtrls, StdCtrls;
type
TForm1 = class (TForm)
HotKey1: THotKey;
Button1: TButton;
procedure FormDestroy(Sender: TObject);
procedure Button1Click(Sender: TObject);
protected
procedure WMHotKey(var Message: TMessage); message WM_HOTKEY;
private
{ Private 宣言 }
FHotKeyID : Integer;
public
{ Public 宣言 }
end ;
var
Form1 : TForm1;
implementation
uses CommCtrl;
{$R *.DFM}
// =============================================================================
// フォーム破棄時の処理
// =============================================================================
procedure TForm1.FormDestroy(Sender: TObject);
begin
if FHotKeyID <> 0 then begin
// アトムに関連付けられている文字列を、アトムテーブルから削除
GlobalDeleteAtom(FHotKeyID);
// ホットキーの登録解除
UnregisterHotKey(Handle, FHotKeyID);
end ;
end ;
// =============================================================================
// ホットキーの登録
// =============================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
LflgCheckHotKey : Boolean;
LHotKey : WORD;
LKeyModifires : Cardinal;
LKeyMod : Cardinal;
LKeyVirtual : Cardinal;
begin
// THotkeyコンポの設定値からRegisterHotkey関数で登録するための値に変換
LHotKey := SendMessage(HotKey1.Handle, HKM_GETHOTKEY, 0 , 0 );
LKeyMod := 0 ;
LKeyModifires := HiByte(LHotKey);
LKeyVirtual := LoByte(LHotKey);
if (LKeyModifires and HOTKEYF_ALT) <> 0 then LKeyMod := LKeyMod or MOD_ALT;
if (LKeyModifires and HOTKEYF_CONTROL) <> 0 then LKeyMod := LKeyMod or MOD_CONTROL;
if (LKeyModifires and HOTKEYF_SHIFT) <> 0 then LKeyMod := LKeyMod or MOD_SHIFT;
// アトムテーブルに文字列(ホットキーを識別する文字列)を登録
FHotKeyID := GlobalAddAtom('Myhotkey' );
// ホットキーの登録
// 一度,ホットキーの登録解除を行う
FormDestroy(nil );
LflgCheckHotKey := RegisterHotkey(Handle, FHotKeyID, LKeyMod, LKeyVirtual);
if not LflgCheckHotKey then begin
MessageBox(Handle, 'ホットキーが登録できませんでした.' , '失敗' , MB_ICONWARNING);
end ;
end ;
// =============================================================================
// WM_HOTKEYメッセージの処理
// =============================================================================
procedure TForm1.WMHotKey(var Message: TMessage);
begin
// 登録したホットキーが押された時の処理
if Message.WParam = FHotKeyID then begin
SetForegroundWindow(Handle);
MessageBox(Handle, 'ホットキーが押されました' , '情報' , MB_ICONINFORMATION);
end ;
end ;
end .
グローバルホットキーの利用例です.画面上のマウスカーソル位置の色を取得して表示します.
指定座標の色だけであれば,例えば,次のコードで取得できます.
copy code
procedure TForm1.Button2Click(Sender: TObject);
var
LDispDC : HDC;
LPosX : Integer;
LPosY : Integer;
LColor : COLORREF;
begin
Panel1.ParentBackground := False;
LDispDC := CreateDC('DISPLAY' , nil , nil , nil );
LPosX := 10 ;
LPosY := 20 ;
LColor := GetPixel(LDispDC, LPosX, LPosY);
DeleteDC(LDispDC);
Panel1.Color := LColor;
end ;
グローバルホットキーの利用すれば,その時のマウスカーソルの位置が取得できます.
マウスカーソルの位置が分かれば,GetPixel 関数でその位置の色を取得することができます.そのサンプルです.
マウスボタンをクリックした時の,マウスカーソルの位置を取得するには,基本的に,マウスのグローバルフックを使用することになります.
図4
設計時画面
Alt + A と表示しているのが THotkey コンポ
図5
実行画面
EXE 実行後,Button1 をクリック
ホットキーを押下すると,その時のマウスカーソル位置の色を取得して表示
copy code
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, ComCtrls, StdCtrls;
type
TForm1 = class (TForm)
HotKey1: THotKey;
Button1: TButton;
Panel1: TPanel;
Edit1: TEdit;
procedure FormDestroy(Sender: TObject);
procedure Button1Click(Sender: TObject);
protected
procedure WMHotKey(var Message: TMessage); message WM_HOTKEY;
private
{ Private 宣言 }
FHotKeyID : Integer;
public
{ Public 宣言 }
end ;
var
Form1 : TForm1;
implementation
uses CommCtrl;
{$R *.DFM}
// =============================================================================
// フォーム破棄時の処理
// =============================================================================
procedure TForm1.FormDestroy(Sender: TObject);
begin
if FHotKeyID <> 0 then begin
// アトムに関連付けられている文字列を、アトムテーブルから削除
GlobalDeleteAtom(FHotKeyID);
// ホットキーの登録解除
UnregisterHotKey(Handle, FHotKeyID);
end ;
end ;
// =============================================================================
// ホットキーの登録
// =============================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
LflgCheckHotKey : Boolean;
LHotKey : WORD;
LKeyModifires : Cardinal;
LKeyMod : Cardinal;
LKeyVirtual : Cardinal;
begin
// THotkeyコンポの設定値からRegisterHotkey関数で登録するための値に変換
LHotKey := SendMessage(HotKey1.Handle, HKM_GETHOTKEY, 0 , 0 );
LKeyMod := 0 ;
LKeyModifires := HiByte(LHotKey);
LKeyVirtual := LoByte(LHotKey);
if (LKeyModifires and HOTKEYF_ALT) <> 0 then LKeyMod := LKeyMod or MOD_ALT;
if (LKeyModifires and HOTKEYF_CONTROL) <> 0 then LKeyMod := LKeyMod or MOD_CONTROL;
if (LKeyModifires and HOTKEYF_SHIFT) <> 0 then LKeyMod := LKeyMod or MOD_SHIFT;
// アトムテーブルに文字列(ホットキーを識別する文字列)を登録
FHotKeyID := GlobalAddAtom('Myhotkey' );
// ホットキーの登録
// 一度,ホットキーの登録解除を行う
FormDestroy(nil );
LflgCheckHotKey := RegisterHotkey(Handle, FHotKeyID, LKeyMod, LKeyVirtual);
if not LflgCheckHotKey then begin
MessageBox(Handle, 'ホットキーが登録できませんでした.' , '失敗' , MB_ICONWARNING);
end ;
end ;
// =============================================================================
// WM_HOTKEYメッセージの処理
// デスクトップのマウスカーソル位置の色を取得
// =============================================================================
procedure TForm1.WMHotKey(var Message: TMessage);
var
LDispDC : HDC;
LMousePos : TPoint;
LColor : COLORREF;
begin
Panel1.Caption := '' ;
Panel1.ParentBackground := False;
// 登録したホットキーが押された時の処理
if Message.WParam = FHotKeyID then begin
SetForegroundWindow(Handle);
GetCursorPos(LMousePos);
LDispDC := CreateDC('DISPLAY' , nil , nil , nil );
try
LColor := GetPixel(LDispDC, LMousePos.X, LMousePos.Y);
Edit1.Text := Format('$%.8x' , [LColor]);
finally
DeleteDC(LDispDC);
end ;
Panel1.Color := LColor;
end ;
end ;
end .
次のように,デスクトップの TCanvas オブジェクトを生成する方法もあります.この方法は TCanvas を使用して,デスクトップに対する操作が可能です.
リスト5
画面上のマウスカーソル位置の色を取得 (TCanvas を生成して使用する方法)
copy code
procedure TForm1.WMHotKey(var Message: TMessage);
var
LScreenDC : HDC;
LScreenCanvas : TCanvas;
LMousePos : TPoint;
LColor : COLORREF;
begin
Panel1.Caption := '' ;
Panel1.ParentBackground := False;
// 登録したホットキーが押された時の処理
if Message.WParam = FHotKeyID then begin
SetForegroundWindow(Handle);
GetCursorPos(LMousePos);
// ディスプレイのデバイスコンテキストを取得
// LScreenDC := GetDC(0);でも同じ
LScreenDC := CreateDC('DISPLAY' , nil , nil , nil );
// スクリーンのキャンバス生成
LScreenCanvas := TCanvas.Create;
// そのハンドルを設定(この値がないと取得設定共に不可)
LScreenCanvas.Handle := LScreenDC;
try
LColor := LScreenCanvas.Pixels[LMousePos.X, LMousePos.Y];
Panel1.Color := LColor;
Edit1.Text := Format('$%.8x' , [LColor]);
finally
FreeAndNil(LScreenCanvas);
DeleteDC(LScreenDC);
end ;
Panel1.Color := LColor;
end ;
end ;
04_ ショートカットキーの設定と検出 - OnShortCut イベントで検出
ここまでは,グローバルホットキーのサンプルでした.同じ様なキー操作でショートカットキーと呼ばれているものがあります.これは主に,そのアプリケーションで有効なキー操作です.
これ以降は,このショートカットキー関係のサンプルです.
本サンプルでは ShortCut 関数で TShortCut 型の変数のショートカットキーを作成します.ショートカットキーを押されたのをフォームの OnShortCutイベントで検出します.
図6
設計時画面
図7
実行画面
リスト6
ショートカットキーの設定と検出 - OnShortCut イベントで検出
copy code
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls, ComCtrls;
type
TForm1 = class (TForm)
procedure FormCreate(Sender: TObject);
procedure FormShortCut(var Msg: TWMKey; var Handled: Boolean);
private
{ Private 宣言 }
FShortCut : TShortCut;
public
{ Public 宣言 }
end ;
var
Form1: TForm1;
implementation
uses
Menus;
{$R *.DFM}
// =============================================================================
// フォーム生成時の処理
// ShortCut関数の使用にはusesにMenusが必要
// =============================================================================
procedure TForm1.FormCreate(Sender: TObject);
begin
// ショートカットキーの設定
FShortCut := ShortCut(Ord('A' ), [ssAlt]);
end ;
// =============================================================================
// このフォームのOnShortCutイベント処理
// ショートカットキーを押下した時に発生するイベント
// OnKeyDownイベントより前に発生する
// =============================================================================
procedure TForm1.FormShortCut(var Msg: TWMKey; var Handled: Boolean);
var
LShortCut : TShortCut;
LText : string ;
begin
// メッセージのメンバからシュートカットキーのTShortCut型の値を取得
LShortCut := ShortCut(Msg.CharCode, KeyDataToShiftState(Msg.KeyData));
// その値が定義したショートカットキーと同じ場合
if LShortCut = FShortCut then begin
LText := 'ショートカットキーが押されました' + sLineBreak
+ ShortCutToText(FShortCut);
MessageBox(Handle, PChar(LText), '結果' , MB_ICONINFORMATION);
// 処理したことを通知
Handled := True;
end ;
end ;
end .
ショートカットキーは,以下のように TextToShortCut 関数でも設定できます.TextShortCut 関数ではキーの組み合わせの文字列で設定します.
procedure TForm1.FormCreate(Sender: TObject);
begin
// ショートカットキーの設定
FShortCut := TextToShortCut('Alt+A' );
end ;
05_ ショートカットキーの設定と検出 - IsShortCut メソッドで検出
ショートカットキーの押下は,TForm.IsShortCut メソッドでも検出できます.その例です.
TForm.IsShortCut メソッドは元々 TForm に実装されているメソッドです.それを override して使用します.
リスト7
ショートカットキーの設定と検出 - IsShortCut メソッドで検出
copy code
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls, ComCtrls;
type
TForm1 = class (TForm)
PopupMenu1: TPopupMenu;
Item1: TMenuItem;
Item2: TMenuItem;
Item3: TMenuItem;
procedure FormCreate(Sender: TObject);
private
{ Private 宣言 }
FShortCut : TShortCut;
public
{ Public 宣言 }
function IsShortCut(var Message: TWMKey): Boolean; override ;
end ;
var
Form1: TForm1;
implementation
uses
Menus;
{$R *.DFM}
// =============================================================================
// フォーム生成時の処理
// ShortCut関数の使用にはusesにMenusが必要
// =============================================================================
procedure TForm1.FormCreate(Sender: TObject);
begin
// ショートカットキーの設定
FShortCut := ShortCut(Ord('A' ), [ssAlt]);
end ;
// =============================================================================
// このフォームのIsShortCutメソッドのoverride関数
// IsShortCutはショートカットキーが定義されていればそれを検出する
// =============================================================================
function TForm1.IsShortCut(var Message: TWMKey): Boolean;
var
LShortCut : TShortCut;
LText : string ;
begin
// メッセージのメンバからシュートカットキーのTShortCut型の値を取得
LShortCut := ShortCut(Message.CharCode, KeyDataToShiftState(Message.KeyData));
// その値が定義したショートカットキーと同じ場合
if LShortCut = FShortCut then begin
LText := 'ショートカットキーが押されました' + sLineBreak
+ ShortCutToText(FShortCut);
MessageBox(Handle, PChar(LText), '結果' , MB_ICONINFORMATION);
// 処理したことを通知(FShortCutの検出はこれ以上しない)
Result := True;
end else begin
// 別のショートカットキー操作の検出
Result := inherited IsShortCut(Message);
end ;
end ;
end .
06_ ショートカットキーの設定と検出 - メニュー項目の例
TMainMenu や TPopupMenu の各アイテム (TMenuItem) には AutoHotkey プロパティがあります.メニューを表示した時に,マウスでその項目をクリックしなくても,そのキーを押下すると,該当するメニューの OnClick イベントを実行することができます.また,ShortCut プロパティを設定すると,メニューを表示しなくても,そのショートカットキーで OnClick イベントを実行できます.
本サンプルは,その動作を実際に確認するサンプルです.
このサンプルではフォームのポップアップメニューに PopupMenu1 を使用しています.PopupMenu1 には項目が設定してあり,その 1 番目 (Item の値は 0) にクリックイベントを実装しています.
ショートカットキーは,設計時にオブジェクトインスペクタで設定できますが,このサンプルでは実行時にショートカットキーとして [Alt] + [A] を割り当てています.
図8
設計時画面
Item1 に OnClick イベントを実装している
図9
実行画面
押下したショートカットキーも表示
このダイアログは Items[0].OnClick イベント内で表示している
図10
実行画面
Form1 のポップアップメニューを表示
Items[0] には,実行時に設定したショートカットキーが表示されている
リスト8
メニューの項目のショートカットキーを実行時に設定する例
copy code
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls, ComCtrls, Menus;
type
TForm1 = class (TForm)
PopupMenu1: TPopupMenu;
Item1: TMenuItem;
Item2: TMenuItem;
Item3: TMenuItem;
procedure FormCreate(Sender: TObject);
procedure Item1Click(Sender: TObject);
private
{ Private 宣言 }
FShortCut : TShortCut;
public
{ Public 宣言 }
end ;
var
Form1: TForm1;
implementation
{$R *.DFM}
// =============================================================================
// フォーム生成時の処理
// ShortCut関数の使用にはusesにMenusが必要
// (TPopupMenuコンポをフォームに配置すれば自動で追加される)
// =============================================================================
procedure TForm1.FormCreate(Sender: TObject);
begin
// このフォームのポップアップメニューをPopupMenu1とする
Self.PopupMenu := PopupMenu1;
// ショートカットキーの設定
FShortCut := ShortCut(Ord('A' ), [ssAlt]);
// PopupMenu1のItemのショートカットキーをHotkey1のHotkeyの値とする
PopupMenu1.Items[0 ].ShortCut := FShortCut;
end ;
// =============================================================================
// PopupMene1のOnClickイベント処理
// ポップアップメニューを表示せずに,ショートカットをクリックと同じ動作実行
// =============================================================================
procedure TForm1.Item1Click(Sender: TObject);
var
LText : string ;
begin
LText := 'ショートカットキーが押されました' + sLineBreak
+ ShortCutToText(FShortCut);
MessageBox(Handle, PChar(LText), '結果' , MB_ICONINFORMATION);
end ;
end .
07_ THotkey を使用したショートカットキーの設定と検出
THotkey コンポーネントを使用すると,アプリの実行時に GUI 操作でショートカットキーの変更ができます.そのサシンプルです.
図11
設計時画面
図12
実行画面
図13
示唆ょーとカットキーを変更
THotkey コンポにフォーカスを移動
設定するショートカットキーを押下
変更したら [Button1] をクリック
変更したショートカットキーを押下
リスト9
THotkey を使用して,実行時に視覚的にショートカットキーを変更
copy code
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls, ComCtrls;
type
TForm1 = class (TForm)
HotKey1: THotKey;
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormShortCut(var Msg: TWMKey; var Handled: Boolean);
private
{ Private 宣言 }
FShortCut : TShortCut;
public
{ Public 宣言 }
end ;
var
Form1: TForm1;
implementation
uses
Menus;
{$R *.DFM}
// =============================================================================
// フォーム生成時の処理
// =============================================================================
procedure TForm1.FormCreate(Sender: TObject);
begin
Button1Click(nil );
end ;
// =============================================================================
// ホットキー(ショートカットキー)を設定
//
// THotkeyのショートカットの設定はTHotKey.Modifiersでもできる
// ShortCutで設定したTShortCut型の値もTHotKey.HotKeyの値として使用可能
// (ShortCut関数の使用にはusesにMenusが必要)
// =============================================================================
procedure TForm1.Button1Click(Sender: TObject);
begin
// ショートカットキーの設定
FShortCut := HotKey1.HotKey;
end ;
// =============================================================================
// このフォームのOnShortCutイベント処理
// ショートカットキーを押下した時に発生するイベント
// OnKeyDownイベントより前に発生する
// =============================================================================
procedure TForm1.FormShortCut(var Msg: TWMKey; var Handled: Boolean);
var
LShortCut : TShortCut;
LText : string ;
begin
// メッセージのメンバからシュートカットキーのTShortCut型の値を取得
LShortCut := ShortCut(Msg.CharCode, KeyDataToShiftState(Msg.KeyData));
// その値が定義したショートカットキーと同じ場合
if LShortCut = FShortCut then begin
LText := 'ショートカットキーが押されました' + sLineBreak
+ ShortCutToText(FShortCut);
MessageBox(Handle, PChar(LText), '結果' , MB_ICONINFORMATION);
// 処理したことを通知(他では検出不可になりOnKeyDownでの検出も不可になる)
Handled := True;
end ;
end ;
end .