C# Form - MouseClick失去表单焦点后会点击实际控件

C# Form - MouseClick will click the actual control after losing form focus

如果您从 Chrome/FireFox/Visual Studio 等任何专业应用程序中移除焦点,然后重新单击某个 button/menu 项目,它实际上会单击它,就好像您从未失去焦点一样。

如何在 C# WinForm 中应用相同的概念?我尝试了很多东西,比如

private void form1_MouseClick(object sender, MouseEventArgs e)
    {
        BringToFront();
        Activate();
    }

Activate/focus/select/etc...没有任何反应以同样的方式起作用,实际点击菜单总是需要 3-4 次点击!

我考虑过为每个控件制作一个点击事件,但这似乎是多余的。

Check this for example (Yellow Clicks)

关于 Menues 需要额外点击以获得焦点的说法,你是对的。

这很烦人,因为菜单无论如何都会突出显示,但对第一次点击没有反应..

您可以通过编写 MouseEnter 事件代码来避免这种情况:

private void menuStrip1_MouseEnter(object sender, EventArgs e)
{
    // either 
    menuStrip1.Focus();
    // or
    this.Focus();
}

这样做的缺点是,它正在窃取其他应用程序的焦点,这不是一个行为良好的应用程序应该做的事情..

所以我认为最好等待最终的用户操作;以类似的方式对 MouseDown 事件进行编码......:[=​​15=]

private void menuStrip1_MouseDown(object sender, MouseEventArgs e)
{
    menuStrip1.Focus();
}

或使用专为该场合举办的活动:

private void menuStrip1_MenuActivate(object sender, EventArgs e)
{
    menuStrip1.Focus();
}

不过,我无法确认按钮或任何其他控件是否存在类似问题。

我找到了解决您问题的技巧。它对我有用 100%

查看此代码:

    dynamic elem1;
    private void menuStrip1_MouseEnter(object sender, EventArgs e)
    {
        elem1 = sender;
    }
    private void menuStrip1_MouseLeave(object sender, EventArgs e)
    {
        elem1 = null;
    }

    private void Form1_Activated(object sender, EventArgs e)
    {
        if(elem1 != null){
            elem1.PerformClick();
            if (elem1.GetType().ToString() == "System.Windows.Forms.ToolStripMenuItem") elem1.ShowDropDown();
        }
        elem1 = null;
    }

这里发生了什么。 当鼠标进入 button/menu item elem1 = this button/menu 时,当鼠标离开时它设置回 null。 所以当表单激活时,我们可以调用 elem1.PerformClick() 来单击 button/menu 项。