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 ?
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.
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.
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With