是这样的,我很多键同时按下,消息队列堆了一堆消息,然后把所有的键都松掉,
但是还是程序还会响应消息一段时间,然而这时候是什么键都没按下的。看上去,会不爽,怎么处理?我处理的思路是,当有键按抬起时,把消息队列清空。但是会有问题,抬起键的消息总是排在那一堆消息之后,
所以我想问有没有方法在消息循环时每次取得是最新的消息。PS:我的程序是win32程序,消息循环用 GetMessage PeekMessage都不行

解决方案 »

  1.   

    筛选消息试试
    MSG msg;
    PeekMessageW(&msg,NULL,WM_KEYUP,WM_KEYUP,PM_NOREMOVE)
      

  2.   

    不要用消息,用 GetAsyncKeyState() 
    或者直接direct input吧........
      

  3.   

    问题:是不是用消息这个问题就解决不了?其它消息也要处理啊,WM_TIMER WM_ERASEBKGND WM_PAINT 还是其它很多消息包括自定义消息。在主消息主消息循环中过滤全部过滤,然后怎么处理哪些剩下的消息呢?它们还是不是一直放在队列里,我该怎么做啊?
      

  4.   

    用GetAsyncKeyState是不是一个死循环,这样程序要处理其它的事情,那该怎么办?
      

  5.   

    GetAsyncKeyState 应该怎么样?说下思路
      

  6.   

    给你个办法试试看,keydown时post一个自定义消息,在这个消息里作你的处理,keyup时peekmessage(usermessage..pm_remove)
      

  7.   

    keyup时,消息队列里面还有好多消息没处理完,keyup消息是排在消息队列后面,你明白我的意思吗?
    等你响应keyup消息时,消息队列里都没消息了。
      

  8.   

    明白,不过你改成这种通过postmessage作处理的形式后就不存在keyup前面多个keydown阻塞的问题,
    你可能有多个keydown,post多个usermessage,消息队列里有是usermessage在排队,和keyup的顺序没关系
      

  9.   

    不是让你再单开一个线程处理键盘么
    可能我的建议不好
    你是不是可以考虑用DirectInput
      

  10.   

    我没有Postmessage 也没有sendmessage
      

  11.   

    #define UM_MYPROC WM_USER + 100
    ...
    OnKeyDown(..)
    {
    PostMessage(UM_MYPROC..) //处理数据
    }OnKeyUp()
    {
    while(peekmessage(UM_MYPROC.., PM_REMOVE)); //移除消息
    }OnMyProcMsg()
    {
    ...//处理加在这里
    }
      

  12.   

    你的意思,我感觉还是一样的,你只是把WM_KEYDOWN消息转化成UM_MYPROC了,消息队列里都是UM_MYPROC 这个消息,而且keyup消息也是排在他们后面的。
      

  13.   

    我以前用hook处理过,你的略麻烦点可以借助第二个窗口来完成
    #define UM_MYPROC WM_USER + 100
    ...
    Cwnd1::OnKeyDown(..)
    {
    PostMessage(hwnd2, UM_MYPROC..) //处理数据
    }Cwnd1::OnKeyUp()
    {
    while(peekmessage(hwnd2, UM_MYPROC.., PM_REMOVE)); //移除消息
    }CWnd2::OnMyProcMsg()
    {
    ...//处理加在这里
    }
      

  14.   

    多谢oldn_CC_bird一直关注着这个方法有点啰嗦,感觉能行的通。
    不知道有没有好一点的方法
      

  15.   

    不好意思
    昨天后来下班后家就没上网
    独立线程处理键盘消息我见人讨论过
    自己没有具体做过
    所以提不出什么具体的方案
    不过你其实可以考虑用DirectInput
      

  16.   

    怎么这么多人说direct input看来要研究下了
      

  17.   

    使用directinput cpu占用是不是会很高?
      

  18.   

    初步了解directinput是查询的方式获取键盘的状态
    这样太耗cpu了。
      

  19.   

    不会
    加个延时就好了
    directinput很底层
    效率很高
      

  20.   

    平时按键没按下的时候,一直在那循环检测,是很耗CPU的
    关键是我用Arm9的处理器。这种消耗很奢侈啊,有没有不很耗CPU的方法啊?
      

  21.   

    例子还真没有特别合适的
    我都是用DirectX做游戏
    要独立应用的得现做
    而且我好久没用了
    电脑上都没有DXSDK了我的意思是
    你循环检测的时候在循环体里Sleep(10)
    就可以释放出CPU了
    而且基本不影响应用
      

  22.   

    没一秒中检测100下,这时候如果cpu在处理别的事,会卡一下的
      

  23.   

    不是卡,是会很忙,如果sleep(500)左右就是卡的现象
      

  24.   

    用两个窗口也解决不了这个问题 while (GetMessage(&msg, NULL, 0, 0))
        {
            TranslateMessage(&msg);
            if (msg.message == WM_KEYUP || msg.message == WM_KEYDOWN)
            {
                if (msg.message == WM_KEYUP)
                {
                    while(PeekMessage(g_tempWnd....));
                }
                else
                {
                    PostMessage(g_tempWnd, msg.message, msg.wParam, msg.lParam);
                }
            }
            else
            {
                DispatchMessage(&msg);
            }
        }
      

  25.   

    while(PeekMessage(g_tempWnd....))
    TRACE("peek success\n");成功trace一下确保你成功peek到了
      

  26.   

    问题解决,结贴给分。
    解决方法是按oldn_CC_bird的思路。
    不过我是自己做了一个队列专门放按键消息的。谢谢楼上的所有的朋友们了。