从每个组件捕获鼠标事件

Gus*_*oso 30 c# mouseevent winforms

我的WinForm C#应用程序上的MouseEvents有问题.

我想在我的应用程序上点击所有鼠标,但我不想在每个子组件中都放置一个监听器,也不要使用Windows鼠标钩子.

在Flash上​​我可以在Stage上放置一个监听器来获取电影上的所有MouseEvent.

C#上有这样的东西吗?全局MouseListener?


编辑:

我从IMessageFilter ans使用Application.AddMessageFilter创建了这个类.

public class GlobalMouseHandler : IMessageFilter{

    private const int WM_LBUTTONDOWN = 0x201;

    public bool PreFilterMessage(ref Message m){
        if (m.Msg == WM_LBUTTONDOWN) {
            // Do stuffs
        }
        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

并将此代码放在需要监听全局点击的控件上:

GlobalMouseHandler globalClick = new GlobalMouseHandler();
Application.AddMessageFilter(globalClick);
Run Code Online (Sandbox Code Playgroud)

Tim*_*son 15

一种直接的方法是通过调用Application.AddMessageFilter和编写实现IMessageFilter接口的类来添加消息循环过滤器.

通过IMessageFilter.PreFilterMessage,您的类可以看到通过应用程序的消息循环传递的任何输入消息.PreFilterMessage还可以决定是否将这些消息传递给它们所指定的特定控件.

这种方法引入的一个复杂性是必须通过传递给您的PreFilterMessage方法的Message结构来处理Windows消息.这意味着涉及到的Win32机制的文档上WM\_LBUTTONDOWN, WM\_MOUSEMOVE,WM\_LBUTTONUP等等,而不是传统的MouseDown,MouseMoveMouseUp事件.


小智 5

样品课

class CaptureEvents : IMessageFilter
{
    #region IMessageFilter Members
    public delegate void Callback(int message);
    public event Callback MessageReceived;

    IntPtr ownerWindow;
    Hashtable interestedMessages = null;
    CaptureEvents(IntPtr handle, int[] messages)
    {
        ownerWindow = handle;
        for(int c = 0; c < messages.Length ; c++)
        {
            interestedMessages[messages[c]] = 0;
        }
    }
    public bool PreFilterMessage(ref Message m)
    {
        if (m.HWnd == ownerWindow && interestedMessages.ContainsKey(m.Msg))
        {
            MessageReceived(m.Msg);
        }
        return true;
    }

    #endregion
}
Run Code Online (Sandbox Code Playgroud)