views:

800

answers:

4

Is there any event in C# that fires when the form STOPS being moved. Not while its moving.

If there is no event for it, is there a way of doing it with WndProc?

A: 

Just set a flag to true when onmove events are fired. If a mouseup event happens and the flag is true, the form stopped being moved.

I admit this probably won't work in the case of a user moving a form via the keyboard, but that's pretty rare.

Brian
The MouseUp event is very unlikely to be fired since moving the form is typically done using the title bar, and mouse events are not raised for mouse operations in that area.
Fredrik Mörk
mouseup event doesnt fire if you move the form from the title bar part
Ozzy
+2  A: 

This is not a failsafe solution, but it's pure .NET and it's dead simple. Add a timer to your form, set it to a relatively short delay (100-150 ms seemed OK for me). Add the following code for the Form.LocationChanged and Timer.Tick events:

private void Form_LocationChanged(object sender, EventArgs e)
{
    if (this.Text != "Moving")
    {
        this.Text = "Moving";
    }
    tmrStoppedMoving.Start();
}

private void Timer_Tick(object sender, EventArgs e)
{
    tmrStoppedMoving.Start();
    this.Text = "Stopped";
}

If you want more exact handling (knowing exactly when the mouse button is release in the title bar and such) you will probably need to dive into monitoring windows messages.

Fredrik Mörk
+3  A: 

The ResizeEnd event fires after a move ends. Perhaps you could use that.

Adam Ruth
I had no idea about this. Just checked, it works! Thanks
Andrija
+1 - I obviously spent too much time doing web apps.
Fredrik Mörk
Haha, nice one. Works perfectly thanks.
Ozzy
A: 

I had the same problem with a user control, but it does not have the ResizeEnd event. The solution, which worked is to override the WndProc method and listen for EXITSIZEMOVE.

See example here