VirtualBox

欢迎通过 vbox-dev 邮件列表<1>对本页提供反馈和改进建议!

  1. https://virtualbox.ac.cn/mailman/listinfo/vbox-dev

调查 VirtualBox 中的鼠标输入问题

本页面快速概述了 VirtualBox 中鼠标输入到虚拟机的工作方式,并介绍了一些方法,以便更深入地了解发生的情况,从而在出现问题时进行排查。欢迎随时提出改进建议!

鼠标输入如何到达客户机系统

为了让用户能够通过主机输入设备控制客户机系统,VirtualBox 在虚拟机内部模拟输入设备。最简单的情况是当主机指针被捕获时,VirtualBox 仅模拟一个标准(PS/2 或 USB)鼠标。在这种情况下,当用户将主机指针向左移动时,VirtualBox 会在模拟鼠标上模拟向左移动;当用户点击右键时,会在客户机鼠标上模拟一次右键点击。

当启用鼠标集成时,情况会稍微复杂一些。VirtualBox 模拟了一个图形输入板(类似于触摸屏),它可以发送精确的位置信息,而不仅仅是“左”、“右”、“上”、“下”。不幸的是,这些位置不是屏幕上的像素,而是百分比——例如,沿 X 轴从左到右边缘的 56%,以及沿 Y 轴从上到下边缘的 73%。为了使其正常工作,客户机和主机必须就输入板上的哪些位置对应于客户机屏幕上的哪些位置达成一致——例如,虚拟屏幕一可能沿 X 轴从 0 到 50%,沿 Y 轴从 0 到 100%;而虚拟屏幕二可能沿 X 轴从 50 到 100%,沿 Y 轴也从 0 到 100%。这对应于屏幕二位于屏幕一的右侧,屏幕一的右边缘与屏幕二的左边缘精确匹配。如果主机和客户机就此布局达成一致,则鼠标集成才能正常工作。否则,客户机中的点击位置将无法与指针位置正确匹配。

更复杂的是,出于历史原因(即当时看起来是个好主意),Guest Additions 输入设备发送的是位置信息,而不是按钮信息。因此,它需要与另一个能够发送按钮信息的设备结合使用(这实际上在物理笔记本电脑上也可能发生,例如有多个触摸板和触摸点设备以及各种按钮组的情况),并且两者可能会出现轻微不同步,导致奇怪的效果。一旦没有更重要的修复事项,这将很快得到解决,但这在很长一段时间内不太可能发生。当使用模拟的 USB 图形输入板设备时,这种情况不会发生,因为该设备也具有按钮,但该设备并不总是能很好地映射到多个客户机屏幕。

鼠标输入的一般流程

与 VirtualBox 中的许多事物一样,鼠标输入遵循一个链条,它从“前端”开始——通常是显示虚拟机的 VirtualBox 应用程序窗口,或内置的远程桌面服务器——然后通过使用原生或 VirtualBox 客户机驱动程序的虚拟设备,一直传送到客户机操作系统。如果出现问题,尽可能多地获取关于链条中每个环节发生情况的信息是找出问题的好方法。

前端

每个前端都有自己获取鼠标输入的方式。远程桌面服务器从查看器应用程序(rdesktop、Microsoft 远程桌面连接客户端)接收鼠标事件,因此查找问题的第一步是确保这些应用程序发送了正确的输入。如何做到这一点超出了我们的范围,但如果通过远程桌面连接可以观察到问题,而直接访问机器则没有,那么这值得跟进。

标准的 VirtualBox 应用程序窗口从操作系统获取鼠标输入。当 VirtualBox 使用 X11 窗口系统(Linux、Solaris、FreeBSD)时,您可以使用“xev”命令行工具(“xev -id <窗口 ID>”)来更深入地查看该输入,您可以通过运行“xwininfo -tree”,点击窗口并在列表中尝试大小合适的窗口来找到 <窗口 ID>。欢迎提供在 Windows 和 OS X 上做类似事情的建议!(这是由一位 Linux 开发者编写的。)

“Main”

“Main”相当于 VirtualBox 应用程序内部的电话交换机,所有不同的组件都相互连接。前端以自己的方式获取鼠标输入,并以标准格式将其传递给 Main。Main 将信息传递给虚拟机内部的虚拟设备(见下文)。您可以通过设置环境变量“VBOX_RELEASE_LOG=+main.e.l3”来运行 VirtualBox,从而查看流经 Main 的信息。这将把鼠标事件信息(请注意,Main 是一个非常繁忙的组件,因此还可能包含许多其他信息)添加到虚拟机日志文件中。

虚拟设备

当客户机操作系统在 VirtualBox 虚拟机中运行时,它会看到自己运行在一台具有多种设备的机器上。这通常会包括(模拟的)输入设备,我们感兴趣的是模拟的 PS/2 鼠标、模拟的 USB 鼠标和图形输入板以及 Guest Additions 指针设备。当您启用指针事件日志时,设置环境变量 RT_RELEASE_LOG_FLAGS=time 以打印所有事件的时间会很有用。这有助于您匹配客户机和主机中的信息。

  • 这些设备中的第一个是将鼠标输入到客户机系统最基本的方法,它模拟传统的非 USB 鼠标。它可以提供关于鼠标向左、向右、向上和向下移动的信息(没有精确位置),以及最多五个鼠标按钮和水平与垂直滚轮滚动信息。客户机操作系统具有与此设备兼容的标准驱动程序。要查看 Main 向此设备发送了哪些信息,请在设置环境变量“VBOX_RELEASE_LOG=+dev_kbd.e.l3.f”的情况下运行 VirtualBox,并查看虚拟机的日志文件。
  • 第二个设备是虚拟 USB 鼠标。它可以提供 PS/2 鼠标能够提供的所有信息,此外,如果客户机操作系统理解此信息,它还可以提供鼠标指针的精确位置。如果客户机使用此信息,那么客户机窗口中鼠标指针的位置应始终与主机指针的位置匹配。如果客户机错误理解此信息,则两个位置之间很可能存在系统性差异。目前,无法获得像 PS/2 鼠标那样多的关于流经此设备的信息。
  • 第三个值得关注的设备是 VirtualBox 的“客户机”设备,它提供了多项服务,用于将虚拟机中的应用程序与运行 VirtualBox 的主机桌面的服务进行集成。我们关注其“鼠标集成”功能,该功能将主机鼠标指针的位置发送到客户机。客户机操作系统需要一个特殊的客户机设备驱动程序(通常随 VirtualBox 提供)来获取此信息。客户机设备不提供鼠标点击信息——此信息仍发送给其他设备之一。您可以通过设置环境变量“VBOX_RELEASE_LOG=+dev_vmm.e.l2.l3.f”来查看流经此设备的信息,其中包括客户机对鼠标指针信息的请求。

客户机操作系统

此外,使用客户机操作系统中可用的任何工具来找出它们在链条末端看到的鼠标信息也很有用。在运行 X Window 系统(Linux、Solaris、FreeBSD)的客户机中,“xev”命令行工具对此很有用,文件“/var/log/Xorg.0.log”及其变体也提供了有用的信息。在许多系统中,您还可以通过“xinput”命令行工具获取信息。在许多 Linux 系统上,“evtest”命令行工具也很有用。示例

  • 如果 Linux 客户机有点击事件,请使用键盘启动 xev,查看它是否报告了鼠标移动事件,如果报告了,再看是否报告了点击事件。
  • 如果 Linux 客户机中的指针位置不正确,请比较 xev 报告的内容和主机日志文件的内容。移动指针,然后将其停留在某个位置一段时间,以便轻松匹配两组日志(两者都将显示一段没有事件的时间)。

欢迎提供针对 Windows 客户机的建议!

最后修改 8 年前 最后修改于 2017/12/14 07:05:51 AM
注意: 查看 TracWiki 获取使用维基的帮助。

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