JavaScript启动本地应用程序

JavaScript调起本地应用程序

以下内容,自定义部分我也还未经过实际验证,酌情查看。

文章目录

  • JavaScript调起本地应用程序
    • 确定协议
    • 调用协议
    • 传参
    • 自定义
      • 写入协议
      • 获取参数

在浏览器中通过 JavaScript调起本地应用程序的一个可行方法就是 通过协议调起。

具体步骤就两步:

  1. 确定协议
  2. 调用协议

确定协议

确定协议的方法要去注册表中看。

window + s搜索regedit,打开 注册表编辑器,然后再HKEY_CLASSES_ROOT下找。

以 微信 为例:可以在HKEY_CLASSES_ROOT项下找到weixin项,在weixin上右键导出注册表,在编辑器(例如:vscdoe)中打开,可以看到以下内容:

Windows Registry Editor Version 5.00[HKEY_CLASSES_ROOT\weixin]
@="weixinProtocol"
"URL Protocol"="weixinProtocol"[HKEY_CLASSES_ROOT\weixin\DefaultIcon]
@="C:\\Program Files (x86)\\Tencent\\WeChat\\WeChat.exe,1"[HKEY_CLASSES_ROOT\weixin\shell][HKEY_CLASSES_ROOT\weixin\shell\open][HKEY_CLASSES_ROOT\weixin\shell\open\command]
@="\"C:\\Program Files (x86)\\Tencent\\WeChat\\WeChat.exe\" \"%1\""

上面写的你可能一脸懵逼,我给转换下写法:

HKEY_CLASSES_ROOTweixin(Default)          "weixinProtocol"URL Protocol      "weixinProtocol"DefaultIcon(Default)        "C:\Program Files (x86)\Tencent\WeChat\WeChat.exe,1"shellopencommand(Default)    "C:\Program Files (x86)\Tencent\WeChat\WeChat.exe" "%1"

这是不是就清楚多了。

除去第一行Windows Registry Editor Version 5.00,只看下面的转换:

[HKEY_CLASSES_ROOT\weixin]表示这是HKEY_CLASSES_ROOT下的weixin,所以写法是:

HKEY_CLASSES_ROOTweixin

再往下:@(Default),其他的就没啥了,自己看下即可。

那么这些里面都是啥意思呢:

  • weixin 是协议的名称。
  • URL Protocol 表示这是一个URL协议。
  • DefaultIcon 子键指定了协议的图标。
  • shell\open\command 子键指定了打开协议链接时应该运行的命令。

由此确定,微信的协议:weixin

调用协议

调用协议就很简单了。一行JavaScript代码:

window.location.href = 'weixin://';

运行这一行代码,浏览器就会弹出提示框,要我们手动确定是否要打开微信。

或者一行html代码:

<a href="weixin://">打开微信</a>

传参

具体说明下,调用的应用程序应该怎么传参,要去查看具体的官方文档,这里只是示例,以微信做个示例,不代表微信就这么传。

调起微信时,想给微信传参数,那么只需要在协议后面拼接参数即可,比如:

window.location.href = 'weixin://example?param=value';

那么微信拿到参数的就是'weixin://example?param=value'

这点也好解释,前面我粘贴的注册表信息shell/open/command的协议链接是这样的:

"C:\Program Files (x86)\Tencent\WeChat\WeChat.exe" "%1"

这里的%1即占位符,我们通过协议打开微信,执行的命令其实是:

"C:\Program Files (x86)\Tencent\WeChat\WeChat.exe" "weixin://example?param=value"

微信可以解析这个参数,然后执行对应的操作。

自定义

自定义不是教怎么去修改别的应用程序的注册表协议,这点我觉得没太大必要。

毕竟你在你的电脑设置了一个特殊的协议,比如把微信的协议weixin://改成we_weixin://,但是把调用代码放到别的电脑上还是白搭,别的电脑可不是这样的协议名字。

也不要想着在浏览器上运行JavaScript时,操纵注册表修改协议,如果JavaScript运行在浏览器环境里,连操作用户本地文件都不允许,操作注册表,不现实。


自定义 指的是我们自己编写的客户端软件如何被调起。

分为以下几步:

  1. 编写客户端软件
  2. 在客户端安装的过程中向用户注册表中注册自定义协议
  3. 在网页中调用协议

这些专门开发桌面应用程序的开发框架,比如Electron会给我们提供更多的权限和能力,让我们可以通过执行Javascript代码来调用本地系统资源。

写入协议

那,如何向注册表写入协议:

可以使用批处理脚本.bat,也可以通过Node.js中的child_process模块执行脚本: (electron就自带nodejs环境),也可以使用第三方库,例如regedit

这里先介绍,child_process如何写入:

const { exec } = require('child_process');const command = 'reg add HKCR\RegistryKey /v YourValueName /t REG_SZ /d "YourValue"';exec(command, (error, stdout, stderr) => {if (error) {console.error(`执行错误: ${error}`);return;}console.log(`stdout: ${stdout}`);console.error(`stderr: ${stderr}`);
});

这里的 reg add 命令用于在注册表中添加一个新的键值对。这需要管理员权限才能执行。

解释下这个command

'reg add HKCU\\Software\\YourRegistryPath /v YourValueName /t REG_SZ /d "YourValue"'
  • reg: 这是注册表编辑器的命令行工具。

  • add: 这是 reg 工具的一个子命令,表示要添加一个新的注册表项。

  • HKCR : 这是注册表的根键之一, 存储了系统中所有已注册的文件类型、协议、COM 对象等信息。

  • RegistryKey: 这是在 HKCU 下的子路径,表示你要添加键值对的具体位置。你可以将 RegistryKey替换为实际的路径。如果路径不存在,reg add 命令会创建它。

  • /v YourValueName: /v 表示要添加的是一个值(value),而 YourValueName 是这个键值对的名称。你可以将 YourValueName 替换为实际的值名称。

  • /t REG_SZ: /t 表示值的类型(type),REG_SZ 表示这是一个字符串类型的值。这表示你要添加的值是一个字符串。

  • /d "YourValue": /d 表示数据(data),而 "YourValue" 是这个值的具体内容。你可以将 YourValue 替换为实际的值。

再说第三方库regedit如何操作,这就很简单了:

  1. 下载库

    npm i regedit
    
  2. 以微信的注册表为例,如何利用regedit写入:

    const regedit = require('regedit');// 协议根路径
    const weixinRegistryKey = 'HKCR\\weixin';
    const weixinProtocolValue = 'weixinProtocol';
    const weixinDefaultIconKey = 'HKCR\\weixin\\DefaultIcon';
    const weixinShellOpenCommandKey = 'HKCR\\weixin\\shell\\open\\command';
    const weixinExePath = 'C:\\Program Files (x86)\\Tencent\\WeChat\\WeChat.exe';// Write registry values
    regedit.putValue({[weixinRegistryKey]: {'@': weixinProtocolValue,'URL Protocol': weixinProtocolValue,},[weixinDefaultIconKey]: {'@': `${weixinExePath},1`,},[weixinShellOpenCommandKey]: {'@': `"${weixinExePath}" "%1"`,},
    }, (err) => {if (err) {console.error(`Error writing to the registry: ${err.message}`);} else {console.log('Registry updated successfully');}
    });
    

协议写好之后,调用协议就不多说了,和上面的一样。

获取参数

自定义了协议,如果用户调用了协议给我们传了参数我们该如何获取呢?

nodejs环境下可以使用 process.argv 获取参数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/163830.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

git 文件被莫名其妙的或略且无论如何都查不到哪个.gitignore文件忽略的

先说解决办法&#xff1a;git check-ignore -v [文件路径] 这个命令会返回一个忽略规则&#xff0c;以及该规则在哪个文件中定义的&#xff0c;该规则使得指定的文件被忽略。 1.遇到的问题 同项目组&#xff0c;其他同学都可以正常的提交.meta文件&#xff0c;我的提交就出现以…

Oracle通过MyBatis执行批量插入与更新问题

最近看一个老项目&#xff0c;使用的Oracle数据库&#xff0c;发现要使用MyBatis执行批量操作还是不太一样。 下面我们来看一下&#xff0c;Oracle数据库&#xff0c;如何使用MyBatis来批量插入和更新。 批量插入 因为Oracle和MySQL的insert还不太一样&#xff0c;Oracle不能…

canal本地安装和使用

1、组件版本 canal.deployer-1.1.7 kafka_2.13-2.6.0 jdk8 apache-zookeeper-3.6.0-bin mysql5.7 2、解压canal.deployer-1.1.7 2.1、修改canal.properties配置文件 ##改为kafka canal.serverModekafka## 改为instance canal.destinations instance## 改为true&#x…

STM32——独立看门狗

文章目录 一、看门狗基础介绍&#xff08;一&#xff09;看门狗概述&#xff1a;&#xff08;二&#xff09;看门狗的作用&#xff1a;&#xff08;三&#xff09;看门狗的原理&#xff1a;&#xff08;四&#xff09;为什么需要使用看门狗来提高系统的可靠性&#xff1a;&…

Linux 中的 rm 命令及示例

Linux 中的 rm 命令及示例 rm命令是Linux中最常见、最基础的命令之一。即使您对 Linux 的使用经验有限&#xff0c;您也很可能听说过它。该命令的主要目的是删除文件和目录。使用此命令删除文件和目录无法撤消。 这意味着您应该谨慎使用此命令&#xff0c;因为如果没有备份&am…

振南技术干货集:制冷设备大型IoT监测项目研发纪实(5)

注解目录 1.制冷设备的监测迫在眉睫 1.1 冷食的利润贡献 1.2 冷设监测系统的困难 &#xff08;制冷设备对于便利店为何如何重要&#xff1f;了解一下你所不知道的便利店和新零售行业。关 于电力线载波通信的论战。&#xff09; 2、电路设计 2.1 防护电路 2.1.1 强电防护…

Colmap三维重建详解与使用方法

图片捕获过程&#xff0c;请遵循以下指导方针以获得最佳重建结果: 1 捕捉具有良好纹理的图像。避免使用完全没有质感的图片(例如&#xff0c;白色的墙或空桌子)。如果场景本身没有足够的纹理&#xff0c;你可以放置额外的背景对象&#xff0c;如海报等。 2 在相似的照明条件下…

@Value和@Scheduled注解简介

&#xff08;1&#xff09;SpringBoot读取配置文件&#xff0c;使用Value注解获取数据&#xff0c;中文乱码问题解决办法 new String(xxx.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8) &#xff08;2&#xff09;Scheduled注解 例如&#xff0c;Scheduled(…

前端处理返回数据为数组对象且对象嵌套数组并重名的数据,合并名称并叠加数据

前端处理返回数据为数组对象且对象嵌套数组并重名的数据&#xff0c;合并名称并叠加数据 var newList[]; var table{}; var dataObj{}; var finalList[]; var tableData[{brName:营业部,dateStr:2023-11-23,tacheArr:[{dealCnt:20,tacheName:奔驰}]},{brName:营业部,dateStr:2…

TypeError: Cannot read property ‘sendpost‘ of undefined

箭头函数指向问题&#xff0c;定义let that this 解决

大宽带服务器有什么优势?

大宽带服务器有什么优势&#xff1f; 什么是大带宽服务器&#xff1f;从属性上看&#xff0c;大宽带可以分为G口大带宽、万兆大带宽等&#xff0c;从线路上看&#xff0c;可以分为电信、移动、联通等&#xff0c;从地域属性看&#xff0c;可以分为国内宽带、国际宽带。大宽带是…

如何活跃谷歌开发者账号,增加账号的权重和真实性,从而延长应用在线时长?

众所周知&#xff0c;每个谷歌开发者账号都有一个初始权重&#xff0c;而权重的高低会影响到账号的稳定性和真实性&#xff0c;从而影响应用上架的成功率和应用在线时长。 关于提高谷歌账号权重、活跃度及稳定性&#xff0c;以下的方法和建议可供参考&#xff1a; 1、社区活动…

外设——CAN总线收发器TJA1043

目录 1. 引脚 2. 工作模式 3. 5种模式和7种状态标识的理解和使用 1. 引脚 2. 工作模式 该收发器相较于普通收发器&#xff0c;引脚多了几个&#xff0c;就是功能等多了。TJA1043支持五种操作模式&#xff0c;就是通过控制引脚STB_N和EN来原则。五种模式&#xff1a; 正常模式…

OpenCV滑块验证码图像缺口位置识别

OpenCV图像缺口位置识别 1、背景2、图像缺口位置识别原理3、图像缺口位置识别实现4、滑块验证码HTTP图像需要保存到本地吗1、背景 在使用Selenium完成自动化爬虫时,许多网站为了防止机器人爬取数据会使用验证码(例如滑块验证码)。通过Selenium动作操作,爬虫可以模拟用户输入…

前端工程、静态代码、Html页面 打包成nginx 的 docker镜像

1. 创建一个 mynginx的目录 2. 将前端代码文件夹&#xff08;比如叫 front &#xff09;复制到 mynginx 目录下 3. 在mynginx 目录下创建一个名为Dockerfile 的文件&#xff08;文件名不要改&#xff09;&#xff0c;文件内容如下&#xff1a; # 使用官方的 Nginx 镜像作为基…

神经网络训练技巧

1. 逐渐增加训练数据规模&#xff0c;比如先在小数据集上训练&#xff0c;之后再增大数据集继续训练。

网站权重是什么意思

网站权重是指搜索引擎对网站的评估指标&#xff0c;用以衡量网站的重要性 搜索引擎会根据网站权重来决定网站在搜索结果中的排名和位置&#xff0c;从而决定其在搜索中的可见度 网站权重是多方面因素的综合评估&#xff0c;其中主要包括网站内容质量、外部链接量及质量、网站…

JS逆向之wasm逆向(二)

本文仅供技术交流和技术学习 不做其他用途 接着上一篇继续讲&#xff1a; 上篇地址&#xff1a; JS逆向之wasm逆向(二进制) 网址&#xff1a; aHR0cHM6Ly93d3cuN3E2Y3lqLmNvbTo5MDAxL3JlZ2lzdGVyNDY5Njg/aV9jb2RlPTQ0Mjc5OTU1 这个网站我们后面可以继续讲他的debugger 和滑块…

[点云分割] Clustering of Pointclouds into Supervoxels

介绍 “Clustering of Pointclouds into Supervoxels” 是一种点云数据聚类的方法&#xff0c;用于将点云数据分割成具有相似特征的超体素&#xff08;supervoxel&#xff09;。 超体素是一种在点云数据中表示连续区域的方法&#xff0c;类似于像素在图像中表示连续区域。超体…

C 语言 http通信

1&#xff0c;C语言本身不包含直接支持HTTP协议的功能&#xff0c;但你可以使用第三方库来实现HTTP客户端或服务器。 以下是一些常用的C语言HTTP库&#xff1a; libcurl&#xff1a;一个支持多种协议的开源库&#xff0c;包括HTTP、HTTPS、FTP等。它提供了一组简单的API&…