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

Electron 如何使电子托盘点击事件可靠工作?,electron,atom-editor,Electron,Atom Editor,在我的OSX Electron应用程序中,我有一个托盘图标,我想在打开和关闭Electron应用程序窗口之间切换。与单击OSX Dropbox托盘图标将打开和关闭Dropbox托盘菜单的方式类似,无论您单击托盘图标的速度有多快 以下是我正在使用的代码: tray.on('click', function(e){ if (mainWindow.isVisible()) { mainWindow.hide() } else { mainWindow.sho

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

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

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

如果您缓慢地单击(在单击之间等待一秒钟),则此操作有效。但是,如果您在一秒钟内重复单击超过1x次,则单击失败,并且什么也没有发生。我在文档中找不到任何类型的延迟。关于发生了什么以及如何使单击事件可靠地工作,您有什么想法吗?

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

托盘
显示与单击相关的3个事件:
单击
双击
右键单击

如果您使用
右键单击
事件,则不会出现此问题,您可以随心所欲地快速单击,每次都会调用回调

例如,macOS处理此事件的电子代码为:

-(void)rightMouseUp:(NSEvent*)事件{
trayIcon_u2;->右键单击(
[自获取边界事件:事件],
ui::EventFlagsFromModifiers([event modifierFlags]);
}
对于每一次右键单击,他们都会触发
右键单击
事件,仅此而已

现在,如果我们看一下左键单击的处理方式,会有一些不同:

-(void)mouseUp:(NSEvent*)事件{
// ...
//截断为仅显示相关部分。。。
// ...
//单击事件。
如果(event.clickCount==1)
trayIcon_uuz->NotifyClicked(
[自获取边界事件:事件],
ui::EventFlagsFromModifiers([event modifierFlags]);
//双击事件。
如果(event.clickCount==2)
trayIcon_uux->notify双击(
[自获取边界事件:事件],
ui::EventFlagsFromModifiers([event modifierFlags]);
[自我设置需要显示:是];
}
多次单击托盘图标时,
事件.clickCount
并不总是返回1。相反,它返回一个计算单击次数的值

因此,当您快速单击托盘图标时,
event.clickCount
的值将大于
2
,并且它们仅在值为
1
2
时才会发出事件,如果不是这样,它们没有任何回退,它们根本不会发出任何事件。这就是您在测试中看到的结果,单击足够快


因此,如果不亲自修改Electron实现,提交问题或请求,您目前无法避免这种行为。

Electron 3.0引入了一种API,可防止等待双击

// Ignore double click events for the tray icon
tray.setIgnoreDoubleClickEvents(true)
“设置忽略双击事件的选项。忽略这些事件允许您检测托盘图标的每次单击。默认情况下,此值设置为false。”

|