0

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

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

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

有什么建议么?

4

1 回答 1

0

感谢这个非常有趣的问题。不幸的是,除了根据本文在主窗体上覆盖 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);
    }
}
于 2010-10-01T23:49:48.550 回答