当前位置: 首页 > news >正文

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 获取参数。

相关文章:

JavaScript启动本地应用程序

JavaScript调起本地应用程序 以下内容&#xff0c;自定义部分我也还未经过实际验证&#xff0c;酌情查看。 文章目录 JavaScript调起本地应用程序确定协议调用协议传参自定义写入协议获取参数 在浏览器中通过 JavaScript调起本地应用程序的一个可行方法就是 通过协议调起。 …...

软件工程理论与实践 (吕云翔)第十四章 软件维护与软件工程管理课后习题与解析

第十四章 软件维护与软件工程管理 1.判断题 &#xff08;1&#xff09;代码行技术是比较简单的定量估算软件规模的方法。(√) &#xff08;2&#xff09;功能点技术依据对软件信息域特性和软件复杂性的评估结果&#xff0c;估算软件规模。&#xff08;√&#xff09; &#…...

Flutter 桌面应用开发之读写Windows注册表

文章目录 需求来源Windows查询Windows版本号方法1. 如何查看Windows版本号2. Windows开发如何通过代码查询Windows版本号(1) 使用C#代码&#xff1a;(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内置的日志框架&#xff0c;开发者只负责调用对…...

Rust UI开发(四):iced中如何添加菜单栏(串口调试助手)

注&#xff1a;此文适合于对rust有一些了解的朋友 iced是一个跨平台的GUI库&#xff0c;用于为rust语言程序构建UI界面。 这是一个系列博文&#xff0c;本文是第四篇&#xff0c;前三篇链接&#xff1a; 1、Rust UI开发&#xff08;一&#xff09;&#xff1a;使用iced构建UI时…...

P19 C++ 构造函数的成员初始化列表

目录 前言 01 如果不用成员列表如何初始化变量 02 成员列表初始化 03 为什么要使用成员列表初始化呢&#xff1f; 04 案例代码 前言 本期我们聊聊构造函数初始化列表。 你应该经常使用成员初始化列表&#xff0c;如果你不喜欢这种代码风格&#xff0c;建议你还是慢慢习惯吧…...

acwing算法基础之数学知识--Nim游戏和集合Nim游戏

目录 1 基础知识2 模板3 工程化 1 基础知识 &#xff08;一&#xff09; Nim游戏&#xff1a; n n n堆物品&#xff0c;每堆有 a i a_i ai​个&#xff0c;两个玩家轮流取走任意一堆的任意个物品&#xff0c;但不能不取。取走最后一个物品的人获胜。 结论&#xff1a;如果这n…...

大数据Doris(二十八):Routine Load查看和修改作业

文章目录 Routine Load查看和修改作业 一、查看导入作业状态...

顺序表总结

&#x1f4d1;打牌 &#xff1a; da pai ge的个人主页 &#x1f324;️个人专栏 &#xff1a; da pai ge的博客专栏 ☁️宝剑锋从磨砺出&#xff0c;梅花香自苦寒来 目录 &#x1f324;️arraylist的简…...

flutter 文本不随系统设置而改变大小[最全的整理]

文本不随系统设置而改变大小[四] 前言方案十九&#xff1a;使用LayoutBuilder和RichText方案二十&#xff1a;使用Transform.scale方案二十一&#xff1a;使用自定义文本缩放因子方案二十二&#xff1a;使用SingleChildScrollView方案二十三&#xff1a;使用FittedBox方案二十四…...

python -opencv 图像锐化

python -opencv 图像锐化 图像锐化其实&#xff0c;是一种增强图片对比度的技术&#xff0c;我们可以通过计算图像的导数&#xff0c;把导数绝对值数值大于零的数值加回原图像&#xff0c;通过这种方法&#xff0c;可以增强图像的对比度。 实现代码如下&#xff1a; import c…...

数字电源为什么一般用DSP控制,而不能用普通的单片机?

数字电源为什么一般用DSP控制&#xff0c;而不能用普通的单片机&#xff1f; 首先你要清楚&#xff0c;数字电源需要一个芯片具备什么功能&#xff1f; 1 能发PWM波 &#xff0c;并且具备保护关断功能&#xff1b; 电源对PWM发波 要求很高&#xff0c;精度要ns级甚至ps级的&…...

个人投资白银收益怎么样?

个人投资白银是可以带来丰厚的收益&#xff0c;但收益的具体情况取决于多种因素。以下是一些明确的答案和举例&#xff0c;帮助投资者更好地理解个人投资白银的收益情况。 白银市场的价格波动是决定投资收益的主要因素之一&#xff0c;白银价格受全球经济形势、地缘局势风险、…...

代码随想录算法训练营 ---第四十五天

前言&#xff1a; 昨天的题做过之后&#xff0c;今天的题基本上都很简单&#xff0c;但是要注重一下细节。 第一题&#xff1a; 简介&#xff1a; 动态规划五部曲&#xff1a; 1.确定dp数组的含义 dp[i]&#xff1a;爬到有i个台阶的楼顶&#xff0c;有dp[i]种方法 2.确定dp…...

【密码学】【多方安全计算】不经意传输(Oblivious Transfer,OT)

文章目录 不经意传输&#xff08;oblivious transfer&#xff09;定义不经意传输的实例&#xff08;1 out 2&#xff0c;二选一不经意传输&#xff09;基于RSA的1 out 2 不经意传输疑问 不经意传输&#xff08;oblivious transfer&#xff09;定义 不经意传输&#xff08;obli…...

STL常用算法-C++

概述&#xff1a; 算法主要是由头文件 <algorithm> <functional> <numeric> 组成。<algorithm> 是所有 STL 头文件中最大的一个&#xff0c;范围涉及是比较、交换、查找、遍历操作、复制、修改等等。<functional> 定义了一些模板类&#xff0c;…...

一、Lua基础

文章目录 一、Lua是什么二、Lua特性&#xff08;一&#xff09;轻量级&#xff08;二&#xff09;可扩展&#xff08;三&#xff09;其它特性 三、Lua安装四、Lua应用 看到评论说&#xff0c;C让我见识了语言的严谨与缜密&#xff0c;lua让我见识到了语言的精巧与创新&#xff…...

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 的中文&#xff08;简体&#xff09;语言包Dev ContainersVisual Studio代码开发容器ES7 React/Redux/GraphQL/React-Native snippetsES7 React/Redux/GraphQL/Rect Native代码段…...

正则表达式详解

一、正则表达式概述 正则表达式是一组由字母和符号组成的特殊文本&#xff0c;它可以用来从文本中找出满足你想要的格式的句子。通俗的讲就是按照某种规则去匹配符合条件的字符串 一个正则表达式是一种从左到右匹配主体字符串的模式。 “Regular expression”这个词比较拗口&a…...

springboot 百货中心供应链管理系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;百货中心供应链管理系统被用户普遍使用&#xff0c;为方…...

从零实现富文本编辑器#5-编辑器选区模型的状态结构表达

先前我们总结了浏览器选区模型的交互策略&#xff0c;并且实现了基本的选区操作&#xff0c;还调研了自绘选区的实现。那么相对的&#xff0c;我们还需要设计编辑器的选区表达&#xff0c;也可以称为模型选区。编辑器中应用变更时的操作范围&#xff0c;就是以模型选区为基准来…...

STM32F4基本定时器使用和原理详解

STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?

论文网址&#xff1a;pdf 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff01;文章偏向于笔记&#xff0c;谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

【2025年】解决Burpsuite抓不到https包的问题

环境&#xff1a;windows11 burpsuite:2025.5 在抓取https网站时&#xff0c;burpsuite抓取不到https数据包&#xff0c;只显示&#xff1a; 解决该问题只需如下三个步骤&#xff1a; 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)

前言&#xff1a; 双亲委派机制对于面试这块来说非常重要&#xff0c;在实际开发中也是经常遇见需要打破双亲委派的需求&#xff0c;今天我们一起来探索一下什么是双亲委派机制&#xff0c;在此之前我们先介绍一下类的加载器。 目录 ​编辑 前言&#xff1a; 类加载器 1. …...

【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 定向转发机制

目录 节点的功能承载层&#xff08;GATT/Adv&#xff09;局限性&#xff1a; 拓扑关系定向转发机制定向转发意义 CG 节点的功能 节点的功能由节点支持的特性和功能决定。所有节点都能够发送和接收网格消息。节点还可以选择支持一个或多个附加功能&#xff0c;如 Configuration …...

在树莓派上添加音频输入设备的几种方法

在树莓派上添加音频输入设备可以通过以下步骤完成&#xff0c;具体方法取决于设备类型&#xff08;如USB麦克风、3.5mm接口麦克风或HDMI音频输入&#xff09;。以下是详细指南&#xff1a; 1. 连接音频输入设备 USB麦克风/声卡&#xff1a;直接插入树莓派的USB接口。3.5mm麦克…...