1

我们有一个通过 IDirectInputDevice8 检索键盘按下的 3D 应用程序。有什么办法,当我们通过 win32 API winproc 循环检索键盘事件时,我们可以将这些命令发送到 DirectInputDevice?

4

2 回答 2

1

Windows 在后台轮询键盘硬件。当关键事件发生时,它会将相应的 WM_* 消息添加到您的 Windows 消息队列中(以及有关键盘状态的相关信息)。Windows 消息泵将这些消息从队列中拉出并相应地处理它们。这种方法的主要好处是你真的不需要做很多事情来掌握键盘事件(加上不需要键盘布局/硬件的知识)。缺点是它真的不是实时的。

通过 DirectInput 与键盘对话实际上是相似的,但轮询由您决定。通常,您使用 DirectInput 设置键盘设备,然后每次运行更新循环时,您使用GetDeviceState()轮询键盘的状态。您可以在轮询之间跟踪键盘的状态。最好的办法是创建一个包含此功能的对象,并可能在适当的时间触发事件/回调或在队列中创建一个命令条目,以便更好地使用它。这种方法的优点是速度快,因为您直接与硬件对话并且可以立即调用更新。缺点是您必须手动执行此操作,这需要一些时间来设置和正确处理。

查看如何使用 DirectInput 查询键盘的示例。

所以你的问题有几个答案:

  1. 如果您已经拥有 WM_* 消息,为什么不直接调用 DirectInput 处理将调用的代码,从而为您提供相同的功能?
  2. DirectInput 通过轮询为您提供与 Windows 通过 WM_* 消息为您提供的相同信息。所以你不需要转换,或者尝试将一个映射到另一个。只需检查键的状态并处理状态变化的情况。
  3. 选择一种方法并放弃另一种方法。他们都做同样的事情。如果您想要速度和响应能力,我建议您使用 DirectInput。如果这不是那么重要,请使用 WM_* 消息。

我希望这会有所帮助。祝你好运!

于 2008-10-27T10:02:05.057 回答
0

wndproc 将在键盘事件上发送这些消息的组合:

WM_SYSKEYDOWN
WM_SYSKEYUP
WM_KEYDOWN
WM_KEYUP 
WM_CHAR 
于 2008-10-26T23:12:19.640 回答