.net Windows需要单击以激活窗口,然后第二次单击将选择按钮。我怎样才能改变这个?

.net Windows需要单击以激活窗口,然后第二次单击将选择按钮。我怎样才能改变这个?,.net,winforms,.net,Winforms,我的应用程序是一个C#Windows窗体应用程序,.Net以某种方式使我的主菜单栏和工具栏按钮的默认行为是,你必须先单击我的应用程序窗口(任何位置),然后它才允许你单击菜单或工具栏按钮。我怎样才能改变这个 像记事本和写字板这样的旧应用程序不会这样做。但所有的微软Office应用程序都是如此。但这太烦人了 更糟糕的是,我的应用程序会弹出辅助窗口,每次我更改窗口时,我都必须先激活坏掉的窗口,然后才能做任何事情。啊 我希望有一些全局性的方法来改变这种行为,这样我就不必单独重写很多控件(我还没有尝试过)

我的应用程序是一个C#Windows窗体应用程序,.Net以某种方式使我的主菜单栏和工具栏按钮的默认行为是,你必须先单击我的应用程序窗口(任何位置),然后它才允许你单击菜单或工具栏按钮。我怎样才能改变这个

像记事本和写字板这样的旧应用程序不会这样做。但所有的微软Office应用程序都是如此。但这太烦人了

更糟糕的是,我的应用程序会弹出辅助窗口,每次我更改窗口时,我都必须先激活坏掉的窗口,然后才能做任何事情。啊

我希望有一些全局性的方法来改变这种行为,这样我就不必单独重写很多控件(我还没有尝试过)。有人知道吗


请注意,我的应用程序对话框上的控件不会表现出这种愚蠢的行为。为什么它们不同?

如果订阅
鼠标单击事件,即使应用程序没有焦点,也可以检测到表单上的单击

然后,当您单击表单时,无论该表单以前是否有焦点,您都会得到回调

然后可以模拟单击所需的控件


这不是一个非常优雅的解决方案,但它应该可以工作。您必须确保单击不会被发送到工具栏按钮两次。

好吧,我最终找到了自己的解决方案,它非常简单。我派生了自己的ToolStrip类(和MenuStrip类),如下所示:

// This version of ToolStrip enables mouse click's even when the main form is NOT active.
private class MyToolStrip : ToolStrip
{
    const uint WM_LBUTTONDOWN = 0x201;
    const uint WM_LBUTTONUP   = 0x202;

    static private bool down = false;

    protected override void WndProc(ref Message m)
    {
        if (m.Msg==WM_LBUTTONUP && !down) {
            m.Msg=(int)WM_LBUTTONDOWN; base.WndProc(ref m);
            m.Msg=(int)WM_LBUTTONUP;
            }

        if (m.Msg==WM_LBUTTONDOWN) down=true;
        if (m.Msg==WM_LBUTTONUP)   down=false;

        base.WndProc(ref m);
    }
}
看起来,就像MacOSX一样,Windows做出了一个GUI风格的决定,要求在允许选择任何控件之前先激活一个窗口。但是,Windows仅对特定控件(如ToolStrip和MenuStrip)执行此操作。当您的窗口未处于活动状态时,这些控件不会发送鼠标按下事件。我不确定WinForms是如何实施此GUI准则的,但可能它使用Application.AddMessageFilter()使用消息过滤器


不管怎样,MenuStrip控件仍然会获取鼠标上升事件。这启发了我的解决方案。我只需查找任何缺少相应的向下事件的鼠标向上事件。当我看到这种特殊情况时,我会生成自己的鼠标按下事件,对于ToolStrip控件,整个世界都很高兴。:-)

这似乎是一个更简单的解决方案:


将MainMenu组件注册到工具箱栏上(在Visual Studio中,使用菜单“工具”,然后选择“选择工具箱项”,然后查找“MainMenu”),然后在窗体上而不是在MenuStrip上使用它

简单清洁的解决方案

public class MyToolStrip : System.Windows.Forms.ToolStrip
{
    protected override void OnMouseEnter(EventArgs e)
    {
        if (this.CanFocus && !this.Focused)
            this.Focus();

        base.OnMouseEnter(e);
    }
}

这听起来像是在Mac OS X下使用任何程序。我试过这个,效果很好。这也困扰了我一段时间。我也觉得这种行为真的很烦人,而且前后矛盾。对于内置的办公室控制有什么解决方案吗?谢谢。你救了我一天。