这是一个简单的修复,当你释放键,KeyUp事件没有收到本身释放的键的任何信息,所以只是属性设置为true:
private void Form1_KeyUp(object sender, KeyEventArgs e)
{
_clear = true;
}
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
if (e.Modifiers == Keys.Control)
{
_clear = false;
}
}
如果你想看到它的实时工作,一个标签添加到您的形式和“_clear”变量的每个设置下补充一点:
label1.Text = _clear.ToString();
根据您的意见,更改第二个代码块:
if (e.KeyData.ToString() == "ControlKey, Control")
{
_clear = false;
}
else if(other shortcut conditionals go here or on other else if's)
{
_clear = true;
}
此条件将保持为真的唯一时间是控制自行保存的时间。其他情况是为了将ccle设置为true,当您按ctrl后再按另一个键时,由于事实上只要按下控件,它就会触发KeyDown事件。
基于这种改变,只要你照顾if语句之后的按键(例如if()),你就不需要在KeyUp事件中设置任何东西。
请参阅my answer here to the intricacies of keys and their properties如果您想要更深入的信息。
编辑#3:
只要你设置_clear为true在每个条件的第一行,你应该能够避免你正面临着在您的评论的问题:
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyData.ToString() == "ControlKey, Control")
{
_clear = false;
}
else if(e.KeyData.ToString() == "O, Control")
{
_clear = true;
//Do other stuff here, such as opening a file dialog
}
}
谢谢,我也试过这个,但是有问题。我有其他的快捷方式,例如CTRL + A和那种类型的stuf。如果我为另一个目的按下CTRL + A(这是菜单项的快捷方式),这将不是一个可靠的解决方案。有没有办法解决? –
修复,检查答案的底部。 – KreepN
嗨,我也试过这种方式。不幸的问题依然存在。发生这种情况时,按下例如'CTRL + O'打开FileOpenDialog,即使对话框关闭,_clear也将保持为false,因此我必须再次按下CTRL。是否有可能避免这种行为? –