使用 DirectInput 在 C# 中检索键盘状态?

Posted

技术标签:

【中文标题】使用 DirectInput 在 C# 中检索键盘状态?【英文标题】:Retrieving keyboard state in C# using DirectInput? 【发布时间】:2010-12-17 12:47:21 【问题描述】:

当在特定窗体上按下某个键时,我需要相当快地检索键盘状态 - 速度足够快,以至于 Windows 窗体的标准 KeyUp/KeyDown 事件不够快。有人告诉我尝试 DirectInput,但我没有使用该库的经验或任何线程经验,所以我完全不确定如何开始。

每次 DirectInput 获取键盘状态的变化时,我将如何设置一个线程来调用表单上的一个函数?我知道如何初始化设备,而 SetEventNotification 正是我想要的,但我不知道如何使用它。

任何帮助将不胜感激!

【问题讨论】:

【参考方案1】:

解决方案可能取决于您说 Windows 的按键向上/按键向下事件不够快时的意思。它们当然可以在亚毫秒级分辨率下工作 - 这比大多数人的手指要快得多 - 那么您希望通过“更快”读取输入来获得什么好处?

您确定不仅仅是您的事件循环或代码减慢了响应速度吗?

您可以使用 Windows 函数 GetAsyncKeyState/GetKeyState 实现与 DirectInput 轮询键盘状态类似(相同?)的速度。我没有使用最新版本的 DirectInput,但我很确定早期版本只是将相同的 Win32 事件用于非轮询键盘状态。 DirectInput 的主要优势在于它提供了对所有类型输入设备的通用抽象——它并不是真正用于“快速”键盘输入(无论这意味着什么)。

您可以在 Microsoft 自己的文档中看到“The use of DirectInput for keyboard and mouse input is not recommended...”

【讨论】:

【参考方案2】:

这可能会帮助您不必使用 DirectInput:

[DllImport("user32.dll")]
private static 
extern short GetAsyncKeyState(System.Int32 vKey);

http://msdn.microsoft.com/en-us/library/ms646293(v=vs.85).aspx

希望对你有帮助

【讨论】:

以上是关于使用 DirectInput 在 C# 中检索键盘状态?的主要内容,如果未能解决你的问题,请参考以下文章

如何确定在 DirectInput 中断开的键盘

C# DirectInput - 确定游戏手柄控制器类型

directX directInput 键盘抛出 E_accessdenied

我应该使用 DirectInput 还是 Windows 消息循环?

DirectX DirectInput C# 测量音频输入

如何制作小游戏