【问题标题】:System Tray Icon Double / Single Click Issue系统托盘图标双击/单击问题
【发布时间】:2014-05-04 14:49:59
【问题描述】:

我创建了系统托盘图标并添加了两次单击事件双击,单击。我试过鼠标点击和正常点击。

    SysTray.MouseClick += new MouseEventHandler(SysTray_MouseClick);
    SysTray.MouseDoubleClick += new MouseEventHandler(SysTray_MouseDoubleClick);

    void SysTray_MouseClick(object sender, MouseEventArgs e)
    {
        SingleClick = true;

        if (e.Button == MouseButtons.Left)
        {
            System.Threading.Thread.Sleep(300);
            if (SingleClick)
            {
                //To Do
            }
        }
    }

    void SysTray_MouseDoubleClick(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left)
        {
            SingleClick = false;
            System.Threading.Thread.Sleep(20);
            //To Do 
        }
    }

如果我双击系统托盘图标,它将自动执行单击图标。

如何解决双击/单击问题

【问题讨论】:

  • 双击总是从单击开始。如果用户点击的速度足够快,那么第二次点击就会变成双击。您将需要在您的 UI 设计中适应这一点。一个愚蠢的技巧是在 MouseClick 事件中启动 Timer。在双击事件处理程序中停止计时器,使用 Tick 事件进行单击动作。然而,这效果不佳,因为用户不会理解为什么他的点击响应如此缓慢。请改用上下文菜单。

标签: c# .net system-tray


【解决方案1】:

我知道这已经有一段时间了,但我只是使用计时器解决了这个问题:

Timer singleClickTimer = new Timer();

private void trayIcon_MouseClick(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left)
    {
        // Give the double-click a chance to cancel this
        singleClickTimer.Interval = (int) (SystemInformation.DoubleClickTime * 1.1);
        singleClickTimer.Start();
    }
}

private void singleClickTimer_Tick(object sender, EventArgs e)
{
    singleClickTimer.Stop();

    // do single click here
}

private void trayIcon_MouseDoubleClick(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left)
    {
        // Cancel the single click
        singleClickTimer.Stop();

        // do double click here
    }
}

【讨论】:

    【解决方案2】:

    就像汉斯在评论中所说的那样。双击总是从单击开始。所以我向您介绍我的解决方案之一

    在你的类中,创建一个布尔值。

     bool click=false;
    

    然后为方法。

     void SysTray_MouseClick(object sender, EventArge e)
         {
            click=true;
            System.Threading.Thread.Sleep(300);//Test with this amount!!
            if(click)
              {
                //codes go here
              }
         }
     void Systray_DoubleClick(object sender , EventArge e)
         {
            System.Threading.Thread.Sleep(20);//This too!
            click=false; // If it is doubleclick cancel the single click event.
            //codes go here.
         }
    

    主要概念是如果是双击取消单击事件。我运行秒表,双击应该需要 200-350 毫秒。所以调整你想要的时间。但另一方面。更多时间 = 代码处理速度越慢

    编辑:这个逻辑让我头疼!!我最终得到了这段代码,试试吧。

    【讨论】:

    • void SysTray_MouseClick(object sender, MouseEventArgs e) { SingleClick = true; System.Threading.Thread.Sleep(1000); if (SingleClick && e.Button == MouseButtons.Left) { // 代码 } } void SysTray_MouseDoubleClick(object sender, MouseEventArgs e) { SingleClick = false; if (e.Button == MouseButtons.Left) { //代码 } }
    • 它怎么不工作,请把上面的代码编辑你的问题。 1000也太多了。你会希望它在 200-350 左右相信我。
    • 我尝试了 100 到 1000 毫秒,但每次执行单击然后双击
    • @KalpeshChhatrala 看到我的新编辑,对不起,那是我的就寝时间
    • 我更新了有问题的代码,但仍然无法正常工作
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-14
    • 1970-01-01
    • 1970-01-01
    • 2014-02-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多