我想实现按住键盘的一个键不动,来达到连续响应的目的。。
比如按主LEFT,光标就一直往左移动知直到开LEFT。。
我在OnKeyDown响应键盘消息,发现即使我长按主LEFT,也只响应了一次啊。。
有什么办法可以响应多次啊。。

解决方案 »

  1.   

    keydwon只有一次吧
    大概要记时处理keyup
      

  2.   

    在四个按键讯息(WM_KEYDOWN、WM_KEYUP、WM_SYSKEYDOWN和WM_SYSKEYUP)中,wParam讯息参数含有上面所讨论的虚拟键码,而lParam讯息参数则含有对了解按键非常有用的其他资讯。lParam的32位分为6个栏位,如图6-1所示。
     图6-1 lParam变数的6个按键讯息栏位 重复计数
     重复计数是该讯息所表示的按键次数,大多数情况下,重复计数设定为1。不过,如果按下一个键之後,您的视窗讯息处理程式不够快,以致不能处理自动重复速率(您可以在「控制台」的「键盘」中进行设定)下的按键讯息,Windows就把几个WM_KEYDOWN或者WM_SYSKEYDOWN讯息组合到单个讯息中,并相应地增加重复计数。WM_KEYUP或WM_SYSKEYUP讯息的重复计数总是为1。因为重复计数大於1指示按键速率大於您程式的处理能力,所以您也可能想在处理键盘讯息时忽略重复计数。几乎每个人都有文书处理或执行试算表时画面卷过头的经验,因为多余的按键堆满了键盘缓冲区,所以当程式用一些时间来处理每一次按键时,如果忽略您程式中的重复计数,就能够解决此问题。不过,有时可能也会用到重复计数,您应该尝试使用两种方法执行程式,并从中找出一种较好的方法。
      

  3.   

    好像是可以产生多个keydown的,你再看下
      

  4.   

    还是不明白啊
    我现在在做俄罗斯方块,想实现如下功能
    一直按下方向键不动,方块连续移动。。这个要怎么做啊。。
    OnKeyDown只能响应一次啊。。
      

  5.   

    写个键盘钩子:
    HHOOK glhHook=NULL;         //安装的鼠标勾子句柄 
    HINSTANCE glhInstance=NULL; //DLL实例句柄
    BOOL CKeyboardHook::StartHook()
    { //启动钩子
    BOOL bResult=FALSE;
    glhHook=SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,glhInstance,0);
    if(glhHook!=NULL)
    bResult=TRUE;
    return bResult; 
    }LRESULT CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)
    {
    char ch=0;
    if( (wParam==VK_SPACE))//空格按键(自行修改)
    {//对按键进行处理
        ........
        ........
        ;
    }
        return CallNextHookEx( glhHook, nCode, wParam, lParam ); 
    }
      

  6.   

    OnKeyDown 如果你一直压着的话,确实是多个消息的..
    但可能因为按键重复时的等待时间过长,让你感觉只产生了一次..
    要想获得精准的当前键盘状态 
    使用GetKeyState(VK_RETURN)&0x80就表示键盘按下了..
    但是这函数不是个消息响应的形式估计你不好用..我用它的时候是 一个类似于cs的程序,然后控制人向前走,因为要不停的绘画,而且是全屏的,
    所以使用的是while(1);因此是在循环里不停的判断GetKeyState(VK_RETURN)&0x80 然后坐标系响应变化....