前提・実現したいこと
Electronでブラウザゲームのクライアントを開発しています。
Krunkerというゲームで、URLを使って知り合いと同じ試合に入ったりすることのできるものです。
発生している問題・エラーメッセージ
preloadさせているスクリプトで
js
1const electronPrompt = require("electron-prompt");
とするとその後の処理が止まってしまいます(この一行を削除すると他のpreload.js内の機能は正常に動くがこれがあると動かなくなる)。
該当のソースコード
javascript
1// main.js 2const { app, BrowserWindow, getCurrentWindow, clipboard, ipcMain } = require("electron"); 3const localShortcut= require("electron-localshortcut"); 4const inputPrompt = require("electron-prompt"); 5const path = require("path") 6 7let gameWindow = null; 8 9const initFlags = () => { 10 app.commandLine.appendSwitch("disable-frame-rate-limit"); // 将来的には設定で変更可能にする 11 app.commandLine.appendSwitch("enable-zero-copy") 12}; 13 14const initGameWindow = () => { 15 gameWindow = new BrowserWindow({ 16 width: 1200, 17 height: 800, 18 webPreferences: { 19 preload: path.join(__dirname, "preload.js"), 20 contextIsolation: true 21 } 22 }); 23 gameWindow.setMenuBarVisibility(false) 24 25 gameWindow.loadURL("https://krunker.io"); 26 27 initShortcutKeys(); 28 29 gameWindow.on("closed", () => { 30 gameWindow = null; 31 }); 32}; 33 34const initShortcutKeys = () => { 35 const sKeys = [ 36 ["Esc", () => { // ゲーム内でのESCキーの有効化 37 gameWindow.webContents.send("ESC") 38 console.log("ESC pressed."); 39 }], 40 ["F5", () => { // リ↓ロ↑ードする 41 getCurrentWindow.reload() 42 }], 43 ["F6", () => { // 別のマッチへ 44 gameWindow.loadURL("https://krunker.io") 45 }], 46 ["F7", () => { // クリップボードへURLをコピー(実質Inviteボタン) 47 clipboard.writeText(gameWindow.webContents.getURL()) 48 }], 49 ["F8", () => { // クリップボードのURLへアクセス(実質Joinボタン) 50 let copiedText = clipboard.readText(); 51 if (copiedText.substr(0, 25) === "https://krunker.io/?game=" || copiedText.substr(0, 30) === "https://comp.krunker.io/?game=") gameWindow.loadURL(copiedText); 52 }], 53 ["Shift+F8", () => { // URLを入力するフォームの表示 54 gameWindow.webContents.send("DIALOG_OPEN", "URL") 55 }], 56 ["Ctrl+Shift+F1", () => { // クライアントの再起動 57 app.relaunch(); 58 app.quit(); 59 }], 60 ["Ctrl+F1", () => { // 開発者ツールの起動 61 gameWindow.webContents.openDevTools() 62 }] 63 ]; 64 65 sKeys.forEach((k) => { 66 localShortcut.register(gameWindow, k[0], k[1]) 67 }); 68}; 69 70ipcMain.on("OPEN_LINK", (event, arg) => { 71 gameWindow.loadURL(arg); 72}) 73 74app.on("ready", () => { 75 initFlags(); 76 initGameWindow(); 77});
javascript
1// preload.js 2const { ipcRenderer } = require("electron"); 3const { prompt } = require("electron-prompt"); 4 5const initIpc = () => { 6 ipcRenderer.on("ESC", () => { 7 document.exitPointerLock() 8 }); 9 ipcRenderer.on("DIALOG_OPEN", (event, arg) => { 10 switch(arg){ 11 case "URL": 12 prompt({ 13 title: "Join to the game", 14 label: "URL", 15 type: "input" 16 }).then((r) => { 17 if(r !== null ) { 18 if (r.substr(0, 25) === "https://krunker.io/?game=" || r.substr(0, 30) === "https://comp.krunker.io/?game=") ipcRenderer.send("OPEN_LINK", r); 19 }; 20 }).catch(console.error); 21 } 22 }) 23}; 24 25initIpc();
試したこと
nodeIntegrationをtrueにしてみたりもしてみましたが特に意味がなく、package.jsonにもelectron-prommptの記載はすでに追記していたので原因がわかりません・・・
補足情報(FW/ツールのバージョンなど)
Windows 10 Home 最新版
node.js v14.15.4
Electron v11.2.1
electron-prompt v1.6.1
回答2件
あなたの回答
tips
プレビュー