Вы можете пропустить ожидающие клики, очистив очередь сообщений Windows с помощью
Application.DoEvents ();
Мы используем следующий пользовательский класс Event для решения вашей проблемы (предотвращение нескольких кликов и отображение курсора ожидания при необходимости):
using System;
using System.Windows.Forms;
public sealed class Event {
bool forwarding;
public event EventHandler Action;
void Forward (object o, EventArgs a) {
if ((Action != null) && (!forwarding)) {
forwarding = true;
Cursor cursor = Cursor.Current;
try {
Cursor.Current = Cursors.WaitCursor;
Action(o, a);
} finally {
Cursor.Current = cursor;
Application.DoEvents();
forwarding = false;
}
}
}
public EventHandler Handler {
get {
return new EventHandler(Forward);
}
}
}
Вы можете убедиться, что он работает, в следующем примере (Консоль выводит щелчок, только если HandleClick завершил работу):
using System;
using System.Threading;
using System.Windows.Forms;
class Program {
static void HandleClick (object o, EventArgs a) {
Console.WriteLine("Click");
Thread.Sleep(1000);
}
static void Main () {
Form f = new Form();
Button b = new Button();
//b.Click += new EventHandler(HandleClick);
Event e = new Event();
e.Action += new EventHandler(HandleClick);
b.Click += e.Handler;
f.Controls.Add(b);
Application.Run(f);
}
}
Чтобы воспроизвести вашу проблему, измените приведенный выше код следующим образом (Консоль выводит все клики с задержкой):
b.Click += new EventHandler(HandleClick);
//Event e = new Event();
//e.Action += new EventHandler(HandleClick);
//b.Click += e.Handler;
Класс Event можно использовать для каждого элемента управления, отображающего события EventHandler (Button, MenuItem, ListView, ...).
С уважением,
Тамберг