我要做的是在一个没有任何控件的对话框窗口中接收键盘按键字符,
就是要用OnChar 函数,但是它没有响应键盘按键.
如何才能让系统调用OnChar 这个函数.
各位大哥大姐,兄弟姐妹帮帮小弟的忙,不弟在些谢过了.

解决方案 »

  1.   

    用调试程序测试时,发现程序可以响应SendMessage(WM_CHAR,48,48)消息,但不能响应PostMessage(WM_CHAR,48,48)消息.但SendMessage消息后之前按键的键值也收到了,且在SendMessage发送来的消息之前收到.
      

  2.   

    自己添加处理代码
    CDialog::PreTranslateMessage(MSG* pMsg)
    {
        if(pMsg->message==VK_KEYDOWN)
        {
            switch(pMsg->wParam)
            {
               case: 'VK_LEFT'
                 MessageBox("你按了左方向键");
               case: 'VK_RETURN'
                 MessageBox("你按了回车键");
                 ...//你的处理代码
               ...
            }
         }
         .....
        return CDialog::PreTranslateMessage(pMsg);
    }
      

  3.   

    当你按下一个键时(然后再抬起来)    windows发送三条消息
    WM_KEYDOWN,WM_CHAR,WM_KEYUP     
    WM_KEYDOWN表示有一个键被按下    
    WM_CHAR表示你按的那个字符
    WM_KEYUP     当然表示有一个键抬起来了
      

  4.   

    重载对话框的PreTranslateMessage
    我这里的示例是过滤编辑框可输入字符,如果是对话框接收OnChar,则
    用this->GetSafeHwnd() ==pMsg->hwnd来判断或者直接省略
    PreTranslateMessage(MSG* pMsg) 
    {
    if(WM_CHAR == pMsg->message)
    {
    if(GetDlgItem(IDC_EDIT1)->GetSafeHwnd() == pMsg->hwnd)
    {
    char ch = (TCHAR) pMsg->wParam;

    if((ch == '.')  ||(ch >='0' && ch <='9')||(ch ==VK_BACK) )
    return CDialog::PreTranslateMessage(pMsg);
    else
    return true;
    }
    }