0

レガシー MFC アプリケーションのメンテナンスを行っています。ユーザーがアプリの上部にあるメイン メニューから [ヘルプ] → [ヘルプ] を選択すると、カスタムOnHelp()を呼び出す必要があります。私の調査から、MFC は通常、このコマンドを自動的にインターセプトし、ヘルプ ファイル自体を表示することがわかりました。ただし、このコマンドをオーバーライドして、このメッセージを自分で傍受することができます。メッセージマップにこれがあります:

BEGIN_MESSAGE_MAP(MyApp, MyBaseApp)
   //{{AFX_MSG_MAP(MyApp)
   ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
   ON_COMMAND(ID_HELP, OnHelp)
   //}}AFX_MSG_MAP
   // Standard file based document commands
END_MESSAGE_MAP()

「About」OnAppAbout()は呼び出されますが、私のものではありませんOnHelp()(MFC は引き続きそれをインターセプトし、それ自体でヘルプを表示します)。私の実装は非常に簡単です。

void MyApp::OnHelp()
{
    // This never gets called
   MessageBox( NULL, "HtmlHelp: MyApp", "Hey", MB_OK );

   CString csHelpFile;
   csHelpFile.Format( "%s/MyHelp.chm", MyDoc::GetHelpPath() );
   ::HtmlHelp(
       NULL,
       csHelpFile,
       HELP_WM_HELP,
       NULL );
}

MessageBox が表示されないため、呼び出されていないことはわかっています (Visual Studio を使用してこれをデバッグすることはできません。メッセージ ボックスのみ)。また、メッセージマップと同様の実装を使用して、それを に押し込もうとしましたがCMDIFrameWnd、どちらも成功しませんでした (ヘルプメニュー項目とは別の項目がここで実装され、正常に動作します)。独自のカスタム ヘルプ関数にフックするために何をする必要があるか考えていますか?

4

1 に答える 1