1.虚拟键码 扫描码 ASCII的区别与联系

1.每个厂家的键盘上的每个键都对应一个扫描码。例如,对于键盘上的’ALT’键,其扫描码可能是4。
2.键盘的驱动程序会把扫描码转成虚拟码。例如将上面的扫描码4转化成虚拟码VK_MENU。
3.由上面可以看出,扫描码通常是和具体的硬件(键盘)相关的,而虚拟码通常可以认为是硬件无关的。

二者可以通过如下函数联系起来:
MapVirtualKey。该函数可以在扫描码和虚拟码之间互相转换。

那么,如何通过程序获取键盘上各个键的状态呢?可以通过调用GetAsyncKeyState和GetKeyState函数来获取单个按键的状态,这两个函数的参数都是按键的虚拟码。也可以通过GetKeyboardState函数获取整个键盘上所有按键的状态。

那么,GetAsyncKeyState和GetKeyState既然都可以获取按键的状态,那么,二者有何区别呢?

GetAsyncKeyState获取的是按键的实时状态,而GetKeyState获取的是最近一个消息从线程的虚拟输入队列取走时该按键的状态,简单来说,就是窗口的消息循环在调用下一个GetMessage或PeekMessage前,使用该函数对特定按键的查询都返回的是同一个值,不管在调用下一个GetMessage或PeekMessage前用户是否按下了该键。

而调用GetAsyncKeyState函数则会返回该按键当前的状态。

虚拟键码和扫描码是计算机系统中用来表示键盘按键的两种不同类型的编码方式,它们各自有特定的作用和特点,在键盘输入处理过程中起着关键作用。以下是它们的区别与联系:

2.区别

  1. 来源与层次:

    • 扫描码(Scan Code):是键盘硬件层面产生的原始编码,它直接对应于键盘上每一个物理按键。当用户按下键盘上的一个键时,键盘控制器检测到这个动作并生成一个扫描码,该扫描码反映了按键在键盘矩阵中的位置。扫描码与具体的键盘硬件设计紧密相关,不同厂家生产的键盘,即使对于相同功能的键,其扫描码也可能存在差异。

    • 虚拟键码(Virtual Key Code):是在操作系统软件层面定义的一套标准化编码体系,用于统一表示键盘上各种按键的功能。扫描码经过键盘驱动程序的翻译后被转换为虚拟键码。虚拟键码与具体的键盘硬件无关,同一功能的键在任何兼容的键盘上,其虚拟键码都是固定的。这种标准化使得应用程序无需关心底层硬件的具体细节,只需处理统一的虚拟键码即可。

  2. 目的与通用性:

    • 扫描码:主要用于硬件层面的键盘输入识别,具有硬件依赖性和较低的通用性。由于不同厂商可能采用不同的扫描码映射表,扫描码不能直接跨键盘模型使用。

    • 虚拟键码:旨在提供一种跨平台、跨硬件的通用表示方法,使得操作系统和应用程序能够一致地处理键盘输入,无论用户使用何种键盘。虚拟键码具有高度的通用性和可移植性。

  3. 处理流程与稳定性:

    • 扫描码:在键盘输入流的早期阶段产生࿰

04-01 16:21