迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > 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 确定当前是否按下了该键。

上一篇:使用 C++ 在 While 循环中输入字符

下一篇:没有了

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

本文地址:

相关文章

使用 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++ 中转换为 SHA256

发布时间:2023/08/19 浏览次数:133 分类:C++

SHA256 转换是一种加密哈希技术,自 90 年代以来一直在使用,但在比特币和区块链出现后获得了重视。它使用一种不可逆的单向哈希技术,这意味着最终答案永远无法逆转回其原始消息,从而使

扫一扫阅读全部技术教程

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

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便