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;
}

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

  1. DirectInput里的键盘鼠标的应用

    设计一个PC游戏,键盘鼠标的输入是绝不能少.Windows也提供了诸如WM_LBUTTONDOWN.WM_RBUTTONUP等鼠标消息以及WM_KEYDOWN.WM_KEYUP等键盘输入消息.但是Di ...

  2. 【Unity】Input——检测鼠标、键盘、手柄输入、鼠标在屏幕上的位置等等

    1.鼠标在屏幕上的位置 using System.Collections; using System.Collections.Generic; using UnityEngine;public cla ...

  3. Unity中按钮检测鼠标状态

    改方法主要是用于按钮检测鼠标的进入.滑出.点击.抬起.长按.长按停止 1:先将下面这个脚本挂载到需要检测鼠标状态的按钮上 using System.Collections; using System. ...

  4. 魔塔之拯救白娘子~我的第一个VB6+DX8做的小游戏源码~3鼠标键盘和手柄引擎

    魔塔之拯救白娘子 完整工程下载地址: xInput.cls 这个模块处理鼠标键盘和手柄的输入. 'impactX Game Engine '本类模块用于处理鼠标键盘和手柄的输入 '使用本类模块必须遵守 ...

  5. 模拟鼠标键盘操作,含硬件模拟技术。

    键盘是我们使用计算机的一个很重要的输入设备了,即使在鼠标大行其道的今天,很多程序依然离不开键盘来操作.但是有时候,一些重复性的,很繁琐的键盘操作总会让人疲惫,于是就有了用程序来代替人们按键的方法,这样 ...

  6. 模拟鼠标键盘操作,含硬件模拟技术。[转]

    模拟鼠标键盘操作,含硬件模拟技术. 键盘是我们使用计算机的一个很重要的输入设备了,即使在鼠标大行其道的今天,很多程序依然离不开键盘来操作.但是有时候,一些重复性的,很繁琐的键盘操作总会让人疲惫,于是就 ...

  7. 模拟鼠标键盘操作,含硬件模拟技术

    键盘是我们使用计算机的一个很重要的输入设备了,即使在鼠标大行其道的今天,很多程序依然离不开键盘来操作.但是有时候,一些重复性的,很繁琐的键盘操作总会让人疲惫,于是就有了用程序来代替人们按键的方法,这样 ...

  8. 8修改host_正点原子【STM32-F407探索者】第五十九章 USB 鼠标键盘(Host)实验

    1)资料下载:点击资料即可下载 2)对正点原子Linux感兴趣的同学可以加群讨论:935446741 3)关注正点原子公众号,获取最新资料更新 上一章我们向大家介绍了如何利用 STM32F4 的 US ...

  9. win7卸载显卡及对应驱动后桌面分辨率不对以及鼠标键盘无反应

    今天实验室师妹的一台电脑把显卡(GTX1070)卸载掉后,出现了一个很奇怪的问题,以前也没有遇到过,具体描述以及最后的解决办法如下: 问题: win7卸载掉显卡后,正常开机,但桌面分辨率不正常,致命的 ...

最新文章

  1. [原创]如果软件在网络磁盘中或移动磁盘中运行时需要解决 exception C0000006 异常问题
  2. 《理解 ES6》阅读整理:块绑定(Block Binding)
  3. ubuntu10.04开启root登陆
  4. qconbeijing2014
  5. 180326新闻:创客授牌仪式新闻稿
  6. ajax接口调节,前端用ajax调接口怎么破啊?
  7. google compute test Problem 1题
  8. java agent_如何脚踏实地构建Java Agent
  9. linux中的开机启动
  10. MySQL MHA切换失败一例
  11. 2020 字节跳动 面经
  12. html+css+js 实现鼠标拖尾效果(源码)
  13. mac测试电池软件,BattMan(Mac电池监测软件) V1.6 Mac版
  14. 《黑客之道》- 全网最详细的kali系统安装教程
  15. 20182319《数据结构与面向对象程序设计》实验二报告
  16. 计算机第一级开机密码设置,开机密码怎么设置
  17. 饥荒联机版服务器搭建_饥荒联机版steam专用服务器快速搭建教程
  18. 微波雷达感应技术系统,车库智能照明应用,物联网智能化发展
  19. arduino leonardo 入门
  20. 若依框架搜索框使用注解写动态SQL

热门文章

  1. 删除列表中重复元素的几种方法
  2. [日常电脑应用]如何彻底清除电脑使用后的痕迹
  3. Python基础学习-1-廖雪峰课程-Python的数据类型和面向对象
  4. 高手给我指点一下迷津~技术情感困惑~
  5. jQuery手风琴特效(含完整源码)
  6. 油耳适合带什么耳机?不入耳的骨传导耳机最合适
  7. springboot集成支付宝沙箱支付
  8. windows的bat命令记录
  9. 给我一个apex的罗技鼠标宏,
  10. linux系统做gost镜像,linux下如何像ghost一样备份系统