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,MouseMove和MouseUp事件.
小智 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)