当表单激活/聚焦时,如何在C#MenuStrip上单击鼠标?

时间:2011-11-17 14:20:48

标签: c# mouseevent menustrip onmouseclick

  

可能重复:
  Click lost on focusing form

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

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

我在某种程度上需要在发生Activate事件后发生OnMouseClick(...),然后在发生OnMouseClick(...)之后发生。{/ p>

1 个答案:

答案 0 :(得分:2)

使用此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();
    }

}