1 c# winapi hyper-v virtual-machine
我将 Windows 10 作为主机运行,并在 Hyper-V 虚拟机内部与另一个 Windows 10 一起运行。我想要做的是编写一个 C# 程序,它将每 1 秒单击一次鼠标按钮,并最终发送一些来自键盘的击键,如“abc”。
到目前为止,我尝试PostMessage使用WM_LBUTTONDOWNUP 和窗口句柄到 hyper-v 窗口mouse_event,但没有任何效果。mouse_event在主机上工作正常,每 1 秒点击一次,但是一旦我将鼠标悬停在虚拟机上,它就不再点击了。
有没有办法模拟主机中的点击和键盘按键并让 VM 对其做出反应?
是的,有一种方法可以通过 Hyper-V 的 WMI 接口(可以通过 PowerShell 访问,它与 C# 有很好的集成)来做到这一点。VirtualPCGuy 有一个很棒的 10 部分博客系列,内容是关于使用 Hyper-V 做这种事情(从 2016 年 3 月 7 日开始)。这是他的代码示例(在 PowerShell 中),用于您询问的具体内容。
$VMName = "Windows 10 Enterprise"
$VMCS = Get-WmiObject -Namespace root\virtualization\v2 -Class Msvm_ComputerSystem -Filter "ElementName='$($VMName)'"
$keyboard = $VMCS.GetRelated("Msvm_Keyboard")
$keyboard.TypeText("Hello!") | out-null
Run Code Online (Sandbox Code Playgroud)
控制鼠标:
$VMName = "Windows 10 Enterprise"
$VMCS = Get-WmiObject -Namespace root\virtualization\v2 -Class Msvm_ComputerSystem -Filter "ElementName='$($VMName)'"
$mouse = $VMCS.GetRelated("Msvm_SyntheticMouse")
$mouse.SetAbsolutePosition(300,450) | out-null
$mouse.ClickButton(2) | out-null
Run Code Online (Sandbox Code Playgroud)
注意:这只在基本模式下有效,在增强模式下无效。如果您对做更高级的东西感兴趣,我强烈建议您阅读整个系列。
免责声明:在 Microsoft 的 Hyper-V 工程团队工作。