win-mouseが使えない話
未解決です
はじめに
Electronでウィジェットを作ってる時に画面全体をドラッグで移動+クリックで別の動作をしたいみたいな事例
まず普通にElectron側
フレームなしの背景透過状態にする
1"use strict";
2
3const electron = require("electron");
4const app = electron.app;
5
6const BrowserWindow = electron.BrowserWindow;
7let mainWindow;
8
9app.on("window-all-closed", function() {
10 if (process.platform != "darwin") {
11 app.quit();
12 }
13});
14
15app.on("ready", function() {
16 mainWindow = new BrowserWindow({
17 width: 400,
18 height: 600,
19 transparent: true,
20 frame: false,
21 });
22
23 mainWindow.loadURL("file://" + __dirname + "/index.html");
24 mainWindow.openDevTools();
25
26 mainWindow.on("closed", function() {
27 mainWindow = null;
28 });
29});
次にhtml側
1<!DOCTYPE html>
2<html lang="ja">
3<head>
4 <meta charset="utf-8">
5 <title>ほげ</title>
6 <style>
7 html, body{
8 margin: 0;
9 padding: 0;
10 width: 100%;
11 height: 100%;
12 }
13 body{
14 -webkit-app-region: drag;
15 -webkit-user-select: none;
16 }
17 </style>
18</head>
19<body>
20 なんか適当にコンテンツ
21</body>
22</html>
みたいな感じで開発すると中に置いたコンテンツをドラッグすることでウィンドウを移動させることが出来る
部分的に解除する(ボタンとか)場合はその要素に
1.button{
2 -webkit-app-region: no-drag;
3}
することでその部分だけ対象から外すことが出来る
でもデスクトップマスコット的な画面全体でドラッグさせたいしクリック等イベントを取りたい時が困る
dragを有効にしてしまうとクリックイベントやマウスオーバーのイベントが全部取られてしまうので検知できなくなってしまう
issueにもある通り一応他にも困ってる人がいた
ただ自作しろ的オチしかないので困る
探してたら
というパッケージを見つけて良さ気なので入れてみたけど前提パッケージのwin-mouseが上手く動かず失敗した
一応トライしたことメモ
- Could not locate the bindings file. Tried:
ファイルがズラーっと出る
bindings/bindings.js
の76行目にとあるけどopts.path自体がundefinedでコケてるっぽいので1b = opts.path ? require.resolve(n) : require(n)
とした1b = require.resolve(n)
- Mouse is not a constructor
上記の対策したら今度はこのエラー
これ以上追いきれなかったので分からず
あとはプロセス間通信でウィンドウ側でマウスダウンとアップを検知してウィンドウをゴリゴリ動かしてipcとかで動かしたらいけそうかなって思ったけど労力に見合わ無さそうなのでどうなんだろうか
issueにもあったけど今回Electronに拘る理由はないからNW.js使ってみようかと思う