2013-09-29 3 views
3

попытаться реализовать комбинацию нажатия клавиш для моей программы в настоящее время может обнаружить требуемую клавиатуру (в описании 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); 
     } 
    } 

Но, имеет следующий результат -

enter image description here Итак - как вы видите - это преобразование ключа управления в 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); 
     } 

все работы

Q: Как я могу преобразовать строку в Кис и сравнить его с Keypressed событий?

EDIT

Так нашел мою ошибку

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); 
+1

Проверьте этот ответ, возможно, было бы полезно. http://stackoverflow.com/questions/12449484/convert-string-to-corresponding-forms-keys-value –

ответ

7

Key Comparision 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

yep - это отлично работает, спасибо, также нашли другое решение - см. EDIT – 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

Вам не кажется, что вы делаете дополнительную работу, разделив ее на запятую на две записи, разобрав ее на два «ключа» и проверив «модификатор» и «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

Кроме того Мухаммад Умар ответа ,

Для версии 3.5 .NET или прежде чем вы можете сделать

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

Будьте осторожны, чтобы перехватывать исключения.

Смежные вопросы