2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

グローバルホットキーの設定とホットキーとして割り当てるキーの設定方法

Posted at

グローバルホットキー

一般的なアプリケーションは自分自身がアクティブな時のみキー入力を受け付けます。
しかし他のアプリケーションの補助を行う場合や、Windows自身の操作を拡張するときに自分自身がアクティブでは無いがキー入力を受け取りたいという場合があります。

そういうときに使用するのがグローバルホットキーです

開始方法

RegisterHotKey(ハンドル, 重複しない番号, CtrlやShift状態を示す値, キーコード);

終了方法

UnregisterHotKey(ハンドル, 開始時に使用した番号);

処理の受け取り方

sample.pas
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で指定したショートカットキーをホットキーとして設定

sample.pas
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を利用したグローバルホットキーを使うことが出来るようになります。

慣れればとても便利ですが、それ以前にどうしてこんな構造にしたのか謎が残ります。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?