迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > C++ >

使用 C++ 检测 Windows 中的按键

作者:迹忆客 最近更新:2023/08/19 浏览次数:

本文将讨论如何使用 C++ 处理 Windows 应用程序中的按键。 在进一步讨论之前,我们将简要介绍一下使用 C++ 的 Windows 应用程序。


使用 C++ 的 Windows 应用程序类型

可以用 C++ 开发两种类型的应用程序:

  1. 基于控制台的应用程序

    控制台应用程序是那些仅从命令行运行并且只能显示文本的应用程序。 因此,这些也称为命令行应用程序。

  2. 基于窗口的应用程序

    而基于窗口的应用程序是那些使用原始本机 Windows C API 开发的应用程序,并显示为窗口应用程序,与基于控制台的应用程序不同。 这些应用程序用于创建窗口格式的软件,可以显示文本、图像以及其中的所有内容。

    开发Windows应用程序的方法有很多种:我们可以直接使用Win32 API并创建C风格的循环来监听Windows事件。 同样,您还可以使用 Microsoft 基础类 (MFC)、面向对象的风格并包装 Win32 API 创建 Windows 应用程序。

    当创建在窗口中运行的 Win32 程序时,开发人员必须在 Windows 过程函数中专门处理 Windows 消息。 Win32 应用程序可以构建为 32 位 (x86) 或 64 位 (x64) 二进制文件。

创建Windows应用程序时我们还需要关心键盘事件。


使用 C++ 在 Windows 应用程序中进行键盘输入

键盘有多种用途,包括:

  1. 字符输入:用户在文档或编辑框中输入的文本。
  2. 键盘快捷键:使用 CTRL+O 打开文件是调用应用程序功能的击键示例。
  3. 来自操作系统的命令:使用 ALT+TAB 切换窗口是调用系统功能的击键示例。

在处理键盘输入时,需要处理按键的所有情况。 例如,如果按下B键,可能会出现以下情况:

B
b

此外,如果按下Ctrl键,按下B键将导致键盘快捷键Ctrl+B,这是使文本加粗的快捷命令。

关键代码

当按下某个键时,操作系统会生成一个扫描码。 这些扫描代码因键盘而异。

这些代码对于所有键盘按键都是唯一的; 例如,左键和右键具有不同的扫描码。 由于这些代码是字母数字且难以记忆,因此键盘设备驱动程序将这些扫描代码转换为与设备无关的虚拟键代码。

库文件 WinUser.h 定义了除字符 A-Z 和数字 0-9 之外的所有虚拟键代码的常量。 它们的虚拟代码映射到它们的 ASCII 等效代码:

  1. 数字 0-9:代码范围从 0x30 到 0x39
  2. 字母 A-Z:代码范围从 0x41 到 0x5A

对于所有其他键,定义了映射到这些键的扫描码的常量; 例如,对于左箭头键,虚拟代码是VK_LEFT。 如上所述,没有为具有相应 ASCII 值的字符定义虚拟代码。

例如,字符 B 没有虚拟代码 VK_B。 显示一些常用虚拟代码的列表如下所示:

虚拟码 扫码 说明
VK_LBUTTON 0x01 鼠标左键
VK_RBUTTON 0x02 鼠标右键
VK_CANCEL 0x03 控制中断处理
VK_MBUTTON 0x04 鼠标中键(三键鼠标)
VK_XBUTTON1 0x05 X1鼠标按钮
VK_XBUTTON2 0x06 X2鼠标按钮
VK_BACK 0x08 退格键
VK_TAB 0x09 TAB键
VK_SHIFT 0x10 SHIFT 键
VK_CONTROL 0x11 CTRL 键
VK_MENU 0x12 ALT 键
VK_PAUSE 0x13 暂停键
VK_CAPITAL 0x14 大写锁定键
VK_NUMPAD0 至 VK_NUMPAD9 | 0x60 - 0x69 | 数字键盘 0-9 键    
VK_F1 至 VK_F12 0x70 - 0x7B | 功能键 F1 至 F12  
VK_NUMLOCK 0x90 NUM LOCK 键
VK_SCROLL 0x91 SCROLL LOCK 键
VK_LSHIFT 0xA0 左SHIFT键
VK_RSHIFT 0xA1 右SHIFT键
VK_LCONTROL 0xA2 左 CONTROL 键
VK_RCONTROL 0xA3 右 CONTROL 键
VK_LMENU 0xA4 左菜单键
VK_RMENU 0xA5 右键菜单键

我们可以在此链接中找到许多其他代码。


使用 C++ 检测 Windows 中的按键

每当按下键盘上的某个键时,就会生成一个事件。 每当按下某个键时就会生成一条消息,并且这些消息是事件驱动的。

我们可以使用函数 GetKeyState() 获取按下的按键的状态。 该函数采用虚拟键代码作为参数,并返回一个标志,告知该键是否被按下。

GetKeyState() 方法很有趣,因为它返回虚拟键盘的状态。 当消息从队列中删除时,该虚拟状态会发生变化,并且基于消息队列内容。

当程序处理窗口消息时,GetKeyState 提供每条消息排队时的键盘快照。 GetKeyState 报告用户按下鼠标按钮时的键盘状态; 例如,如果队列中的最后一条消息是 WM _BUTTONDOWN

句法:

if(GetKeyState(VK_SHIFT) & 0x8000)
{
    // Shift down
}

位标志 0x8000 确定当前是否按下了该键。

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

Arduino 中停止循环

发布时间:2024/03/13 浏览次数:444 分类:C++

可以使用 exit(0),无限循环和 Sleep_n0m1 库在 Arduino 中停止循环。

Arduino 复位

发布时间:2024/03/13 浏览次数:315 分类:C++

可以通过使用复位按钮,Softwarereset 库和 Adafruit SleepyDog 库来复位 Arduino。

Arduino 的字符转换为整型

发布时间:2024/03/13 浏览次数:181 分类:C++

可以使用简单的方法 toInt()函数和 Serial.parseInt()函数将 char 转换为 int。

Arduino 串口打印多个变量

发布时间:2024/03/13 浏览次数:381 分类:C++

可以使用 Serial.print()和 Serial.println()函数在串口监视器上显示变量值。

Arduino if 语句

发布时间:2024/03/13 浏览次数:123 分类:C++

可以使用 if 语句检查 Arduino 中的不同条件。

Arduino ICSP

发布时间:2024/03/13 浏览次数:214 分类:C++

ICSP 引脚用于两个 Arduino 之间的通信以及对 Arduino 引导加载程序进行编程。

使用 C++ 编程 Arduino

发布时间:2024/03/13 浏览次数:127 分类:C++

本教程将讨论使用 Arduino IDE 在 C++ 中对 Arduino 进行编程。

Arduino 中的子程序

发布时间:2024/03/13 浏览次数:168 分类:C++

可以通过在 Arduino 中声明函数来处理子程序。

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便