TranslateMessage函数就可以将WM_KEYDOWN和WM_ KEYUP消息的组合转换为一条WM_CHAR消息(该消息的wParam附加参数包含了字符的ASCII码)
而我发现组合后会使WM_KEYUP消息消失。。有例子(部分代码):在键盘上按下A键(使用小写模式)。。        case WM_KEYDOWN:
             if(0x41==wParam)
                MessageBox(hwnd,"A","1",1);
             return 0;  
        case WM_KEYUP:
             if(0x41==wParam)
                MessageBox(hwnd,"A","2",1);
             return 0;
        case WM_CHAR:
             if(0x61==wParam)
                MessageBox(hwnd,"a","3",1);
             return 0;    先收到WM_CHAR 再收到WM_KEYDOWN而为什么看不到WM_KEYUP弹出的对话框???而且顺序为什么是WM_CHAR  后是WM_KEYDOWN??可以删除WM_CHAR消息和WM_KEYDOWN消息后,发现WM_KEYUP 又回来了。。请问这是为什么啊??

解决方案 »

  1.   

    其实是你测试出现的问题按下a的时候会生成 WM_KEYDOWN 和 WM_KEYCHAR 消息, 当你释放的时候 实际上是对 MessageBox 发送的释放消息,所以你得不到释放消息
    至于为什么先 WM_CHAR消息 是因为TranslateMessage 会先发送 WM_CHAR消息
      

  2.   

    http://blog.csdn.net/okadler0518/archive/2009/07/16/4354633.aspx
      

  3.   

            case WM_KEYDOWN:
             hdc=GetDC(hwnd);
                    if(0x41==wParam)
                    TextOut(hdc,200,200,szBuffer,wsprintf(szBuffer,"WM_KEYDOWN"));
             ReleaseDC(hwnd,hdc); 
              _sleep(1000);
             return 0;
             
             case WM_KEYUP:
              hdc=GetDC(hwnd);
                 if(0x41==wParam)
                 TextOut(hdc,0,0,szBuffer,wsprintf(szBuffer,"WM_KEYUP"));
               ReleaseDC(hwnd,hdc);
               _sleep(1000);
             return 0;
            
             case WM_CHAR:
              hdc=GetDC(hwnd);     
                 if(0x61==wParam)
                 TextOut(hdc,70,70,szBuffer,wsprintf(szBuffer,"WM_CHAR"));
              ReleaseDC(hwnd,hdc);
              _sleep(1000);
              return 0;     
      

  4.   

    测试出来了。。哈哈多谢yxwsbobo不过还有一个问题 就是对 MessageBox 发送的释放消息,为什麽会得不到释放消息(WM_KEYUP)??
      

  5.   

    只有有焦点的窗口才能收到 按键消息
    测试了一下 WM_CHAR 确实不是 TranslateMessage 发出的,DispatchMessage会先后将WM_CHAR,WM_KEYDOWN消息派发给窗口过程,具体原因看3楼,我没看懂,以后用得着再来纠结吧。。
      

  6.   

    明白了 。。多谢大家了;今天学习了yxwsbobo 以后还得向你学习嘿嘿。。