VirtualBox键盘输入原理:为何“P”键的扫描码是25而非0x50?-java教程

本文详解virtualbox `ikeyboard.putscancodes()` 接口使用的**物理键盘扫描码(scan code)**机制,阐明其与java/windows中虚拟键码(vk_p = 0x50)的本质区别,并提供可运行的编码转换方案与实用建议。

在使用 VirtualBox Java SDK 控制虚拟机键盘输入时(如调用 k.putScancodes(Arrays.asList(25, 25 | 0x80)) 发送字母 P),开发者常困惑于:为何 Java 的 KeyEvent.VK_P 和 Windows 文档中的虚拟键码均为 0x50(即 ASCII 码值),而 VirtualBox 却要求传入 25?答案在于——VirtualBox 的 IKeyboard 接口不接受虚拟键码(Virtual Key Code),而是直接模拟物理键盘行为,接收的是底层硬件级的扫描码(Scan Code)。

扫描码 vs 虚拟键码:根本差异

  • 扫描码(Scan Code):由物理键盘芯片生成,表示“某个物理按键被按下/释放”,与字符无关,且依赖键盘布局和历史标准(如 IBM PC/XT 的 Scan Code Set 1)。例如:

    • 25 表示 P 键按下(make code);
    • 25 | 0x80 = 153(即 0x99)表示 P 键释放(break code)。
  • 虚拟键码(Virtual Key Code):是操作系统抽象层定义的逻辑常量(如 VK_P = 0x50),用于统一处理不同键盘布局下的语义操作(如“用户想输入字母 P”),需由键盘驱动将扫描码翻译而来。

VirtualBox 为保证跨平台兼容性与精确硬件仿真,选择绕过宿主机 OS 的键盘驱动栈,直接向客户机注入原始扫描码——这正是 putScancodes() 接口的设计定位:低阶、无状态、与 BIOS/UEFI 引导阶段兼容。

实际编码:使用 Scan Code Set 1(VirtualBox 默认)

VirtualBox 使用的是经典的 IBM PC/XT Scan Code Set 1(也称 “AT Set” 或 “Set 1″)。以下是常用字符对应关系(含 Shift 修饰):

字符 按下扫描码 释放扫描码 备注
P 25 153 25 \| 0x80
2 3 131 主键盘区数字键
b 48 176 小写 b(需配合左 Shift)
Shift(左) 42 170 必须先按再松,才能生效

✅ 正确发送小写字母 p 的完整流程(含 Shift 控制):

夏夕资源网专注于CMS网站模板,主流语言整站网站源码下载,网站建设相关教程分享,好用的软件素材整合下载,提供一站式便捷自助服务。
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"zy.lucklyus.top",如遇到无法解压的请联系管理员!
夏夕资源网-网站模板_免费源码_资源素材 » VirtualBox键盘输入原理:为何“P”键的扫描码是25而非0x50?-java教程
在线时间:12:00 - 22:00
关注微信公众号:微信公众号
站长邮箱:[email protected]
  • 运营天数: 1391+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 3998203+
  • 本周更新: 0+
  • 最后更新: 2026-03-16

本站指数

×
  • 运营天数: 1391+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 3998203+
  • 本周更新: 0+
  • 最后更新: 2026-03-16