2013-09-29 120 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"); 

要當心捕獲異常。