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