Search code examples
c#.netwinformskeytypeconverter

How to convert string to Keys


Trying to implement a combination of key pressing for my program currently can detect the required key pressed (in this post described how) but only predefined in code, but I want to store the setting in a config file then read it and use it if pressed.

Now can store it, and read as string - currently try to convert read string to Keys, using the following code:

Storing in config file:

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

and using it

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

But, has next result -

enter image description here So - as you see - this converts ControlKey to Shiftkey, also try to use code if (ModifierKeys.ToString() == keyValueTemp[0] && e.KeyCode.ToString() == keyValueTemp[1]), but it's not work too.

if I use this code

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

all works

Q: how can I convert string to Keys and compare it with keyPressed events?

EDIT

So found my mistake

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

forget to add e - from the event handler

another way - as written by AccessDenied

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

Solution

  • Key comparision is done with enumerations, So what you have to do is a String to Enum conversion.

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