VirtualBox

X11主机系统上的键盘处理

VirtualBox 处理键盘输入的方式与大多数 X11 应用程序有所不同,因为客户操作系统期望从物理键盘读取键码,这些键码告知其按键在键盘上的位置,而不是按键上的符号。例如,美式键盘上的“,”和俄式键盘上的“ъ”会产生相同的键码,操作系统在不被告知的情况下,无法得知正在使用哪种布局。(除非您来自美国,否则您很可能熟悉如何在您的物理系统上设置键盘布局。这同样适用于虚拟系统。)

VirtualBox 通常完全不查看从主机操作系统接收到的按键事件的按键符号(其中有查看这些符号的代码,但这主要是我们尚未清除的遗留代码;到您阅读本文时,我们甚至可能已经清除了这些代码)。相反,它查看键码,该键码对应于被按下的实际物理按键。它使用 X 服务器的一个名为 XKB 的函数来查找该键码对应于 PC 键盘上的哪个按键,并向客户机假装模拟虚拟键盘上的该按键被按下了。因此,当您按住 Shift 键并按下“A”时,客户机看到的是“Shift 键按下”、“A 键按下”(实际的键码取决于您的特定键盘上字母 A 的位置)、“A 键释放”和“Shift 键释放”的键码。它不会收到对应大写 A 的键码,如果客户机中的键盘布局设置不正确(例如,您使用的是法式键盘,但客户机认为它是美式键盘),客户机中的软件通常会看到大写“Q”。实际上,如果您在客户机中正确设置了布局,但在主机上设置错误,客户机中的应用程序通常仍会获得正确的字母和符号。

只要您主机系统上的键盘大致符合 PC 键盘,这一切就能正常工作。由于这占我们用例的绝大多数,我们目前不尝试处理其他情况。(上面提到的遗留代码确实有处理,但效果不够好,不值得讨论。)一个不能很好工作的用例是远程 VNC 会话,因为尽管键盘通常是 PC 键盘,但 VNC 服务器通常不会向 VirtualBox 提供足够的信息,使其无法确定按下了哪些物理按键。我们可以想到一些可能的解决方案,但没有一个真正令人信服,此外,由于受影响的用户数量相当少,我们宁愿将精力集中在其他地方。

当然,我们乐意接受合理的代码贡献,以使其他用例更好地工作。需要考虑的几点是:代码应该运行良好并经过充分测试,它不应导致其他用例出现回归问题(我们期望提交者能让我们相信他们已经充分测试了这一点),并且不应使我们现有的代码更难理解。由于缺乏可用的开发者时间,我们可能无法接受以撰写代码为回报的捐赠。如果您有此意向,最好是寻找一位愿意接受捐赠并编写和提交代码的第三方开发者。他们在开始之前应与我们沟通,并与我们协调工作,以使流程顺利进行并避免浪费精力。

上次修改 8 年前 上次修改于 2017/09/18 06:31:20 AM
注意: 查看 TracWiki 获取使用维基的帮助。

© 2025 Oracle 支持 隐私 / 请勿出售我的信息 使用条款 商标政策 自动化访问礼仪