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

AnA*_*ice 22 atom-editor electron

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

这是我正在使用的代码:

  tray.on('click', function(e){
    if (mainWindow.isVisible()) {
      mainWindow.hide()
    } else {
      mainWindow.show()
    }
  });
Run Code Online (Sandbox Code Playgroud)

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

HiD*_*Deo 17

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

这个类Tray相对暴露3个事件点击:click,double-clickright-click.

如果您使用该right-click活动,则不会遇到此问题,您可以根据需要快速点击,每次都会收到回叫.

例如,用于处理此事件的macOS的电子代码如下:

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

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

现在,如果我们看看如何处理左键单击,代码会略有不同:

- (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];
}
Run Code Online (Sandbox Code Playgroud)

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

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

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


agu*_*ben 12

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

// Ignore double click events for the tray icon
tray.setIgnoreDoubleClickEvents(true)
Run Code Online (Sandbox Code Playgroud)

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

相关文档| Electron 3.0 发行说明