Winforms:首先在主窗体上拦截鼠标事件,而不是在控件上

Meh*_*ANI 8 c# winforms

肯定有一种方便的方法:

我已经在我的主窗体上实现了鼠标拖动行为的"移动窗口",
我希望鼠标单击/移动事件被表单拦截,而不是由其中的控件拦截.

我想找到一个等效/复制鼠标事件的"KeyPreview"属性

此外,我想避免在12个控件的鼠标事件中单独将鼠标事件重定向到主窗体方法12次(这是我到目前为止找到的丑陋的解决方法)

有任何想法吗 ?

Ser*_*kiy 6

订阅所有控件MouseMove事件(考虑对嵌套控件进行递归操作)

foreach (Control control in Controls)
    control.MouseMove += RedirectMouseMove;
Run Code Online (Sandbox Code Playgroud)

并在此事件处理程序中引发MouseMove

private void RedirectMouseMove(object sender, MouseEventArgs e)
{
    Control control = (Control)sender;
    Point screenPoint = control.PointToScreen(new Point(e.X, e.Y));
    Point formPoint = PointToClient(screenPoint);
    MouseEventArgs args = new MouseEventArgs(e.Button, e.Clicks, 
        formPoint.X, formPoint.Y, e.Delta);
    OnMouseMove(args);
}
Run Code Online (Sandbox Code Playgroud)

请记住,控件接收具有本地控制坐标的MouseEvents.所以你需要将它转换为表格坐标.嵌套控件可能有缺点,但我留给你(例如调用Parent.PointToClient)

更新:您仍然可以处理控制事件 - 只需再次订阅事件.


tzu*_*zup 1

根据您的评论,

在基类中实现鼠标事件的重定向功能,然后使所有控件都从该基类派生。

因此,您只需实现该功能一次,然后所有控件将“重新抛出”鼠标事件以由主窗体捕获。

希望这可以帮助。