将String转换为相应的Forms.Keys值?

Zia*_*iki 5 .net c# string winforms

我正在寻找一种方法将a的值转换string为等效System.Windows.Forms.Keys项.然后,此值将用于PressKey模拟相应的Key.我试过用KeyConverter这样的:

    [DllImport("user32.dll", SetLastError = true)]
    static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, UIntPtr dwExtraInfo);

    public static void PressKey(System.Windows.Forms.Keys key, bool up)
        {
            const int KEYEVENTF_EXTENDEDKEY = 0x1;
            const int KEYEVENTF_KEYUP = 0x2;
            if (up)
            {
                keybd_event((byte)key, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, (UIntPtr)0);
            }
            else
            {
                keybd_event((byte)key, 0x45, KEYEVENTF_EXTENDEDKEY, (UIntPtr)0);
            }
        }

    KeyConverter kc = new KeyConverter();
    PressKey((System.Windows.Forms.Keys)kc.ConvertFromString(string), false);
Run Code Online (Sandbox Code Playgroud)

我需要的是string喜欢"Enter"被转换为System.Windows.Forms.Keys.Enter.但是KeyConverter没有返回任何东西.有什么想法吗?

nne*_*neo 6

使用Enum.Parse字符串转换成相应的枚举值:

public static Keys ConvertFromString(string keystr) {
    return (Keys)Enum.Parse(typeof(Keys), keystr);
}
Run Code Online (Sandbox Code Playgroud)

请注意,如果键字符串不在枚举中,Enum.Parse则抛出一个ArgumentException.如果您不想这样,请使用Enum.TryParse,返回一个bool,指示转换是否成功.


Ada*_*dam 5

System.Windows.Forms.Keys是一个枚举,所以你可以使用 Enum.TryParse

Keys key;
Enum.TryParse("Enter", out key);
Run Code Online (Sandbox Code Playgroud)

它是在 .NET 框架 4.0 中引入的,它比Enum.Parse自动推断类型参数更具可读性。

您可以检查布尔返回值以查看转换是否成功,无需为未定义的枚举值捕获异常。