我用MFC APPWIZARD做了一个基于对话框的应用程序,想在CMyDialog(继承CDialog)类中捕获按键消息,用Wizard写了一个消息映射函数
void CElsDlg::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
但是奇怪的是为什么为什么根本就不执行啊,消息映射不到,其他的都是默认设置,那位高手请指点一下怎样才能在这捕获到按键消息呢,多谢了。

解决方案 »

  1.   

    你怎么用Wizard写的这函数啊?要那多参数做啥?直接双击按钮控件就是最简单的消息函数建立方法了。
      

  2.   

    BOOL CMyDialog::PreTranslateMessage(MSG *pMsg)
    {
    if(pMsg->message == WM_KEYDOWN)
    {
    ...
    }
    return CDialog::PreTranslateMessage(pMsg);
    }
      

  3.   

    楼上的可以工作,可是没有说明为什么。
    hehe,打个岔
      

  4.   

    1.一旦某控件得到了输入焦点则后来发生的键盘消息就会被传送到控件.
    PreTranslateMessage可以处理.
    2.按键消息由::IsDialogMessage处理,该函数从每个对话框的消息循环中调用,但如果::IsDialogMessage在::TranslateMessage之前发现键盘消息,则该处理程序根本没有机会被调用.
      

  5.   

    lou shang shuo de OK
      

  6.   

    我觉得,有些说法好像还是缺少点什么。就说1吧:OK,对的,“一旦某控件得到了输入焦点则后来发生的键盘消息就会被传送到控件”,那么,也就是具有输入焦点(Focus)的窗口能接受键盘消息了?那为什么对话框不具有焦点,却能在对话框的PreTranslateMessage中处理WM_KEYDOWN消息呢?也就是说,控件的键盘消息的处理和对话框的PreTranslateMessage之间,有什么关系呢?好像没有说清楚。
    这大概就涉及到消息循环、涉及到键盘消息了。事实上,键盘消息(WM_KEYDOWN,WM_KEYUP)是通过PostMessage发送到窗口所在线成的消息队列的,因此...
      

  7.   

    你还要调用基类的CView::OnKeyDown(....);这样子才行的。
      

  8.   

    我这是基于对话框的程序啊,那有CView类啊,
      

  9.   

    PreTranslateMessage运行在UI线程的TranslateMessage函数之前。等于是在把消息交给窗口函数处理之前,先拦截它。进行第一层处理,如果在PreTranslateMessage中进行了所需的处理,就可让PreTranslateMessage返回非0值。这样该消息就不会被继续处理了,也就是被拦截了。
    你发现的很多消息在你的窗口函数中获得不到,多半是因为在这里被拦截了。够明白了吧?
      

  10.   

    sorry。楼上的说法是因为我理解错“按键”这个词了。我以为是按了一个按钮呢:P