C# 如何将字符串转换为键

C# 如何将字符串转换为键,c#,.net,winforms,key,typeconverter,C#,.net,Winforms,Key,Typeconverter,尝试为我的程序实现按键组合 目前可以检测所需的按键(在如何描述中),但只在代码中预定义,但我想在condig文件中存储设置,然后读取它并在按下时使用 现在可以将其存储并读取为字符串-当前尝试使用下一个代码将读取的字符串转换为键: 存储在配置文件中: <add key="open" value="ControlKey,N" <add key="close" value="ControlKey,Q" /> <add key="clear" value="ControlKey,

尝试为我的程序实现按键组合 目前可以检测所需的按键(在如何描述中),但只在代码中预定义,但我想在condig文件中存储设置,然后读取它并在按下时使用

现在可以将其存储并读取为字符串-当前尝试使用下一个代码将读取的字符串转换为

存储在配置文件中:

<add key="open" value="ControlKey,N"
<add key="close" value="ControlKey,Q" />
<add key="clear" value="ControlKey,D" />
<add key="settings" value="ControlKey,S" />
<add key="colorKey" value="ControlKey,K" />
<add key="fontKey" value="ShiftKey,T" />
<add key="defaultKey" value="ControlKey,P" />
但是,还有下一个结果-

因此,正如您所看到的,这个将控制键转换为Shiftkey的方法,也尝试使用code
if(ModifierKeys.ToString()==keyValueTemp[0]&&e.KeyCode.ToString()==keyValueTemp[1])
,但它不起作用

如果使用此代码

        if (e.Modifiers == Keys.Control && e.KeyCode == Keys.N)
        {
            string keyPressed = e.KeyCode.ToString();
            MessageBox.Show(keyPressed);
        }
所有作品

问:如何将字符串转换为键,并将其与按键事件进行比较

编辑

所以我发现了我的错误

Keys key = (Keys)converter.ConvertFromString(keyValueTemp[0]);
Keys key2 = (Keys)converter.ConvertFromString(keyValueTemp[1]);
if (e.Modifiers == key && e.KeyCode == key2)
   {
       MessageBox.Show(e.KeyCode.ToString());
   }
忘记从事件处理程序添加
e

另一种方式-如AccessDenied所述

 Keys key = (Keys)Enum.Parse(typeof(Keys), keyValueTemp[0], true);

键比较是通过枚举完成的,因此您需要做的是
字符串到枚举的转换

if (e.Modifiers == (Keys)Enum.Parse(typeof(Keys), "keys1", true)
    && e.KeyCode == (Keys)Enum.Parse(typeof(Keys), "keys2", true))
{
    string keyPressed = e.KeyCode.ToString();
    MessageBox.Show(keyPressed);
}

我建议您不要将配置中的键存储为“ControlKey,N”,而是存储其值

 Keys openKey = Keys.ControlKey | Keys.N;
 int value = (int)openKey;//95
它的整数表示形式是
95
,因此在app.config中存储为

<add key="open" value="95">//ControlKey|N

Keys open = (Keys)int.Parse(cm.GetValueString("open").ToString());

我是这样做的。 在app.config文件中,我有以下内容

<add key="KeyboardShortcut" value="Control+M" />
并检测是否按下了该键

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
    try
    {           
        if (this.ShortCutKeys != Keys.None && (keyData & this.ShortCutKey) == this.ShortCutKey)
        {
            this.Execute_Plugin();
        }
    }
    catch(Exception ex)
    {
        log.Error(ex.ToString());
    }
}

除了穆罕默德·乌马尔的回答

对于.NET的3.5版或之前,您可以

Keys key = Enum.Parse(typeof(Keys), "Enter");

注意捕捉异常。

检查此答案可能会有所帮助。是的-这是完美的工作,谢谢,还找到了另一个解决方案-参见EDIT@Kirill很高兴它起到了作用:)但是如果我将我的密钥存储在字符串中,比如
ControlKey,N
,会有什么问题呢?你不认为用逗号将它拆分为两个条目是在做额外的工作吗,将其解析为两个
,并使用
修饰符
进行检查。存储值并与
e.KeyData
<add key="KeyboardShortcut" value="Control+M" />
public System.Windows.Forms.Keys ShortCutKeys
{
    get
    {
        string keyboardShortcut = ConfigurationManager.AppSettings["KeyboardShortcut"];
        System.Windows.Forms.Keys retval = System.Windows.Forms.Keys.None;

        if (!string.IsNullOrEmpty(keyboardShortcut))
        {
            try
            {
                 System.Windows.Forms.KeysConverter kc = new System.Windows.Forms.KeysConverter();
                 retval = (System.Windows.Forms.Keys)kc.ConvertFromInvariantString(keyboardShortcut);
            }
            catch (Exception ex)
            {
                log.Info(ex.ToString());           
            }
       }
       return retval;
    }
}
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
    try
    {           
        if (this.ShortCutKeys != Keys.None && (keyData & this.ShortCutKey) == this.ShortCutKey)
        {
            this.Execute_Plugin();
        }
    }
    catch(Exception ex)
    {
        log.Error(ex.ToString());
    }
}
Keys key = Enum.Parse(typeof(Keys), "Enter");