比如按主LEFT,光标就一直往左移动知直到开LEFT。。
我在OnKeyDown响应键盘消息,发现即使我长按主LEFT,也只响应了一次啊。。
有什么办法可以响应多次啊。。
9 个解决方案
#1
keydwon只有一次吧
大概要记时处理keyup
大概要记时处理keyup
#2
还有没有其他办法啊。。。
#3
在四个按键讯息(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指示按键速率大於您程式的处理能力,所以您也可能想在处理键盘讯息时忽略重复计数。几乎每个人都有文书处理或执行试算表时画面卷过头的经验,因为多余的按键堆满了键盘缓冲区,所以当程式用一些时间来处理每一次按键时,如果忽略您程式中的重复计数,就能够解决此问题。不过,有时可能也会用到重复计数,您应该尝试使用两种方法执行程式,并从中找出一种较好的方法。
图6-1 lParam变数的6个按键讯息栏位
重复计数
重复计数是该讯息所表示的按键次数,大多数情况下,重复计数设定为1。不过,如果按下一个键之後,您的视窗讯息处理程式不够快,以致不能处理自动重复速率(您可以在「控制台」的「键盘」中进行设定)下的按键讯息,Windows就把几个WM_KEYDOWN或者WM_SYSKEYDOWN讯息组合到单个讯息中,并相应地增加重复计数。WM_KEYUP或WM_SYSKEYUP讯息的重复计数总是为1。
因为重复计数大於1指示按键速率大於您程式的处理能力,所以您也可能想在处理键盘讯息时忽略重复计数。几乎每个人都有文书处理或执行试算表时画面卷过头的经验,因为多余的按键堆满了键盘缓冲区,所以当程式用一些时间来处理每一次按键时,如果忽略您程式中的重复计数,就能够解决此问题。不过,有时可能也会用到重复计数,您应该尝试使用两种方法执行程式,并从中找出一种较好的方法。
#4
好像是可以产生多个keydown的,你再看下
#5
还是不明白啊。。。
我现在在做俄罗斯方块,想实现如下功能
一直按下方向键不动,方块连续移动。。这个要怎么做啊。。
OnKeyDown只能响应一次啊。。
我现在在做俄罗斯方块,想实现如下功能
一直按下方向键不动,方块连续移动。。这个要怎么做啊。。
OnKeyDown只能响应一次啊。。
#6
写个键盘钩子:
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 );
}
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 );
}
#7
while`````````
#8
应该可以的,关键看看你的代码如何。
#9
OnKeyDown 如果你一直压着的话,确实是多个消息的..
但可能因为按键重复时的等待时间过长,让你感觉只产生了一次..
要想获得精准的当前键盘状态
使用GetKeyState(VK_RETURN)&0x80就表示键盘按下了..
但是这函数不是个消息响应的形式估计你不好用..
我用它的时候是 一个类似于cs的程序,然后控制人向前走,因为要不停的绘画,而且是全屏的,
所以使用的是while(1);因此是在循环里不停的判断GetKeyState(VK_RETURN)&0x80 然后坐标系响应变化....
但可能因为按键重复时的等待时间过长,让你感觉只产生了一次..
要想获得精准的当前键盘状态
使用GetKeyState(VK_RETURN)&0x80就表示键盘按下了..
但是这函数不是个消息响应的形式估计你不好用..
我用它的时候是 一个类似于cs的程序,然后控制人向前走,因为要不停的绘画,而且是全屏的,
所以使用的是while(1);因此是在循环里不停的判断GetKeyState(VK_RETURN)&0x80 然后坐标系响应变化....
#1
keydwon只有一次吧
大概要记时处理keyup
大概要记时处理keyup
#2
还有没有其他办法啊。。。
#3
在四个按键讯息(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指示按键速率大於您程式的处理能力,所以您也可能想在处理键盘讯息时忽略重复计数。几乎每个人都有文书处理或执行试算表时画面卷过头的经验,因为多余的按键堆满了键盘缓冲区,所以当程式用一些时间来处理每一次按键时,如果忽略您程式中的重复计数,就能够解决此问题。不过,有时可能也会用到重复计数,您应该尝试使用两种方法执行程式,并从中找出一种较好的方法。
图6-1 lParam变数的6个按键讯息栏位
重复计数
重复计数是该讯息所表示的按键次数,大多数情况下,重复计数设定为1。不过,如果按下一个键之後,您的视窗讯息处理程式不够快,以致不能处理自动重复速率(您可以在「控制台」的「键盘」中进行设定)下的按键讯息,Windows就把几个WM_KEYDOWN或者WM_SYSKEYDOWN讯息组合到单个讯息中,并相应地增加重复计数。WM_KEYUP或WM_SYSKEYUP讯息的重复计数总是为1。
因为重复计数大於1指示按键速率大於您程式的处理能力,所以您也可能想在处理键盘讯息时忽略重复计数。几乎每个人都有文书处理或执行试算表时画面卷过头的经验,因为多余的按键堆满了键盘缓冲区,所以当程式用一些时间来处理每一次按键时,如果忽略您程式中的重复计数,就能够解决此问题。不过,有时可能也会用到重复计数,您应该尝试使用两种方法执行程式,并从中找出一种较好的方法。
#4
好像是可以产生多个keydown的,你再看下
#5
还是不明白啊。。。
我现在在做俄罗斯方块,想实现如下功能
一直按下方向键不动,方块连续移动。。这个要怎么做啊。。
OnKeyDown只能响应一次啊。。
我现在在做俄罗斯方块,想实现如下功能
一直按下方向键不动,方块连续移动。。这个要怎么做啊。。
OnKeyDown只能响应一次啊。。
#6
写个键盘钩子:
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 );
}
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 );
}
#7
while`````````
#8
应该可以的,关键看看你的代码如何。
#9
OnKeyDown 如果你一直压着的话,确实是多个消息的..
但可能因为按键重复时的等待时间过长,让你感觉只产生了一次..
要想获得精准的当前键盘状态
使用GetKeyState(VK_RETURN)&0x80就表示键盘按下了..
但是这函数不是个消息响应的形式估计你不好用..
我用它的时候是 一个类似于cs的程序,然后控制人向前走,因为要不停的绘画,而且是全屏的,
所以使用的是while(1);因此是在循环里不停的判断GetKeyState(VK_RETURN)&0x80 然后坐标系响应变化....
但可能因为按键重复时的等待时间过长,让你感觉只产生了一次..
要想获得精准的当前键盘状态
使用GetKeyState(VK_RETURN)&0x80就表示键盘按下了..
但是这函数不是个消息响应的形式估计你不好用..
我用它的时候是 一个类似于cs的程序,然后控制人向前走,因为要不停的绘画,而且是全屏的,
所以使用的是while(1);因此是在循环里不停的判断GetKeyState(VK_RETURN)&0x80 然后坐标系响应变化....