例如我用下面一扑获键盘消息循环,但把他放在哪里合适?如果放在主程序就阻塞程序。
如何把::PostQuitMessage(0) 传给他。
这只是一例子。还请大虾讲讲如何学习消息及消息队列。
while(GetMessage(&msg, NULL, WM_KEYFIRST, WM_KEYLAST) > 0)
{
    TranslateMessage(&msg);
    DispatchMessage(&msg);
}
谢谢

解决方案 »

  1.   

    如果想扑获消息:请直接重载PreTranslateMessage,以下一个demo
    pMsg->wParam指键盘的键值:112对应f1
    BOOL CMysunApp::PreTranslateMessage(MSG* pMsg) 
    {
    // TODO: Add your specialized code here and/or call the base class if(pMsg->message==WM_KEYDOWN)
        {
    switch(pMsg->wParam)
             {
    case 112:
               do...
                break;
              }
         }
    }
      

  2.   

    我现在按wuchuncai(1234567) 的方法重载PreTranslateMessage
    可是程序依然阻塞。死循环。怎样退出。
      

  3.   

    而且没有执行PreTranslateMessage
      

  4.   

    就不要再有:
    while(GetMessage(&msg, NULL, WM_KEYFIRST, WM_KEYLAST) > 0)
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    如果要用,也应该是: MSG Message;
    while (::PeekMessage(&Message, NULL, 0, 0, PM_REMOVE))  
    {
    ::TranslateMessage(&Message);
    ::DispatchMessage(&Message);
    }
      

  5.   

    看window程序设计,讲的是window api 编程,不懂可以问偶
    偶qq 54928978
      

  6.   

    在PreTranslateMessage截获你需要的消息,并处理,其余的消息,你要转发的,你只拦截,不转发,当然要出问题了。
     wuchuncai(1234567) 
    的方法不错的,我经常这样用的。当然了,你想自己给控件发消息的话,可以用PostMessage()发消息。如果是键盘消息,要发两个(down,up)消息,否则会有问题的。
      

  7.   

    首先我想说明你的消息循环的问题
    为什么你的消息循环在主程序中会出现问题呢?
    请参看GetMessage()后两个参数的的定义——你的窗口消息之处理你定义范围内的消息
    如果你要处理键盘相应的消息,不妨在其他的地方来响应
    用键盘的钩子函数或者其他什么处理键盘消息的消息来处理好了
      

  8.   

    关于Windows消息的描述,这里讲得很详细:http://www.codetools.com/dialog/,
      

  9.   

    如果我程序如下:哪里有错。
    先OnButton2(),再OnButton3()
    可是什么都没做!#define WM_MY_MESSAGE  WM_USER+1
    hWnd = this->m_hWnd;BOOL CMy1Dlg::PreTranslateMessage(MSG* pMsg) 
    {
       if (pMsg->message==WM_MY_MESSAGE)
       {
          int i = 1;
        }
        return CDialog::PreTranslateMessage(pMsg);
    }
    void CMy1Dlg::OnButton2() 
    {
        while( PeekMessage(&msg, NULL, 0, 0, PM_REMOVE) )
        {
    ::TranslateMessage(&msg);
             ::DispatchMessage(&msg);
        }
    }
    void CMy1Dlg::OnButton3() 
    {
        ::SendMessage(hWnd, WM_MY_MESSAGE, 0, 0);
    }
      

  10.   

    我简直不知道该如何跟你说。
    看你的程序是MFC向导产生的框架。MFC把消息完全封装掉了,你根本不能再在MFC程序里处理消息。要用消息编程,就要写基础Win32程序,用“Win32 Application”向导,不要用MFC向导。
      

  11.   

    AthlonxpX86(一滴水) 
    解决了就说出来吗,窝在肚子多不舒服,说出来就舒服了。 :)
      

  12.   

    仔细看了你的问题,我要晕倒了,我都不知道该怎样给你讲了,你的按钮中
        while( PeekMessage(&msg, NULL, 0, 0, PM_REMOVE) )
        {
    ::TranslateMessage(&msg);
             ::DispatchMessage(&msg);
        }
    其实就是
     while( this->PeekMessage(&msg, NULL, 0, 0, PM_REMOVE) )
        {
    this->::TranslateMessage(&msg);
             this->DispatchMessage(&msg);
        }
    this指向CMy1Dlg,CMy1Dlg已经有了自己的消息循环处理,你又在他内部来一遍,你想你能截获到任何消息吗?你根本截获不了任何消息,因为在你截获之前已经被CMy1Dlg自己处理了,消息队列已经空了,你还想截获什么?
    想不通你为什么要这样做,直接用CMy1Dlg消息循环就行了,做法类似你的OnButton2()OnButton3(),这是两个按钮消息,你已经截获了,只不过稍微改一下就能截获键盘消息了另外要注意,消息是针对指定窗口的,比如你的窗口失去焦点以后,就不能截获键盘消息了,这时,如果你还想截获金盘消息,可以用键盘HOOK
      

  13.   

    很感谢AthlonxpX86(一滴水)与icansaymyabc(学习与进步)。。各位大虾
    下班回家再看书。
      

  14.   

    你真是女的啊?:-)
    消息循环是一个程序活动的标志!
    如果一个消息退出了,你的程序也差不多结束了。在你的消息循环体中,Windows会调用你的消息处理函数进行消息处理,完成相应的功能的。你不用担心。
    当一个特定消息发生时。你的程序可能想结束自己的生命,你就可以在任何地方使用PostQuitMessage(0),系统就会在消息队列放一个编号为0的消息。你的消息循环就会检测到它,然后就可以自杀了!
      

  15.   

    用MFC编的啊?
    那就重载CWinApp的Run函数!