经过更多研究,我发现了Application.AddMessageFilter方法。使用此工具,我创建了.NET版本的鼠标钩:
class MouseMessageFilter : IMessageFilter, IDisposable{ public MouseMessageFilter() { } public void Dispose() { StopFiltering(); } #region IMessageFilter Members public bool PreFilterMessage(ref Message m) { // Call the appropriate event return false; } #endregion #region Events public class CancelMouseEventArgs : MouseEventArgs {...} public delegate void CancelMouseEventHandler(object source, CancelMouseEventArgs e); public event CancelMouseEventHandler MouseMove; public event CancelMouseEventHandler MouseDown; public event CancelMouseEventHandler MouseUp; public void StartFiltering() { StopFiltering(); Application.AddMessageFilter(this); } public void StopFiltering() { Application.RemoveMessageFilter(this); }}然后,我可以在容器控件中处理MouseMove事件,检查鼠标是否在父控件中,然后开始工作。(我还必须跟踪上一次鼠标移到父控件上,以便可以停止先前启动的父控件。)
-—编辑----
在表单类中,我创建并连接了过滤器:
public class MyForm : Form{ MouseMessageFilter msgFilter; public MyForm() {... msgFilter = new MouseMessageFilter(); msgFilter.MouseDown += new MouseMessageFilter.CancelMouseEventHandler(msgFilter_MouseDown); msgFilter.MouseMove += new MouseMessageFilter.CancelMouseEventHandler(msgFilter_MouseMove); } private void msgFilter_MouseMove(object source, MouseMessageFilter.CancelMouseEventArgs e) { if (CheckSomething(e.Control) e.Cancel = true; } }


