在我的应用程序中,我将键盘快捷键(事件处理程序)添加到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。
答案 0 :(得分:4)
是的,那是因为你调用ShowDialog()。这是一个阻塞调用,因此在关闭对话框之后,e.SuppressKeyPress语句才会执行。并且ShowDialog泵出一个消息循环,DoEvents样式,因此按键消息将被正常分派并触发KeyPress事件。
最直接的解决方法是延迟显示对话框,直到消息处理完成。使用Control.BeginInvoke()优雅地完成,如下所示:
case Keys.H:
this.BeginInvoke(new Action(() => ShowFindReplaceDialog(true)));
e.SuppressKeyPress = true;
break;