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

【虚拟仿真】Unity3D实现从浏览器拉起本地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 lang="zh-CN">
<head><meta charset="UTF-8"><meta http-equiv="content-type" content="text/html; charset=utf-8"><title>web打开本地exe</title><script src="vue.js"></script>
</head>
<body><div id="app"><span>请输入课程ID:</span><input type="text" name="" id="" v-model="courseId" style="width: 400px;"><a :href="hrefValue" @click="getHrefValue" style="display: inline-block;">测试打开本地应用并传参</a></div><script>var vm = new Vue({el: "#app",data: {courseId:'',paramValue: 'token=123456789',hrefValue:'',},methods: {getHrefValue(){this.hrefValue='virtualcourse.'+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[],当Length>1的时候就是带参数在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和坑,让后来人可以有些参考。

相关文章:

【虚拟仿真】Unity3D实现从浏览器拉起本地exe程序并传参数

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 最近有项目需求&#xff0c;从浏览器调起来本地的exe程序&…...

Intel中断体系(1)中断与异常处理

文章目录概述中断与异常中断可屏蔽中断与不可屏蔽中断&#xff08;NMI&#xff09;异常异常分类中断与异常向量中断描述符表中断描述符中断与异常处理中断与异常处理过程堆栈切换错误码64位模式下的中断异常处理64位中断描述符64位处理器下的堆栈切换相关参考概述 中断是现代计…...

财报解读:四季度营收超预期,优步却越来越“不务正业”了

“公司第四季度的业绩表现将是强劲的”。 公布2022年第三季度财报时&#xff0c;优步的高管给出了这样的预告&#xff0c;给资本市场打了一针“强心剂”。然而有人对此表示质疑&#xff0c;后疫情时代&#xff0c;带着新模式、新车型的全新网约车公司层出不穷&#xff0c;车企…...

C语言-程序环境和预处理(14.2)

目录 预处理详解 1.预定义符号 2. #define 2.1 #define定义标识符 2.2 #define 定义宏 2.3 #define 替换规则 注意事项&#xff1a; 2.4 #和## 2.5 带副作用的宏参数 2.6 宏和函数对比 3. #undef 4. 条件编译 4.1 单分支条件编译 4.2 多分支条件编译 4.3 判断是…...

VHDL语言基础-时序逻辑电路-计数器

目录 计数器的设计&#xff1a; 计数器的作用&#xff1a; 计数器的实现&#xff1a; 1、用“”函数描述&#xff1a; 用T触发器级联构成的串行进位的二进制加法计数器的仿真波形&#xff1a; 计数器的仿真&#xff1a; 计数器的设计&#xff1a; 计数是一种最简单基本的…...

MySQL数据库07——高级条件查询

前面一章介绍了基础的一个条件的查询&#xff0c;如果多条件&#xff0c;涉及到逻辑运算&#xff0c;and or 之类的。就是高级一点的条件查询。本章来介绍复杂的条件搜索表达式。 AND运算符 AND运算符只有当两边操作数均为True时&#xff0c;最后结果才为True。人们使用AND描述…...

《Terraform 101 从入门到实践》 第四章 States状态管理

《Terraform 101 从入门到实践》这本小册在南瓜慢说官方网站和GitHub两个地方同步更新&#xff0c;书中的示例代码也是放在GitHub上&#xff0c;方便大家参考查看。 军书十二卷&#xff0c;卷卷有爷名。 为什么需要状态管理 Terraform的主要作用是管理云平台上的资源&#xff…...

数据结构之二叉树

&#x1f388;一.二叉树相关概念 1.树 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合&#xff0c;树结构通常用来存储逻辑关系为 "一对多" 的数据。例如&#xff1a; 关于树的几个重要概念&…...

上海亚商投顾:三大指数集体调整 消费板块逆市活跃

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。市场情绪三大指数今日集体调整&#xff0c;沪指全天弱势震荡&#xff0c;创业板指盘中跌超1%。旅游、食品、乳业等大消费板块…...

【2023unity游戏制作-mango的冒险】-开始画面API制作

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 秩沅 原创 收录于专栏&#xff1a;游戏制作 ⭐mango的冒险-开始画面制作⭐ 文章目录⭐mango的冒险-开始画面制作⭐&#x1f468;‍&…...

【微服务】Nacos配置管理

&#x1f6a9;本文已收录至专栏&#xff1a;微服务探索之旅 &#x1f44d;希望您能有所收获 Nacos除了可以做配置管理&#xff0c;同样可以当作注册中心来使用。 了解注册中心用法点击跳转&#x1f449;【微服务】Nacos注册中心 一.引入 当微服务部署的实例越来越多&#xff0…...

【C++】类与对象理解和学习(上)

专栏放在【C知识总结】&#xff0c;会持续更新&#xff0c;期待支持&#x1f339;类是什么&#xff1f;类是对对象进行描述的&#xff0c;是一个模型一样的东西&#xff0c;限定了类有哪些成员&#xff0c;定义出一个类并没有分配实际的内存空间来存储它&#xff08;实例化后才…...

Pyqt5小案例,界面与逻辑分离的小计算器程序

直接看下最终效果&#xff1a; 使用技术总结 使用Designer设计界面 使用pyuic5命令导出到python文件 新建逻辑处理文件&#xff0c;继承pyuic5导出的文件的类&#xff0c;在里面编写信号与槽的处理逻辑 使用Designer设计界面 要使用Designer&#xff0c;安装一个Python库即…...

leaflet加载KML文件,显示图形(方法2)

第049个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+leaflet中加载KML文件,将图形显示在地图上。 直接复制下面的 vue+openlayers源代码,操作2分钟即可运行实现效果; 注意如果OpenStreetMap无法加载,请加载其他来练习 文章目录 示例效果配置方式示例源代码(共66…...

Mysql 部署 MGR 集群

0. 参考文章 官方文档&#xff1a; MySQL :: MySQL 8.0 Reference Manual :: 18.2 Getting Started 博客&#xff1a; MGR 单主模式部署教程&#xff08;基于 MySQL 8.0.28&#xff09; - 墨天轮 (modb.pro) mysql MGR单主模式的搭建 - 墨天轮 (modb.pro) MySQL 5.7 基于…...

迁移至其他美国主机商时需要考虑的因素

网站的可访问性是关系业务的关键因素之一。一个稳定、快速且优化良好的主机上的网站更有可能享受不间断的流量&#xff0c;并在谷歌的SERP中获得更好的排名。因此&#xff0c;在构建企业网站时&#xff0c;选择合适的主机商相当重要。不过就以美国主机为例&#xff0c;由于每个…...

【数据结构】第二章 线性表

文章目录第二章 知识体系2.1 线性表的定义和基本操作2.1.1 线性表的定义2.1.2 线性表的基本操作2.2 线性表的顺序表示2.2.1 顺序表的定义2.2.2 顺序表的基本操作的实现2.3 线性表的链式表示2.3.1 单链表的定义2.3.2 单链表的基本操作实现2.3.3 双链表2.3.4 循环链表2.3.5 静态链…...

RESTful API 为何成为顶流 API 架构风格?

作者孙毅&#xff0c;API7.ai 技术工程师&#xff0c;Apache APISIX Committer 万物互联的世界充满着各式各样的 API &#xff0c;如何统筹规范 API 至关重要。RESTful API 是目前世界上最流行的 API 架构风格之一&#xff0c;它可以帮助你实现客户端与服务端关注点分离&#x…...

Python基础知识点汇总(列表)

列表的含义 列表由一系列按特定顺序排列的元素组成,是Python中内置的可变序列。 **注:**列表的所有元素放在中括号[]中,相邻的两个元素用逗号分隔; 可将整数、实数、字符串、列表、元组等任何类型的内容放到列表中,且同一列表的元素类型可以不同。 列表的创建和删除 1.…...

新的一年软件测试行业的趋势能够更好?

如果说&#xff0c;2022年对于全世界来说&#xff0c;都是一场极大的挑战的话&#xff1b;那么&#xff0c;2023年绝对是机遇多多的一年。众所周知&#xff0c;随着疫情在全球范围内逐步得到控制&#xff0c;无论是国际还是国内的环境&#xff0c;都会呈现逐步回升的趋势&#…...

Threejs中的Shadow Mapping(阴影贴图)

简而言之&#xff0c;步骤如下&#xff1a; 1.从灯光位置视点&#xff08;阴影相机&#xff09;创建深度图。 2.从相机的位置角度进行屏幕渲染&#xff0c;在每个像素点&#xff0c;比较由阴影相机的MVP矩阵计算的深度值和深度图的值的大小&#xff0c;如果深度图值小的话&…...

本质安全设备标准(IEC60079-11)的理解(四)

本质安全设备标准&#xff08;IEC60079-11&#xff09;的理解&#xff08;四&#xff09; 对于标准中“Separation”的理解 IEC60079-11使用了较长的篇幅来说明设计中需要考虑到的各种间距&#xff0c; 这也从一定程度上说明了间距比较重要&#xff0c;在设计中是需要认真考虑…...

(record)QEMU安装最小linux系统——TinyCore(命令行版)

文章目录QEMU安装最小linux系统——TinyCore参考QEMU使用qemu创建tinycore虚拟机再次启动文件保存QEMU安装最小linux系统——TinyCore 简单记录安装过程和记录点 参考 [原创] qemu 与 Tiny Core tinycore的探索 QEMU qemu不多介绍&#xff0c;这里是在WSL2上安装的linux版…...

C++中的cast类型转换

reinterpret_cast用法&#xff1a;reinpreter_cast<type-id> (expression)type-id必须是一个指针、引用、算术类型、函数指针或者成员指针。它可以把一个指针转换成一个整数&#xff0c;也可以把一个整数转换成一个指针。这个操作符能够在非相关的类型之间转换。操作结果…...

西瓜数据集读取的详细解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。喜欢通过博客创作的方式对所学的知识进行总结与归纳,不仅形成深入且独到的理…...

Mac开发环境配置

一、mac 安装homebrew 1. 必要性 ​ homebrew可以通过bash命令快速安装配置开发环境&#xff0c;并且在大多数情况下可以实现环境的自动配置。&#xff08;一键安装配置&#xff09; 2. 收益 ​ 节省开发环境工具配置时间&#xff0c;提高人效。 3. 安装步骤 打开mac终端…...

概率论面试题1:玫瑰花

概率论面试题 1. 一个活动&#xff0c;n个女生手里拿着长短不一的玫瑰花&#xff0c;无序的排成一排&#xff0c;一个男生从头走到尾&#xff0c;试图拿更长的玫瑰花&#xff0c;一旦拿了一朵就不能再拿其他的&#xff0c;错过了就不能回头&#xff0c;问最好的策略&#xff1…...

【DGL】图分类

目录概述数据集定义Data LoaderDGL中的batched graph定义模型训练参考概述 除了节点级别的问题——节点分类、边级别的问题——链接预测之外&#xff0c;还有整个图级别的问题——图分类。经过聚合、传递消息得到节点和边的新的表征后&#xff0c;映射得到整个图的表征。 数据…...

时间复杂度的计算(2023-02-10)

时间复杂度的计算 时间复杂度的计算分为三大类&#xff1a;一层循环、二层循环和多层循环。 一层循环 1.找出循环趟数t及每轮循环i的变化值 2.确立循环停止的条件 3.得出t与i之间的关系 4.联立两式&#xff0c;得出结果 eg: void fun(int n) {int i0;while (i*i*i<n)i;…...

测试开发之Django实战示例 第六章 追踪用户行为

第六章 追踪用户行为在之前的章节里完成了小书签将外站图片保存至本站的功能&#xff0c;并且实现了通过jQuery发送AJAX请求&#xff0c;让用户可以对图片进行喜欢/不喜欢操作。这一章将学习如何创建一个用户关注系统和创建用户行为流数据&#xff0c;还将学习Django的信号框架…...

铁岭网站建设/网站推广的概念

和List类型不同的是&#xff0c;Set集合中不允许出现重复的元素Set可包含的最大元素数量是4294967259存储Set的常用命令&#xff1a; 添加/删除元素获得集合中的元素集合中的差集运算集合中的交集运算集合中的并集运算扩展命令> sadd myset a b c //向集合中添加元素 (integ…...

wordpress用户勾选/平台seo什么意思

SRM&#xff1a;机房内部竞赛&#xff0c;哼唧。 描述 给一个 01 串设为其 S&#xff0c;询问是否存在只出现两次的 01 串 T。 这里的出现定义为存在一串下标 &#xff0c;满足 且 。 输入格式 一行&#xff0c;一个 01 串 输出格式 一行&#xff0c;字母 Y 表示存在&#xff…...

做网站如何突出网站特色/百度收录要多久

CentOS5、6系统的启动流程基于Intel X86架构平台的系统启动流程&#xff1a;1.POST&#xff1a;Power-On Self Testing&#xff0c;加电自检&#xff1b;CMOS&#xff1a;在这里面有一个EPROM&#xff0c;可擦写可编程的只读存储器&#xff1b;在这里面保存了一小段程序叫做BIO…...

电子商城开发网站建设/百度号注册官网

构建百万访问量电子商务网站之LVS负载均衡(前端四层负载均衡器)[连载之电子商务系统架构] 版本&#xff1a;V1 出处&#xff1a;http://jimmyli.blog.51cto.com/我站在巨人肩膀上Jimmy Li 作者&#xff1a;Jimmy Li 关键词&#xff1a;电子商务&#xff0c;系统架构&#xff0c…...

漯河做网站/网络小说网站三巨头

所以情况就是这样&#xff1a;我正在创建一个多人游戏,我希望我的朋友……,能够为它创建机器人.所以我要做的是创建一个抽象类Bot {},并为机器人定义函数,然后他们必须实现它们&#xff1a;非常简单.我被卡住了,之后如何添加它们&#xff1f;您可以使用反射或类似的东西来找到B…...

哪个平台免费招人最快/搜索引擎优化的方式

参考链接: 11周精通python计划&#xff08;完结&#xff09; 总结: # 演示类的使用 # 1.类属性, 类对象的属性, 由所有实例对象所共享,通过(类名.属性)或者(实例名.属性)来访问 # 2.实例属性, 实例对象的属性, 由各实例对象所独享,通过(实例名.属性)来访问代码实验展示: # 演…...