我是新来的StackOverflow,我希望能正确地写一个问题。
我想在我的winform应用程序中实现键盘快捷键。
查看微软MSDN关于键盘输入管理的文档,我了解到可以通过预处理相应的消息来拦截快捷键的压力,发送到窗体的窗口,在ProcessCmdKey方法的覆盖内。
由于我必须通过管理KeyDown和KeyUp事件来处理不同的所有其他键,无论是个人还是他们的组合,我需要当您按下并释放最后一个快捷键时不会触发这些事件。
下面是处理键盘输入的代码:
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
if (keyData == (Keys.Control | Keys.Shift | Keys.End))
{
// now I need this to avoid making actions in the KeyUp event handler
//if (filterNextKeyUp == false)
//{
// filterNextKeyUp = true;
//}
return true;
}
return base.ProcessCmdKey(ref msg, keyData);
}
private void ClientForm_KeyDown(object sender, KeyEventArgs e)
{
// do actions in reaction to key pressure
}
private void ClientForm_KeyUp(object sender, KeyEventArgs e)
{
// now I need this to avoid making actions in the KeyUp event handler..
// but I would not enter here if a shortcut was intercepted!!
//if (filterNextKeyUp == true)
//{
// filterNextKeyUp = false;
//}
//else
//{
// do actions in reaction to key release
//}
}
在这种情况下,压力消息被ProcessCmdKey过滤,然后KeyDown事件没有被触发,而是当你释放最后一个快捷键时触发KeyUp事件。
我如何避免KeyUp事件被触发,以类似的方式,我过滤KeyDown事件?
是否有其他方法可以重写以达到目的?
你需要'组合按钮'做一些事情时,他们没有与Ctrl, Shift或结束组合?
如果没有,也只处理ProcessCmdKey中的那些键:
public static bool HandleProcessCmdKey(this IPAMålepunktGui guiMålepunkt, Keys keyData)
{
switch (keyData)
{
case Keys.Right:
case Keys.Right | Keys.Shift:
case Keys.Enter:
// go to next field
return guiMålepunkt.NæsteFelt();
case Keys.Left:
case Keys.Left | Keys.Shift:
// go to previous field
return guiMålepunkt.ForrigeFelt();
case Keys.Down:
case Keys.Down | Keys.Shift:
case Keys.Up:
case Keys.Up | Keys.Shift:
// disable native navigation
return true;
case Keys.Tab:
case Keys.Tab | Keys.Control:
// go to next point
return guiMålepunkt.NæsteMålepunkt();
case Keys.Tab | Keys.Shift:
case Keys.Tab | Keys.Shift | Keys.Control:
// go to previous point
return guiMålepunkt.ForrigeMålepunkt();
}
return false;
}
或者直接在KeyUp中处理它们,稍后捕获它们。
如果你在KeyUp中检查它们,看一下KeyEventArgs有Control和Shift(也有Alt)的属性,你可以检查。如果KeyEventArg。控件,然后将其设置为已处理。
至于结束按钮,我认为有一个键盘或其他东西,你可以调用来询问是否按下了特定的键