代码之家  ›  专栏  ›  技术社区  ›  AZDean

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

  •  13
  • AZDean  · 技术社区  · 14 年前

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

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

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

    4 回复  |  直到 14 年前
        1
  •  16
  •   AZDean    14 年前

    好吧,我最终找到了我自己的解决方案,它非常简单。我派生了自己的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控件仍然获取mouse UP事件。这启发了我的解决方案。我只需查找任何鼠标向上的事件,但它缺少相应的向下事件。当我看到这种特殊情况时,我生成了自己的鼠标按下事件,对于ToolStrip控件,世界都很高兴。:-)

        2
  •  2
  •   Rahmat Anjirabi    6 年前

    简单清洁的解决方案

    public class MyToolStrip : System.Windows.Forms.ToolStrip
    {
        protected override void OnMouseEnter(EventArgs e)
        {
            if (this.CanFocus && !this.Focused)
                this.Focus();
    
            base.OnMouseEnter(e);
        }
    }
    
        3
  •  0
  •   user1798340    9 年前

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

        4
  •  -1
  •   Andrew Shelansky    14 年前

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

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

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

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