电子防止中间点击多个实例

时间:2018-03-08 03:31:36

标签: node.js electron

我想要制作单实例Electron应用程序。 我正在使用app.makeSingleInstance,请参阅下面的示例。

中间点击的SingleInstance问题:

  1. 如果我第二次点击app.exe
  2. ,则单个实例有效
  3. 如果我中间点击我的应用程序中的链接
  4. ,它就无效

    我需要什么:

    1. 制作电子应用程序singleInstance并确保即使中间点击也可以重新保存单个实例。
    2. 我不想在某些地方强制禁用我的应用程序中间点击,我在非链接项目上有一个用例
    3. 如何重现:

      1. 使用repo:https://github.com/electron/electron-quick-start
      2. 用我的index.htmlmain.js替换现有内容,请参阅下面的
      3. npm install然后npm start
      4. 的index.html:

        <!DOCTYPE html>
        <html>
          <head><meta charset="UTF-8"><title>Hello World!</title></head>
          <body>
            <h1>app.makeSingleInstance()</h1>
            <a href="$">Middle Click on it</a>
          </body>
        </html>
        

        main.js

        const electron = require('electron')
        const app = electron.app
        const BrowserWindow = electron.BrowserWindow
        const path = require('path')
        const url = require('url')
        let mainWindow
        const isSecondInstance = app.makeSingleInstance((commandLine, workingDirectory) => {
          if (myWindow) {
            if (myWindow.isMinimized()) myWindow.restore()
            myWindow.focus()
          }
        })
        if (isSecondInstance) {
          app.quit()
        }
        function createWindow () {
          mainWindow = new BrowserWindow({width: 800, height: 600})
          mainWindow.loadURL(url.format({
            pathname: path.join(__dirname, 'index.html'),
            protocol: 'file:',
            slashes: true
          }))
          mainWindow.on('closed', function () {
            mainWindow = null
          })
        }
        app.on('ready', createWindow)
        app.on('window-all-closed', function () {
          if (process.platform !== 'darwin') {
            app.quit()
          }
        })
        app.on('activate', function () {
          if (mainWindow === null) {
            createWindow()
          }
        })
        

        enter image description here

1 个答案:

答案 0 :(得分:1)

中间点击不会创建应用程序的新实例,而是创建BrowserWindow的新实例。您可以使用auxclick事件禁用a(实际上所有)元素的中间点击。

在主窗口的HTML中,如果您不想将这些事件重定向到默认浏览器,则可以使用以下JavaScript来禁用链接元素的中间点击:

// The following function will catch all non-left (middle and right) clicks
function handleNonLeftClick (e) {
    // e.button will be 1 for the middle mouse button.
    if (e.button === 1) {
        // Check if it is a link (a) element; if so, prevent the execution.
        if (e.target.tagName.toLowerCase() === "a") {
            e.preventDefault();
        }
    }
}

window.onload = () => {
    // Attach the listener to the whole document.
    document.addEventListener("auxclick", handleNonLeftClick);
}

但您也可以选择将中键点击事件重定向到标准浏览器,即通过Electron&#39; shell模块:

// Require Electron's "shell" module
const { shell } = require("electron");

function handleNonLeftClick (e) {
    // e.button will be 1 for the middle mouse button.
    if (e.button === 1) {
        // Check if it is a link (a) element; if so, prevent the execution.
        if (e.target.tagName.toLowerCase() === "a") {
            // Prevent the default action to fire...
            e.preventDefault();

            // ...and let the OS handle the URL.
            shell.openExternal(e.target.href);
        }
    }
}

// Also attach the listener this time:
window.onload = () => { document.addEventListener("auxclick", handleNonLeftClick); }

如果您还想阻止对if (e.button === 1)元素进行右键点击,则可以删除a