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将enter替换为应用程序级别的选项卡_C#_Winforms_Events_Replace_Key - Fatal编程技术网

C# C将enter替换为应用程序级别的选项卡

C# C将enter替换为应用程序级别的选项卡,c#,winforms,events,replace,key,C#,Winforms,Events,Replace,Key,我正在做一个大型的WinC窗体项目。在向我的最终用户解释了数千次他们必须在文本框、数据网格和任何地方按tab键而不是enter键之后,我决定在某处添加一个复选框,以便用户可以选择设置是否要将enter键替换为tab键。我自己也不喜欢,因为我觉得会有奇怪的事情发生,但我想试试 问题是我有很多表格,很多地方需要设置按键事件或类似事件。我想把所有这些放在一个地方,在应用程序级别上。有什么办法吗?我想这是不可能的,因为有些控件会以不同的方式公开按键事件,例如在gridview的单元格中。您可以递归地遍历

我正在做一个大型的WinC窗体项目。在向我的最终用户解释了数千次他们必须在文本框、数据网格和任何地方按tab键而不是enter键之后,我决定在某处添加一个复选框,以便用户可以选择设置是否要将enter键替换为tab键。我自己也不喜欢,因为我觉得会有奇怪的事情发生,但我想试试


问题是我有很多表格,很多地方需要设置按键事件或类似事件。我想把所有这些放在一个地方,在应用程序级别上。有什么办法吗?

我想这是不可能的,因为有些控件会以不同的方式公开按键事件,例如在gridview的单元格中。您可以递归地遍历表单中的所有控件,并为基本控件分配事件。
然后可以在中心位置处理事件本身

我建议您创建一个单独的类,构造函数接受您需要的参数,如文本框,您创建全局变量并将参数分配给构造函数中的变量

然后在类中创建事件处理程序,然后可以使用变量将代码放入事件处理程序中

然后,您可以在任何需要keydown事件的地方调用该类,您可以在基本表单中实现行为并从中继承:

这可能也可以在应用程序级别上完成:在主窗体中,您必须使用message filter对来自消息循环的消息进行预筛选:application.AddMessageFiltery您的筛选器,检查消息WM_KEYDOWN=0x100,检查按下的键是否已输入,然后按上述方法处理。您只需在主窗体中执行一次,它会对你所有的孩子表格起作用

在主窗体类中:

protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);

            this.mouseMessageFilter = new MouseMoveMessageFilter();
            this.mouseMessageFilter.TargetForm = this;
            Application.AddMessageFilter(this.mouseMessageFilter);
        }

protected override void OnClosed(EventArgs e)
        {
            Application.RemoveMessageFilter(this.mouseMessageFilter);

            base.OnClosed(e);
        }

private class MouseMoveMessageFilter : IMessageFilter
        {
            public FormMain TargetForm { get; set; }

            public bool PreFilterMessage(ref Message m)
            {
                if (TargetForm.IsDisposed) return false;

                int numMsg = m.Msg;

                int VK_RETURN=0x0D;
                if (m.Msg == 0x100 &&(int)m.WParam == VK_RETURN) // WM_KEYDOWN and enter pressed
                {
                      if (TargetForm.PressedEnter()) return true;
                }

                return false;
            }
        }
资料来源:


将MessageFilter与SendKeys结合使用要简单得多:


坏主意,如果你用tab替换enter键,当用户需要按enter键时你会怎么做?我知道,我已经警告过他们很多次了。这就是为什么他们想要打开/关闭开关,所以无论何时他们需要进入,这几乎是永远不会的,显然他们可以切换它。也许我应该开始为另一家公司工作。
protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);

            this.mouseMessageFilter = new MouseMoveMessageFilter();
            this.mouseMessageFilter.TargetForm = this;
            Application.AddMessageFilter(this.mouseMessageFilter);
        }

protected override void OnClosed(EventArgs e)
        {
            Application.RemoveMessageFilter(this.mouseMessageFilter);

            base.OnClosed(e);
        }

private class MouseMoveMessageFilter : IMessageFilter
        {
            public FormMain TargetForm { get; set; }

            public bool PreFilterMessage(ref Message m)
            {
                if (TargetForm.IsDisposed) return false;

                int numMsg = m.Msg;

                int VK_RETURN=0x0D;
                if (m.Msg == 0x100 &&(int)m.WParam == VK_RETURN) // WM_KEYDOWN and enter pressed
                {
                      if (TargetForm.PressedEnter()) return true;
                }

                return false;
            }
        }
public partial class Form1 : Form, IMessageFilter
{
    public Form1()
    {
        InitializeComponent();
        Application.AddMessageFilter(this);
    }        
    public bool PreFilterMessage(ref Message m)
    {
        if (m.Msg == 0x100)//WM_KEYDOWN
        {
            if (m.WParam.ToInt32() == 0xd)//VK_RETURN = 0xd
            {         
                SendKeys.Send("{TAB}");                                        
                return true; //Discard the Enter key
            }
        }
        return false;
    }
}