IDirectInputDevice8键盘钩子

时间:2008-10-26 22:51:06

标签: c++ directx

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

2 个答案:

答案 0 :(得分:1)

Windows在幕后轮询键盘硬件。当关键事件发生时,它会将相应的WM_ *消息添加到Windows消息队列中(包含键盘状态的相关信息)。 windows message pump将这些消息从队列中拉出并相应地处理它们。这种方法的主要好处是你不必为了掌握键盘事件而做很多事情(不需要知道键盘布局/硬件)。缺点是它确实不是实时的。

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

查看this example如何使用DirectInput查询键盘。

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

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

答案 1 :(得分:0)

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

WM_SYSKEYDOWN
WM_SYSKEYUP
WM_KEYDOWN
WM_KEYUP 
WM_CHAR