版本:"electron": "^22.3.27",实现一个在windows下图片点击右键,使用electron打开的功能。
一、注册表操作
注册表工具类
const cp = require("child_process");
const { app } = require('@electron/remote')
export default {
regKey:'',//菜单一级目录名
basePath:app.getPath('exe'),
getSh(code){
return '"'+this.basePath+' '+code+' %1"'
},
runShell(exec,callback) {
cp.exec(exec, function(err,stdout,stderr){
if(err){
console.info(err);
return
}
console.log(stdout)
callback(stdout)
});
},
//查询注册表
queryRegGroup(callback) {
//查询组是否存在
let sh='reg Query HKEY_CLASSES_ROOT\\*\\shell /v '+this.regKey
this.runShell(sh,callback)
},
//查询添加注册表一级菜单
openReg(callback) {
//查询组是否存在
let sh='reg Query HKEY_CLASSES_ROOT\\*\\shell /v '+this.regKey
let js=this
cp.exec(sh, function(err,stdout,stderr){
if(err){
js.addRegGroup(callback)
return
}
callback()
});
},
//添加注册表1级
addRegGroup(callback) {
//查询组是否存在
let sh='reg Add HKEY_CLASSES_ROOT\\*\\shell\\'+this.regKey+' /ve /t REG_DWORD /d 0 /f'
let js=this
this.runShell(sh,()=>{
js.addGroupNasp(callback)
})
},
//添加注册表子项(用于扩展二级菜单)
addGroupNasp(callback){
let sh='reg Add HKEY_CLASSES_ROOT\\*\\shell\\' + this.regKey +' /v SubCommands /t REG_DWORD /d 0 /f'
this.runShell(sh,callback)
},
//添加二级菜单及索引
addGroupAndItem(that,regValue,callback){
let js=this
let sh='reg Query HKEY_CLASSES_ROOT\\*\\shell\\'+this.regKey+' /v SubCommands -s'
this.runShell(sh,(innValue)=>{
if(innValue.includes(regValue.label)){
callback()
return
}
js.addNaspValue(that,regValue,callback,innValue)
})
},
//添加二级索引
addNaspValue(that,regValue,callback,innValue){
let js=this
let val=this.getNaspValue(that,regValue,innValue)
let sh='reg Add HKEY_CLASSES_ROOT\\*\\shell\\'+this.regKey+ ' /v SubCommands /t REG_SZ /d "'+val +'" /f'
this.runShell(sh,()=>{
js.addItemData(regValue,callback)
})
},
updateNaspValue(val,callback){
let sh='reg Add HKEY_CLASSES_ROOT\\*\\shell\\'+this.regKey+ ' /v SubCommands /t REG_SZ /d "'+val +'" /f'
this.runShell(sh,()=>{
callback()
})
},
getNaspValue(that,regValue,innValue){
let res=''
for(let i=0;i<that.options.length;i++){
if(innValue.includes(that.options[i].label)){
res+=that.options[i].label+';'
}
}
if(res==''){
res=regValue.label
}else{
res+=regValue.label
}
return res
},
//添加二级菜单
addItemData(regValue,callback){
let js=this
this.delItemData(regValue.label,()=>{
//二级菜单
let sh='reg add HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\CommandStore\\shell\\'+regValue.label+ ' /ve /t REG_DWORD /d 0 /f '
js.runShell(sh,()=>{
//事件脚本控制
let sh='reg add HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\CommandStore\\shell\\'+regValue.label+'\\command'+ ' /ve /t REG_SZ /d '+regValue.sh+' /f '
js.runShell(sh,()=>{
callback()
})
})
})
},
//先删除项
async delItemData(code,callback){
let sh='reg delete HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\CommandStore\\shell\\'+code+ ' /f'
await cp.exec(sh, function(err,stdout,stderr){
callback()
});
},
//删除右键菜单
closeReg(that,callback){
let js=this
let sh='reg delete HKEY_CLASSES_ROOT\\*\\shell\\' + this.regKey + ' /f'
cp.exec(sh, function(err,stdout,stderr){
for(let i=0;i<that.options.length;i++){
js.delItemData(that.options[i].label,()=>{})
}
callback(stdout)
});
}
}
注:%1是指当前文件的路径。
二、主进程操作
//使用:
initArgs()
windows[mainWindow.id]=mainWindow
require('@electron/remote/main').initialize()
require('@electron/remote/main').enable(mainWindow.webContents)
function initArgs(){
if(process.env.NODE_ENV != 'development'){
let progressArgv =process.argv
if(progressArgv.length<2){
return
}
if(!progressArgv[2]||progressArgv[2]==''){
return;
}
let message=screenShotUtil.screenshotViewParams(progressArgv[1]+'?path='+progressArgv[2])
screenShotUtil.openPage(message,windows)
}
}
在主进程创建窗体时监听注册表的返回的值,包含自定义参数和文件路径。