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 .