[WIN32API]ホットキーの登録と処理を実装する

MFC
この記事は約3分で読めます。

この記事で考えていたアプリケーションを開発する過程でホットキーによるイベント駆動を実装しました。

常駐型のアプリケーションで、特定のタイミングで起動したい場合はホットキーをトリガーにすると便利です。いちいちアクティブなアプリケーションを切り替えるよりもずっと使いやすくなります。

この記事では、ホットキーの登録と、ホットキーによる機能の起動について、忘れないうちにまとめたものです。

ホットキーの登録

ホットキーを使う場合は、OSに対して「このキーが押されたらこのアプリの機能を使うよ!」ということを教えてあげなければいけません。でなければOSがホットキーを認識できず、アプリにメッセージを流せないからです。

ホットキーの登録はRegisterHotKey()で行います。読んでそのまんまですね。

この関数にはホットキーが押された時にメッセージを送るウィンドウのハンドラ、アプリケーション内でホットキーごとに一意のID、そしてホットキーとして使用するキーを引数として渡します。

ホットキーはシステムキーとそれ以外との組み合わせとすることもできます。

// CSnipExApp の初期化
BOOL CSnipExApp::InitInstance()
{
	CWinApp::InitInstance();

    //~~~省略~~~

	CSnipExWnd* pWnd = new CSnipExWnd();
	pWnd->Create();
	m_pMainWnd = pWnd;
	
	// HotKeyの登録
	RegisterHotKey(m_pMainWnd->m_hWnd, SNIP_START_KEY, MOD_ALT, VK_SPACE);
	
	return TRUE;
}

SnipExでは、アプリケーション側のCSnipExAppのInitInstance()で、CsnipExWndクラスを作成したあとにRegisterHotkey()を呼び出して、ホットキーが押されたらCSnipExWndにメッセージを送るように依頼しています。

ホットキーによるアプリケーションの機能の起動

ホットキーが押されるとハンドルを登録したウィンドウにはWM_HOTKEYというメッセージが送られます。このメッセージを掴むイベントハンドラを追加してやれば、ホットキーによる処理が可能となります。

今回作成したSnipExでは、ホットキーによりクリップボードの監視のON/OFFを切り替えるようにしました。これで不必要に画像を保存しすぎることがなくなるというわけです。

//---------------------------------------------------------
// HotKeyが押されたときのイベントハンドラ
//---------------------------------------------------------
void CSnipExWnd::OnHotKey(UINT nHotKeyId, UINT nKey1, UINT nKey2)
{
	// TODO: ここにメッセージ ハンドラー コードを追加するか、既定の処理を呼び出します。

	CTaskTrayApp::OnHotKey(nHotKeyId, nKey1, nKey2);

	// 押下したホットキーが「SnippingStart」だった場合
	if (nHotKeyId == SNIP_START_KEY)
	{
		// 現在の状態を切り替える。
		if (m_bIsClipboardChk == TRUE)
		{
			EndClipBoardChk();
		}
		else
		{
			StartClipBoardChk();
		}
	}
}

ホットキーのイベントメッセージを受け取った時、クリップボードの監視状態を示すm_bIsClipboardChkの正負をもとにクリップボードの監視の開始と終了を行っています。こちらについては、別途「クリップボードを監視する」という記事にまとめようと思っているのでそちらを参照してください。

コメント

タイトルとURLをコピーしました