DelphiでRegisterHotKeyを使ったグローバルホットキー登録|WM_HOTKEY応答とウィンドウ制御の実装例
DelphiのVCLアプリケーションで、アクティブでない状態でもキー入力に応答するには、RegisterHotKey関数を使ったグローバルホットキーの登録が有効です。
このページでは、WM_HOTKEYメッセージの処理方法、GlobalAddAtomによるホットキーIDの管理、SetWindowPosを使ったウィンドウの前面表示など、実用的なコード例とともに詳しく解説します。
CTRL+WIN+F12やALT+Zなどのキーを使った登録例も紹介しています。
プロジェクトとフォームの作成
Delphi IDEを起動し、「ファイル」⇒「Windows VCLアプリケーション -Delphi」をクリックします
フォーム上に以下をドラッグ&ドロップします。
TMemo×1個
ソースコードの記述
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]キーを押します。
実行したアプリケーションがアクティブになり、前面に出てきて、押されたキーが表示されます。
