无论表单是否具有焦点,我都可以确保我的控件能够捕获第一个事件吗?
我对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行为。 我不认为你可以覆盖的东西(以便点击事件触发,但不会将你的应用程序带到前台和活动状态)。
如果您不想将焦点带到窗口,但仍希望与窗口本身提供一些“交互”,请尝试键盘挂钩或热键事件。 例子:
- http://social.msdn.microsoft.com/Forums/en-US/Vsexpressvb/thread/2622427d-1e15-4f30-b01d-57b0ba054f5c
- 在WPF / C#中使用全局键盘钩子(WH_KEYBOARD_LL)
- 低级Keyhook
- http://www.pinvoke.net/default.aspx/user32/RegisterHotKey.html