单击按钮从 NWJS 应用程序中启动单独的 NWJS 应用程序

Launching separate NWJS App from within a NWJS app onclick of a button

我正在开发软件的启动器应用程序。无法通过单击我的 NWJS 应用程序中的按钮来弄清楚如何启动另一个应用程序。我以前在 HTA 上做过这件事以启动我的视频游戏,但无法在这里找到答案。在 hta 上,我必须在单击时生成一个 bat 文件,然后是 bat 脚本 运行 程序。

我制作的按钮:

<span name="SystemWrapper3" id="SystemWrapper3" class="SystemWrapper3">
    <input type="button" value="Calculator"    name="SystemInput3" id="SystemInput3" class="SystemInput3" />
    <i class="fa-solid fa-square-root-variable fa-lg" id="SystemIcon4"></i>
</span>

我一直在研究它我对此还是很陌生。我已经尝试了几种解决方案,我发现这些解决方案是在网上查找的,但它们都没有用。 idk 如果它是版本不兼容还是什么?我正在使用 NWJS 0.64.1 Win64 它可能会或可能不会成为我正在启动的 NWJS 应用程序,它可能只是一个普通的 exe。我不确定两者是否有不同的要求。

编辑::::

我找到了这个,但我不确定如何在单击我的按钮时调用此代码?也许让它成为一个功能?然后用onclick="myfunc()"?

调用函数名
var exec = require('child_process').execFile;

exec('C:/asd/test.exe', function(err, data) {  
    console.log(err)
    console.log(data.toString());                       
});

编辑 2::::

所以我尝试了这个和几个变体,但仍然没有运气。我用 onclick="launchbat()" 从我的按钮调用它。

<script type="text/javascript">
    function launchbat() {
        var exec = require('child_process').execFile;

        exec('"C:\Users\Dustin Angeletti\OneDrive\Documents\bat.bat"', function(err, data) {  
            console.log(err)
            console.log(data.toString());                       
        });
    }
</script>

这应该有效。虽然取决于你想要什么,你可能想使用 require('child_process').spawn 而不是 require('child_process').exec.

Vanilla JS:您需要设置每个按钮(重复)并更新数组。

<button id="calculator">
  <i class="fa-solid fa-square-root-variable fa-lg"></i>
  Open Calculator
</button>

<button id="photoshop">
  <i class="fa-solid fa-aperture fa-lg"></i>
  Open Adobe Photoshop
</button>

<script>
const exec = require('child_process').exec;
const path = require('path');

const appMap = [
  {
    buttonId: 'calculator',
    executable: 'calc.exe'
  },
  {
    buttonId: 'photoshop',
    executable: path.join('C:', 'Program Files (x86)', 'Adobe', 'Photoshop', 'photoshop.exe')
  }
];

function executionCallback (err, stdout, stderr) {
  if (err) {
    console.log({ err });
  }
  if (stdout) {
    console.log({ stdout });
  }
  if (stderr) {
    console.log({ stderr });
  }
}

appMap.forEach(function (app) {
  const button = document.getElementById(app.buttonId)
  button.addEventListener('click', function () {
    exec(app.executable, {}, executionCallback);
  });
});
</script>

Vue.js: 你可以改用 Vue,这里你只需要更新数组,Vue 会处理其他所有事情。

<div id="app">
  <button v-for="app in apps" @click="run(app.executable)">
    <i class="fa-solid fa-lg" :class="app.icon"></i>
    {{ app.label }}
  </button>
</div>

<script src="https://unpkg.com/vue@3.2.36/dist/vue.global.prod.js"></script>
<script>
const exec = window.nw.require('child_process').exec;
const path = window.nw.require('path');

const app = Vue.createApp({
  data: function () {
    return {
      apps: [
        {
          icon: 'fa-square-root-variable',
          label: 'Open Calculator',
          executable: 'calc.exe'
        },
        {
          icon: 'fa-aperture',
          label: 'Open Adobe Photoshop',
          executable: path.join('C:', 'Program Files (x86)', 'Adobe', 'Photoshop', 'photoshop.exe')
        }
      ]
    }
  },
  methods: {
    run: function (appExecutable) {
      const options = {};
      exec(appExecutable, options, function (err, stdout, stderr) {
        if (err) {
          console.log({ err });
        }
        if (stdout) {
          console.log({ stdout });
        }
        if (stderr) {
          console.log({ stderr });
        }
      });
    }
  }
}).mount('#app');
</script>

想通了。很简单,我的第一种方法和第二种方法都很好。我一直以来的问题是在真实文件路径中使用反斜杠。您必须使用正斜杠。很奇怪。这适用于相对和绝对路径。

function AppLaunch7() {
    const path = require('path');
    nw.Shell.openItem(path.resolve('D:/SECURE DRIVE/SYSTEM CORE/SECURE CALC/SECURE CALC.exe'));
}

<div name="SystemWrapper1" id="SystemWrapper1" class="SystemWrapper1" onclick="AppLaunch7()">
    <input type="button" value="Documents" name="SystemInput1" id="SystemInput1" class="SystemInput1" />
    <span name="SystemIcon1" id="SystemIcon1" class="material-icons">description</span>
</div>