同时激活表单和进程按钮单击?
我在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