1

C#.Net で Windows フォーム アプリケーションを開発しました。アプリケーションには複数のフォームがあります。メイン フォームは、frmA と言うと、btnA と言うプッシュ ボタンがあります。btnA をクリックすると、frmB という新しいフォームが開かれ、frmA は frmB の後ろに移動します。frmB にも btnB というプッシュ ボタンがあり、frmB 上の btnB の位置 (場所) は frmA 上の btnA の位置 (場所) とまったく同じです。btnB をクリックすると、いくつかの異なるアクションが実行されます。

今私の問題は、一部のアプリケーション ユーザーが btnA をダブルクリックすることです。シングルクリックが 2 回連続して発生します。btnA を最初に 1 回クリックすると、frmB が btnB で開かれます。2 回目のシングル クリックはすぐに btnB で実行され、事実上、ユーザーは frmB を見ることさえできません。

私の制約は、どちらのフォームでもボタンの位置を変更できないことです。この問題を処理できる方法はありますか?

4

8 に答える 8

0

IMessageFilter を使用して WM_LBUTTONDOWN メッセージを検出し、特定の時間しきい値内に発生した場合はそれらを抑制することができます。

public partial class Form1 : Form
{

    public Form1()
    {
        InitializeComponent();
        Application.AddMessageFilter(new DoubleClickSuppressser());
    }

    private void button1_Click(object sender, EventArgs e)
    {
        Form2 f2 = new Form2();
        f2.StartPosition = FormStartPosition.Manual;
        f2.Location = this.Location;
        f2.Show();
    }

    private void listBox1_MouseDoubleClick(object sender, MouseEventArgs e)
    {
        Console.WriteLine("listBox1 DoubleClick");
    }

}

public class DoubleClickSuppressser : IMessageFilter
{

    private int difference;
    private DateTime Last_LBUTTONDOWN = DateTime.MinValue;
    private const int WM_LBUTTONDOWN = 0x201;

    public bool PreFilterMessage(ref Message m)
    {
        switch (m.Msg)
        {
            case WM_LBUTTONDOWN:
                if (Control.FromHandle(m.HWnd) is Button)
                {
                    if (!Last_LBUTTONDOWN.Equals(DateTime.MinValue))
                    {
                        difference = (int)DateTime.Now.Subtract(Last_LBUTTONDOWN).TotalMilliseconds;
                        Last_LBUTTONDOWN = DateTime.Now;
                        if (difference < System.Windows.Forms.SystemInformation.DoubleClickTime)
                        {
                            return true;
                        }
                    }
                    Last_LBUTTONDOWN = DateTime.Now;
                }
                break;
        }
        return false;
    }

}

Control.FromHandle() チェックを使用して、ボタンのダブルクリックのみを無効にしたことに注意してください。これにより、リストボックスなどの他のコントロールでダブルクリックが機能するようになります...

于 2013-11-11T14:08:18.480 に答える
0

私はいくつかのトリックを行いcursor positionます. ユーザーが btnA をクリックすると、カーソル ポイントが少し移動するため、2 回目のクリックは btnB にヒットしません。

this.Cursor = new Cursor(Cursor.Current.Handle);
Cursor.Position = new Point(Cursor.Position.X - 50, Cursor.Position.Y - 50);
Cursor.Clip = new Rectangle(this.Location, this.Size);
于 2013-11-11T13:41:54.993 に答える
0

この UI が使いにくいことに同意しますが、ボタンの位置または 2 番目のフォームの開いている位置を絶対に変更できない場合は、frmB を閉じる原因となる 2 番目のクリックを停止する必要があります。最も簡単な方法は、formB を開くときに遅延を組み込むことです。

public partial class FormB : Form
    {
        public FormB()
        {
            InitializeComponent();
            Thread.Sleep(2000);
        }
    }
于 2013-11-11T12:33:43.293 に答える