将鼠标/键盘事件模拟到Hyper-V虚拟机

时间:2017-06-26 14:26:02

标签: c# winapi virtual-machine hyper-v

我正在运行Windows 10作为主机,而在运行另一台Windows 10的Hyper-V虚拟机内部。我正在尝试做的是编写一个C#程序,它会每1秒点击一次鼠标按钮,并且最终从键盘发出一些按键,比如'abc'。

到目前为止,我尝试.Where() .Add()和UP与窗口句柄到超v窗口PostMessage,但没有任何效果。 WM_LBUTTONDOWN在主机上工作正常,每1秒点击一次,但是一旦我将鼠标悬停在虚拟机上,它就不会再点击了。

有没有办法在主机上模拟点击和键盘键并让VM对它做出反应?

1 个答案:

答案 0 :(得分:4)

是的,有一种方法可以通过Hyper-V的WMI接口(可以通过PowerShell访问,它与C#很好地集成)来实现。 VirtualPCGuy有一个很棒的10部分博客系列关于使用Hyper-V做这种事情(从2016年3月7日开始)。以下是他要求的具体事项的代码示例(在PowerShell中)。

Typing a String

$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

Controlling the Mouse

$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工程团队工作。