Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 处理未处理的输入键c_C#_Audio_Keystroke_Enter - Fatal编程技术网

C# 处理未处理的输入键c

C# 处理未处理的输入键c,c#,audio,keystroke,enter,C#,Audio,Keystroke,Enter,我必须处理win窗体上的enter键和其他键,而不会产生错误声音,但前提是当前活动控件尚未处理它 因此,当在文本框或DateTimePicker中按下enter键时,我希望用一个没有错误声音的表单来处理它,但如果在DataGridView中按下enter键,我希望默认情况下以DataGridView的方式处理它 OnKeyUp解决了我只处理未处理的击键的问题。Handled和ProcessCmdKey解决了声音问题,但两者都不能解决 有什么建议吗?这是一个非常有趣的问题。不幸的是,除了在主窗体上

我必须处理win窗体上的enter键和其他键,而不会产生错误声音,但前提是当前活动控件尚未处理它

因此,当在文本框或DateTimePicker中按下enter键时,我希望用一个没有错误声音的表单来处理它,但如果在DataGridView中按下enter键,我希望默认情况下以DataGridView的方式处理它

OnKeyUp解决了我只处理未处理的击键的问题。Handled和ProcessCmdKey解决了声音问题,但两者都不能解决


有什么建议吗?

这是一个非常有趣的问题。不幸的是,除了在主窗体上重写ProcessCmdKey之外,我似乎找不到适用于所有按键的全局事件处理程序。此方法的唯一问题是传递到事件处理程序委托的参数没有定义创建事件的控件:

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

代码:


ProcessCmdKey的Msg参数包含目标控件窗口的HWND。您可以使用Control.FromHandle获取托管控件对象。我不知道处理按键可以防止错误声音。我用KeyUp试过,但不知怎么的,我认为它也不能用KeyPress。但是,要从窗体捕获关键事件,您不需要执行所有这些操作,只需将窗体的KeyPreview属性设置为true并处理她的关键事件。此外,为了避免显式说明哪些控件可以或不可以处理enter,只需添加&!e、 在if中处理statement@Damir,看来Tergiver-see在我的帖子上的评论可能比我更符合目标。提供给ProcessCmdKey处理程序的msg参数似乎包含发送消息的windows.NET控件的windows句柄。您应该能够使用此方法,而不是为每个控件分配一个处理程序。是的,但是ProcessCmdKey会在表单级别上捕获击键,并且它永远不会访问可以处理它的控件。
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);
    }
}