Очистка буфера мыши в C#
У меня есть проблема при выполнении этого в файле code-behind файла winform:
// Waiting Cursor + disabling form
Cursor = Cursors.WaitCursor;
this.Enabled = false;
// Synchronous method
SomeWork();
// Re-enabling form
Cursor = Cursors.Default;
this.Enabled = true;
Текущее поведение
Нажав на кнопку, например, во время Somework()
выполнит метод, связанный с кнопкой после повторного включения формы.
Ожидаемое поведение
Я не ожидаю от формы для хранения событий щелчка пользователя, пока форма отключена.
Вопрос
Есть ли способ очистить кеш кликов формы (чтобы я мог сделать это до повторного включения формы)?
ВАЖНОЕ РЕДАКТИРОВАНИЕ
Возможным простым решением было бы внедрение IMessageFilter
Интерфейс в коде позади формы. Отключение левого кажется простым с помощью этого PreFilterMessage
:
public bool PreFilterMessage(ref Message m)
{
// Blocks all the messages relating to the left mouse button.
return (m.Msg >= 513 && m.Msg <= 515) ;
}
Но, опять же, отключение и повторное включение левого щелчка мыши НЕ ПУСТАЕТ БУФЕР МЫШИ...
1 ответ
Проблема заключается в том, что процесс выполняется в том же потоке, поэтому форма фактически не отключается до запуска процесса. Легче всего было бы использовать Application.DoEvents(), чтобы принудительно отключить все перед запуском процесса, но более профессиональный (и, возможно, более безопасный) метод - запустить трудоемкий процесс в другом потоке.
ПРИМЕЧАНИЕ. После того, как я наткнулся на другую заминку в моем собственном программировании, я обнаружил, что вам, возможно, придется запустить Application.DoEvents(), прежде чем снова включить все - он будет запускать любые клики, сделанные пользователем на отключенных элементах управления, вместо того, чтобы ждать, пока процесс завершено - включение элементов управления - и ТОГО щелчок.
Очевидно, что DoEvents грязный, и я должен использовать потоки.