ユーザーがボタンをクリックすると、何らかのタスクが開始されます。メイン アプリケーション スレッドをブロックしたくないので、別のスレッドで実行します。ここで、タスクが完了するまでユーザーがボタンをクリックすることを禁止する必要があります。
設定できました
button.Enabled = false;
、しかし、クリックを無視する方法を探しています。
クリック イベント ハンドラーにいくつかのチェックを追加できます。
if (executingThread != null) return;
、しかし、悪い考えである各ハンドラーに対してそれを行う必要があります。
ユーザーのメッセージをフィルタリングする方法があることを知っています。これを行う方法を教えていただけますか?また、すべてのメッセージを除外したくありません。他のいくつかのボタンはクリック可能にしておく必要があるため、特定のコントロール (ボタン、グリッドなど) に来るメッセージを除外する必要があります。
解決
internal class MessagesFilter: IMessageFilter
{
private readonly IntPtr ControlHandler;
private const int WM_KEYUP = 0x0101;
public MessagesFilter(IntPtr ControlHandler)
{
this.ControlHandler = ControlHandler;
}
#region IMessageFilter Members
public bool PreFilterMessage(ref Message m)
{
// TODO: Add MessagesFilter.PreFilterMessage implementation
if (m.Msg == WM_KEYUP)
{
if (m.HWnd == ControlHandler)
{
Keys k = ((Keys) ((int) m.WParam));
if (k == Keys.Enter)
return true;
}
}
return false;
}
#endregion
}