События флеш-кликов в C#

Если кнопка запускает длинную задачу, вы, вероятно, не хотите, чтобы пользователь мог снова нажать кнопку (или, возможно, ничего в приложении), пока задача не завершится. Следующий код показывает прямую попытку запретить пользователю щелкнуть кнопку, пока ее код все еще выполняется.

Когда запускается обработчик событий, он отключает кнопку. Затем он выполняет свою работу и снова включает кнопку.

К сожалению, этот подход не работает. Windows очень успешно ставит в очередь любые ожидающие события мыши, включая клики, когда ваша программа занята, а затем доставляет их, когда обработчик событий заканчивается, чтобы вы могли получить второй клик. (Я мог бы поклясться, что этот подход использовался для работы.)

Один из способов: использовать BackgroundWorker или другую технологию потоков для выполнения работы над отдельным потоком. Отключите кнопку, а затем запустите поток. Когда нить закончится, снова включите кнопку. Этот метод работает и может иметь другие преимущества (например, позволяя пользователю взаимодействовать с другими частями программы, пока задача кнопки все еще работает), но это немного круговое движение.

Другой подход заключается в использовании функции API PeekMessage, как показано в следующем коде.

Этот код содержит кучу деклараций для функции API и ее параметров. (Вам также нужно добавить с помощью операторов для пространств имен System.Runtime.InteropServices и System.Security. Загрузите пример для деталей.)

Метод FlushMouseMessages вызывает PeekMessage, чтобы он отклонил любое сообщение в диапазоне WM_MOUSELAST до PM_REMOVE. Код вызывает PeekMessage несколько раз, пока не вернет false, чтобы указать, что таких сообщений нет.

Следующий обработчик событий кнопки вызывает FlushMouseMessage, поэтому вы не можете нажать кнопку, пока код еще не запущен.

Источник: http://csharphelper.com/blog/2015/08/flush-click-events-in-c/

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)

Add a Comment

Ваш e-mail не будет опубликован. Обязательные поля помечены *