处理未处理的回车键 c#

Posted

技术标签:

【中文标题】处理未处理的回车键 c#【英文标题】:Processing unprocessed enter key c# 【发布时间】:2010-10-01 22:40:53 【问题描述】:

我必须在 win 表单上处理 enter(以及其他键)而不会产生错误声音,但前提是当前活动的控件尚未处理它。

所以,当在 TextBox 或 DateTimePicker 中按下 Enter 时,我想用表单处理它(没有错误声音),但如果按下它,例如,在 DataGridView 中,我希望它以 DataGridView 的方式处理默认情况下会这样做。

OnKeyUp 解决了我只处理未处理的击键 (e.Handled) 的问题,而 ProcessCmdKey (this) 解决了声音问题,但两者都没有解决。

有什么建议吗?

【问题讨论】:

【参考方案1】:

感谢这个非常有趣的问题。不幸的是,除了根据this article 在主窗体上覆盖 ProcessCmdKey 之外,我似乎找不到所有按键的全局事件处理程序。此方法的唯一问题是传递给事件处理程序委托的参数没有定义创建事件的控件:(

所以,我唯一的想法是您需要将事件处理程序分配给应用程序中的每个控件。我已经编写了一些代码,可以帮助您了解如何做到这一点。我不确定将 KeyPress 事件处理程序分配给页面上的每个控件可能会产生什么不利影响,但这是我看到的唯一可行的解​​决方案。

代码:

private void Form1_Load(object sender, EventArgs e)

    AssignHandler(this);


protected void HandleKeyPress(object sender, KeyPressEventArgs e)

    if (e.KeyChar == (char)Keys.Enter && (sender != this.textBoxToIgnore || sender ! this.gridViewToIgnore))
    
        PlaySound();  // your error sound function
        e.Handled = true;
    


public void AssignHandler(Control c)

    c.KeyPress += new KeyPressEventHandler(HandleKeyPress);
    foreach (Control child in c.Controls)
    
        AssignHandler(child);
    

【讨论】:

ProcessCmdKey 的 Msg 参数包含目标控件(窗口)的 HWND。您可以使用 Control.FromHandle 来获取托管的 Control 对象。 我不知道处理 KeyPress 可以防止错误声音。我用 KeyUp 进行了尝试,并以某种方式认为它也不适用于 KeyPress。但是,要从表单中捕获 Key 事件,您不需要执行所有这些操作,只需将表单的 KeyPreview 属性设置为 true 并处理她的 Key 事件。 另外,为了避免明确说明哪些控件处理或不处理输入,在 if 语句中添加 && !e.Handled 就足够了 @Damir,看起来 Tergiver(请参阅我的帖子中的 cmets)可能比我更准确。看起来好像提供给 ProcessCmdKey 处理程序的 msg 参数包含发送消息的窗口(.NET 控件)的窗口句柄。您应该能够使用此方法,而不是为每个控件分配一个处理程序。 是的,但是 ProcessCmdKey 会在表单级别捕获击键,并且它永远不会到达可以处理它的控件。

以上是关于处理未处理的回车键 c#的主要内容,如果未能解决你的问题,请参考以下文章

c#处理空白字符

U盘容量变小的处理方式

Form表单(回车)提交问题

移动端回车键触发表单提交及相关兼容

怎么在批处理中加回车命令?

C# 自动清除 Winform 文本框