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

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

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

有什么建议么?

有帮助吗?

解决方案

感谢这个非常有趣的问题。不幸的是,除了在主窗体上覆盖 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);
    }
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top