You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VirtualBox向虚拟机发送字符:为何按键扫描码与标准键码不一致?

VirtualBox按键码与标准键码差异的原因

VirtualBox的putScancodes接口使用的是PS/2键盘Set 1扫描码,这和微软虚拟键码、java.awt.event.KeyEvent里的虚拟键码是完全不同的两套编码体系,差异的核心原因如下:

  • 编码维度不同
    虚拟键码(比如VK_P=0x50)是操作系统层面的抽象,目的是统一不同硬件键盘的逻辑按键标识——不管你用的是PS/2、USB还是其他键盘,系统都用同一个虚拟键码代表“P键”。而PS/2扫描码是硬件层面的原生编码,直接对应PS/2键盘的物理按键信号,每个按键的按下/松开都有对应的字节值。

  • PS/2 Set 1扫描码的规则
    Set 1扫描码中,按键按下时输出单字节值,松开时输出该字节加上0x80的结果。比如你代码里的25(十进制)就是0x19,这是PS/2键盘上P键按下的原生扫描码,和虚拟键码0x50没有直接数值对应关系。你遇到的“2对应0x50、b对应0x30”也是同样的道理——这些数值都是PS/2扫描码,不是虚拟键码。

  • VirtualBox的设计逻辑
    VirtualBox模拟的是完整的硬件环境,包括PS/2键盘控制器。当你调用putScancodes时,相当于直接向虚拟机的硬件键盘控制器发送物理按键信号,所以必须使用硬件原生的扫描码,而非操作系统抽象的虚拟键码。

内容的提问来源于stack exchange,提问作者Grim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 16:32:33