2013-08-04 56 views
1

我已经通过windows WMI实现了一个远程hyper-v管理类,但是对于ENTER键,keycode是什么。
该方法是“PressKey”,类是Hyper-V WMI类中的Msvm_Keyboard类。
示例代码是PressKey method of the Msvm_Keyboard class
上面示例中的ENTER键的第二个参数是什么?
根据Virtual-Key Codes table它必须是“0”或“0x0D”,但它们都不被这个样本接受!什么是ENTER键的虚拟键码?

示例代码:

class PressKeyClass 
{ 
    static ManagementObject GetComputerKeyboard(ManagementObject vm) 
    { 
     ManagementObjectCollection keyboardCollection = vm.GetRelated 
     (
      "Msvm_Keyboard", 
      "Msvm_SystemDevice", 
      null, 
      null, 
      "PartComponent", 
      "GroupComponent", 
      false, 
      null 
     ); 

     ManagementObject keyboard = null; 

     foreach (ManagementObject instance in keyboardCollection) 
     { 
      keyboard = instance; 
      break; 
     } 

     return keyboard; 
    } 

    static void PressKey(string vmName, int keyCode) 
    { 
     ManagementScope scope = new ManagementScope(@"root\virtualization", null); 
     ManagementObject vm = Utility.GetTargetComputer(vmName, scope); 
     ManagementObject keyboard = GetComputerKeyboard(vm); 

     ManagementBaseObject inParams = keyboard.GetMethodParameters("PressKey"); 

     inParams["keyCode"] = keyCode; 

     ManagementBaseObject outParams = keyboard.InvokeMethod("PressKey", inParams, null); 

     if ((UInt16)outParams["ReturnValue"] == ReturnCode.Completed) 
     { 
      string.Format("Key {0} was pressed on {1}", keyCode, vm["ElementName"]); 
     } 
     else 
     { 
      string.Format("Unable to press key {0}' on {1}", keyCode, vm["ElementName"]); 
     } 

     inParams.Dispose(); 
     outParams.Dispose(); 
     keyboard.Dispose(); 
     vm.Dispose(); 
    } 

    static void Main(string[] args) 
    { 
     if (args != null && args.Length != 2) 
     { 
      Console.WriteLine("Usage: PressKey vmName keyCode"); 
      return; 
     } 
     string vmName = args[0]; 
     int keyCode = int.Parse(args[1]); 
     PressKey(args[0], keyCode); 
    } 

} 
+0

你是什么意思“不可接受的样本”?你是否遇到编译器错误或运行时问题? –

+0

只需将常量'VK_RETURN'放在那里,并告诉我们什么不起作用。 –

回答

0

我已经发现这个问题。代码“0x0D”对于输入密钥是正确的,但是Microsoft示例代码中存在错误。 PressKey method of the Msvm_Keyboard class
在第40行:

if ((UInt16)outParams["ReturnValue"] == ReturnCode.Completed) 

上面铸是不正确的话,我认为虚拟键码不正确。