在Form上的任何位置捕获鼠标单击(不使用IMessageFilter)
当鼠标位于子控件上时,不会调用MouseDown
事件。 我试过KeyPreview = true;
但它没有帮助(虽然它适用于KeyDown
– 键盘点击)。
我正在寻找类似KeyPreview
东西,但是对于鼠标事件。
我宁愿不使用IMessageFilter
并处理WinAPI消息,如果有更简单的话。 替代方案(另外, IMessageFilter
设置为Application- wide。我只想要Form- wide。)并且迭代所有子控件,订阅每个,都有其自身的缺点。
您仍然可以使用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... }