CCautionDialog::PreTranslateMessage重载的是这个Dialog的,所以对APP类不起作用。

解决方案 »

  1.   

    PreTranslateMessage是在消息在被响应或者被继续向其子类传递前的处理,当然就可以让某个消息在这里提前处理,或者截断...以正因为只能控制向下传递,所以不你不控制你的上层对消息的处理.你要实现的功能应该放到OnCmdMsg重载函数中处理,让其返回TRUE,即让其上层知道这个消息我已经处理了,你不再处理.如果这里返回FALSE,则上消息上层会继续处理该消息,直到最外层
      

  2.   

    ....你在你的C~APP类中覆盖下PreTranslateMessage函数:如
    BOOL CTestSDI1App::PreTranslateMessage(MSG* pMsg)
    {
    // TODO: 在此添加专用代码和/或调用基类
    if(pMsg->wParam == VK_F1)
    return true;
    else
    return CWinApp::PreTranslateMessage(pMsg);
    }或者你打开你的程序的资源视图,找到Accelerator项,再找ID_HELP VK_F1 ,把那项删除掉
      

  3.   

    我按你讲的在C**Dialog里实现了OnCmdMsg,结果有效。
    但是OnCmdMsg是个什么函数?与PreTranslateMessage有什么关系?
    你说的里层外层的我都蒙了
      

  4.   

    重载这个函数我也试了。
    BOOL CTestSDI1App::PreTranslateMessage(MSG* pMsg)
    不过如果这样的话不就所有窗口下的F1都被屏蔽了吗。
    我只想屏蔽某一个窗口的F1。
    我尝试通过pMsg来判断该消息来自于该窗口,并且在此时返回TRUE。
    结果还是不好用
    555555为神马。
      

  5.   

    重载 void CXXXApp::WinHelp( DWORD dwData, UINT nCmd)
    {
      //CWinApp::WinHelp(dwData, nCmd);
    }  
      

  6.   


    if(pMsg->wParam == VK_F1 && 
    (CWnd::FromHandle(pMsg->hwnd))->IsKindOf(RUNTIME_CLASS(你的dialog名)))
       return true;
    else
       return CWinApp::PreTranslateMessage(pMsg);我试了下 可以屏蔽的
      

  7.   

    不好意思。你的这个方法还是不管用
    我通过写LOG的方法试了一下。
    在对话框上面按f1的话,函数的调用顺序是这样的。CmfcTestApp::PreTranslateMessage
    CmfcTestDlg::PreTranslateMessage
    CmfcTestDlg::OnCmdMsg
    CmfcTestApp::OnCmdMsg
    CmfcTestDlg::OnCmdMsg
    CmfcTestApp::OnCmdMsg
    CmfcTestApp::OnHelp    //(这个函数弹出HELP窗体,是通过ONCOMMAND(ID_HELP,CmfcTestApp::OnHelp)映射的在CmfcTestApp::PreTranslateMessage中捕获消息返回TRUE之后,执行的顺序是这样的CmfcTestApp::PreTranslateMessage
    CmfcTestDlg::OnCmdMsg
    CmfcTestApp::OnCmdMsg
    CmfcTestDlg::OnCmdMsg
    CmfcTestApp::OnCmdMsg
    CmfcTestApp::OnHelp    //(这个函数弹出HELP窗体,是通过ONCOMMAND(ID_HELP,CmfcTestApp::OnHelp)映射的仅仅CmfcTestDlg::PreTranslateMessage一个函数被跳过。
    按理说PreTranslateMessage返回TRUE消息就不应该被处理了。但是为什么无效呢。
    请各位指点~感激
      

  8.   

    CXXXApp::WinHelp这个函数没有被调用啊
      

  9.   

    CXXXApp::WinHelp这个函数根本没有被调用啊。。
      

  10.   

    在你的CCautionDialog覆盖下PreTranslateMessage,如下面的:BOOL CAboutDlg::PreTranslateMessage(MSG* pMsg)
    {
    // TODO: 在此添加专用代码和/或调用基类
    if((VK_F1 == pMsg->wParam && WM_KEYDOWN == pMsg->message) || (pMsg->message == 77))
    return TRUE;
    return CDialog::PreTranslateMessage(pMsg);
    }