通过Web页面启动本地应用程序

博客围绕网页上调用本地应用程序展开。介绍了在页面通过链接唤醒本地应用的需求,给出解决方法,包括注册自定义协议、检验注册成功的方式及在页面启动程序的配置。还阐述了调用思路、完整实例,并提醒动态生成注册表信息、路径及获取参数等注意问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

需求

目前在项目中需要在html页面中通过连接(a标签)来唤醒本地应用,这个是基于window系统

解决方法

注册自己的协议

window下需要将自己的协议添加至注册表中,下面以打开wps word为例

// 新建word.reg注册表文件(可以使用vscode进行编辑,安装reg插件来提供一些小提示)
Windows Registry Editor Version 5.00 // 注册表工具的版本信息
[HKEY_CLASSES_ROOT\word]  
@="word"  // 协议的名称
"URL Protocol"="D:\\software\\WPS Office\\10.1.0.7521\\office6\\wps.exe"   // 可应用程序的路径,只能是exe的程序
[HKEY_CLASSES_ROOT\word\DefaultIcon]
@="D:\\software\\WPS Office\\10.1.0.7521\\office6\\wps.exe,1" 
[HKEY_CLASSES_ROOT\word\shell]
@="open"
[HKEY_CLASSES_ROOT\word\shell\open]
@="open"
[HKEY_CLASSES_ROOT\word\shell\open\command]
@="\"D:\\software\\WPS Office\\10.1.0.7521\\office6\\wps.exe\" \"%1\"" // 应用程序路径,%1表示参数

注意

  1. 路径使用双杠“\
  2. 如果字符串中有双引号("),那么需要加转义字符""
  3. 保存后双击文件执行,将这些项写入到注册表

检验是否注册成功

  • 开始-运行 输入word:,可以运行该程序则表示注册成功了;
  • 在浏览器的地址栏直接输入:word:,可以运行则表示注册成功;

web页面中启动word程序

href里面配置自定义的协议,用于唤醒本地应用

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>Page Title</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
</head>

<body>
    <a href="word:">打开word</a>
</body>

</html>

最后

在谷歌浏览器69版本中测试可正常唤醒wps word程序


网页Web上调用本地应用程序

一、web调用本地应用程序的思路

这个方法主要思路是利用自定义URL Protocol来调用应用程序。浏览器在解析到自定义URL Protocol之后,会寻找注册表,然后通过注册表启动相应的程序,然后启动改程序,传入参数。这样就可以在WEB页面调到你的程序了。比如在浏览器地址栏输入“tencent://message/?uin=88888888&Site=JooIT.com&Menu=yes”就会出现一个QQ对话框。

1、先往注册表写信息。如下:

Windows Registry Editor Version 5.00  
[HKEY_CLASSES_ROOT\Diff]  
"URL Protocol"="这里是小程序的安装路径"  
@="DiffProtocol"  
[HKEY_CLASSES_ROOT\Diff\DefaultIcon]  
@="这里是小程序的安装路径,1"  
[HKEY_CLASSES_ROOT\Diff\shell]  
[HKEY_CLASSES_ROOT\Diff\shell\open]  
[HKEY_CLASSES_ROOT\Diff\shell\open\command]  
@="\"这里是小程序的安装路径\" \"%1\""  

将上面的内容保存为.reg文件运行即可。

2、web页面调用。在网页直接一个超链接,协议://参数就可以了。比如

<a href=" Diff://">  
   alt="点击这里">    
 </a>  
<a href=" Diff://hello">SIMU</a>  

需要指出的是:在上面例子中注册表中代码【@="\"这里是小程序的安装路径\" \"%1\""】中的%1表示传入参数,就是对应这此处的Diff://hello,解析之后就可以得到参数hello了。

二、完整实例。

1、xxxClient.reg文件

Windows RegistryEditor Version 5.00  

[HKEY_CLASSES_ROOT\xxxClient]  
@="xxxClientProtocol"  
"URLProtocol"=""  

[HKEY_CLASSES_ROOT\xxxClient\DefaultIcon]  
@="C:\\ xxx_Client\\client.bat,1"  

[HKEY_CLASSES_ROOT\xxxClient\shell]  

[HKEY_CLASSES_ROOT\xxxClient\shell\open]  

[HKEY_CLASSES_ROOT\xxxClient\shell\open\command]  
@="\"C:\\xxx_Client\\client.bat\" \"%1\""  

2、client.bat文件

@echo off  

rem设置当前目录为C:\ xxx _Client\

setcurrent_dir=C:\ xxx _Client\   

pushd%current_dir%   

call C:\ xxx _Client\xxx _Client.exe  

3、web页面文件

<!DOCTYPEHTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
<htmlxmlnshtmlxmlns="http://www.w3.org/1999/xhtml">  
 <head>  
     <meta http-equiv="Content-Type"content="text/html; charset=utf-8" />  
 </head>  
   <body>  
       <div>  
           <a href="xxxClient://">  
          打开客户端软件  
           </a>  
       </div>  
   </body>  
</html>  

三、注意问题:

1、如何动态生成注册表信息,可以在应用程序中写代码操作注册表,写入上面的URL Protocol注册表格式信息。

2、路径问题,如果应用程序包含了很多文件,就涉及到工作路径问题,web调用应用程序,当时的工作路径是的web运行的工作路径。可以通过bat或应用程序来切换路径。

bat为例,建立一个批处理文件,里面切换路径,注册注册表信息时,[HKEY_CLASSES_ROOT\Diff\shell\open\command]使用bat路径。

xxxClient.bat文件

@echo off

rem设置当前目录为C:\ xxx_Client\

setcurrent_dir=C:\ xxx_Client\

pushd%current_dir%

call C:\ xxx_Client\xxx_Client.exe

3、如何获取参数?

MFC Dialog程序的参数值:

首先需要获取传入的参数,在控制台程序中我们都知道main()函数的参数argv里带入了传入的参数,而在MFC程序中则需要在InitInstance()中进行命令行参数解析。

CCommandLineInfo   cmdInfo;   
ParseCommandLine(cmdInfo);

为了给对话框传入待显示的参数,加入了一个SetDisplayInfo方法。

CHelloWorldDlg dlg;
dlg.SetDisplayInfo(cmdInfo.m_strFileName);//设置待显示的信息

void CHelloWorldDlg::SetDisplayInfo(CString& strInfo)
{
this->m_strInfo = strInfo;
}

最后在OnInitDialog函数中进行参数解析

//解析传入的完整地址,e.g "helloworld://hello world/"
int pos = m_strInfo.Find("//");//找到分隔符
m_strInfo = m_strInfo.Mid(pos+2);//取到传入的参数
m_strInfo.Delete(m_strInfo.GetLength()-1);//去掉最后的'/'
m_edit_info.SetWindowText(m_strInfo);
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值