Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Winforms : Intercepting Mouse Event on Main Form first, not on Controls

Tags:

c#

winforms

There is certainly a convenient way to do this :

I have implemented a "Move Window" on mouse drag behavior on my main form,
and I would like the MouseClick/Move event to be intercepted by the form, not by controls that are in it.

I would like to find an Equivalent to/replicate the "KeyPreview" property for Mouse Events

Besides I want to avoid Redirecting the Mouse Event to the Main Form Method 12 times in 12 Controls' Mouse events individually (which is the ugly workaround I have Found so far)

Any Ideas ?

like image 799
Mehdi LAMRANI Avatar asked Feb 14 '11 10:02

Mehdi LAMRANI


3 Answers

Subscribe to all controls MouseMove events (consider do it recursively for nested controls)

foreach (Control control in Controls)
    control.MouseMove += RedirectMouseMove;

And raise MouseMove inside this event handler

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);
}

Keep in mind that controls receive MouseEvents with local coordinates of control. So you need to convert it to form coordinates. There are could be drawbacks with nested controls, but I leave it to you (e.g. call Parent.PointToClient)

UPDATE: You are still will be able to handle events of control - just subscribe to event one more time.

like image 109
Sergey Berezovskiy Avatar answered Nov 16 '22 02:11

Sergey Berezovskiy


Based on your comments,

Implement the redirect functionality of the Mouse Event in a base class, then make all controls derive from that base class.

Thus, you only implement the functionality once and then all your controls will "rethrow" the mouse event to be caught by the Main Form.

Hope this helps.

like image 38
tzup Avatar answered Nov 16 '22 02:11

tzup


Override the Control.PreProcessMessage Method:

http://msdn.microsoft.com/en-us/library/system.windows.forms.control.preprocessmessage.aspx

Edit:

It seems PreProcessMessage might not work for mouse events. Try overriding WndPrc instead. It can intercept mouse messages for sure, but you need to see if it intercepts them in the order you want:

http://bytes.com/topic/c-sharp/answers/752144-preprocessmessage

like image 25
Pedery Avatar answered Nov 16 '22 03:11

Pedery