Winforms 两个连续键控事件之间的长延迟

Winforms 两个连续键控事件之间的长延迟,winforms,keyboard-events,game-engine,Winforms,Keyboard Events,Game Engine,我在写一个小小的游戏引擎——纯粹是为了从内部理解它们是如何工作的。我目前不想弄乱OpenGL或DirectX,所以我坚持使用GDI+和所有WinForms之类的东西在控件上绘图 显然,我需要处理输入。更具体地说,是键盘事件。然而,这带来了一个问题: protected override void OnKeyDown(KeyEventArgs e) { Trace.WriteLine(string.Format("KD {0:hh:MM:ss.fff} {1}", Dat

我在写一个小小的游戏引擎——纯粹是为了从内部理解它们是如何工作的。我目前不想弄乱OpenGL或DirectX,所以我坚持使用GDI+和所有WinForms之类的东西在控件上绘图

显然,我需要处理输入。更具体地说,是键盘事件。然而,这带来了一个问题:

protected override void OnKeyDown(KeyEventArgs e)
{
    Trace.WriteLine(string.Format("KD {0:hh:MM:ss.fff} {1}", 
        DateTime.Now, e.KeyCode));
}
此代码(即使在控制面板的键盘小程序中设置了最短的重复延迟)产生以下结果:

KD 10:02:18.318 Right
KD 10:02:18.570 Right
KD 10:02:18.598 Right
KD 10:02:18.639 Right
KD 10:02:18.667 Right
KD 10:02:18.701 Right
如你所见,有0.25秒。前两个事件之间的延迟。很明显,这会导致屏幕上的对象移动缓慢:它首先稍微向右移动,然后暂停一段明显的时间,然后继续


我如何解决这个问题?这可以在纯WinForms中完成吗?或者我应该使用DirectInput(或者现在的犹太教方式?)路线吗?

使用Windows消息并不是进行输入交互的最佳方式。
我对WinForms一无所知,但我假设在关键事件中使用消息

很多年前我就使用了DirectInput(v7),速度非常快。

也许,或者在游戏循环中是好的选择

这个问题在谷歌搜索结果中出现的速度太快了。@Anton,哪一个?GetKeyboardState或GetAsyncKeyState?
GetKeyboardState
速度足够快,所以我从未尝试过
GetAsyncKeyState
@Anton,ok:)DirectInput让您可以“直接”访问键盘缓冲区,所以在需要非常精确的输入时使用它,或者,如果您想处理游戏垫/操纵杆并利用它们的额外功能。