Ctrl/Shift/Alt/Winキーを受け付けるWindowsのHotKeyを登録・処理する
49 HotKeyRegistration 動作確認 Delphi2007 更新日 2008/01/29(火)

HotKeyというのは、あるキーの組み合わせを押したら
どんなアプリが動いていても
自分のアプリのイベントが呼ばれるという便利な仕組みです。

アプリケーション内でWindowsOSにキーを登録しておけば
登録したアプリ(というかウィンドウハンドル)に
メッセージが流れてくる仕組みです。

これを使えば、例えば、どんな場面でもEscを押したら
動作するようなソフトを作る事が出来ます。

HotKeyを登録するのに、Formのハンドルが必要です。
────────────────────
type
  TForm1 = class(TForm)
  private
  protected
  public
    procedure WMHotKey(var Msg: TWMHotKey); message WM_HOTKEY;
  end;

{-------------------------------
//  HotKeyの処理
機能:
備考:       ShortCutToKeyを使っているので
            uses Menusが必要
履歴:       2007/01/03(水) 01:08
//------------------------------}
procedure SetHotKeyToOS(Handle: THandle; HotKeyNumber: Integer; VirtualKey: Word;
 Shift, Ctrl, Alt, Win: Boolean);
var
  Modifiers: Word;
begin
  Modifiers := 0;
  if Shift  then Modifiers := Modifiers or MOD_SHIFT;
  if Ctrl   then Modifiers := Modifiers or MOD_CONTROL;
  if Alt    then Modifiers := Modifiers or MOD_ALT;
  if Win    then Modifiers := Modifiers or MOD_WIN;
  RegisterHotKey(Handle, HotKeyNumber, Modifiers, VirtualKey);
end;

//WindowsHotKey登録後、受け取り処理
procedure TForm1.WMHotKey(var Msg: TWMHotKey);
begin
  {下:登録したHotKeyNumberによってcaseで分岐出来ます}
  case Msg.HotKey of
    1: ShowMessage('Aが押されました');
    2: ShowMessage('↑が押されました');
    3: ShowMessage('Escが押されました');
  end;
end;
//------------------------------

//-------------------------------
//Windowsホットキーを登録する
procedure TForm1.Button1Click(Sender: TObject);
begin
  SethotKeyToOS(Self.Handle, 1, Ord('A'), False, False, False, False);
  SethotKeyToOS(Self.Handle, 2, VK_UP, False, False, False, False);
  SethotKeyToOS(Self.Handle, 3, VK_ESCAPE, False, False, False, False);
end;

procedure TMainForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  if CanClose then
  begin
    UnregisterHotKey(Self.Handle, 1);
    UnregisterHotKey(Self.Handle, 2);
    UnregisterHotKey(Self.Handle, 3);
  end;
end;
────────────────────
アプリケーション終了すれば解除されるようですが
RegisterHotKeyを行った時はUnRegisterHotKeyを行った方がよいでしょう。