我必须在win表单上处理enter(以及其他键),而不会产生错误声音,但前提是当前活动控件尚未处理它。
因此,当在TextBox或DateTimePicker中按下enter时,我想用表单处理它(没有错误声音),但是如果按下它,例如,在DataGridView中我希望它以DataGridView的方式处理默认情况下。
OnKeyUp解决了我的问题,只处理未处理的击键(e.Handled)和ProcessCmdKey(this)解决了声音问题,但两者都没有解决。
有什么建议吗?
答案 0 :(得分:0)
感谢这个非常有趣的问题。不幸的是,除了在每个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);
}
}