質問編集履歴

1 コンテキストメニューは無関係でした。

workr

workr score 158

2017/03/10 19:54  投稿

Electronアプリでウィンドウが非アクティブな状態でもマウスイベントを受け取りたい
Electron 1.4.15 でフレームやタイトルバーのないウィンドウを使ったWindows/Mac兼用のデスクトップアプリケーションを作っています。(frame: false)
フレームのないウィンドウをマウスで移動させる場合、一般的には -webkit-app-region: drag を使って行うことになるかと思いますが、Windows ではコンテキストメニューとの併用ができなくなるため自分でマウスの座標を拾って実装することにしました。
移動処理は次のようにしました。
```Javascript
var self = this;
this.browserWindow = remote.getCurrentWindow();
window.addEventListener('mousedown', function(e){
   if(e.button != 0) return;
   self.mouseX = e.clientX;
   self.mouseY = e.clientY;
   self.dragging = true;
});
window.addEventListener('mousemove', function(e){
   if(!self.dragging || e.button != 0) return;
   var x = e.screenX - self.mouseX;
   var y = e.screenY - self.mouseY;
   self.browserWindow.setPosition(x, y);
});
window.addEventListener('mouseup', function(e){
   if(e.button != 0) return;
   self.dragging = false;
});
```
一応移動はできるのですが Mac(OS X 10.11) で実行すると別のアプリケーションのウィンドウがアクティブのときにドラッグ操作を行おうとしても無反応で、一旦クリックしてアクティブな状態にしてからでないとドラッグ操作に反応しません。
コンテキストメニューに関してもウィンドウがフォーカスされていない状態では右クリックに反応しません。Atom などの Electron 系アプリでは非アクティブな状態でも右クリックでコンテキストメニューが出るようなのでどうにかすればできそうではあります。
この2つの問題は同じ原因のように思えます。常に最前面に表示する状態ならちゃんと反応するので、何らかの方法で browserWindow.focus() することで解消できるのかもしれませんが何か良い方法は無いでしょうか?
常に最前面に表示する状態ならちゃんと反応するので、何らかの方法で browserWindow.focus() することで解消できるのかもしれませんが何か良い方法は無いでしょうか?
  • JavaScript

    35078 questions

    JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

  • Node.js

    4240 questions

    Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

  • Electron

    362 questions

    Electronは、HTML5とNode.jsというWebの技術を用いてデスクトップアプリケーションを作成できるクロスプラットフォームな実行環境です。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る