web-dev-qa-db-ja.com

Electronトレイクリックイベントを確実に機能させるにはどうすればよいですか?

私のOSXElectronアプリには、Electronアプリウィンドウの開閉を切り替えるトレイアイコンがあります。 OSX Dropboxトレイアイコンをクリックすると、トレイアイコンをクリックした速度に関係なく、Dropboxトレイメニューが開いたり閉じたりするのと同じです。

これが私が使用しているコードです:

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

これは、ゆっくりクリックすると(クリックの間に1秒待つ)機能しますが、1秒間に1回以上繰り返しクリックすると、クリックが失敗し、何も起こりません。ドキュメントに遅延のタイプは見つかりませんでした。何が起こっているのか、クリックイベントを確実に機能させる方法についてのアイデアはありますか?

23
AnApprentice

Electron 3.0は、ダブルクリックを待たないようにするAPIを導入しました。

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

「ダブルクリックイベントを無視するオプションを設定します。これらのイベントを無視すると、トレイアイコンの個々のクリックをすべて検出できます。この値はデフォルトでfalseに設定されています。」

関連ドキュメント | Electron 3.0のリリースノート

4
aguynamedben

あなたが説明している問題は簡単に再現できます。あなたが得ている結果はあなたの側のバグや間違った実装ではありませんが、それはElectronがトレイ要素でこれらのクリックイベントを処理している現在の方法に関して期待される結果です。

クラスTrayは、クリックに関連する3つのイベントclickdouble-click、およびright-clickを公開します。

right-clickイベントを使用する場合、この問題は発生しません。必要なだけ速くクリックでき、毎回コールバックが呼び出されます。

たとえば、このイベントを処理するためのmacOSのElectronコードは 以下

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

右クリックするたびに、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];
}

トレイアイコンが複数回クリックされた場合、event.clickCountは常に1を返すとは限りません。代わりに、クリックされた回数をカウントする値を返します。

したがって、トレイアイコンを非常に速くクリックすると、event.clickCountの値は2より大きくなり、値が1または2の場合にのみイベントが発行されます。そうでない場合、フォールバックはありません。それらは単にイベントを発行しません。これは、十分に速くクリックしたときにテストで表示される結果です。

したがって、Electronの実装を自分で変更したり、問題やプルリクエストを送信したりしない限り、現時点ではこの動作を回避することはできません。

17
HiDeo