解决方案 »

  1.   

    有时候我们需要在消息翻译前做些事,于是MFC有个PreTranslateMessage虚函数,我们可以处理特定按键消息
      

  2.   

    只有虚拟键消息需要它吧,可以在它之前做些预处理,如wm_keydown.
      

  3.   

    大部分消息不需要,TranslateMessage主要用于转换虚拟键The TranslateMessage function translates virtual-key messages into character messages. The character messages are posted to the calling thread's message queue, to be read the next time the thread calls the GetMessage or PeekMessage function. 
      

  4.   

    TranslateMessage用于将键盘按键(按下、弹起)加工为一个附加的WM_CHAR(或其他)消息投递到当前消息队列中,如果不需要附加的消息,完全可以不调用TranslateMessageTranslateMessage对绝大多数消息都是直接忽略的
      

  5.   

    可是书上的例子都是写着TranslateMessage的,消息循环每次取得消息肯定接下来就执行TranslateMessage,并没有跳过这一句啊,对于大部分不需要的消息,是怎么处理的
      

  6.   

    也就是说TranslateMessage是把keydown和keyup两个消息合并成一个char消息是吗,然后这个消息会重新放到消息队列中,可是这样这个按键就要重新排队,这不就有时间差了吗?比如说我输入一个字符,按完键然后又操作了别的,那么消息队列因该是 keydown-》keyup-》其他操作,也就是说本意是先输入字符在做其他操作,等翻译完了之后消息队列就成了 其他操作-》char,这就变成了先其他操作再输入字符了
      

  7.   


    可以尝试构造一下,开辟一个线程不断给窗口PostMessage(WM_USER)消息队列中将收到的消息全部打印出来,看是否会出现以下情况:KEYDOWN USER USER KEYUP USER USER USER CHAR...即USER消息插入了UP和CHAR消息之间我认为是可能的,不过我当前不具备做试验的条件这个试验对速度有要求,手动操作引发的消息是不足以暴露问题的
      

  8.   

    应该不对,keydow就被转换为wm_char,不会等到keyup之后再转换,并且,keydow如果一直按着会产生多个wm_char
      

  9.   

    翻译keydown的时候会不会在消息队列中找找看有没有keyup??因为按下一个键的时候KEYDOWN消息就已经发出了,这时候翻译的话就会翻译出来,如果只有一个KEYDOWN,那就只翻译成一个字符,并不是说只要没有KEYUP就一直输入这个字符直到有KEYUP才停止,如果长时间按一个键,会反复出现KEYDOWN这个消息,只要没有KEYDOWN这个消息了,就不会再输入字符了是吧,所以消息队列后面有没有KEYUP有用吗?
    如果说必须是KEYDOWN和KEYUP组合才产生一个字符的话,那么在翻译KEYDOWN的时候应该就要在队列中寻找KEYUP,是吧