gpt4 book ai didi

javascript - 当预期结果更改时, Electron ipcMain.handle()不触发

转载 作者:行者123 更新时间:2023-12-03 12:40:02 27 4
gpt4 key购买 nike

我的应用程序打开了两个窗口,其中一个应该在投影仪上(第二个监视器)打开。我正在尝试使其正常运行,以便如果在未连接投影仪的情况下打开应用程序,则用户可以连接投影仪,然后单击按钮并按下第二个窗口。如果他们尝试在未连接投影仪的情况下单击按钮,则会收到alert的通知。一旦他们连接了投影机并单击按钮,它将按预期将窗口推到另一个屏幕并最大化其自身。

  • 这是有效的方法:
  • 我用两个监视器打开该应用程序。我单击投影机连接按钮。窗口被插入并最大化。
  • 我使用一个监视器打开该应用程序。我单击投影机连接按钮。警报弹出,并告诉我投影机未连接。我可以多次这样做。
  • 我使用一个监视器打开该应用程序。我不要单击投影机连接按钮。我将显示模式切换为两台显示器。我单击投影机连接按钮。窗口被插入并最大化。
  • 这是行不通的:

  • 我用一台显示器打开该应用程序。我 单击投影机连接按钮。警报弹出,并告诉我投影机未连接。我将显示选项切换到两个监视器。我单击投影机连接按钮。 没有任何 react 。 没有警报,控制台日志,什么也没有。
    这是我的代码:
    electronic.js:
    const electron = require("electron");
    const app = electron.app;
    const BrowserWindow = electron.BrowserWindow;
    const path = require("path");
    const isDev = require("electron-is-dev");
    const { ipcMain } = require("electron");

    let mainWindow;
    let gameWindow;
    let projectorDisplay;
    const electronScreen = electron.screen;

    function createWindow() {

    mainWindow = new BrowserWindow({
    width: 900,
    height: 680,
    title: "Control Panel",
    webPreferences: {
    nodeIntegration: true,
    },
    });
    gameWindow = new BrowserWindow({
    width: 1200,
    height: 900,
    webPreferences: {
    nodeIntegration: true,
    },
    frame: false,
    title: "Gameboard",
    show: true,
    });

    mainWindow.loadURL(
    isDev
    ? "http://localhost:3000"
    : `file://${path.join(__dirname, "../build/index.html")}`
    );

    mainWindow.on("closed", () => {
    gameWindow.close();
    mainWindow = null;
    gameWindow = null;
    app.quit();
    });

    ipcMain.handle("REQUEST_PROJECTOR_MODE", async () => {
    let promise = new Promise((resolve) => {
    projectorDisplay = electronScreen.getAllDisplays().find((display) => {
    return display.bounds.x !== 0 || display.bounds.y !== 0;
    });
    if (projectorDisplay !== undefined) {
    gameWindow.setBounds({
    x: projectorDisplay.bounds.x + 50,
    y: projectorDisplay.bounds.y + 50,
    });
    gameWindow.maximize();
    resolve(true);
    } else {
    resolve(false);
    }
    });
    return await promise;
    });

    gameWindow.loadURL(
    isDev
    ? "http://localhost:3000/#/gameboard"
    : `file://${path.join(__dirname, "../build/index.html")}`
    );

    gameWindow.webContents.executeJavaScript("location.assign('#/gameboard');");
    }

    app.on("ready", createWindow);
    // other unrelated things...
    这是我的渲染器组件的(一部分):
    projectorMode = () => {
    ipcRenderer.invoke("REQUEST_PROJECTOR_MODE")
    .then((response) => {
    if(response === true) {
    this.hideProjectorButton()
    } else {
    alert('Projector not found')
    }
    })
    };

    hideProjectorButton = () => {
    this.projectorButton.current.style.display = "none";
    };

    最佳答案

    我发现了我的问题。从不是主BrowserWindow的窗口调用ipcRenderer函数似乎会导致一些奇怪的副作用。我剥离了所有代码,仅发送和接收基本消息,甚至它们都以无法预测的方式失败。在主窗口的按钮上放置“投影仪模式”请求后,所有问题均消失了,该应用程序按预期工作。

    关于javascript - 当预期结果更改时, Electron ipcMain.handle()不触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62678840/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com