8

Windows CE 上で動作する .NET Compact Framework 3.5 を対象とする C# で記述されたアプリケーションがあります。ときどき、1 秒程度の操作が UI スレッドで実行されます。私は現在Cursor.Current、アプリケーションがビジーであることを示すようにプロパティを設定していますが、これは熱心なユーザーがキューに入れようとするマウス イベントを妨げません。これにより、意図しないクリックが発生することがあります。

.NET Compact Framework プラットフォームでキューに入れられたマウス メッセージを無視する最善の方法は何ですか? 残念ながら、コードは UI スレッドで実行する必要があります。

4

2 に答える 2

8

特に調整されていないタッチスクリーンを使用している場合、ユーザーが約50ミリ秒で別のクリックに忍び込むことができることが私のPOSアプリケーションからわかったので、コントロールを無効にしても役に立ちません.

これが作成する問題の 1 つは、請求書を作成するときです。現在の請求書をクリアする前に 50 ミリ秒の遅延があるという理由だけで、重複したクリックで別の請求書を作成することはできません。

このような場合、次のようなパターンを使用します。

    public static void ClearMouseClickQueue()
    {
        Message message;
        while (PeekMessage(out message,IntPtr.Zero, (uint) MessageCodes.WM_MOUSEFIRST,(uint) MessageCodes.WM_MOUSELAST,1) != 0)
        {    
        }
    }

    private object approvalLockObject = new object();

    private void btnApproveTransaction_Click(object sender, EventArgs e)
    {
        ApproveTransactionAndLockForm();
    }

    private void ApproveTransactionAndLockForm()
    {
        lock (approvalLockObject)
        {
            if (ApprovalLockCount == 0)
            {
                ApprovalLockCount++;
                ApproveTransaction();
            }
            else
            {
                CloseAndRetry();
            }
        }
    }

    private void ApproveTransaction()
    {
        ClearMouseClickQueue();

        this.Enabled = false;

        Logger.LogInfo("Before approve transaction");

        MouseHelper.SetCursorToWaitCursor();

        ... validate invoice and print
    }

画面を再度有効にする必要がある場合は、次のようにします。

            this.Enabled = true;

            ApprovalLockCount = 0;

            DialogResult = DialogResult.None;
于 2009-03-23T09:22:23.843 に答える
0

最善の解決策は、イベントが発生しないようにすることだと思います。時間のかかる操作が終了したら、すべてのコントロールを無効にしてから再度有効にすることで、これを行うことができます。

于 2009-03-23T08:43:40.240 に答える