捕获鼠标单击Form上的任何位置(不使用IMessageFilter)

时间:2014-01-23 15:31:31

标签: c# .net winforms

当鼠标位于子控件上时,不会调用MouseDown事件。我尝试了KeyPreview = true;但它没有帮助(尽管它适用于KeyDown - 键盘点击)。

我正在寻找像KeyPreview这样的东西,但是对于鼠标事件。

我宁愿不使用IMessageFilter并处理WinAPI消息,如果有更简单的话。替代方案(另外,IMessageFilter设置为应用程序 - 范围。我只想要表单 - 范围。)并且迭代所有子控件,订阅每个,都有自己的缺点。

1 个答案:

答案 0 :(得分:10)

您仍然可以使用MessageFilter并只过滤ActiveForm:

private class MouseDownFilter : IMessageFilter {
  public event EventHandler FormClicked;
  private int WM_LBUTTONDOWN = 0x201;
  private Form form = null;

  [DllImport("user32.dll")]
  public static extern bool IsChild(IntPtr hWndParent, IntPtr hWnd);

  public MouseDownFilter(Form f) {
    form = f;
  }

  public bool PreFilterMessage(ref Message m) {
    if (m.Msg == WM_LBUTTONDOWN) {
      if (Form.ActiveForm != null && Form.ActiveForm.Equals(form)) {
        OnFormClicked();
      }
    }
    return false;
  }

  protected void OnFormClicked() {
    if (FormClicked != null) {
      FormClicked(form, EventArgs.Empty);
    }
  }
}

然后在你的表格中,附上它:

public Form1() {
  InitializeComponent();
  MouseDownFilter mouseFilter = new MouseDownFilter(this);
  mouseFilter.FormClicked += mouseFilter_FormClicked;
  Application.AddMessageFilter(mouseFilter);
}

void mouseFilter_FormClicked(object sender, EventArgs e) {
  // do something...
}