无论表单是否具有焦点,我都可以确保我的控件能够捕获第一个事件吗?

我对C#比较陌生。 我有一个带按钮的窗口。 如果窗口没有聚焦,我第一次点击一个按钮,第一次点击就会抓住窗口的焦点,所有后续点击将执行各自的操作。

有没有办法执行与按钮关联的事件而不是抓住焦点?

听起来您正在描述ToolStrips如何操作,除非应用程序具有焦点,否则不会触发单击事件。

解决方法是使用您自己的ToolStrip并让鼠标激活为控件提供焦点,然后让按钮触发它的click事件:

public class ToolStripIgnoreFocus : ToolStrip { private const int WM_MOUSEACTIVATE = 0x21; protected override void WndProc(ref Message m) { if (m.Msg == WM_MOUSEACTIVATE && this.CanFocus && !this.Focused) this.Focus(); base.WndProc(ref m); } } 

重建您的解决方案,您应该在工具箱中看到ToolStripIgnoreFocus控件。 尝试将其添加到表单中,然后相应地添加工具按钮。

这就是大多数Windows应用程序的工作方式 – 应用程序在接收点击事件之前需要具有焦点。

据我所知,你已经描述了一种固有的Windows行为,因此可能无法做到。

另一种方法是利用Windows应用程序的“永远在线”风格,这里解释:

如何使窗口始终保持在.Net的顶部?

这是正常的Windows行为。 我不认为你可以覆盖的东西(以便点击事件触发,但不会将你的应用程序带到前台和活动状态)。

如果您不想将焦点带到窗口,但仍希望与窗口本身提供一些“交互”,请尝试键盘挂钩或热键事件。 例子: