【海康威视】WPF客户端二次开发:【4】Chrome浏览器调用客户端程序

文章目录

  • 一、前言
  • 二、操作步骤
    • 1、调用案例:
    • 2.1、注册表自定义协议内容:手动添加
    • 2.2、注册表自定义协议内容:打包程序中固定配置
    • 2.3、注册表自定义协议内容:打包程序中动态配置
    • 3、浏览器唤起客户端程序:
    • 4、多客户端启动问题:
    • 5、启动程序后路径引用问题:
    • 6、应用程序权限问题:
  • 三、总结


一、前言

WPF客户端程序开发完成了,安装包也制作好了,但是场景需求又来,用户应该如何在浏览器网页里面唤起客户端程序呢?就像网页点击迅雷下载资源一样,浏览器自动弹起迅雷客户端,还能传递参数;

二、操作步骤

1、调用案例:

  1. 浏览器地址输入调起QQ:tencent://message/?uid=001&username=002
  2. QQ注册表内容:
    【海康威视】WPF客户端二次开发:【4】Chrome浏览器调用客户端程序_第1张图片

2.1、注册表自定义协议内容:手动添加

  1. 创建注册表文件(照猫画虎):AngWeiRobot.reg
  2. 其中应用程序安装路径:“C:\Program Files (x86)\昂威科技\昂威机器人\HKVS.IPCM.WPF.exe”;
  3. 注意路径中要用双斜杠,带中文注意文件编码 UTF-8-BOM编码 否则导入失败或者乱码;
  4. 双击AngWeiRobot.reg 把注册内容添加到注册表;
  5. 手动添加的方式只是为讲解原理,和测试使用,实际场景比较局限;
 Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\AngWeiRobot]               //节点1:AngWeiRobot 就是自定义协议名称
@="URL:AngWeiRobotProtocol"                   //节点1:数据项1 内容随便写
"URL Protocol"="C:\\Program Files (x86)\\昂威科技\昂威机器人\\HKVS.IPCM.WPF.exe"//节点1:数据项2 应用程序路径

[HKEY_CLASSES_ROOT\AngWeiRobot\shell]              //节点2:留空

[HKEY_CLASSES_ROOT\AngWeiRobot\shell\open]         //节点3:留空

[HKEY_CLASSES_ROOT\AngWeiRobot\shell\open\command] //节点4:添加程序路径及参数
//@="C:\Program Files (x86)\\昂威科技\\昂威机器人\\HKVS.IPCM.WPF.exe" //不带参数写法
@="\"C:\Program Files (x86)\\昂威科技\\昂威机器人\\HKVS.IPCM.WPF.exe\" \"%1\"" //带参数写法

【海康威视】WPF客户端二次开发:【4】Chrome浏览器调用客户端程序_第2张图片

2.2、注册表自定义协议内容:打包程序中固定配置

  1. 由于已经使用了AdvancedInstaller 进行WPF安装包制作,所以直接把上面的注册表内容打包到安装程序;
  2. 参数名称留空表示默认名称;
  3. 程序安装完成后注册表中就有相应的注册内容;
    【海康威视】WPF客户端二次开发:【4】Chrome浏览器调用客户端程序_第3张图片

2.3、注册表自定义协议内容:打包程序中动态配置

  1. 上面2种方法是写入死的路径,如果用户选择了其他安装路径,会导致实际安装路径与注册表中配置的路径不一致从而无法启动程序,考虑采用动态拼接的方式,把实际安装目录和应用程序名字拼起来如:[APPDIR]xxx.exe;[APPDIR]是一个动态变量,代表当前动态选择的程序实际安装目录;
  2. 这样不管用户怎么选择路径,最终注册表中的程序路径配置都能与之对应;
    【海康威视】WPF客户端二次开发:【4】Chrome浏览器调用客户端程序_第4张图片

3、浏览器唤起客户端程序:

//不带参数启动:

<html>
<body id="myid" title="mytitle">
<a href="AngWeiRobot://">调用客户端程序</a>
</body>
</html> 

//带参数启动:
<html>
<body id="myid" title="mytitle">
<a href="AngWeiRobot://uid=250&name=438">调用客户端程序</a>
//程序启动后可以获取传入的参数 uid=250&name=438
</body>
</html> 

【海康威视】WPF客户端二次开发:【4】Chrome浏览器调用客户端程序_第5张图片

4、多客户端启动问题:

  1. 问题:如果有多个程序要启动呢?
  2. 方案:1、添加一个xxx.bat 文件;2、直接调用.bat;3、在.bat文件中去启动多个程序;

5、启动程序后路径引用问题:

  1. 问题描述:不管是启动exe 还是启动 .bat 都会存在一个问题,目标程序是启动起来了,但是程序总是异常或则某些功能不对,但是手动在安装目录双击启动又一切正常; 比如:当前启动的xxx.exe程序 依赖了当前根目录下的某个 Serilog.dll 日志程序集,但是启动后 程序中却无法使用日志功能,通过直接双击xxx.exe 日志功能正常;
  2. 问题分析:这是因为在使用A程序调用B程序的时候,会导致B程序的实际启动路径不是B程序的物理路径,而是A程序的路径 或者是C:\Windows\system32 系统路径,从而导致B程序找不到相对路径下的Serilog.dll程序集;
  3. 解决方案:
    1. 添加一个run.bat文件;
    2. 切换到当前run.bat文件所在物理系统盘符 D盘 C盘:cd /d(等价于:cd d: cd:c cd:e)
    3. 切换到run.bat文件所在的绝对路径:cd “%~dp0”(等价于:cd d:\currentdirectory\)
    4. 合在一起就是:cd /d “%~dp0”
    5. 采用异步的方式启动程序:start HKVS.IPCM.WPF.exe %1( %1 代表run.bat从浏览器获取到的第1个参数,传递给目标程序)
    6. 退出cmd黑窗口:exit

run.bat

@echo off
cd /d "%~dp0"
start HKVS.IPCM.WPF.exe %1
exit 

::关闭输出内容
::相当于 cd /d cd “%~dp0” 两条命令 cd /d: 相当于cd D: 或则 cd C: 代表当前批处理程序所在的盘符 ;cd “%~dp0”:相当于 cd “C:\xxxdir”
::采用异步的方式启动程序 否则cmd窗口会等待程序退出 %1 代表从第一个参数 由浏览器传递进来
::直接退出CMD黑框

6、应用程序权限问题:

  1. 问题描述:用Advanced Installer 打包的程序 默认安装在路径是在 C:\Program Files (x86)下面,安装后发现应用程序启动的时候没有创建文本文件的权限,导致程序异常无法启动,需要手动设置以管理员身份启动才行,搞了半天想了各种方法没搞定;
  2. 解决方案:在打包程序的时候,配置默认安装路径在C盘根目录或者其他盘,只要不在C:\Program Files (x86)这个下面就可以:太特么坑爹了 ,好想哭 就这么一个破问题折腾了我一天;
    【海康威视】WPF客户端二次开发:【4】Chrome浏览器调用客户端程序_第6张图片

三、总结

一年之计在于春,一周之计在于周末,一天之计在于下班,卧槽还有一个半小时!

你可能感兴趣的:(WPF,海康威视二次开发,海康威视,WPF)