如何使电子托盘点击事件可靠地工作?

时间:2016-07-05 00:38:55

标签: electron atom-editor

在我的OSX Electron应用程序中,我有一个托盘图标,我想在打开和关闭Electron应用程序窗口之间切换。类似于点击OSX Dropbox托盘图标将打开和关闭Dropbox托盘菜单,无论您多快点击托盘图标。

以下是我正在使用的代码:

  tray.on('click', function(e){
    if (mainWindow.isVisible()) {
      mainWindow.hide()
    } else {
      mainWindow.show()
    }
  });

如果你慢慢点击(在点击之间等待一秒),这是有效的,但如果你反复点击,一秒钟内超过1倍,点击失败并且没有任何反应。我在文档中找不到任何类型的延迟。关于发生了什么以及如何使点击事件可靠地工作的任何想法?

2 个答案:

答案 0 :(得分:17)

您所描述的问题很容易重现。您获得的结果不是错误或错误的实现,但这是关于当前Electron在托盘元素上处理这些点击事件的预期结果。

班级Tray公开了相对于点击的3个事件:clickdouble-clickright-click

如果您使用right-click事件,则不会遇到此问题,您可以根据需要快速点击,每次都会调用回调。

用于处理此事件的macOS的电子代码是the following

- (void)rightMouseUp:(NSEvent*)event {
  trayIcon_->NotifyRightClicked(
    [self getBoundsFromEvent:event],
    ui::EventFlagsFromModifiers([event modifierFlags]));
}

对于每次右键单击,他们都会触发right-click事件,就是这样。

现在,如果我们看看如何处理左键点击,the code略有不同:

- (void)mouseUp:(NSEvent*)event {

  // ...
  // Truncated to only show the relevant part...
  // ...

  // Single click event.
  if (event.clickCount == 1)
    trayIcon_->NotifyClicked(
        [self getBoundsFromEvent:event],
        ui::EventFlagsFromModifiers([event modifierFlags]));

  // Double click event.
  if (event.clickCount == 2)
    trayIcon_->NotifyDoubleClicked(
        [self getBoundsFromEvent:event],
        ui::EventFlagsFromModifiers([event modifierFlags]));

  [self setNeedsDisplay:YES];
}

多次单击托盘图标时,event.clickCount并不总是返回1.而是返回一个计算点击次数的值。

因此,当您非常快速地点击托盘图标时,event.clickCount的值将大于2,并且当值为1或{时,它们仅发出事件{1}}如果不是这样,他们没有任何后备,他们只是不发出任何事件。这是你在测试中看到的足够快的点击结果。

因此,如果不自行修改Electron实现,提交问题或提取请求,您现在就无法避免此行为。

答案 1 :(得分:1)

Electron 3.0引入了防止等待双击的API。

// Ignore double click events for the tray icon
tray.setIgnoreDoubleClickEvents(true)

“设置忽略双击事件的选项。忽略这些事件可让您检测到托盘图标的每一次单击。默认情况下,此值设置为false。”

Related Docs | Release Notes for Electron 3.0