06/11/2020

键盘鼠标输入

  • WIN32 API 输入与输出
  • DirectXTK
    • keyDown和keyUp函数,不是类的成员函数
    • 键盘鼠标的单例模式
    • 封装好的isKeyDown 和 isKeyUp
      • 键盘鼠标设计单例的好处
    • 鼠标键盘跟踪器
  • DirectXInput
    • 创建
    • 总结

WIN32 API 输入与输出

因为windows WIN32 API的消息回调会处理键盘鼠标的事件,所以可以直接使用。

LRESULT CALLBACK MsgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{switch (msg){// 监测这些键盘/鼠标事件case WM_INPUT:case WM_LBUTTONDOWN:case WM_MBUTTONDOWN:case WM_RBUTTONDOWN:case WM_XBUTTONDOWN:case WM_LBUTTONUP:case WM_MBUTTONUP:case WM_RBUTTONUP:case WM_XBUTTONUP:case WM_MOUSEWHEEL:case WM_MOUSEHOVER:case WM_MOUSEMOVE:  //鼠标移动事件 int x = LOWORD(lParam);//鼠标的横坐标int y = HIWORD(lParam);//鼠标的纵坐标return 0;case WM_KEYDOWN:case WM_SYSKEYDOWN:case WM_KEYUP:case WM_SYSKEYUP:  //系统键位return 0;}return DefWindowProc(hwnd, msg, wParam, lParam); //交给操作系统自己处理
}

DirectXTK

微软进一步针对DirectX重写了Keyboard和Mouse类,但依然是通过原先的消息回调函数传递事件

void Keyboard::ProcessMessage(UINT message, WPARAM wParam, LPARAM lParam)
{auto pImpl = Impl::s_keyboard; //Keyboard类中的私有Impl类,用来管理键盘状态识别if (!pImpl)return;bool down = false;switch (message){case WM_ACTIVATEAPP:pImpl->Reset();return;case WM_KEYDOWN:case WM_SYSKEYDOWN:down = true;break;case WM_KEYUP:case WM_SYSKEYUP:break;default:return;}int vk = static_cast<int>(wParam);  //获取wParam保存的按键信息switch (vk){case VK_SHIFT:vk = MapVirtualKey((lParam & 0x00ff0000) >> 16, MAPVK_VSC_TO_VK_EX);if (!down){// Workaround to ensure left vs. right shift get cleared when both were pressed at same timeKeyUp(VK_LSHIFT, pImpl->mState);KeyUp(VK_RSHIFT, pImpl->mState);}break;case VK_CONTROL: //control键的识别vk = (lParam & 0x01000000) ? VK_RCONTROL : VK_LCONTROL;break;case VK_MENU:vk = (lParam & 0x01000000) ? VK_RMENU : VK_LMENU;break;}if (down){KeyDown(vk, pImpl->mState);}else{KeyUp(vk, pImpl->mState);}
}

keyDown和keyUp函数,不是类的成员函数

void KeyDown(int key, Keyboard::State& state)
{if (key < 0 || key > 0xfe)return;auto ptr = reinterpret_cast<uint32_t*>(&state);unsigned int bf = 1u << (key & 0x1f);ptr[(key >> 5)] |= bf;
}
void KeyUp(int key, Keyboard::State& state)
{if (key < 0 || key > 0xfe)return;auto ptr = reinterpret_cast<uint32_t*>(&state);unsigned int bf = 1u << (key & 0x1f);ptr[(key >> 5)] &= ~bf;
}

如果按了某一个键,那个键的状态会变为true,如果释放掉了,则变为false

/*
//自定义映射表
A B C D E F G H I J
0 1 2 3 4 5 6 7 8 9
*/
enum keyCode{A,B,C,D,E,F,G,H,I,J,K};
bool keyMap[10] = {false};
if(KEYDOWN)
{// B = vk_B   bool keyMap[B] = true;
}
if(KEY_UP)
{bool keyMap[B] = false;
}
  • vk是微软自己定义键位值,只是算法不一样,微软使用的是位运算和移位法

键盘鼠标的单例模式

键盘鼠标可以设置为单例模式,在一个键盘和鼠标的情况下,我们只需要记录一套映射表或者键值对。

//Singleton
static Keyboard& __cdecl Get();
static Mouse& __cdecl Get();

封装好的isKeyDown 和 isKeyUp

返回bool类型,检测是否按键或者释放

bool __cdecl IsKeyDown(Keys key) const
{if (key >= 0 && key <= 0xfe){auto ptr = reinterpret_cast<const uint32_t*>(this);unsigned int bf = 1u << (key & 0x1f);return (ptr[(key >> 5)] & bf) != 0;}return false;
}bool __cdecl IsKeyUp(Keys key) const
{if (key >= 0 && key <= 0xfe){auto ptr = reinterpret_cast<const uint32_t*>(this);unsigned int bf = 1u << (key & 0x1f);return (ptr[(key >> 5)] & bf) == 0;}return false;
}

键盘鼠标设计单例的好处

通常来说,一台主机只有一个键盘和一个鼠标,Windows操作系统处理好键盘和鼠标的的信号,并转换为虚拟值。对于一个应用程序,可以全局的获取键盘和鼠标的状态情况是比较好的

鼠标键盘跟踪器

主要保存了上一次按键信息,根据上一次按键信息,可以更新当前鼠标或者键盘的状态

State __cdecl GetLastState() const { return lastState; }
void __cdecl Update(const State& state);

DirectXInput

需要引用库文件#include <dinput.h>, 输入类在DirectX8的时候就一直使用到现在

创建

#if DIRECTINPUT_VERSION > 0x0700
//需要Win32 API 应用程序实例,
extern HRESULT WINAPI DirectInput8Create(HINSTANCE hinst, DWORD dwVersion, REFIID riidltf, LPVOID *ppvOut, LPUNKNOWN punkOuter);#else

总结

使用DirectInput设备的步骤

1、获取设备GUID,调用IDirectInput8::EnumDevice来实现。
2、创建设备COM对象,调用IDirectInput8::CreateDevice来实现。
3、设置数据格式,调用IDirectInputDevice8::SetDataFormat来实现。
4、设置协作级别,调用IDirectInputDevice8::SetCooperativeLevel来实现。
5、设置任何特殊属性,调用IDirectInputDevice8::SetProperty来实现。
6、获得设备,调用IDirectInputDevice8::Acquire来实现。
7、轮询设备,调用IDirectInputDevice8::Poll来实现。
8、读取数据,调用IDirectInputDevice8::GetDeviceState来实现。

微软 WIN32 API
微软 DirectXTK
微软 Keyboard and Mouse Input
微软 dinput头文件
X_Jun的博客园
DirectXInput hjjdebug CSDN
DirectXInput 寒江雪 CSDN

DX11(九):处理键盘鼠标输入相关推荐

  1. [Python从零到壹] 九.网络爬虫之Selenium基础技术万字详解(定位元素、常用方法、键盘鼠标操作)

    欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...

  2. DirectX11 With Windows SDK--06 键盘和鼠标输入

    文章目录 前言 鼠标输入 鼠标状态追踪 键盘输入 键盘状态追踪 D3DApp::MsgProc方法的变化 前言 提供键鼠输入可以说是一个游戏的必备要素.在这里,我们不使用DirectInput,而是使 ...

  3. 介绍一个统计键盘和鼠标输入情况的工具软件

    程序员是不是手速越快,工作效率越高? 我觉得工作时把手机锁起来是一个好办法. 言归正传,我今天尝试了一个统计键盘和鼠标输入情况的工具软件,名叫 WhatPulse,分享给大家. 官网地址:https: ...

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

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

  5. 【Win32 API学习】模拟键盘输入和鼠标输入

    在Windows大行其道的今天,windows界面程序受到广大用户的欢迎.对这些程序的操作不外乎两种,键盘输入控制和鼠标输入控制.有时,对于繁杂的,或重复性的输入操作,我们能否通过编制程序来代替手工输 ...

  6. qml开发笔记(七):输入元素鼠标输入MouseArea和键盘输入Keys

    若该文为原创文章,未经允许不得转载 原博主博客地址:https://blog.csdn.net/qq21497936 原博主博客导航:https://blog.csdn.net/qq21497936/ ...

  7. 模拟键盘输入和鼠标输入 winAPI

    在Windows大行其道的今天,windows界面程序受到广大用户的欢迎.对这些程序的操作不外乎两种,键盘输入控制和鼠标输入控制.有时,对于繁杂的,或重复性的输入操作,我们能否通过编制程序来代替手工输 ...

  8. WPF经典教程--键盘输入事件, 鼠标输入事件, 焦点处理

    一.键盘和键盘事件 WPF提供了一个基本的键盘类(System.Input.Keyboard类),该类提供键盘相关的事件,方法和属性,以提供有关键盘状态的信息.键盘事件也由诸如UIElement XA ...

  9. 模拟键盘输入和鼠标输入

    在Windows大行其道的今天,windows界面程序受到广大用户的欢迎.对这些程序的操作不外乎两种,键盘输入控制和鼠标输入控制.有时,对于繁杂的,或重复性的输入操作,我们能否通过编制程序来代替手工输 ...

最新文章

  1. Cisco WLAN 控制器的配置
  2. Android 根据从服务器中获取的rgb值实现动态改变圆角加框的Imageview 的背景色
  3. BZOJ1444: [Jsoi2009]有趣的游戏(Trie图,矩乘)
  4. Mybatis DAO开发--Mapper动态代理开发方式
  5. python对象继承
  6. 博客目录(随时删除)
  7. 机器学习第七篇:详解EM算法
  8. 封装 axios 请求
  9. android ble蓝牙接收不到数据_Android蓝牙4.0 Ble读写数据详解 -2
  10. 利用VBS合并Excel中相同单元格
  11. 计算机系统修复命令提示符,老司机帮您w10蓝屏后用命令提示符修复系统的方法...
  12. 基于激光刻划技术的石墨烯器件
  13. PhotoZoom pro8激活码使用方法下载安装教程
  14. eNSP——通过Stelnet登录系统网络配置实验
  15. opengl 知识点2
  16. 139邮箱服务器的ip,[原创]中国移动139邮箱和说客
  17. 海鸣威《离开为了更好的回来》 MV首播感心动耳
  18. 压力测试是什么?为什么要压力测试?怎么使用压力测试?
  19. 高通TrueWireless Mirroring无缝的用户体验镜像技术
  20. 此人才是最强的创客,马化腾、李彦宏大佬都望尘莫及

热门文章

  1. 谷歌浏览器调试移动端h5页面
  2. 基于 HTML5 WebGL 的加油站 3D 可视化监控
  3. 禁用Win10系统驱动程序强制签名的方法
  4. html自动弹出提示对话框代码,html5简单的手机端弹出对话框确认代码
  5. 视频云技术系列 - 5G 700MHz建设方案及产业链
  6. 创客集结号:3D打印技术的三大缺点及解决方法
  7. win10自带的播放器无法播放
  8. python有道自动翻译_python文档自动翻译
  9. HTML5期末大作业:关于旅游网站设计----- 洪江市旅游网 HTML+CSS+JavaScript
  10. Python里面数据库连接