注册 登录
编程论坛 Windows论坛

如何消除键盘停顿的时间

炫色流年 发布于 2012-08-14 20:30, 172 次点击
大家都知道,在平常的记事本输入字符时,就是按住键盘的一个字母,会先输出一个字母,然后停顿一段时间,再继续连续快速输出这个字母
在 雷电 这样的游戏里面,一按一个键(比如左键),飞机就会立即连续地向左飞,而不会出现停顿的状况

我想问问高手们,怎样消除这段停顿时间,做到 雷电 这样的效果

void __fastcall TForm::FormKeyDown(TObject *Sender, WORD &Key,
      TShiftState Shift)
{
//这里面怎么写????假设我要移动的是一个图片框,名字是ball
如果写
  if(判断按下左键) ball->left-=10;
的话,就会出现停顿效果,怎么办?
}

求高手指教啊!!!!!!
9 回复
#2
pangding2012-08-14 22:25
其实你只用问怎么判断一个键是否被按下了。因为按下一个键和抬起一个键时键盘会送扫描码,中间的过程是闲着的。
至于侦测到按键按下之后应该干什么,按下和抬起之间应该怎样处理是你编程的工作。

给你移到 windows 区吧。我不懂 windows 的那些东西。
#3
zklhp2012-08-14 22:52
如果他问的是编程貌似应该移动到MFC VC 那个版比较合适

你说的这个叫重复延迟 Xwindow下是用kbdrate设置罢 windows控制面板里就能调 不过消息处理怎么写我就不知道了
#4
lonmaor2012-08-14 22:57
这个该移到BCB区
#5
pangding2012-08-14 23:07
是吗。L版 自行处理呗。
在下路痴,不是很熟悉这边的地理状况。
#6
zklhp2012-08-14 23:11
这个问题挺有意思

我能想到的

直接处理按下和放开的消息 不管重复的 在按下和放开之间手工处理 也就是绕过这个重复率 我试了试 貌似这个重复延迟直接消息发送? 有待深究

或者直接用钩子 当然这个增加了编程复杂性也有稳定性问题 但应该是一种比较好的方法


#7
lonmaor2012-08-15 11:09
对windows的消息机制了解不深
我能想到的是
当出发BUTTONDOWN事件时,创建一个while(true)的循环,循环体内是按下键后要触发的事件,然后跟一个从消息队列中取消息的函数,如果不是对应的BUTTONUP,则把该消息继续插回原消息队列。
可行性待定
#8
天剑山2012-08-15 11:12
可以考虑另开一个线程,对按键进行监控
#9
休闲客2012-08-16 10:14
在你的程序里你得编写三个消息处理程序,一个是键铵下消息处理程序,一个是键放开消息处理程序,一个时钟发生器发出的消息处理程序,在键按下时,设置一个你想要速度的时钟发生器,即每隔多少时间出一个时间消息,在时间消息处理程序中处理你想做的事情(如移动图片等),在键放开的消息处理中,停止你做的事情,同时清除时间发生器。
希望能帮到你,详细的代码,我想你应该会的。
#10
炫色流年2012-08-25 19:56
我想问的是,大家打开记事本,按右方向键,死死按住一直不要松开,就会看光标先向右移动了一格,然后停住,大概过了一秒之后,光标就会快速地向右移动。如果把那个光标当作雷电里的飞机,大家都知道雷电里的飞机不会出现这种停住一秒的状况。我用一个图片框载入雷电的图片,在窗体的keydown事件里写代码。游戏开始时,如果玩家一直按着一个方向键(如向右),飞机就会向右移动一下,停顿大概一秒,再连续不间断向右移动,这种情况和记事本里的光标一样。我想问的是,如何消除那个大约一秒的停顿??
1