C++ Builder Tips


Windowsのホットキーを使用する


Windowがアクティブでないときにもキーボード上で押されたキーを認識するホットキーを使用するにはWindowsAPIのRegisterHotKey()を使います。いわゆるキーフックを簡単に実現する方法です。手順は以下のとおりです。
まず、WM_HOTKEYメッセージを補足するように、メインフォームのヘッダファイルで次のように宣言します。

WM_HOTKEYメッセージを受け取ったら実行する関数(この例ではWMHotKey())の中身を書きます。WParamにホットキーの種類がIDの形で格納されています。このIDはRegisterHotKey()を実行してホットキーを登録したときに任意に決めることができます。

キーフックを開始するにはRegisterHotKey()を呼び出します。第2引数はホットキーのID、第3引数はCtrlやAltなどホットキーとして他のきーと 組み合わせて使うものを指定できます。第4引数はホットキーをVirtual Key Codeで指定します。この例ではCtrl+SPACEが押されたときにID 0x0000をWParamとしてWM_HOTKEYを発行することになります。それをWMHotKey()で補足して処理するという流れになっています。

キーフックを解除するには以下の関数を使います。
UnregisterHotKey(Handle,0x0000);

これで簡単にキーフックを実現することができます。制限としては、他のアプリケーションで予約されているホットキーを登録することはできません。さらに細かい制御をするためには、SetWindowsHookEx()など別のWindowsAPIを使用する必要があります。

class TForm1 : public TForm
{
private:
  void WMHotKey(TMessage& Message); //メッセージを受け取ったら実行する関数
  BEGIN_MESSAGE_MAP
    MESSAGE_HANDLER(WM_HOTKEY,TMessage,WMHotKey);//WM_HOTKEYメッセージを受け取る
  END_MESSAGE_MAP(TComponent)
};

void TForm1::WMHotKey(TMessage& Message)
{
  if(Message.WParam == 0x0000)
  {
    MessageBox(Handle,"ホットキーが押されました","",MB_OK);
  }
}

if(RegisterHotKey(Handle,0x0000,MOD_CONTROL,VK_SPACE)==0)
{
  MessageBox(Handle,"指定されたホットキーはすでに他のアプリケーションで予約されています。","エラー",MB_OK);
}

// キーフックの解除
UnregisterHotKey(Handle,0x0000);



目次に戻る
Copyright(c) 2008 WoodenSoldier Software