グローバルホットキー
一般的なアプリケーションは自分自身がアクティブな時のみキー入力を受け付けます。
しかし他のアプリケーションの補助を行う場合や、Windows自身の操作を拡張するときに自分自身がアクティブでは無いがキー入力を受け取りたいという場合があります。
そういうときに使用するのがグローバルホットキーです
開始方法
RegisterHotKey(ハンドル, 重複しない番号, CtrlやShift状態を示す値, キーコード);
終了方法
UnregisterHotKey(ハンドル, 開始時に使用した番号);
処理の受け取り方
procedure TFormMain.WndProc(var Message: TMessage);
inherited WndProc(Message); // 他のプロセスへも処理を回す
if Message.Msg <> WM_HOTKEY then exit; // ホットキー以外は処理しない
if Message.WParam <> 開始時に使用した番号 then exit;
// ここに処理を書く
ホットキーに使うショートカットキーの設定
あらかじめホットキーに使用するキーが決まっている場合は固定値でも良いのですが、折角ですからユーザーで設定出来るようにします。
DelphiにはあらかじめTHotKeyという便利なコンポーネントがありますのでこれを使います。
ただしこのコンポーネントに癖があるため使うために工夫が必要になります。
ショートカットキーの値とは?
ショートカットキーが設定できるTHotKeyというコンポーネントがあることを説明しましたが、ではショートカットキーを値として保存しておくには何を保存すれば良いと思いますか?
キー部分はキーコードを覚えておけば良さそうですがShiftやCtrlを押しながらという設定もあるので設定値が増える気はします。
しかし実はWORD型の値を1つ覚えておくだけでグローバルホットキーの指定もショートカットキーの設定も可能です。
THotKeyをWORD値による取得設定に対応させる
THotKeyに何故かまともな設定と取得方法が存在しません。これはかなり謎の部分です
published節に取得設定方法が用意されていないのでウインドウメッセージを使って自力で作る必要があります。
THotKeyの設定状態を取得
取得した値 = SendMessage(HotKey1.Handle, HKM_GETHOTKEY, 0, 0);
THotKeyの設定状態を設定
SendMessage(HotKey1.Handle, HKM_SETHOTKEY, 設定する値, 0);
THotKeyで指定したショートカットキーをホットキーとして設定
procedure TFormMain.HotkeyStart(HotKey : WORD);
var
mKey : Cardinal;
b,hKey : Integer;
begin
if HotKey = 0 then exit; // 未設定時未処理
FHotkeyUsed := True; // ホットキー設定済みとする
hKey := FConfig.HotKey; // ホットキー取得
b := hKey shr 8; // Shit,Ctrl部分を取得
mKey := 0; // Shift,Ctrlの指定値初期化
if (b and $01) <> 0 then mKey := mKey + MOD_SHIFT; // Shift指定時の演算
if (b and $02) <> 0 then mKey := mKey + MOD_CONTROL; // Ctrl指定時の演算
if (b and $04) <> 0 then mKey := mKey + MOD_ALT; // Alt指定時の演算
RegisterHotKey(Handle, 1, mKey, hKey and $ff); // ホットキー設定
end;
最後に
これでTHotKeyを利用したグローバルホットキーを使うことが出来るようになります。
慣れればとても便利ですが、それ以前にどうしてこんな構造にしたのか謎が残ります。