我对 C# 比较陌生。我有一个带按钮的窗口。如果窗口失焦并且我第一次单击按钮,则第一次单击会获取窗口的焦点,并且所有后续单击都将执行各自的操作。
有没有办法执行与按钮相关的事件而不是抓住焦点?
听起来您正在描述 ToolStrips 的操作方式,除非应用程序具有焦点,否则它不会触发单击事件。
一种解决方法是使用您自己的 ToolStrip 并让鼠标激活为控件提供焦点,然后让按钮触发它的单击事件:
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 行为。我认为您无法覆盖的东西(以便触发点击事件,但不会将您的应用程序置于前台和活动状态)。
如果您不想将焦点放在窗口上,但仍想与窗口本身提供一些“交互”,请尝试使用键盘挂钩或热键事件。例子:
这就是大多数 Windows 应用程序的工作方式 - 应用程序需要先获得焦点,然后才能接收点击事件。