Событие остановки перемещения формы C#
Вопрос
Есть ли какое-либо событие в С#, которое срабатывает, когда форма ОСТАНАВЛИВАЕТ перемещение.Не во время движения.
Если для этого нет события, есть ли способ сделать это с помощью WndProc?
Решение
Событие ResizeEnd срабатывает после завершения перемещения.Возможно, вы могли бы использовать это.
Другие советы
Это не отказоустойчивое решение, но это чистый .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.
Просто установите флаг в значение true, когда запускаются события onmove.Если происходит событие mouseup и флаг имеет значение true, форма перестает перемещаться.
Я признаю, что это, вероятно, не сработает в случае, если пользователь перемещает форму с помощью клавиатуры, но это довольно редко.
У меня была та же проблема с пользовательским элементом управления, но у него нет события ResizeEnd.Решение, которое сработало, состоит в том, чтобы переопределить метод WndProc и прослушивать EXITSIZEMOVE.
См. пример здесь
Я протестировал событие ResizeChanged, и оно работает нормально, однако я не знаю связи между перемещением и изменением размера, но у меня оно работает.