winforms 如何将字符串转换为键

d8tt03nd  于 2023-05-18  发布在  其他
关注(0)|答案(5)|浏览(151)

尝试为我的程序实现按键组合,目前可以检测所需的按键按下(在这篇文章中描述了如何),但仅在代码中预定义,但我想将设置存储在配置文件中,然后读取并使用它,如果按下。
现在可以存储它,并读取为字符串-目前尝试将读取字符串转换为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);
        }
    }

但是,下一个结果-
x1c 0d1x所以-如你所见-这将ControlKey转换为Shiftkey,也尝试使用代码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并将其与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);
3zwjbxry

3zwjbxry1#

Keys key;
Enum.TryParse("Enter", out key);
ie3xauqp

ie3xauqp2#

键比较是用枚举完成的,所以你要做的是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);
}
eufgjt7s

eufgjt7s3#

我建议你不要在config中存储键为“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
}
cdmah0mi

cdmah0mi4#

我是这样做的。在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());
    }
}
laik7k3q

laik7k3q5#

穆罕默德·奥马尔的回答。
对于.NET版本3.5或之前可以做的

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

小心捕捉异常。

相关问题