只能用测试键盘状态的API来得到状态,
不知道MFC有无封装。

解决方案 »

  1.   

    如果一治按着健的话,并不是只发出一个Keydown,然后等待你松开才发出Keyup.而是连续发出几对Keydown和Keyup,而且是成对的,最后一个Keyup.然后就停止掉.所以一会儿以后就不响应了.
      

  2.   

    sorry,刚才我用spy++测试过了,证明我的理解错了..
      

  3.   

    这是我一个检测按钮的模块,里面的上下左右是连续判断,而其她的是判断一次,
    这个程序可以和其它流程一起执行不影响。// 检测坦克1P按键
    void Key1PT(void)
    {
    int st=16;
    int Zd=0;
    int xx1,yy1;
        Tank1.old_y=Tank1.y;Tank1.old_x=Tank1.x;
    xx1=Tank1.x;yy1=Tank1.y;
    if( GetAsyncKeyState(VK_DOWN)  ) //下
    {
    Tank1.old_y=Tank1.y;
    Tank1.y+=Tank1.speed;
    Tank1.fx=3;
    Tank1.x=Tank1.x-Tank1.x%st;
                Tank1.old_x=Tank1.x;
    goto Key1PE;
    }
    if( GetAsyncKeyState(VK_UP)  ) //上
    {
    Tank1.old_y=Tank1.y;
    Tank1.y-=Tank1.speed;
    Tank1.fx=2;
    Tank1.x=Tank1.x-Tank1.x%st;
                Tank1.old_x=Tank1.x;
    goto Key1PE;
    }
    if( GetAsyncKeyState(VK_LEFT)  ) //左
    {
    Tank1.old_x=Tank1.x;
    Tank1.x-=Tank1.speed;
    Tank1.fx=0;
    Tank1.y=Tank1.y-Tank1.y%st;
                Tank1.old_y=Tank1.y;
    goto Key1PE;
    }
    if( GetAsyncKeyState(VK_RIGHT)  )   //右
    {
    Tank1.old_x=Tank1.x;
    Tank1.x+=Tank1.speed;
    Tank1.fx=1;
    Tank1.y=Tank1.y-Tank1.y%st;
                Tank1.old_y=Tank1.y;
    goto Key1PE;
    }
    Key1PE:
            //普通子弹
    if( (GetAsyncKeyState(VK_DELETE)) ||   //DELETE
    (GetAsyncKeyState(VK_RETURN) ||    //回车
    (GetAsyncKeyState(VK_SPACE) 
    {
    //while(GetAsyncKeyState(VK_DELETE)) {}
    }
            if(GetAsyncKeyState(VK_DELETE)==FALSE) Tank1PP=0;
    if(GetAsyncKeyState(VK_RETURN)==FALSE) Tank1PP1=0;
    if(GetAsyncKeyState(VK_SPACE)==FALSE) Tank1PP2=0;}
      

  4.   

    这样试试看,应该可以了吧
    BOOL CDlgDlg::PreTranslateMessage(MSG* pMsg) 
    { if(pMsg->message == WM_KEYDOWN)
    {
    if((pMsg->lParam & 0x00ff) ==1)
    SetTimer();
    } if(pMsg->message ==WM_KEYUP)
    KillTimer();

    return CDialog::PreTranslateMessage(pMsg);
    }