首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >捕捉鼠标单击窗体上的任意位置(没有IMessageFilter)

捕捉鼠标单击窗体上的任意位置(没有IMessageFilter)
EN

Stack Overflow用户
提问于 2014-01-23 15:31:30
回答 1查看 4.9K关注 0票数 8

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

我正在寻找类似于KeyPreview的东西,但是要寻找鼠标事件。

如果有更简单的消息,我宁愿不使用IMessageFilter来处理WinAPI消息。alternative (同时,Application-wide.设置了IMessageFilter我只想要表单-wide。)迭代所有子控件,订阅每个控件,都有其自身的缺点。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-23 16:53:16

您仍然可以使用MessageFilter,只需对ActiveForm进行筛选:

代码语言:javascript
复制
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);
    }
  }
}

然后以你的形式附上:

代码语言:javascript
复制
public Form1() {
  InitializeComponent();
  MouseDownFilter mouseFilter = new MouseDownFilter(this);
  mouseFilter.FormClicked += mouseFilter_FormClicked;
  Application.AddMessageFilter(mouseFilter);
}

void mouseFilter_FormClicked(object sender, EventArgs e) {
  // do something...
}
票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21312587

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档