ユーザーがWindowsの3Dプログラムで使用するホットキーを設定できるダイアログボックスがあります。私はCHotKeyCtrlを使用しています。これは非常に優れていますが、ユーザーが使用したいいくつかのキー(具体的には、タブとスペース)を処理しません。
ホットキーの処理は、これらのキーを起動できるほどスマートです。必要なのは、それらを設定するためのUIだけです。CHotKeyCtrlに似たコントロールが理想的ですが、他の回避策もありがたいです。
ユーザーがWindowsの3Dプログラムで使用するホットキーを設定できるダイアログボックスがあります。私はCHotKeyCtrlを使用しています。これは非常に優れていますが、ユーザーが使用したいいくつかのキー(具体的には、タブとスペース)を処理しません。
ホットキーの処理は、これらのキーを起動できるほどスマートです。必要なのは、それらを設定するためのUIだけです。CHotKeyCtrlに似たコントロールが理想的ですが、他の回避策もありがたいです。
回避策の 1 つのオプションは、メッセージ フック機能を備えた標準の編集コントロールを使用することです。
これにより、そのエディット コントロールに送信されたキーボードWM_KEYDOWNメッセージをトラップできます。
フック関数は次のようになります。
LRESULT CALLBACK MessageHook(int code, WPARAM wParam, LPMSG lpMsg)
{
LRESULT lResult = 0;
if ((code >= 0) && (code == MSGF_DIALOGBOX))
{
if (lpMsg->message == WM_KEYDOWN)
{
//-- process the key down message
lResult = 1;
}
}
// do default processing if required
if (lResult == 0)
{
lResult = CallNextHookEx(MessageFilterHook, code, wParam, (LPARAM)lpMsg);
}
return lResult;
}
エディット コントロールがフォーカスを取得すると、次のようにフックをエディット コントロールにアタッチできます。
//-- create an instance thunk for our hook callback
FARPROC FilterProc = (FARPROC) MakeProcInstance((HOOKPROC)(MessageHook),
hInstance);
//-- attach the message hook
FilterHook = SetWindowsHookEx(WH_MSGFILTER,
(HOOKPROC)FilterProc,
hInstance, GetCurrentThreadId());
次のように、編集コントロールがフォーカスを失ったときに削除されます。
//-- remove a message hook
UnhookWindowsHookEx(MessageFilterHook);
このアプローチを使用すると、編集コントロールにフォーカスがある場合、キーを押すたびにフックに送信されます。