4

我对 C# 比较陌生。我有一个带按钮的窗口。如果窗口失焦并且我第一次单击按钮,则第一次单击会获取窗口的焦点,并且所有后续单击都将执行各自的操作。

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

4

4 回答 4

11

听起来您正在描述 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会在工具箱中看到可用的控件。尝试将其添加到您的表单中,然后相应地添加您的工具按钮。

于 2012-07-04T01:13:43.293 回答
0

据我所知,您已经描述了一种固有的 Windows 行为,因此这可能是不可能的。

另一种方法是利用 Windows 应用程序的“始终位于顶部”样式,此处对此进行了说明:

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

于 2012-07-04T00:53:04.320 回答
0

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

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

于 2012-07-04T01:02:42.643 回答
0

这就是大多数 Windows 应用程序的工作方式 - 应用程序需要先获得焦点,然后才能接收点击事件。

于 2012-07-04T00:51:55.133 回答