我写一个WIN32程序,用DialogBoxParam生成一个新的弹出对话框后,捕获该对话框的WM_KEYDONW消息时,
case WM_KEYDOWN:
   MessageBox(hwnd, "test", "倒", MB_OK); //必须加上这句 WM_CHAR中才能捕获到字符,我倒??
   switch ((int) wParam)
   {
      case VK_RETURN://当按下回车,捕获不到回车,怪??
       .....
   } 
   ...
case WM_CHAR:
   ....

解决方案 »

  1.   

    WM_KEYUP一点问题也没有,就是WM_KEYDOWN
      

  2.   

    当然了,系统先帮你截掉了,去PreTranslateMessage里面抓吧
      

  3.   

    是win32程序 not use MFC
      

  4.   

    产生过程是WM_KEYDOWN--->WM_CHAR(部分)--->WM_KEYUP
      

  5.   

    BOOL CXXXDlg::PreTranslateMessage(MSG* pMsg) 
    {
    if( pMsg->message == WM_KEYDOWN )
    {
    if( pMsg->wParam == VK_RETURN )
                       {
                          .............
                        }

    }
    return CDialog::PreTranslateMessage(pMsg);
    }
      

  6.   

    是啊 可是没理由让我加上这句MessageBox(hwnd, "test", "倒", MB_OK);  WM_CHAR才有反应阿
      

  7.   

    BOOL CXXXDlg::PreTranslateMessage(MSG* pMsg) 
    {
    if( pMsg->message == WM_KEYDOWN )
    {
    if( pMsg->wParam == VK_RETURN )
                       {
                          .............
                        }

    }
    return CDialog::PreTranslateMessage(pMsg);
    }这是MFC阿 我写的是win32程序,不使用MFC
      

  8.   

    那你总有个窗口吧?
    没有窗口肯定不能抓到key_down消息的,系统怎么知道要发给你啊?
    要不你用HOOK好了。
      

  9.   

    allonhoo() ( )  
       是啊 可是没理由让我加上这句MessageBox(hwnd, "test", "倒", MB_OK);  WM_CHAR才有反应阿
      
    有理由这么做,这个消息是在Messagebox的messagepump里抓到了。
      

  10.   

    你在消息:
         case WM_COMMAND:
    中可以得到;
      

  11.   

    WM_COMMAND捕获不到1-9 a-z
      

  12.   

    ------------
    那你总有个窗口吧?
    没有窗口肯定不能抓到key_down消息的,系统怎么知道要发给你啊?
    要不你用HOOK好了。
    ----------------有窗口。
    主界面就没问题,WM_KEYDOWN捕获都正常,就是弹出的窗口不行,估计只能用HOOK了。
      

  13.   

    不需要HOOK的
    你是在弹出的窗口类中去响应这个消息的吗?
    弹出的对话框是系统内建对话框?
      

  14.   

    用DialogBoxParam生成一个新的弹出对话框,该对话框资源是预先在设计的时候画好的,窗口采用回调函数
      

  15.   

    我现在用了一个很不好的方法去解决keydown消息不能捕获的,就是在WM_KEYUP里把wParam 作为SendMessage一个参数,发一个WM_CHAR消息,在WM_CHAR里处理字符,在WM_KEYUP里处理回车了。
      

  16.   

    那么你要把WM_KEYDOWN插到它的消息队列里面才可以啊
      

  17.   

    这样就彻底不用捕获WM_KEYDOWN消息了,WM_KEYUP里直接发消息WM_CHAR,在WM_CHAR中就可以捕获到键值了。