博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
DirectX11 输入设备——DirectInput检测鼠标、键盘状态
阅读量:4087 次
发布时间:2019-05-25

本文共 2474 字,大约阅读时间需要 8 分钟。

DirectX11 输入设备——DirectInput检测鼠标、键盘状态

1. 什么是DirectInput?

由于windows应用程序的消息机制,Windows 成为了在应用程序和硬件之间的一堵无形的墙。 消息队列记录着各种事件,比如鼠标移动,键盘输入,或来自于操作系统本身的事件。这种获取事件的方式对于 Windows 应用程序效率足够了,但是对于游戏来说却不够快。也有的开发者转向使用另一个 Windows 函数,GetAsyncKeyState,来取得他们所需的信息,这也是可以的。

另一种屏蔽技巧性的方法或设备的巧妙使用的快速取得用户输入的方法,是使用 DirectX SDK 提供的 DirectInput组件,它提供了公共层来解决上述问题。这节课我们就学习使用DirectInput。DirectInput对象用来提供接口来访问DirectInput设备,你所创建的 DirectInput 设备能够使你访问指定的输入设备,比如键盘,操纵杆, 或其它游戏输入设备。

2. 如何创建DirectInput对象?

注意到,使用 DirectInput 的第一步就是创建 DirectInput 对象,函数 DirectInput8Create 就用于此目的,其原型如下:

HINSTANCE hinst,DWORD dwVersion,REFIID riidltf,LPVOID *ppvOut,LPUNKNOWN punkOuter );
  1. hInst——用于创建 DirectInput 对象的应用程序实例句柄
  2. dwVersion——应用程序所要求的 DirectInput 的版本号,用于该参数的标准值是 DIRECTINPUT_VERSION
  3. riidltf——接口要求标识,可以使用默认值 IID_IDirectInput8 用于该参数
  4. ppvOut——持有创建成功后的 DirectInput 对象的指针
  5. punkOuter——该参数一般设为 NULL

下面是一个代码片段,用来创建一个 DirectInput 对象:

HRESULT hr = DirectInput8Create( hInst, DIRECTINPUT_VERSION, IID_IDirectInput8, ( void** )&directInputObject, 0 );if FAILED( hr ){    return false;}

2. 如何创建DirectInput设备?

现在,你拥有一个有效的 DirectInput 对象,就可以自由创建设备,可以通过使用 CreateDevice 函数完成:

HRESULT CreateDevice( REFGUID rguid, LPDIRECTINPUTDEVICE *lplpDirectInputDevice, LPUNKNOWN pUnkOuter );
  1. rguid,使用GUID_SysKeyboard 或 GUID_SysMouse 来标识使用键盘或鼠标设备。
  2. lplpDirectInputDevice,保存创建成功的 DirectInput 设备对象地址。
  3. 最后一个参数用于处理 COM 接口。大部分应用程序将最后一个参数设置为 NULL。
    下面的代码假设你想创建一个用于键盘的 DirectInput 设备:
LPDIRECTINPUTDEVICE8 keyboardDevice;HRESULT hr = directInputObject ->CreateDevice( GUID_SysKeyboard, &keyboardDevice, 0 );if FAILED(hr){    return false;}

3. 如何获得键盘/鼠标的信息?

在你从键盘中读取输入之前,需要以一种简单的方式确定键盘上的哪个键被按下。下面提供宏 KEYDOWN 检查你所查看的键是否按下来简单的返回 TRUE 或 FALSE:

#define KEYDOWN( name, key ) ( name[key] & 0x80 )

一个从键盘上读取输入的例子如下:

#define KEYDOWN( name, key ) ( name[key] & 0x80 )char buffer[256];while ( 1 ){    keyboardDevice->GetDeviceState( sizeof( buffer ), ( LPVOID )&buffer );    if( KEYDOWN( buffer, DIK_LEFT ) )    {        // Do something with the left arrow    }    if( KEYDOWN( buffer, DIK_UP ) )    {        // Do something with the up arrow    }}

一个从鼠标读取按键状态的例子如下:

#define BUTTONDOWN(name, key) ( name.rgbButtons[key] & 0x80 )curX = 320;curY = 240;while ( 1 ){    mouseDevice->GetDeviceState( sizeof ( mouseState ), (LPVOID) &mouseState );    if( BUTTONDOWN( mouseState, 0 ) )    {        // Do something with the first mouse button    }    if( BUTTONDOWN( mouseState, 1 ) )    {        // Do something with the up arrow    }    curX += mouseState.lX;    curY += mouseState.lY;}

转载地址:http://mjyii.baihongyu.com/

你可能感兴趣的文章
C++的模板化等等的确实比C用起来方便多了
查看>>
ROS是不是可以理解成一个虚拟机,就是操作系统之上的操作系统
查看>>
用STL algorithm轻松解决几道算法面试题
查看>>
ACfly之所以不怕炸机因为它觉得某个传感器数据不安全就立马不用了
查看>>
我发觉,不管是弄ROS OPENCV T265二次开发 SDK开发 caffe PX4 都是用的C++
查看>>
ROS的安装(包含文字和视频教程,我的ROS安装教程以这篇为准)
查看>>
国内有个码云,gitee
查看>>
原来我之前一直用的APM固件....现在很多东西明白了。
查看>>
realsense-ros里里程计相关代码
查看>>
似乎写个ROS功能包并不难,你会订阅话题发布话题,加点逻辑处理,就可以写一些基础的ROS功能包了。
查看>>
if __name__ == ‘__main__‘:就是Python里的main函数,脚本从这里开始执行,如果没有main函数则从上到下顺序执行。
查看>>
PX4官方用户和开发手册的首页面是会给你选择英文和中文的
查看>>
网络协议栈我是不是可以这么理解,就是把你要发送的数据自动处理成TCPIP格式的消息发出去,这种底层的转换不需要你弄了。
查看>>
除了LwIP还有uIP
查看>>
《跟工程师学嵌入式开发》这本书最后的终极项目我反而觉得有说头
查看>>
博士的申请考核制
查看>>
那些硬件的初始化函数主要是在做些上什么?
查看>>
MAVLink学习之路05_MAVLink应用编程接口分析(也有讲STM32下的收发函数)
查看>>
找到了中文版的mavlink手册
查看>>
浅谈飞控开发的仿真功能
查看>>