使用 C++ 检测 Windows 中的按键
本文将讨论如何使用 C++ 处理 Windows 应用程序中的按键。 在进一步讨论之前,我们将简要介绍一下使用 C++ 的 Windows 应用程序。
使用 C++ 的 Windows 应用程序类型
可以用 C++ 开发两种类型的应用程序:
-
基于控制台的应用程序
控制台应用程序是那些仅从命令行运行并且只能显示文本的应用程序。 因此,这些也称为命令行应用程序。
-
基于窗口的应用程序
而基于窗口的应用程序是那些使用原始本机 Windows C API 开发的应用程序,并显示为窗口应用程序,与基于控制台的应用程序不同。 这些应用程序用于创建窗口格式的软件,可以显示文本、图像以及其中的所有内容。
开发Windows应用程序的方法有很多种:我们可以直接使用Win32 API并创建C风格的循环来监听Windows事件。 同样,您还可以使用 Microsoft 基础类 (MFC)、面向对象的风格并包装 Win32 API 创建 Windows 应用程序。
当创建在窗口中运行的 Win32 程序时,开发人员必须在 Windows 过程函数中专门处理 Windows 消息。 Win32 应用程序可以构建为 32 位 (x86) 或 64 位 (x64) 二进制文件。
创建Windows应用程序时我们还需要关心键盘事件。
使用 C++ 在 Windows 应用程序中进行键盘输入
键盘有多种用途,包括:
- 字符输入:用户在文档或编辑框中输入的文本。
- 键盘快捷键:使用 CTRL+O 打开文件是调用应用程序功能的击键示例。
- 来自操作系统的命令:使用 ALT+TAB 切换窗口是调用系统功能的击键示例。
在处理键盘输入时,需要处理按键的所有情况。 例如,如果按下B键,可能会出现以下情况:
B
b
此外,如果按下Ctrl键,按下B键将导致键盘快捷键Ctrl+B,这是使文本加粗的快捷命令。
关键代码
当按下某个键时,操作系统会生成一个扫描码。 这些扫描代码因键盘而异。
这些代码对于所有键盘按键都是唯一的; 例如,左键和右键具有不同的扫描码。 由于这些代码是字母数字且难以记忆,因此键盘设备驱动程序将这些扫描代码转换为与设备无关的虚拟键代码。
库文件 WinUser.h 定义了除字符 A-Z 和数字 0-9 之外的所有虚拟键代码的常量。 它们的虚拟代码映射到它们的 ASCII 等效代码:
- 数字 0-9:代码范围从 0x30 到 0x39
- 字母 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 确定当前是否按下了该键。
相关文章
使用 C++ 在 While 循环中输入字符
发布时间:2023/08/19 浏览次数:62 分类:C++
-
这个简单的文章将讨论在 C++ 中处理输入。 此外,我们将研究处理用户无效输入的问题。 最后,我们将讨论如何使用 while 循环从用户处获取输入。
C++ 中的 STL 容器中的 value_type
发布时间:2023/08/19 浏览次数:115 分类:C++
-
STL 是标准模板库的缩写。 它是一组数据结构和算法,用于实现 C++ 编程语言的通用容器和函数。在 C++ 中,容器将数据存储在特定类型的对象中。 有两种容器:序列容器(按顺序保存对象)和
C++ 中的常量参数
发布时间:2023/08/19 浏览次数:96 分类:C++
-
const 关键字在 C++ 中用于将变量定义为常量。 该关键字可以应用于任何数据类型,但最常应用于指针和引用。常量参数是可以由同一范围内的任何函数设置和使用的值。 该参数应在使用该参数
在 C++ 中创建表
发布时间:2023/08/19 浏览次数:68 分类:C++
-
在C++中,可以使用 iomanip 库以表格的形式显示数据。 我们还将了解 iomanip 库有助于打印表中数据的各种方法。在本文中,我们将讨论如何在 C++ 中以表格的形式打印数据。
C++ 中的 POD 类型
发布时间:2023/08/19 浏览次数:188 分类:C++
-
C++ 中的 POD 代表普通旧数据。 它是一个用关键字 struct 或 class 定义的类,只有 int、char、double、bool、signed/unsigned、long/short、float 等数据成员。C++ 中的 POD 类型
在 C++ 中查找对象类型
发布时间:2023/08/19 浏览次数:192 分类:C++
-
本文讨论在 C++ 中查找对象类型的不同方法。在 C++ 中查找类对象的类型 与简单变量的数据类型(如 int、bool 等)类似,类对象也有一个类型,即它们所属的类:
在 C++ 中定义和使用负无穷大
发布时间:2023/08/19 浏览次数:83 分类:C++
-
本文讨论了在 C++ 中表示负无穷大的问题并列出了一些可能的解决方案。C++ 使用 IEEE-754 标准来表示浮点数。 浮点数据类型共有三种:float、double 和 long double。
C++ 中的异常 Warning: Cast From Pointer to Integer of Different Size
发布时间:2023/08/19 浏览次数:106 分类:C++
-
这篇快速文章是关于 C++ 中 cast from pointer to integer of different size 警告的解决方案。 该警告通常在不同的编译器上显示为错误。C++ 中 Warning: Cast From Pointer to Integer of Different Size
在 C++ 中转换为 SHA256
发布时间:2023/08/19 浏览次数:133 分类:C++
-
SHA256 转换是一种加密哈希技术,自 90 年代以来一直在使用,但在比特币和区块链出现后获得了重视。它使用一种不可逆的单向哈希技术,这意味着最终答案永远无法逆转回其原始消息,从而使