在KeyDown中,ShowDialog使SuppressKeyPress不起作用

时间:2012-02-17 10:23:17

标签: winforms

在我的应用程序中,我将键盘快捷键(事件处理程序)添加到TextBox。一个是Ctrl + H,它显示了一个Find&替换弹出窗口。

在我的表单的KeyDown事件处理程序中,我检查Ctrl + H按键:

case Keys.H:
    ShowFindReplaceDialog(true); // This line makes the SuppressKeyPress not work
    e.SuppressKeyPress = true;
    break;

现在,Ctrl + H是标准键盘快捷键,相当于按退格键,所以我需要禁止它。

问题是显示弹出窗口导致抑制不起作用。因此弹出窗口显示,关闭后我看到退格键(Ctrl + H)仍然存在。

如何才能使其发挥作用?

N.B。为了完整起见:你使用MessageBox遇到同样的问题,下面是所有ShowDialog。

1 个答案:

答案 0 :(得分:4)

是的,那是因为你调用ShowDialog()。这是一个阻塞调用,因此在关闭对话框之后,e.SuppressKeyPress语句才会执行。并且ShowDialog泵出一个消息循环,DoEvents样式,因此按键消息将被正常分派并触发KeyPress事件。

最直接的解决方法是延迟显示对话框,直到消息处理完成。使用Control.BeginInvoke()优雅地完成,如下所示:

case Keys.H:
    this.BeginInvoke(new Action(() => ShowFindReplaceDialog(true)));
    e.SuppressKeyPress = true;
    break;