while(GetMessage(&msg,NULL,0,0))
{
    TranslateMessage(&msg);
    DispatchMessage(&msg);
}
在以上的消息循环当中,如果处理的是虚拟键消息,那么TranslateMessage()函数首先会将消息转换为WM_CHAR消息,然后以新消息的形式投递到消息队列当中去。而DispatchMessage()函数会将当前的消息交给窗口处理过程函数处理。当下次GetMessage()时,是不是重复处理了刚才的虚拟键消息?
谢谢赐教! 

解决方案 »

  1.   

    你弄几个messagebox()自己勘察一下。
      

  2.   

    比如:
    1.GetMessage WM_KEYDOWN;
    2.TranslateMessage 生成一个 WM_CHAR 消息放入消息队列;
    3.DispatchMessage 调用窗口过程处理 WM_KEYDOWN;
    4.GetMessage WM_CHAR;
    5.TranslateMessage 不生成任何消息;
    6.DispatchMessage 调用窗口过程处理 WM_CHAR;...
      

  3.   

    TranslateMessage 转换消息
    DispatchMessage  将消息发送到相对应的窗体或程序确实只有一个消息被投递啊
      

  4.   

    GetMessage的作用就是将消息从消息队列中删除然后复制到msg结构中. 所以虚拟键消息已经不在消息队列里了. 不会出现重复获取同一个虚拟键消息的情况.
      

  5.   

    感觉好麻烦啊,有好多中转过程
    能告诉我为什么要把虚拟键转成WM_CHAR吗,中间有哪些过程?