建设网站的风险,创建全国文明城市总结,网站联系我们模块怎么做,手机网站字体大小规范推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 大家好#xff0c;我是佛系工程师☆恬静的小魔龙☆#xff0c;不定时更新Unity开发技巧#xff0c;觉得有用记得一键三连哦。
一、前言
最近有项目需求#xff0c;从浏览器调起来本地的exe程序… 推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 大家好我是佛系工程师☆恬静的小魔龙☆不定时更新Unity开发技巧觉得有用记得一键三连哦。
一、前言
最近有项目需求从浏览器调起来本地的exe程序并且还要传参、传数据。
研究了一下总结出来。
流程图如下所示
二、正文
2-1、实现方法
浏览器实现拉起本地exe的方法就是向系统中添加一个注册表注册表找到指定路径下的程序拉起。
这个注册表就是类似于HTTP的私有协议本地有效可以拉起本地exe程序。
注册表如下
[HKEY_CLASSES_ROOT\virtualcourse.test]
[HKEY_CLASSES_ROOT\test\DefaultIcon]
F:\test\mytest,1
[HKEY_CLASSES_ROOT\test\shell]
[HKEY_CLASSES_ROOT\test\shell\open]
[HKEY_CLASSES_ROOT\test\shell\open\command]
F:\test\mytest %1 DefaultIcon 是默认程序的icon位置 command 是记录程序的位置 注册表的结构
2-2、制作注册表程序
新建个控制台程序搭建一下UI 编辑代码
using Microsoft.Win32;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;namespace WindowsFormsApp1
{public partial class Form1 : Form{public Form1(){InitializeComponent();}private void Form1_Load(object sender, EventArgs e){}private void button1_Click(object sender, EventArgs e){try{if (string.IsNullOrEmpty(txtCourseID.Text.Trim())){MessageBox.Show(课程ID不能为空);return;}string strPrimaryKey virtualcourse. txtCourseID.Text.Trim();RegistryKey key Registry.ClassesRoot;RegistryKey regPrimaryKey key.CreateSubKey(strPrimaryKey);regPrimaryKey.SetValue(, strPrimaryKey Protocol);regPrimaryKey.SetValue(URL Protocol, );RegistryKey regDefaultIconKey key.CreateSubKey(strPrimaryKey \\DefaultIcon);string strExePathName Application.StartupPath \\ Application.ProductName;regDefaultIconKey.SetValue(, strExePathName ,1);RegistryKey regshellKey key.CreateSubKey(strPrimaryKey \\shell);RegistryKey regshellopenKey key.CreateSubKey(strPrimaryKey \\shell\\open);RegistryKey regshellopencommandKey key.CreateSubKey(strPrimaryKey \\shell\\open\\command);regshellopencommandKey.SetValue(, string.Format(\{0}\ \%1\, strExePathName));key.Close();MessageBox.Show(生成注册表成功);this.btnAddReg.Enabled false;this.txtCourseID.ReadOnly true;}catch (Exception ex){MessageBox.Show(生成注册表失败 ex.Message);}}private void button2_Click(object sender, EventArgs e){try{if (string.IsNullOrEmpty(txtCourseID.Text.Trim())){MessageBox.Show(课程唯一ID不能为空);return;}string strPrimaryKey virtualcourse. txtCourseID.Text.Trim();RegistryKey delKey Registry.ClassesRoot;RegistryKey regPrimaryKey delKey.OpenSubKey(strPrimaryKey, true);//判断要删除的regPrimaryKey是否存在if (regPrimaryKey ! null){delKey.DeleteSubKeyTree(strPrimaryKey, true);}delKey.Close();MessageBox.Show(删除注册表成功);this.btnAddReg.Enabled true;this.txtCourseID.ReadOnly false;}catch (Exception ex){MessageBox.Show(删除注册表失败 ex.Message);}}}
}生成解决方案 在bin→Debug目录下运行程序 以管理员的身份运行 随便写入课程ID点击生成注册表即可 PS也可以手动添加注册表就是有点麻烦在实际开发中需要用到打包工具将添加注册表的事项添加到安装过程中就可以在安装完程序后注册表也添加完成。 2-3、HTML网页调用本地exe
首先新建个.txt文件编辑后再改成.html后缀名即可代码参考
!DOCTYPE html
html langzh-CN
headmeta charsetUTF-8meta http-equivcontent-type contenttext/html; charsetutf-8titleweb打开本地exe/titlescript srcvue.js/script
/head
bodydiv idappspan请输入课程ID/spaninput typetext name id v-modelcourseId stylewidth: 400px;a :hrefhrefValue clickgetHrefValue styledisplay: inline-block;测试打开本地应用并传参/a/divscriptvar vm new Vue({el: #app,data: {courseId:,paramValue: token123456789,hrefValue:,},methods: {getHrefValue(){this.hrefValuevirtualcourse.this.courseId://this.paramValue;}},mounted() {// this.getHrefValue();},})/script
/body
/html将打包后的程序放到添加注册表的程序目录下因为在生成注册表的时候将这个目录记录进去了 当然也可以手动改这个路径。
2-4、生成Unity的exe程序
新建个Unity项目新建场景搭建场景 新建脚本命名为JSCallUnity.cs编辑代码
using System;
using UnityEngine;
using UnityEngine.UI;public class JSCallUnity : MonoBehaviour
{public InputField m_Input;void Start(){// 从控制台接收参数ReadEnvironmentData();}private void ReadEnvironmentData(){//用来接收HTML发来的数据string[] CommandLineArgs Environment.GetCommandLineArgs();if (CommandLineArgs.Length 2 || CommandLineArgs[1] ){m_Input.text 没有接收到参数;Application.Quit();//启动时没有参数则退出}else{ParseInitData(CommandLineArgs[1]);}}//解析参数void ParseInitData(string data){//解析参数m_Input.text data;}
}注意 主要的方法就是Environment.GetCommandLineArgs();用来接收HTML发来的命令行参数数据。 官方解释返回包含当前进程的命令行参数的字符串数组。 返回值是一个string[],当Length1的时候就是带参数在UnityEditor模式 也就是编辑器模式会有默认参数返回,Length是大于1的 拖进去 打包为exe 复制到生成注册表的程序中将命名改成生成注册表的生成的exe名字 打开HTMl文件输入生成的注册表的课程ID点击测试打开本地应用 运行结果 后面就是对数据进行处理的事情了这个就跟后端的程序沟通如何定义数据类型如何解析数据即可了这里就不展开讲了。
三、后记
本篇文章实现了从生成注册表然后用浏览器通过注册表HTTP协议拉起本地的EXE程序。
然后Unity程序中使用了Environment.GetCommandLineArgs();方法获取到HTML发过来的数据。 你的点赞就是对博主的支持有问题记得留言
博主主页有联系方式。
博主还有跟多宝藏文章等待你的发掘哦
专栏方向简介Unity3D开发小游戏小游戏开发教程分享一些使用Unity3D引擎开发的小游戏分享一些制作小游戏的教程。Unity3D从入门到进阶入门从自学Unity中获取灵感总结从零开始学习Unity的路线有C#和Unity的知识。Unity3D之UGUIUGUIUnity的UI系统UGUI全解析从UGUI的基础控件开始讲起然后将UGUI的原理UGUI的使用全面教学。Unity3D之读取数据文件读取使用Unity3D读取txt文档、json文档、xml文档、csv文档、Excel文档。Unity3D之数据集合数据集合数组集合数组、List、字典、堆栈、链表等数据集合知识分享。Unity3D之VR/AR虚拟仿真开发虚拟仿真总结博主工作常见的虚拟仿真需求进行案例讲解。Unity3D之插件插件主要分享在Unity开发中用到的一些插件使用方法插件介绍等Unity3D之日常开发日常记录主要是博主日常开发中用到的用到的方法技巧开发思路代码分享等Unity3D之日常BUG日常记录记录在使用Unity3D编辑器开发项目过程中遇到的BUG和坑让后来人可以有些参考。