同时激活表单和进程按钮单击?

时间:2011-08-04 19:07:25

标签: c# winforms focus form-control

我在C#中使用Windows窗体。

我有一个主窗体,其中包含几个包含toolStripButtons的工具栏。使用包含数据的另一个表单后,主窗体失去焦点并单击toolStripButton不会触发OnClick事件:第一次单击激活主窗体,只有第二次单击实际按下按钮。我需要用户只按一次按钮才能触发Click事件,有关如何操作的任何想法?感谢。

注意:

  • 我使用的是MDI ,点击父级的表单按钮没有问题。但现在最重要的是让表格自由地浮动在多个显示器上。
  • 工作表单的主要表单是所有者属性,这样它们就会保留在主表单的顶部。
  • 当我单击非活动表单的按钮时,MouseHover,MouseEnter,MouseDown和MouseUp都不会触发。这只是主要形式的激活事件。
  • 主窗体上有一个treeView(在tabControl内,splitContainer内,面板内)。即使主窗体处于非活动状态,也可以在第一次鼠标单击时选择其项目。我猜不是所有的控制都是平等的!

2 个答案:

答案 0 :(得分:7)

您需要做的是创建一个继承ToolStrip并处理WndProc的类。这是一种方法。还有其他人。

private class MyToolStrip : ToolStrip
{
    private const uint WM_LBUTTONDOWN = 0x201;
    private const uint WM_LBUTTONUP   = 0x202;

    private static 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);
    }
}

我也见过这个解决方案:

protected override void WndProc(ref Message m)
{
    // WM_MOUSEACTIVATE = 0x21
    if (m.Msg == WM_MOUSEACTIVATE && this.CanFocus && !this.Focused)
        this.Focus();
    base.WndProc(ref m);
}

我在我工作的最后一个地方碰到了这个,我认为我提出的解决方案更像后者,但我无法访问我使用的确切代码。

答案 1 :(得分:-4)

如果你有没有边框的Form,那么这个逻辑适合你内置:)

form.FormBorderStyle = FormBorderStyle.None