当窗体被激活/聚焦时,如何在C#菜单条上点击鼠标

本文关键字:菜单 鼠标 激活 窗体 聚焦 | 更新日期: 2023-09-27 18:14:53

可能重复:
聚焦表单上的点击丢失

如果带有MenuStrip的窗体不是具有焦点的窗口,并且您单击MenuStrip,它会使用第一次单击使窗口处于活动状态,然后您必须再次单击MenuStrip才能使菜单下拉。按钮的工作方式不同。如果带有按钮的表单未激活/没有焦点,并且您单击该按钮,则它将在第一次单击时注册为按钮单击,同时使该表单处于激活/焦点状态。我真的需要MenuStrip上的菜单在第一次点击时下拉,即使表单没有激活。

当窗体Enter和/或Activate事件被触发时,我尝试使用OnMouseClick(...)方法模拟鼠标单击,但这不起作用。Enter和Activate事件是在鼠标按下时触发的,因此通过在Enter或Activate事件处理程序中放入OnMouseClick(...)调用,它试图在第一次鼠标点击释放之前激发第二次鼠标点击。

不知何故,我需要OnMouseClick(...)发生在Activate事件发生之后,然后发生在MouseUp之后。

当窗体被激活/聚焦时,如何在C#菜单条上点击鼠标

使用此MenuStrip衍生物作为替换:

public class ActivatingMenuStrip : MenuStrip
{
    public ActivatingMenuStrip()
    {
        InitializeComponent();
    }

    int WM_MOUSEACTIVATE = 0x21;
    protected override void WndProc(ref Message m)
    {
        if (m.Msg == WM_MOUSEACTIVATE)
        {
            this.Parent.Focus();
        }
        base.WndProc(ref m);
    }
    private System.ComponentModel.IContainer components = null;
    protected override void Dispose(bool disposing)
    {
        if (disposing && (components != null))
        {
            components.Dispose();
        }
        base.Dispose(disposing);
    }
    private void InitializeComponent()
    {
        components = new System.ComponentModel.Container();
    }
}