C# 禁用';要求';单击菜单提示时双击未聚焦窗口的步骤

C# 禁用';要求';单击菜单提示时双击未聚焦窗口的步骤,c#,winforms,C#,Winforms,很抱歉这个奇怪的标题,我目前正在玩WinForms,我想知道是否有什么方法可以让你不必在窗口未聚焦时“双击”窗口来激活菜单提示中的项目 当前,如果窗口未聚焦,我必须首先单击窗口以使其聚焦,然后再次单击menustrip项目,即使我的鼠标从一开始就悬停在menustrip项目上方 提前谢谢 尝试将此函数放入表单类中: protected override void WndProc(ref Message m) { int WM_PARENTNOTIFY = 0x0210; if (

很抱歉这个奇怪的标题,我目前正在玩WinForms,我想知道是否有什么方法可以让你不必在窗口未聚焦时“双击”窗口来激活菜单提示中的项目

当前,如果窗口未聚焦,我必须首先单击窗口以使其聚焦,然后再次单击menustrip项目,即使我的鼠标从一开始就悬停在menustrip项目上方


提前谢谢

尝试将此函数放入表单类中:

protected override void WndProc(ref Message m) {
    int WM_PARENTNOTIFY = 0x0210;
    if (!this.Focused && m.Msg == WM_PARENTNOTIFY) {
        // Make this form auto-grab the focus when menu/controls are clicked
        this.Activate();
    }
    base.WndProc(ref m);
}

@Detmar答案中的方法将在窗口被破坏时聚焦窗口(请参阅)。如果应用程序中有多个窗口并且正在退出,则可能会导致问题。以下是一个在处理windows时不会触发的事件:

    protected override void WndProc(ref Message m)
    {
        const int WM_PARENTNOTIFY = 0x0210;
        if (!this.Focused && m.Msg == WM_PARENTNOTIFY)
        {
            const int WM_CREATE = 0x0001;
            const int WM_DESTROY = 0x0002;
            const int WM_LBUTTONDOWN = 0x0201;
            const int WM_MBUTTONDOWN = 0x0207;
            const int WM_RBUTTONDOWN = 0x0204;
            const int WM_XBUTTONDOWN = 0x020B;
            const int WM_POINTERDOWN = 0x0246;

            int type = (int)(0xFFFF & (long)m.WParam);
            switch (type)
            {
                case WM_LBUTTONDOWN:
                case WM_MBUTTONDOWN:
                case WM_RBUTTONDOWN:
                case WM_XBUTTONDOWN:
                case WM_POINTERDOWN:
                    // Make this form auto-grab the focus when menu/controls are clicked
                    this.Activate();
                    break;
                case WM_DESTROY:
                case WM_CREATE:
                    //do nothing
                    break;
            }
        }
        base.WndProc(ref m);
    }