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.pswp.cn/news/163830.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/163830.shtml
英文地址,請注明出處:http://en.pswp.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&…