C#表单移动停止事件

C#表单移动停止事件,c#,winforms,events,move,wndproc,C#,Winforms,Events,Move,Wndproc,在C#中是否存在当窗体停止移动时触发的事件。当它移动的时候 如果没有事件,是否有方法使用WndProc执行此操作?只要在触发onmove事件时将标志设置为true即可。如果发生mouseup事件且标志为true,则窗体将停止移动 我承认这在用户通过键盘移动表单的情况下可能不起作用,但这非常罕见。这不是一个故障保护解决方案,但它是纯.NET的,非常简单。在表单中添加计时器,将其设置为相对较短的延迟(100-150毫秒对我来说似乎没问题)。为Form.LocationChanged和Timer.Ti

在C#中是否存在当窗体停止移动时触发的事件。当它移动的时候


如果没有事件,是否有方法使用WndProc执行此操作?

只要在触发onmove事件时将标志设置为true即可。如果发生mouseup事件且标志为true,则窗体将停止移动


我承认这在用户通过键盘移动表单的情况下可能不起作用,但这非常罕见。

这不是一个故障保护解决方案,但它是纯.NET的,非常简单。在表单中添加计时器,将其设置为相对较短的延迟(100-150毫秒对我来说似乎没问题)。为Form.LocationChanged和Timer.Tick事件添加以下代码:

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

如果您想要更精确的处理(确切地知道何时在标题栏中释放鼠标按钮等),您可能需要深入监视windows消息。

移动结束后,ResizeEnd事件将触发。也许您可以使用它。

我对用户控件也有同样的问题,但它没有ResizeEnd事件。有效的解决方案是重写WndProc方法并侦听EXITSIZEMOVE


参见示例

我测试了ResizeChanged事件,它工作正常,但我不知道移动和调整大小之间的关系,但它对我有效

MouseUp事件不太可能触发,因为移动表单通常使用标题栏,该区域中的鼠标操作不会引发鼠标事件。如果您从标题栏部分移动表单,则不会引发鼠标事件。如果有人来到这里,并希望了解更多有关此答案最后部分的信息(确定移动过程中何时按下和释放鼠标),看看我的问题,它更深入地探讨了这个解决方案有一个问题。如果通过更改窗体坐标移动,则不会触发此事件。如果窗口状态更改,也不会触发此事件