3

winform のコード ビハインド ファイルでこれを実行中に問題が発生しました。

// Waiting Cursor + disabling form
Cursor = Cursors.WaitCursor;
this.Enabled = false;

// Synchronous method
SomeWork();

// Re-enabling form
Cursor = Cursors.Default;
this.Enabled = true;

現在の動作

たとえば、ボタンをクリックするとSomework()、フォームを再度有効にした後、ボタンに関連付けられたメソッドが実行されます。

予想される動作

フォームが無効になっている間、フォームからユーザーのクリックイベントを保存することは期待していません。

質問

フォームのClicking キャッシュを空にする方法はありますか (フォームを再度有効にする前に行うように) ?

重要な編集

考えられる簡単な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) ;
}

ただし、マウスの左クリックを無効にして再度有効にしても、マウスバッファは空になりません...

4

1 に答える 1

1

問題は、プロセスが同じスレッドで実行されているため、プロセスが実行を開始する前にフォームが実際に無効にならないことです。プロセスを開始する前に Application.DoEvents() を使用してすべてを無効に設定するのが簡単ですが、より専門的な (おそらくより安全な) 方法は、時間のかかるプロセスを別のスレッドで実行することです。

注:私自身のプログラミングで別の問題が発生した後、すべてを再度有効にする前に Application.DoEvents() を実行する必要がある場合があることがわかりました-プロセスが完了するのを待つ代わりに、無効になっているコントロールでユーザーが行ったクリックが発生します完了 - コントロールを有効にしてから、クリックを発射します。

明らかに DoEvents は面倒なので、スレッドを使用する必要があります。

于 2013-07-30T22:11:09.677 に答える