【问题标题】:How to convert string to Keys如何将字符串转换为键
【发布时间】:2013-10-05 08:19:33
【问题描述】:

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

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

存储在配置文件中:

<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" />

并使用它

    private void textBox1_KeyDown(object sender, KeyEventArgs e)
    {
        TypeConverter converter = TypeDescriptor.GetConverter(typeof(Keys));
        string[] keyValueTemp;

        keyValueTemp = cm.GetValueString("open").ToString().Split(',');
        string key1 = keyValueTemp[0];
        string key2 = keyValueTemp[1];

        Keys keys1 = (Keys)converter.ConvertFromString(key1);
        Keys keys2 = (Keys)converter.ConvertFromString(key2);

        if (ModifierKeys == keys1 && e.KeyCode == keys2)
        {
            string keyPressed = e.KeyCode.ToString();
            MessageBox.Show(keyPressed);
        }
    }

但是,有下一个结果-

所以 - 如你所见 - 将控制键转换为 Shift 键,也尝试使用代码 if (ModifierKeys.ToString() == keyValueTemp[0] &amp;&amp; e.KeyCode.ToString() == keyValueTemp[1]),但它也不起作用。

如果使用此代码

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

所有作品

问:如何将字符串转换为 Keys 并将其与 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);

【问题讨论】:

标签: c# .net winforms key typeconverter


【解决方案1】:
Keys key;
Enum.TryParse("Enter", out key);

【讨论】:

    【解决方案2】:

    关键比较是通过枚举完成的,所以你要做的是String to Enum转换。

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

    【讨论】:

    • 是的 - 它工作完美,谢谢,还找到了另一个解决方案 - 见编辑
    • @Kirill 很高兴它有帮助:)
    【解决方案3】:

    我建议你不要将配置中的键存储为“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());
    

    这里将打开Keys.ControlKey | Keys.N

    然后您可以轻松地与e.KeyData进行比较

    if(e.KeyData == open)
    {
        //Control + N pressed
    }
    

    【讨论】:

    • 但是如果我将密钥存储在像ControlKey,N 这样的字符串中会有什么问题?
    • 你不认为你正在做额外的工作,用逗号将其分成两个条目,将其解析为两个 Keys 并检查 modifierKeyCode。存储值并与e.KeyData进行比较不是更好吗?
    【解决方案4】:

    我正在按照以下方式进行操作。 在 app.config 文件中,我有以下内容

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

    【讨论】:

      【解决方案5】:

      除了 Muhammad Umar 的答案。

      对于 .NET 3.5 版或之前的版本

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

      小心捕捉异常。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-09-28
        • 2011-04-12
        • 1970-01-01
        • 2020-02-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-03
        相关资源
        最近更新 更多