2013-09-29 116 views
3

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

现在可以存储,读为字符串 - 目前尝试readed字符串转换为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); 
     } 
    } 

但是,有下一个结果 -

所以 - 正如你所看到的 - 这将控制键转换为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); 
     } 

所有作品

问:我怎样才能将字符串转换为按键,并将其与事件的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 - 从事件处理程序

另一种方式 - 书面通过存取遭拒

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

检查这个答案可能会有帮助。 http://stackoverflow.com/questions/12449484/convert-string-to-corresponding-forms-keys-value –

回答

7

重点对比是d一个枚举,所以你必须做的是一个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); 
} 
+0

是的 - 它的工作完美,谢谢,还发现了另一种解决方案 - 请参阅编辑 – gbk

+0

@Kirill很高兴它帮助:) – Kurubaran

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

我会建议你不要将密钥存储在配置为“CONTROLKEY,N”,而其存储价值。

Keys openKey = Keys.ControlKey | Keys.N; 
int value = (int)openKey;//95 

它整数表示95,所以在app.config中存储为

这里开放将是Keys.ControlKey | Keys.N

然后你就可以轻松地对e.KeyData

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

但是如果我把我的密钥存储为像ControlKey,N这样的字符串会出现什么问题? – gbk

+1

你不觉得你正在做额外的工作吗?把它用逗号分成两个条目,解析成两个'Keys'并用'modifier'和'KeyCode'检查。存储值并与'e.KeyData'进行比较不是更好吗? –

0

比较我按照以下方式进行。 在应用程序中。配置文件我有以下

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

此外穆罕默德·奥马尔的回答来检测。

对于.NET 3.5版本或之前,你可以做

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

要当心捕获异常。