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.