【问题标题】:In KeyDown, a ShowDialog makes SuppressKeyPress not work在 KeyDown 中,ShowDialog 使 SuppressKeyPress 不起作用
【发布时间】:2012-02-17 22:03:30
【问题描述】:

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

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

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

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

问题是显示弹出窗口会导致抑制不起作用。所以弹出窗口显示出来了,在它关闭后我看到退格键 (Ctrl+H) 仍然出现。

如何才能让它发挥作用?

注意为了完整起见:您在 MessageBox 中遇到了同样的问题,下面都是 ShowDialog。

【问题讨论】:

    标签: winforms


    【解决方案1】:

    是的,那是因为您调用了 ShowDialog()。这是一个阻塞调用,因此 e.SuppressKeyPress 语句直到 对话框关闭后才会执行。 ShowDialog 会抽出一个消息循环,DoEvents 样式,因此按键消息会正常发送并触发 KeyPress 事件。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-16
      • 2014-02-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多