技术点:single-instance 和 gui.App.on('open',function({})) open监听事件
想要像c++可以实现打开一个实例后,再次点击exe文件时,不再创建新的实例,而是把已经打开的实例启动到最前端,需要做以下操作:
1、package.json里面配置 “single-instance”:true
2、在项目的每个页面的js里面 添加open监听事件
var gui = require("nw.gui"); gui.App.on('open', function(cmdline) { window.alert('command line: ' + cmdline);//打开的信息 window.alert(gui.App.argv);//打开传递过来的参数 });
```
3、通过url带参数唤醒客户端
如果客户端未启动,第一次url唤醒客户端时,可通过gui.App.argv数组获取url的信息,其实底层就是cmd命令。通过url protocoll和修改注册表实现的command命令,如下:
;把程序添加到注册表 可以通过链接打开客户端
Var /GLOBAL protocol
StrCpy $protocol "xxxfor"
Var /GLOBAL app
StrCpy $app "$INSTDIR\xxx\xxx.exe"
SetRegView 64
WriteRegStr HKCR "$protocol" "" "URL:$protocol Protocol"
WriteRegStr HKCR "$protocol" "URL Protocol" ""
WriteRegStr HKCR "$protocol\shell\open\command" "" "$\"$app$\" $\"%1$\""
SetRegView 32
WriteRegStr HKCR "$protocol" "" "URL:$protocol Protocol"
WriteRegStr HKCR "$protocol" "URL Protocol" ""
WriteRegStr HKCR "$protocol\shell\open\command" "" "$\"$app$\" $\"%1$\""
nw.js项目里面的index.js入口文件 通过
//第一次url启动客户端 if (gui.App.argv.length != 0 && !global.historyUrl) {//url唤醒的客户端 callAddToMeetSDK(gui.App.argv[0]);//获取参数
}
//第二次启动客户端 gui.App.on('open', function(cmdline) { console.log(cmdline);//url启动的所有参数 gui.Window.get().show();//使得客户端显示在最前端 if(cmdline.indexOf('xxxxx://join/?meetingId=') != -1){ //url唤醒的sdk callAddToMeetSDK(cmdline);//传递参数 做相关操作 ..... } });
注意:开始查资料以为single-instance从0.12版本以后已经启用,官网说明没看清楚,即使启用了,还是可以实现单实例的
启动,官网关于single-instance的版本使用介绍https://nwjs-cn.readthedocs.io/zh_CN/latest/Base/Migration/From%200.12%20to%200.13/index.html。
参考连接:https://blog.csdn.net/zeping891103/article/details/50773200