我可以使用键盘的音量旋钮并在虚拟盒中获取主机密钥吗?

我可以使用键盘的音量旋钮并在虚拟盒中获取主机密钥吗?

我在 Windows 上使用 VirtualBox 创建 Linux 虚拟机。Linux VM 运行良好,但有一点除外:我的键盘(Azio L70 游戏键盘)上的音量旋钮无法使用。

为了解决这个问题,我尝试为键盘添加 USB 例外,神奇的是,键盘及其音量旋钮开始工作……大部分。出于某种奇怪的原因,只要我例外键盘,它的主机键(右 CTRL)就会停止工作。或者更确切地说,它可以工作,但只是作为普通的 CTRL 键,而不是主机键。如果我尝试将主机键更改为任何其他键,情况也是如此。

所以,我的问题是,有人知道如何在键盘有 USB 异常的虚拟框中修复主机键识别吗?必须在可用的音量调节器和进入/退出全屏模式的能力之间做出选择真的很令人沮丧。

答案1

我不知道如何解决你的问题,但我会尝试解释你的经历,提供一些见解,也许为真正的解决方案做好准备。


在正常情况下,主机操作系统会为虚拟操作系统模拟键盘。主机会传递一些例外和转换的按键(您可以在更改主机密钥的位置进行配置)。据我所知,模拟键盘在虚拟操作系统中显示为 PS/2 键盘。

我猜想,如果音量旋钮像鼠标滚轮一样旋转和“跳跃”,它会产生按键(就像音量键一样);或者如果它有固定的位置,它就会传递音量级别0100%无论如何,为了简单起见,我将这些输入称为“按键”。

您的虚拟操作系统对音量旋钮没有反应,可能的原因是:

  • 主机操作系统可能会捕获这些击键但永远不会将其传递给 VirtualBox。

我的主机操作系统是 Kubuntu Linux 和 KDE。我做了一个测试:VLC 确实接收到了提高音量音量减小沉默的仅当它们未在 KDE 中注册为全局热键时才允许使用。这让我相信全局热键必须被禁用,只有这样音量控制键才可以进入 VirtualBox。我不知道它在 Windows 中是否以相同的方式工作。我也不知道您是否可以像在 KDE 中一样轻松地禁用 Windows 中的全局热键。

  • VirtualBox 可能会丢弃这些击键并且永远不会将它们传递给虚拟操作系统。

即使我在 Kubuntu KDE 中禁用全局热键,我的虚拟操作系统也不会对音量控制键做出反应。就我而言,虚拟操作系统是 Windows XP。目前我无法判断它是否接收到任何与音量相关的按键。当我进行进一步测试时,我会更新我的答案。

  • 虚拟操作系统可能会接收一些击键,但它们可能是无效的。

假设 VirtualBox 将按键原样传递给虚拟操作系统。这张表显示 USB 和 PS/2 的代码不同。您的键盘可能会生成 USB 代码,但虚拟操作系统可以使用(模拟的)PS/2 键盘并需要 PS/2 代码。我在虚拟 XP 中尝试了几种不同的键盘驱动程序,但没有一种可以使音量控制工作,但请记住,我不确定按键是否首先到达虚拟操作系统。

  • 一些其他的原因。

但您已成功让音量旋钮在虚拟操作系统中工作。如果我对“USB 异常”一词的理解正确的话,您已将设备连接到虚拟操作系统,并使其通过。

这意味着您的 VirtualBox 捕获了键盘并将其半直接连接到您的虚拟操作系统。虚拟操作系统将 USB 键盘与模拟键盘分开,安装了适当的驱动程序并开始像使用 USB 键盘一样使用它,而不是模拟 PS/2。VirtualBox 正在传递键盘和虚拟操作系统之间的所有 USB 通信。这就是您的旋钮工作的原因。

但是!为了捕获 USB 通信,VirtualBox 必须将键盘从主机操作系统中分离出来。在使用虚拟机时,您可能没有注意到键盘从主机系统中消失了。它当时是“VirtualBox 专用的某个设备”,而不是主机操作系统的功能性键盘。这就是主机键不起作用的原因。

要测试这一点,您可以在窗口中运行虚拟操作系统,像以前一样将键盘连接到它,然后通过鼠标单击切换到另一个(主机)应用程序。键盘在虚拟操作系统之外不起作用。当您关闭虚拟机时,键盘将重新连接到主机操作系统。


虚拟操作系统是否接收音量控制按键的问题仍未解决。目前,我认为您可能需要一些编码才能使其工作。无论是某人(您可以!)应实现 USB 到 PS/2 代码转换(如果这是问题所在)或 USB 键盘模拟而不是 PS/2。有一个选项可以模拟 USB 指点设备(请参阅),但似乎它并不影响键盘模拟。


更新:

OP的评论:

是否有任何诊断步骤(在非 USB 异常情况下)可以用于确定音量旋钮“按键”的进展程度?换句话说,是否有办法确定“按键”是 A) 未进入 Virtual Box、B) 被丢弃,还是 C) 被错误传递?

碰巧昨天又有人问了关于多媒体键的问题。我研究了一下,现在又知道了一些技巧。我对这个问题的回答可以根据您的需要进行调整,即您可以xinput在虚拟 Linux 中使用它来确定两件事:

  1. 当您使用音量旋钮时会检测到哪些键码,并且它在虚拟机中工作,并且键盘以 USB 直通模式连接到虚拟机(我怀疑122123);
  2. 当键盘正常运行并连接到 Windows 时,使用音量旋钮时在虚拟操作系统中会检测到哪些键码(如果有)。

请注意,在两种情况下您应该使用不同的id-s,因为您分别想要读取 USB 键盘或模拟键盘(可能AT Translated Set 2 keyboard)。

我做过类似的事情。我在普通的 Kubuntu 中运行虚拟 Knoppix。我禁用了全局热键并确保音量控制键可以到达 VLC,因此当其窗口处于活动状态时,它们也应该可以到达 VirtualBox。然而,我在xinput虚拟 Knoppix 中没有得到任何响应,而其他“标准”键却被识别。我认为我这里的情况是 (B)。记录如下:我的 VirtualBox 是4.3.36_Ubuntu r105129

VirtualBox 在 Windows 下可能会以不同的方式工作,但坦率地说,我对此表示怀疑。

如果您在 (2) 中偶然获得了一些键码,则意味着这就是您调用的 (C)。代码不能与 (1) 中的相同,否则首先就不会出现问题。假设您得到了250251(仅作为示例,这些数字是我编造的)。在您的虚拟 Linux 调用中:

xmodmap -e 'keycode 250 = XF86AudioLowerVolume'
xmodmap -e 'keycode 251 = XF86AudioRaiseVolume'

这应该将这些代码映射到适当的操作。

好消息:即使其他所有方法都失败了,您仍然可能能够使用xmodmap将音量控制与适用于 VirtualBox 键盘模拟的键关联起来。如果您很少使用NUM-然后NUM+重新映射它们:

xmodmap -e 'keycode 82 = XF86AudioLowerVolume'
xmodmap -e 'keycode 86 = XF86AudioRaiseVolume'

我尝试用Shiftonly 重新映射它们的组合,但结果并不像我预期的那样简单,至少在我的设置中是这样(我需要了解更多)。无论如何,提示:调用xmodmap -pke | less并从中学习。您的更改xmodmap应该在(虚拟)重启后撤消,所以不要害怕尝试。或者最好为您的虚拟机制作快照以防万一。

毕竟,即使有办法让旋钮按你的意愿工作,重新映射一些键也可能不是个坏主意。如果我是你,我会考虑将旋钮专用于 Windows 音量,将其他东西专用于虚拟 Linux 音量。

相关内容