尝试为我的程序实现按键组合 目前可以检测所需的keypressed(在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);
}
}
但是,有下一个结果 -
所以 - 如你所见 - 这个转换控制键转换为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);
答案 0 :(得分:7)
使用枚举进行密钥比较,因此您需要做的是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);
}
答案 1 :(得分:7)
Keys key;
Enum.TryParse("Enter", out key);
答案 2 :(得分:3)
我建议你不要将配置中的密钥存储为“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
}
答案 3 :(得分:0)
我是按照以下方式进行的。 在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());
}
}
答案 4 :(得分:0)
除了穆罕默德·奥马尔的回答。
对于.NET 3.5版或您可以做之前
Keys key = Enum.Parse(typeof(Keys), "Enter");
小心捕捉异常。