我在 Linux 上运行 VirtualBox。 (virtualbox
Ubuntu 14.04 上的 4.3.10 软件包很重要,但我更喜欢与版本无关的解决方案。)我在主机上(在 X11 下)调整了键盘布局,显然这会导致 VirtualBox 误解某些按键。
具体来说,左“Windows”键(LWIN
用于 XKB)配置有 xmodmap 来发送
keycode 133 = Hyper_L
在 VirtualBox 虚拟机中,根本无法识别该密钥。我showkey
在 Linux 控制台上运行来检查,当我按此键时它没有反应。
如何LWIN
在虚拟机中发送正确的键码?触发器可以是这个特定的物理键或Hyper_L
键符号。当然其他应用程序一定不能受到影响; xmodmap 行保留。
我使用 Sawfish 作为我的窗口管理器。 Sawfish 特定的解决方案是可以的,但我不确定它是否有帮助:它允许我定义每个窗口的键绑定,但不能单独定义修饰键。我想运行 Windows VM,因此必须将按键的按下和释放事件单独传递到 VM(按LWIN
→ 将按键事件传递到 VM),而不仅仅是像LWIN
+key 这样的组合。
如果该键是修饰符这一事实使这变得太困难,那么我愿意回退到使CAPS
( Caps Lock) 键(它绑定到Mode_switch
键符 ( AltGr
) 且没有修饰符)在虚拟机中显示为 LWIN。
答案1
您可以尝试编写一个可用于启动 virtualbox 的 bash 脚本,并使其在启动脚本时将 LWIN 配置回默认值,这样中继键盘代码就不会出现问题。然后,如果需要,您可以在虚拟机本身上使用 xmodmap。
如果我的解决方案不起作用,我建议您查看以下两个线程。那里的人也有类似的问题,我想你也许可以使用它。我认为与我的相比,这可能是一个更好的解决方案。祝你好运!
答案2
到目前为止,我一直在做的是在 Sawfish 中或多或少地实现每个窗口的键绑定。我定义了调用xmodmap
焦点变化的钩子。它很容易出现竞争条件,但实际上这并不是问题。我在进入和离开类窗口时切换键码 133 的键符号VirtualBox
(这适用于管理器以及虚拟机,但对我正在做的事情并不重要)。
(define (add-window-class-matcher class-regexp . assignments)
"Declare properties for windows whose class matches CLASS-REGEXP.
The string matched against is the X class followed by a slash
followed by the X instance, e.g., \"XTerm/xterm\"."
(apply add-window-matcher 'WM_CLASS class-regexp assignments))
(define (per-window-keymap-hook window index)
(let ((xmodmap-expressions-property (window-get window 'xmodmap-expressions)))
(if (symbolp xmodmap-expressions-property)
(setq xmodmap-expressions-property
(symbol-value xmodmap-expressions-property)))
(when xmodmap-expressions-property
(let ((expressions (nth index xmodmap-expressions-property))
(args ()))
(when expressions
(while expressions
(setq args (cons (car expressions) (cons "-e" args))
expressions (cdr expressions)))
(apply call-process nil nil "xmodmap" (nreverse args)))))))
(define (per-window-keymap-in-hook window focus-mode)
(per-window-keymap-hook window 0))
(define (per-window-keymap-out-hook window focus-mode)
(per-window-keymap-hook window 1))
(add-hook 'focus-in-hook per-window-keymap-in-hook)
(add-hook 'focus-out-hook per-window-keymap-out-hook)
(define virtualbox-xmodmap-expressions
'(("keycode 133 = Super_L")
("keycode 133 = Hyper_L")))
(add-window-class-matcher "^VirtualBox/"
`(xmodmap-expressions . virtualbox-xmodmap-expressions))
有一天我可能会将键盘配置切换到 XKB 并运行知识库。
答案3
VirtualBox 将键码传递给虚拟机,而不是这些键的解释含义。您的键码映射处于更高的级别,告诉您的主机 X 服务器将每个键码解释为含义。
也就是说,Virtualbox 确实(或者确实如此?)使用各种启发式方法来尝试识别您正在使用的键盘,并进行某种映射。根据提交的票证,我想说这是一个混乱的过程,并且通常涉及 virtualbox 人员需要确切地了解所涉及的键盘是什么样的。
这可能会让您朝着正确的方向前进: https://forums.virtualbox.org/viewtopic.php?f=7&t=57120。看起来有人遇到了类似的问题并且能够解决它。看起来他们正在来宾中进行 xmodmap 映射,这与 Windows 不同,但看起来他们确实能够使以前不活动的键起作用,因此它表明您想要的东西是可能的,并说明了一些关于您的信息在Linux虚拟机中测试的方法。