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 同梱)



  • 2006年09月07日
  • リンク修正
  • 2013年10月03日
  • コードと記事を整備
  • THotKey コンポーネントを使用したサンプルを追加




01_グローバルホットキーの登録


あるキーの組み合わせを押下したら、何かの動作をさせたい。しかも、システム全体で有効にしたい場合は、グローバルホットキーの機能が利用できます。
あるキーの組み合わせをグローバルホットキーとしてシステムに登録すると、そのキーの組み合わせを押下すると、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
グローバルなホットキープロジェクトのソースコード
//=============================================================================
//  起動時は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.


リスト2
グローバルホットキーの登録
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 コンポを使用したグローバルホットキーの登録
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.




03_画面上のマウスカーソル位置の色を取得


グローバルホットキーの利用例です。画面上のマウスカーソル位置の色を取得して表示します。
指定座標の色だけであれば、例えば、次のコードで取得できます。


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 をクリック
  • ホットキーを押下すると、その時のマウスカーソル位置の色を取得して表示

リスト4
画面上のマウスカーソル位置の色を取得
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 を生成して使用する方法)
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 イベントで検出
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 メソッドで検出
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
メニューの項目のショートカットキーを実行時に設定する例
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
設計時画面
  • THotkey コンポーネントを配置
図12
実行画面
  • 押下したショートカットキーも表示
図13
示唆ょーとカットキーを変更
  • THotkey コンポにフォーカスを移動
  • 設定するショートカットキーを押下
  • 変更したら [Button1] をクリック
  • 変更したショートカットキーを押下

リスト9
THotkey を使用して、実行時に視覚的にショートカットキーを変更
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.