【问题标题】:What is virtual-key code for the ENTER Key?ENTER 键的虚拟键代码是什么?
【发布时间】:2013-08-04 07:13:59
【问题描述】:

我已经通过 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”,但本示例不接受这两个值!

示例代码:

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);
    }

}

【问题讨论】:

  • 您所说的“此样本不可接受”是什么意思?您遇到编译器错误还是运行时问题?
  • 只需将常量VK_RETURN 放在那里,然后告诉我们究竟是什么不起作用。

标签: c# wmi virtual keycode hyper-v


【解决方案1】:

我发现了问题。代码“0x0D”对于回车键是正确的,但 Microsoft 示例代码中存在错误。 PressKey method of the Msvm_Keyboard class
第 40 行:

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

上面的演员表不正确,然后我认为虚拟键码不正确。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-03
    • 1970-01-01
    • 2016-11-01
    相关资源
    最近更新 更多