Windowsシステム全体にRegisterHotkey関数でホットキーを登録(VCL) ~Delphiでお手軽プログラミング

Windowsシステム全体にRegisterHotkey関数でホットキーを登録(VCL) ~Delphiでお手軽プログラミング

Windowsシステム全体にRegisterHotkey関数でホットキーを登録します。
ホットキーを登録すると、アプリケーションがアクティブでない場合でもホットキーが押されたら WM_HOTKEYメッセージが届いてキーの入力を捕まえることができるようになります。

プロジェクトとフォームの作成

Delphi IDEを起動し、「ファイル」⇒「Windows VCLアプリケーション -Delphi」をクリックします
フォーム上に以下をドラッグ&ドロップします。
TMemo×1個
RegisterHotkey画面デザイン

ソースコードの記述

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private 宣言 }
    FHotKeyID1:ATOM; //[CTRL]+[WIN]+[F12]キー 用ホットキーID
    FHotKeyID2:ATOM; //[ALT]+[Z]キー          用ホットキーID
    //ホットキーが押された時に呼び出されるメソッド
    procedure WMHotKey(var Message:TMessage); message WM_HOTKEY;
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var res:BOOL;
begin
  //ホットキーIDは、
  //アプリケーション(exe)の場合は$0000~$BFFFの範囲の値を指定し
  //DLLの場合はGlobalAddAtom関数で$C000~$FFFFの値を取得して指定する
  //  (例)FHotKeyID1:=GlobalAddAtom('MyAppRegistHotKey');
  //  (例)FHotKeyID2:=GlobalAddAtom('MyAppRegistHotKey');
  //今回はアプリケーション(exe)なのでホットキーIDを適当に指定する
  FHotKeyID1:=$B000;
  FHotKeyID2:=$B001;

  //ホットキーを登録 [CTRL]+[WIN]+[F12] キー
  res:=RegisterHotkey(Handle, FHotKeyID1, MOD_CONTROL or MOD_WIN, VK_F12);
  if res then
  begin
    //登録成功時
    Memo1.Lines.Add('[CTRL]+[WIN]+[F12]が登録されました');
  end
  else
  begin
    //登録失敗時
    Memo1.Lines.Add('失敗:[CTRL]+[WIN]+[F12]は既に他のアプリで登録済みです');
    FHotKeyID1:=0;
  end;

  //ホットキーを登録 [ALT]+[Z] キー
  res:=RegisterHotkey(Handle, FHotKeyID2, MOD_ALT, Ord('Z'));
  if res then
  begin
    //登録成功時
    Memo1.Lines.Add('[ALT]+[Z]が登録されました');
  end
  else
  begin
    //登録失敗時
    Memo1.Lines.Add('失敗:[ALT]+[Z]は既に他のアプリで登録済みです');
    FHotKeyID2:=0;
  end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  //DLLの場合はアトムに登録されている文字列を削除
  //  (例)GlobalDeleteAtom(FHotKeyID1);
  //  (例)GlobalDeleteAtom(FHotKeyID2);

  //ホットキーの登録解除
  if FHotKeyID1 <> 0 then
    UnregisterHotKey(Self.Handle,FHotKeyID1);
  if FHotKeyID2 <> 0 then
    UnregisterHotKey(Self.Handle,FHotKeyID2);
end;

procedure TForm1.WMHotKey(var Message: TMessage);
begin
  //■登録したホットキーが押された時の処理

  //ウィンドウが最小化されていたら普通に戻す
  if Self.WindowState=TWindowState.wsMinimized then
  begin
    Self.WindowState:=TWindowState.wsNormal;
  end;
  //ウィンドウをフォアグラウンドに設定する
  SetForegroundWindow(Self.Handle);
  //ウィンドウを手前に移動させる
  SetWindowPos(Self.Handle, HWND_TOP,0,0,0,0,SWP_NOMOVE+SWP_NOSIZE);

  if Message.WParam=FHotKeyID1 then
  begin
    Memo1.Lines.Add(
      FormatDateTime('hh:nn:ss',Now)+
      '[CTRL]+[WIN]+[F12]キーが押されました'
    );
  end
  else if Message.WParam=FHotKeyID2 then
  begin
    Memo1.Lines.Add(
      FormatDateTime('hh:nn:ss',Now)+
      '[ALT]+[Z]キーが押されました'
    );
  end;
end;

end.

実行する

実行⇒実行 などから実行します。(自動的にコンパイルされて、実行ファイルが生成され、実行されます)
実行したアプリケーションを「ウィンドウの最小化」するなり、デスクトップをクリックするなりして、非アクティブな状態にします。
この状態でキーボードから[ALT]+[Z]又は[CTRL]+[WIN]+[F12]キーを押します。
実行したアプリケーションがアクティブになり、前面に出てきて、押されたキーが表示されます。
RegisterHotkey実行画面