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

问题描述 投票:21回答:2

在我的OSX电子应用程序我有,我想打开和关闭电子应用程序窗口之间切换托盘图标。类似如何在OSX Dropbox的托盘图标点击后会打开和关闭Dropbox的托盘菜单,无论你如何快速单击托盘图标。

下面是我使用的代码:

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

这工作,如果你单击慢(等待点击之间的第二),但是如果你反复点击,比1个多的第二,点击失败,并没有任何反应。我找不到任何类型的文档延误。什么任何想法是怎么回事,以及如何使click事件的可靠工作?

electron atom-editor
2个回答
2
投票

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

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

“设置忽略双击事件的选项。忽视这些事件允许您检测托盘图标的每个人点击。该值默认设置为false。”

Related Docs | Release Notes for Electron 3.0


17
投票

您所描述的问题很容易繁殖。你得到的结果是不是一个错误或者在你身边一个错误的实现,但它是关于当前电子方式受理的托盘元素这些点击的事件预期的结果。

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更大,当值12他们只发出一个事件,如果不是的话,他们没有任何回落,他们根本就没有发出任何事件。这就是你在你的测试一下速度不够快时,看到的结果。

因此,没有自己修改电子执行,提交问题或拉入请求,你不能在此刻避免这种行为。

© www.soinside.com 2019 - 2024. All rights reserved.