首先,让我先说一下,我通常建议不要Shift单独使用密钥来触发任何桌面软件中的动作,而不是游戏。这样做违反了最小惊讶原则:由于Shift在正常打字过程中经常使用它来修改其他键的含义,因此用户习惯于期望按下它本身不会产生任何后果,当然也不会造成任何破坏。因此,如果用户不经意地按下Shift并发现他刚刚丢失了他的项目列表,他可能会感到非常不愉快,特别是如果要恢复损坏是困难或乏味的。
但是,您在评论中说您在这件事上别无选择,所以说,这是一个可能的解决方案。
为了能够区分单独Shift和Shift+Del组合之间的区别,我们需要捕获和KeyDown
事件并KeyUp
使用从每个事件中收集的信息。
在这种情况KeyDown
下,我们将 的值保存KeyEventArgs.KeyData
到一个私有字段,但尚未对其采取任何操作。 KeyData
包含Keys
表示被按下的主键的组合标志,以及任何修改键,如Ctrl,Shift或Alt同时被按住。注意当Shift被单独按下时,它既是主键又是修饰符,所以KeyData
会包含Keys.ShiftKey
(键)和Keys.Shift
(修饰符)的组合。
private Keys LastKeysDown;
private void MainForm_KeyDown(object sender, KeyEventArgs e)
{
LastKeysDown = e.KeyData;
}
在这种情况KeyUp
下,我们会查看相对于上次按下的键释放了哪些键。我们正在寻找两个特定的键序列:
- Shift+Del被按下,然后在仍被按住Del时被释放。Shift
- Shift在没有其他键的情况下按下,然后释放。
如果我们找到了我们正在寻找的东西,我们就会启动适当的操作,否则我们什么也不做。
private void MainForm_KeyUp(object sender, KeyEventArgs e)
{
// Shift + Delete pressed, then Delete released while Shift still held down
if (LastKeysDown == (Keys.Shift | Keys.Delete) && e.KeyData == LastKeysDown)
textBox1.Clear();
// Shift pressed with no other key, then released
else if (LastKeysDown == (Keys.Shift | Keys.ShiftKey) && e.KeyData == Keys.ShiftKey)
listBox1.Items.Clear();
LastKeysDown = Keys.None;
}
请注意,作为最后的任务,我们清除私有LastKeysDown
字段。这有助于确保如果我们KeyUp
连续获得两个事件,则只有第一个与前一个配对KeyDown
。但请注意,这并非万无一失:如果您按住按键的时间足够长,计算机的按键重复将启动并产生额外的KeyDown
事件。