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

我在C#中使用Windows窗体。

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

笔记:

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

您需要做的是创建一个inheritanceToolStrip并处理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); } 

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

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

 form.FormBorderStyle = FormBorderStyle.None