【问题标题】:Distinguishing between Click and DoubleClick events in C#区分 C# 中的 Click 和 DoubleClick 事件
【发布时间】:2021-09-22 21:14:10
【问题描述】:

我目前有一个 NotifyIcon 作为 Windows 窗体应用程序的一部分。我想让表单在双击图标时显示/隐藏,并在单击时显示气球提示。我有两个功能分开工作,但我找不到让应用程序区分单击和双击的方法。现在,它将双击视为两次单击。

如果检测到第二次点击,有没有办法阻止单击事件?

【问题讨论】:

  • win表单应用中有鼠标双击事件!您可以有两个事件,一个用于鼠标单击,另一个用于鼠标双击并在那里处理单独的逻辑。
  • 这正是我现在正在做的事情,但是即使我双击,click 事件处理程序也会触发。
  • 这只是处于调试模式还是运行模式?如果它处于调试模式并且您在单击事件中设置了断点,则调试器将不会等待您的双击。如果是这种情况,请尝试从单击事件中删除断点并将其设置在双击事件中
  • 可以通过处理MouseDown事件和使用定时器来实现。这是一篇关于它的文章:msdn.microsoft.com/en-us/library/ms171543(v=vs.110).aspx
  • 使用 Windows 10 上的通知图标,我只能点击开始工作。

标签: c# winforms events


【解决方案1】:

不幸的是,MouseClick 事件的建议处理不适用于 NotifyIcon 类 - 在我的测试中,e.MouseClicks 始终为 0,这也可以从 reference source 中看出。

我看到的相对简单的方法是通过使用表单级别标志、async 处理程序和Task.Delay 来延迟Click 事件的处理:

bool clicked;

private async void OnNotifyIconClick(object sender, EventArgs e)
{
    if (clicked) return;
    clicked = true;
    await Task.Delay(SystemInformation.DoubleClickTime);
    if (!clicked) return;
    clicked = false;
    // Process Click...
}

private void OnNotifyIconDoubleClick(object sender, EventArgs e)
{
    clicked = false;
    // Process Double Click...
}

唯一的缺点是在我的环境中,Click 的处理延迟了半秒(DoubleClickTime 是 500 毫秒)。

【讨论】:

  • 简单、优雅、有效的解决方案。
【解决方案2】:

有 2 种不同类型的事件。

单击/双击

鼠标单击/鼠标双击

前 2 次仅传入 EventArgs,而第二次传入 MouseEventArgs,这可能允许您确定事件是否为双击。

所以你可以做类似的事情;

obj.MouseClick+= MouseClick;
obj.MouseDoubleClick += MouseClick;
// some stuff

private void MouseClick(object sender, MouseEventArgs e)
{
    if(e.Clicks == 2) { // handle double click }
}

【讨论】:

    【解决方案3】:

    注册一个Click 事件然后处理单击和双击就足够了。

        int clickCount;
        async void NotifyIcon_Click( object sender, EventArgs e ) {
            if( clickCount > 0 ) {
                clickCount = 2;
                return;
            }
            clickCount = 1;
            await Task.Delay( SystemInformation.DoubleClickTime );
    
            if( clickCount == 1 ) {
                // Process single click ...
            } else if( clickCount == 2 ) {
                // Process double click ...
            }
            clickCount = 0;
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-21
      • 2011-06-07
      • 2017-01-26
      • 1970-01-01
      相关资源
      最近更新 更多