在我的OSX Electron应用程序中,我有一个托盘图标,我想在打开和关闭Electron应用程序窗口之间切换。类似于点击OSX Dropbox托盘图标将打开和关闭Dropbox托盘菜单,无论您多快点击托盘图标。
以下是我正在使用的代码:
tray.on('click', function(e){
if (mainWindow.isVisible()) {
mainWindow.hide()
} else {
mainWindow.show()
}
});
如果你慢慢点击(在点击之间等待一秒),这是有效的,但如果你反复点击,一秒钟内超过1倍,点击失败并且没有任何反应。我在文档中找不到任何类型的延迟。关于发生了什么以及如何使点击事件可靠地工作的任何想法?
答案 0 :(得分:17)
您所描述的问题很容易重现。您获得的结果不是错误或错误的实现,但这是关于当前Electron在托盘元素上处理这些点击事件的预期结果。
班级Tray
公开了相对于点击的3个事件:click
,double-click
和right-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。”