MFCでキーボードプロック関数をどのように使用するか
MFCでは、CWndクラスのPreTranslateMessage関数をオーバーライドすることで、KeyboardProc関数が利用できるようになります。
まず、ウィンドウクラス内でKeyboardProcコールバック関数を次のように宣言してください。
LRESULT CALLBACK MyKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
// 处理键盘消息
// ...
// 如果需要继续处理消息,则调用CallNextHookEx函数
return CallNextHookEx(NULL, nCode, wParam, lParam);
}
そして、あなたのウィンドウクラス内で PreTranslateMessage 関数を以下のようにオーバーライドします。
BOOL CMyWindow::PreTranslateMessage(MSG* pMsg)
{
if (pMsg->message == WM_KEYDOWN || pMsg->message == WM_KEYUP)
{
// 调用KeyboardProc函数处理键盘消息
LRESULT result = MyKeyboardProc(pMsg->message, pMsg->wParam, pMsg->lParam);
// 如果键盘消息已经被处理,返回TRUE;否则,返回FALSE
if (result != 0)
return TRUE;
}
// 调用基类的PreTranslateMessage函数继续处理消息
return CWnd::PreTranslateMessage(pMsg);
}
上記のコードでは、PreTranslateMessage 関数の中で WM_KEYDOWN や WM_KEYUP メッセージをあなたの KeyboardProc 関数に渡して処理します。KeyboardProc 関数が 0 以外の値を返した場合、キーボード メッセージは処理され、PreTranslateMessage 関数は TRUE を返してそれ以上の他のウィンドウへのメッセージの渡送を停止します。KeyboardProc 関数が 0 を返した場合、PreTranslateMessage 関数は基底クラスの PreTranslateMessage 関数を呼び出してメッセージの処理を続けます。
KeyboardProc 関数でキーボードメッセージを処理するときは、CallNextHookEx 関数を呼び出してメッセージを次のフック、または既定の処理関数に渡さなければなりません。これによって、他のウィンドウがキーボードメッセージを適切に処理できます。