私は答えを見つけました。メインウィンドウの子ウィンドウは、キーボードアクセラレータによって生成されたWM_COMMANDメッセージをインターセプトして親ウィンドウに渡すことができるように、サブクラス化する必要があります。
これには、コントロールのウィンドウプロシージャを別のプロシージャに変更することが含まれます。別の手順では、メッセージを親ウィンドウに送信することにより、傍受する必要のあるメッセージを処理します。コントロールが正しく機能できるように、元のウィンドウプロシージャへのポインタもどこかに格納する必要があります。
ウィンドウプロシージャは、GWLP_WNDPROCでSetWindowLongPtrを使用して変更できます。
コントロールのユーザーデータ値(GWLP_USERDATA)に元のウィンドウプロシージャへのポインタを格納することにより、これを行う簡単な例を次に示します。
ウィンドウプロシージャを変更し、元のプロシージャをGWLP_USERDATAに保存するコード:
SetWindowLongPtr( hWnd, GWLP_USERDATA, ( LONG_PTR )SetWindowLongPtr( hWnd, GWLP_WNDPROC, ( LONG_PTR )WndProc ) );
インターセプトウィンドウの手順:
static LRESULT CALLBACK WndProc( const HWND hWnd, const UINT message, const WPARAM wParam, const LPARAM lParam )
{
switch( message )
{
case WM_COMMAND:
SendMessage( GetParent( hWnd ), message, wParam, lParam );
return 0;
default:
//Assume that GWLP_USERDATA has been set to the original window procedure.
return CallWindowProc( ( WNDPROC )GetWindowLongPtr( hWnd, GWLP_USERDATA ), hWnd, message, wParam, lParam );
}
}