使用 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# 中检索键盘状态?的主要内容,如果未能解决你的问题,请参考以下文章
directX directInput 键盘抛出 E_accessdenied