我在Windows 7 x64上使用最新版本的VMware Workstation(11.1.0),我希望能够按“Ctrl + 1”键进入VM#1,“Ctrl + 2”转到VM#2,然后按“Ctrl + 3”转到VM#3。
听起来很简单吧?事实并非如此。
在Mac OS X上,使用VMware Fusion结合Spaces / Mission Control实现此功能是微不足道的 - 您可以简单地将每个VM放在一个单独的空间中,然后定义您想要的任何空间热键。我正在从OS X迁移并希望获得相同的功能。
作为参考,以下是我尝试过的一些可能的解决方案,可以验证它们不起作用:
1)AutoHotkey
AutoHotkey可用于制作如下热键:
^1::WinActivate, Win7(1) - VMware Workstation
^2::WinActivate, Win7(2) - VMware Workstation
^3::WinActivate, Win7(3) - VMware Workstation
这些工作输入 VM,但不退出; Workstation将“Ctrl + 1”提供给VM,AutoHotkey不会优先,即使AutoHotkey是以管理员身份运行。
2)使用AutoHotkey暂停/取消暂停
这篇有前途的帖子表明,在VMware窗口处于活动状态时暂停和取消暂停AutoHotkey将解决问题:
https://superuser.com/questions/232762/autohotkey-script-to-exit-vmware-window
然而,即使在复制了确切的代码并进行必要的字符串修改之后,我也无法使用Workstation。
3)远程桌面和/或VNC
一种可能的解决方案,如果所有3个虚拟机都在运行Windows,那就是使用微软的远程桌面功能。但是,我打算使用的一个或多个VM将运行Linux。
在Linux上,可以只使用VNC。但是,与原生VMware Workstation控制台窗口相比,VNC存在相当大的缺点:没有声音,分辨率不会自动缩放,性能会很差等等。
最后,虚拟机将位于1)网络上,这些网络不会通过桥接NIC(主机上禁用NIC)连接到主机,2)使用没有任何拆分隧道的VPN。因此,首先不会有远程桌面或VNC的连接。
3)Windows键盘挂钩
Liuk解释了如何使用Windows钩子拦截使用C ++的击键:
http://polytimenerd.blogspot.com/2011/02/intercepting-keystrokes-in-any.html
但是,在使用演示程序进行测试后,似乎此方法不会拦截发送到VMware Workstation的击键。
4)FullScreenSwitch.directKey
似乎在VMware Workstation中曾经内置过这种功能,如此SuperUser线程中所述:
https://superuser.com/questions/71901/vmware-workstation-keyboard-shortcut
但是,VMware的文档指出这适用于VMware Workstation 5.0。我尝试将这些字符串添加到我的VMX文件中并且它们没有任何效果,因此功能必须在Workstation 5和11之间的某个位置折旧。
5)PSExec
Wade Hatler提到他使用PSExec在主机上激活相应的AutoHotkey脚本来完成此任务:
http://www.autohotkey.com/board/topic/64359-sending-keystrokes-to-vmware-player/
这个解决方案值得怀疑,您必须将主机的密码保留为纯文本才能将其传递给PSExec。
无论如何,此解决方案不会出于上述#2中所述的原因:所讨论的虚拟机将位于1)未通过桥接NIC连接到主机的网络(在网络上禁用了NIC)主机)和2)使用没有任何分离隧道的VPN。因此,主机和来宾之间无法保证连接。
6)在每次“Ctrl +#”击键之间执行“主持人”击键
这是有问题的,因为它会使所涉及的击键次数加倍,并且无法通过按住控制并按下1 + 2 + 3 + 4 + 5来“翻转”我的所有VM,依此类推。
7)使用“主机+左/右箭头”热键和/或VMware-KVM.exe进行循环功能
这是有问题的,因为当我一次打开10个或更多虚拟机时,旋转所有虚拟机会变得非常麻烦和低效。