JavaScript启动本地应用程序
JavaScript调起本地应用程序
以下内容,自定义部分我也还未经过实际验证,酌情查看。
文章目录
- JavaScript调起本地应用程序
- 确定协议
- 调用协议
- 传参
- 自定义
- 写入协议
- 获取参数
在浏览器中通过
JavaScript调起本地应用程序的一个可行方法就是
通过协议调起。
具体步骤就两步:
- 确定协议
- 调用协议
确定协议
确定协议的方法要去注册表中看。
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运行在浏览器环境里,连操作用户本地文件都不允许,操作注册表,不现实。
自定义 指的是我们自己编写的客户端软件如何被调起。
分为以下几步:
- 编写客户端软件
- 在客户端安装的过程中向用户注册表中注册自定义协议
- 在网页中调用协议
这些专门开发桌面应用程序的开发框架,比如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如何操作,这就很简单了:
-
下载库
npm i regedit -
以微信的注册表为例,如何利用
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 获取参数。
相关文章:
JavaScript启动本地应用程序
JavaScript调起本地应用程序 以下内容,自定义部分我也还未经过实际验证,酌情查看。 文章目录 JavaScript调起本地应用程序确定协议调用协议传参自定义写入协议获取参数 在浏览器中通过 JavaScript调起本地应用程序的一个可行方法就是 通过协议调起。 …...
软件工程理论与实践 (吕云翔)第十四章 软件维护与软件工程管理课后习题与解析
第十四章 软件维护与软件工程管理 1.判断题 (1)代码行技术是比较简单的定量估算软件规模的方法。(√) (2)功能点技术依据对软件信息域特性和软件复杂性的评估结果,估算软件规模。(√) &#…...
Flutter 桌面应用开发之读写Windows注册表
文章目录 需求来源Windows查询Windows版本号方法1. 如何查看Windows版本号2. Windows开发如何通过代码查询Windows版本号(1) 使用C#代码:(2) 使用VB.NET代码 3.通过注册表查看Windows版本信息 Flutter查询Windows版本号方法依赖库支持平台实现步骤1. 在pubspec.yaml…...
【Java Spring】SpringBoot 日志系统
文章目录 一、Spring Boot 日志系统1.1 Spring Boot 日志框架1.2 自定义日志打印1.3 日志级别设置1.4 日志持久化1.5 lombok 简化日志输出 一、Spring Boot 日志系统 1.1 Spring Boot 日志框架 SLF4J 和 logback都是spring boot内置的日志框架,开发者只负责调用对…...
Rust UI开发(四):iced中如何添加菜单栏(串口调试助手)
注:此文适合于对rust有一些了解的朋友 iced是一个跨平台的GUI库,用于为rust语言程序构建UI界面。 这是一个系列博文,本文是第四篇,前三篇链接: 1、Rust UI开发(一):使用iced构建UI时…...
P19 C++ 构造函数的成员初始化列表
目录 前言 01 如果不用成员列表如何初始化变量 02 成员列表初始化 03 为什么要使用成员列表初始化呢? 04 案例代码 前言 本期我们聊聊构造函数初始化列表。 你应该经常使用成员初始化列表,如果你不喜欢这种代码风格,建议你还是慢慢习惯吧…...
acwing算法基础之数学知识--Nim游戏和集合Nim游戏
目录 1 基础知识2 模板3 工程化 1 基础知识 (一) Nim游戏: n n n堆物品,每堆有 a i a_i ai个,两个玩家轮流取走任意一堆的任意个物品,但不能不取。取走最后一个物品的人获胜。 结论:如果这n…...
大数据Doris(二十八):Routine Load查看和修改作业
文章目录 Routine Load查看和修改作业 一、查看导入作业状态...
顺序表总结
📑打牌 : da pai ge的个人主页 🌤️个人专栏 : da pai ge的博客专栏 ☁️宝剑锋从磨砺出,梅花香自苦寒来 目录 🌤️arraylist的简…...
flutter 文本不随系统设置而改变大小[最全的整理]
文本不随系统设置而改变大小[四] 前言方案十九:使用LayoutBuilder和RichText方案二十:使用Transform.scale方案二十一:使用自定义文本缩放因子方案二十二:使用SingleChildScrollView方案二十三:使用FittedBox方案二十四…...
python -opencv 图像锐化
python -opencv 图像锐化 图像锐化其实,是一种增强图片对比度的技术,我们可以通过计算图像的导数,把导数绝对值数值大于零的数值加回原图像,通过这种方法,可以增强图像的对比度。 实现代码如下: import c…...
数字电源为什么一般用DSP控制,而不能用普通的单片机?
数字电源为什么一般用DSP控制,而不能用普通的单片机? 首先你要清楚,数字电源需要一个芯片具备什么功能? 1 能发PWM波 ,并且具备保护关断功能; 电源对PWM发波 要求很高,精度要ns级甚至ps级的&…...
个人投资白银收益怎么样?
个人投资白银是可以带来丰厚的收益,但收益的具体情况取决于多种因素。以下是一些明确的答案和举例,帮助投资者更好地理解个人投资白银的收益情况。 白银市场的价格波动是决定投资收益的主要因素之一,白银价格受全球经济形势、地缘局势风险、…...
代码随想录算法训练营 ---第四十五天
前言: 昨天的题做过之后,今天的题基本上都很简单,但是要注重一下细节。 第一题: 简介: 动态规划五部曲: 1.确定dp数组的含义 dp[i]:爬到有i个台阶的楼顶,有dp[i]种方法 2.确定dp…...
【密码学】【多方安全计算】不经意传输(Oblivious Transfer,OT)
文章目录 不经意传输(oblivious transfer)定义不经意传输的实例(1 out 2,二选一不经意传输)基于RSA的1 out 2 不经意传输疑问 不经意传输(oblivious transfer)定义 不经意传输(obli…...
STL常用算法-C++
概述: 算法主要是由头文件 <algorithm> <functional> <numeric> 组成。<algorithm> 是所有 STL 头文件中最大的一个,范围涉及是比较、交换、查找、遍历操作、复制、修改等等。<functional> 定义了一些模板类,…...
一、Lua基础
文章目录 一、Lua是什么二、Lua特性(一)轻量级(二)可扩展(三)其它特性 三、Lua安装四、Lua应用 看到评论说,C让我见识了语言的严谨与缜密,lua让我见识到了语言的精巧与创新ÿ…...
vue3 webSocket 封装及使用
vue3 webSocket 封装及使用 封装 import { ref, onUnmounted } from vue; interface SocketOptions {heartbeatInterval?: number;reconnectInterval?: number;maxReconnectAttempts?: number; }class Socket {url: string;ws: WebSocket | null null;opts: SocketOption…...
记录vscode常用插件集合(extensions)
名称用处Chinese (Simplified) (简体中文) Language Pack for Visual Studio Code适用于 VS Code 的中文(简体)语言包Dev ContainersVisual Studio代码开发容器ES7 React/Redux/GraphQL/React-Native snippetsES7 React/Redux/GraphQL/Rect Native代码段…...
正则表达式详解
一、正则表达式概述 正则表达式是一组由字母和符号组成的特殊文本,它可以用来从文本中找出满足你想要的格式的句子。通俗的讲就是按照某种规则去匹配符合条件的字符串 一个正则表达式是一种从左到右匹配主体字符串的模式。 “Regular expression”这个词比较拗口&a…...
51单片机+ADC0808数字电压表:从C语言到汇编,手把手教你用Proteus仿真(附完整汇编源码)
51单片机与ADC0808数字电压表:从C语言到汇编的实战迁移指南 在嵌入式开发领域,51单片机因其经典架构和广泛的应用基础,一直是工程师入门的首选平台。当我们从C语言这种高级语言过渡到汇编语言时,不仅能够更深入地理解硬件工作原理…...
芯洲SCT SCT2361FPBR QFN-12 DC-DC电源芯片
特性宽4V - 28V输入电压范围0.6V - 5.5V输出电压范围6A连续输出电流集成高端/低端功率MOSFET,导通电阻为36mΩ/16mΩ集成一个3.3V、150mA的LDO固定1ms软启动时间固定400KHz开关频率可选PWM、PFM和USM工作模式逐周期电流限制输出过压保护过温保护采用QFN 12引脚3mmx3…...
Foldseek蛋白质结构比对:高性能算法优化与大规模数据库分析技术
Foldseek蛋白质结构比对:高性能算法优化与大规模数据库分析技术 【免费下载链接】foldseek Foldseek enables fast and sensitive comparisons of large structure sets. 项目地址: https://gitcode.com/gh_mirrors/fo/foldseek 蛋白质结构比对是结构生物信息…...
终极Windows 11瘦身指南:使用Win11Debloat免费工具让电脑提速50%
终极Windows 11瘦身指南:使用Win11Debloat免费工具让电脑提速50% 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declut…...
Rustup进阶指南:5个高效管理Rust工具链的实战技巧
Rustup进阶指南:5个高效管理Rust工具链的实战技巧 【免费下载链接】rustup The Rust toolchain installer 项目地址: https://gitcode.com/gh_mirrors/ru/rustup Rustup作为Rust官方工具链安装器,让开发者能够轻松管理多个Rust版本、切换发布渠道…...
ZLUDA终极实践指南:在非NVIDIA GPU上无缝运行CUDA程序的完整方案
ZLUDA终极实践指南:在非NVIDIA GPU上无缝运行CUDA程序的完整方案 【免费下载链接】ZLUDA CUDA on non-NVIDIA GPUs 项目地址: https://gitcode.com/GitHub_Trending/zl/ZLUDA ZLUDA是一个革命性的开源项目,它让开发者和研究者能够在非NVIDIA GPU上…...
从入门到精通:零基础学深度学习需要学哪些框架?PyTorch 和 TensorFlow 选哪个?
从入门到精通:零基础学深度学习需要学哪些框架?PyTorch 和 TensorFlow 选哪个? 标签:#深度学习、#pytorch、#tensorflow、#计算机视觉、#人工智能、#python、#机器学习### 一、深度学习入门必学框架有哪些?分别用来做什…...
PPTist:在浏览器中重新定义演示文稿创作的技术革命
PPTist:在浏览器中重新定义演示文稿创作的技术革命 【免费下载链接】PPTist PowerPoint-ist(/pauəpɔintist/), An online presentation application that replicates most of the commonly used features of MS PowerPoint, allowing for t…...
抖音批量下载技术深度解析:从单视频到用户主页的全场景解决方案
抖音批量下载技术深度解析:从单视频到用户主页的全场景解决方案 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallb…...
FanControl深度配置指南:从零构建智能温控系统的5大核心模块
FanControl深度配置指南:从零构建智能温控系统的5大核心模块 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trend…...
