我正在运行Windows 10作为主机,而在运行另一台Windows 10的Hyper-V虚拟机内部。我正在尝试做的是编写一个C#程序,它会每1秒点击一次鼠标按钮,并且最终从键盘发出一些按键,比如'abc'。
到目前为止,我尝试.Where()
.Add()
和UP与窗口句柄到超v窗口PostMessage
,但没有任何效果。 WM_LBUTTONDOWN
在主机上工作正常,每1秒点击一次,但是一旦我将鼠标悬停在虚拟机上,它就不会再点击了。
有没有办法在主机上模拟点击和键盘键并让VM对它做出反应?
答案 0 :(得分:4)
是的,有一种方法可以通过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
$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
注意:这只能在基本模式下工作,而不能在增强模式下工作。如果你对做更高级的东西感兴趣,我强烈建议你阅读整个系列。
免责声明:在Microsoft的Hyper-V工程团队工作。