禁用双击winform按钮

时间:2013-11-11 12:04:09

标签: c# winforms

我在C#.Net中开发了一个Windows窗体应用程序。应用程序中有多种形式。主要形式说frmA有一个按钮说btnA。点击btnA后,新表格打开frmB打开,frmA落后于frmB。 frmB还有一个按钮,说btnB和frmB上btnB的位置(位置)与frmA上的btnA完全相同。点击btnB后,会发生一些不同的动作。

现在我的问题是一些应用程序用户双击btnA。我连续两次点击一下。首次单击btnA,将使用btnB打开frmB。第二次单击立即在btnB上执行,实际上用户甚至无法看到frmB。

我的约束是我无法更改任何表单上按钮的位置。无论如何我能处理这个问题吗?

8 个答案:

答案 0 :(得分:1)

尝试将新形式发挥到不同的位置。

据我所知,用户在第一次点击时会触发frmB 并在“第二次点击”上按下btnB

这不是双击。

这是两次不同的点击 尝试这样的事情:

Form2 form=new Form2();  
form.StartPosition = FormStartPosition.Manual;  
form.Location=new Point(0, 10);  
form.Show(); 

答案 1 :(得分:1)

将btnB.Enabled设置为false并使用以下代码。这将延迟点击按钮半秒的可能性。

public partial class frmB : Form
{
    private Timer buttonTimer = new Timer();

    public frmB()
    {
        InitializeComponent();
        buttonTimer.Tick += new EventHandler(buttonTimer_Tick);
        buttonTimer.Interval = 500;
    }

    private void frmB_Shown(object sender, EventArgs e)
    {
        buttonTimer.Start();
    }

    void buttonTimer_Tick(object sender, EventArgs e)
    {
        btnB.Enabled = true;
        buttonTimer.Stop();
    }
}

答案 2 :(得分:0)

在第一次点击时禁用它,当用户再次打开格式时,启用它,或者来自forma to form b

this.button.enable=false;
按下按钮后立即

。 并在forma

的构造函数中再次写入
this.button.enable=true;

答案 3 :(得分:0)

我同意这个UI不友好但是如果你绝对无法改变按钮的位置或第二个窗体的打开位置,那么你需要停止第二次点击导致关闭frmB。最简单的方法是在打开formB时建立延迟,例如

public partial class FormB : Form
    {
        public FormB()
        {
            InitializeComponent();
            Thread.Sleep(2000);
        }
    }

答案 4 :(得分:0)

我会做一些技巧,如何更改cursor position。一旦用户点击btnA光标点将稍微移动,所以第二次点击不会点击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);

答案 5 :(得分: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()检查专门禁用了双击按钮。这将允许双击对其他控件(如ListBoxes等)起作用...

答案 6 :(得分:0)

在您自己的类中,继承基本控件并使用.SetStyle()方法禁用双击。以下代码不适用于Button,但它的工作方式应该相同:

public class MOBIcon : PictureBox
{
    public MOBIcon() : base()
    {
        this.SetStyle(ControlStyles.StandardDoubleClick, false);
    }
}

答案 7 :(得分:0)

启用和禁用按钮的问题是,如果您在单击事件中拥有的代码运行得如此之快,以至于在第二次单击双击操作之前该按钮被启用(某些用户不理解它只需要点击1)所以这是我的解决方案。

private const int waittime = 2;
private DateTime clickTime = DateTime.Now;

private void cmd_TimeStamp_Click(object sender, EventArgs e)
{
  if ((DateTime.Now - clickTime).Seconds < waittime)
    return;
  else
    clickTime = DateTime.Now;
  try
  {
    cmd_TimeStamp.Enabled = false;
    //Do some stuff in here
  }
  catch (Exception ex)
  {
    //Show error if any
    MessageBox.Show(this, ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
  }
  finally
  {
    cmd_TimeStamp.Enabled = true;
  }
}