Dialog是不是不能响应WM_KEYDOWN和WM_CHAR消息呀?

解决方案 »

  1.   

    需要通过PreTranslateMessage来得到这两个消息
    BOOL CxxxDlg;:PreTranslateMessage(MSG *pMsg)
    {
    if(pMsg->message == WM_KEYDOWN)
    {
    ...
    }
    else if(pMsg->message == WM_CHAR)
    {
    ...
    }
    return CDialog::PreTranslateMessage(pMsg);
    }
      

  2.   

    缺省状态下,你按回车会关掉dialog只要你在PreTranslateMessage函数里面屏蔽掉回车消息就好:)
      

  3.   

    需要在消息的处理函数中屏蔽掉Enter键的事件的 响应,因为对话框回对该键有默认的响应。需要在OnOK中对该函数中的代码进行修改才能 完成真正的消息处理!
      

  4.   

    Dialog是不是不能响应WM_KEYDOWN和WM_CHAR消息呀?
    回答:当然不是
     flyelf(空谷清音) 说的很正确!
    需要通过PreTranslateMessage来得到这两个消息
    BOOL CxxxDlg;:PreTranslateMessage(MSG *pMsg)
    {
    if(pMsg->message == WM_KEYDOWN)
    {
    ...
    }
    else if(pMsg->message == WM_CHAR)
    {
    ...
    }
    return CDialog::PreTranslateMessage(pMsg);
    }祝你郝云!
      

  5.   

    1.PreTranslateMessage的方法是可行的;
    2.为什么Dialog和正常的CWnd不一样呢,不能通过afx_msg方式而要用PreTranslateMessage方式呢?
    3.为什么我用WindowProc方式截获不到WM_KEYDOWN消息呢?
    LRESULT CTestDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
    {
    if((WM_KEYDOWN== message) )
    {
                   TRACE("keydown!\n");
    }

    return CDialog::WindowProc(message, wParam, lParam);
    }
      

  6.   

    因为windows内部包含有默认的对话框处理过程(即包含在CWnd中,但不同于普通消息处理框架),如果需要自己截获消息并处理,需要进行窗口子类化(即建立钩子)
      

  7.   

    3.为什么我用WindowProc方式截获不到WM_KEYDOWN消息呢?
    LRESULT CTestDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
    {
    if((WM_KEYDOWN== message) )
    {
                   TRACE("keydown!\n");
    }

    return CDialog::WindowProc(message, wParam, lParam);
    }
      

  8.   

    win32编程中需要为要截获以便自己处理的消息建立单独的窗口过程,并把函数地址传递给windows内建窗口过程,这样内部窗口过程就可以在做默认处理时调用你自己建立的函数以便处理消息。对于mfc,我不知道封装后内部是怎样实现的,但应该大同小异
      

  9.   

    to baoyuhua(游侠) :
    你说的可能有道理!