三键鼠标点击C#?

时间:2011-02-16 09:43:59

标签: c# winforms mouseevent

MS-Word鼠标点击事件中用作:

  

单击 - 放置光标
  双击 - 选择单词
  三击 - 选择段落

在C#中,我可以处理单击和双击鼠标事件,但我想在 C#Windows TextBox 中处理Triple Mouse Click事件。

示例:

void textbox1_TripleClick()
{
    MessageBox.Show("Triple Clicked"); 
} 

5 个答案:

答案 0 :(得分:7)

看看这个: Mousebuttoneventargs.clickcount

我认为这应该涵盖它。

答案 1 :(得分:3)

DO THIS:

    private int _clicks = 0;
    private System.Windows.Forms.Timer _timer = new System.Windows.Forms.Timer();
    private void txtTextMessage_MouseUp(object sender, MouseEventArgs e)
    {
        _timer.Stop();
        _clicks++;
        if (_clicks == 3)
        {
            // this means the trip click happened - do something
            txtTextMessage.SelectAll();
            _clicks = 0;
        }
        if (_clicks < 3)
        {
            _timer.Interval = 500;
            _timer.Start();
            _timer.Tick += (s, t) =>
            {
                _timer.Stop();
                _clicks = 0;
            };
        }
    }

答案 2 :(得分:2)

您只需存储在该框中发生双击的时间。然后,在单击的处理程序中,检查双击发生的时间是否超过N毫秒(N = 300左右)。

在这种情况下,直接调用您的TripleClick()函数或为您派生一个新事件派生“TripleClickAwareTextBox”。

答案 3 :(得分:2)

我正在研究类似的C ++问题

首先,您需要了解事件是如何触发的,我将使用鼠标左键单击: - 点击一次 - &gt;触发了左键单击事件 - 双击 - &gt;左击双击事件

Windows仅支持您达到此级别。

对于三次点击,它实际上是双击后点击,中间时间足够小。因此,您需要做的是处理点击事件,检查之前是否有双击并触发三击事件。

虽然代码不同,但我就是这样做的:

  • 声明doubleClickTime&amp; doubleClickInterval存储我们上次双击&amp;点击之间的时间。
  • 声明tripleClickEventFired表示我们已经触发了一个事件(init为false)

<强>处理程序

点击处理程序

if ((clock() - doubleClickFiredTime) < doubleClickInterval)
    <fire triple click event>
    tripleClickFired = true;
else
    <fire click event>

双击处理程序

doubleClickTime == clock()
doubleClickInterval == GetDoubleClickTime() * CLOCKS_PER_SEC / 1000;

If ( !tripleClickEventFired)
    <fire doubleClickEvent>
else
    tripleClickEventFired = false;

我使用的功能是:

  • clock():获取UNIT中的当前系统时间
  • GetDoubleClickTime():Windows提供的功能,用于获取点击之间的时间
  • “* CLOCKS_PER_SEC / 1000;” part用于将GetDoubleClickTime()的返回值转换为UNIT'''

注意:第三次点击会在系统级别触发点击和双击事件

答案 4 :(得分:0)

我修改了Jimmy T的答案,将代码封装到一个类中,并使其更易于应用于表单上的多个控件。

班级是这个:

    using System.Windows.Forms;

    public class TripleClickHandler
    {
        private int _clicks = 0;
        private readonly System.Windows.Forms.Timer _timer = new System.Windows.Forms.Timer();
        private readonly TextBox _textBox;
        private readonly ToolStripTextBox _toolStripTextBox;

        public TripleClickHandler(TextBox control)
        {
            _textBox = control;
            _textBox.MouseUp += TextBox_MouseUp;
        }
        public TripleClickHandler(ToolStripTextBox control)
        {
            _toolStripTextBox = control;
            _toolStripTextBox.MouseUp += TextBox_MouseUp;
        }
        private void TextBox_MouseUp(object sender, MouseEventArgs e)
        {
            _timer.Stop();
            _clicks++;
            if (_clicks == 3)
            {
                // this means the trip click happened - do something
                if(_textBox!=null)
                    _textBox.SelectAll();
                else if (_toolStripTextBox != null)
                    _toolStripTextBox.SelectAll();
                _clicks = 0;
            }
            if (_clicks < 3)
            {
                _timer.Interval = 500;
                _timer.Start();
                _timer.Tick += (s, t) =>
                {
                    _timer.Stop();
                    _clicks = 0;
                };
            }
        }
    }

然后,将其应用于文本框,您可以执行以下操作:

partial class MyForm : Form
{
    UIHelper.TripleClickHandler handler;
    public MyForm()
    {
        InitializeComponent();
        handler = new UIHelper.TripleClickHandler(myTextBox);
    }
}

或者,如果您不使用控件的标记,则只需执行以下操作:

partial class MyForm : Form
{
    public MyForm()
    {
        InitializeComponent();
        myTextBox.Tag = new UIHelper.TripleClickHandler(myTextBox);
    }
}