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

news2024/11/28 7:42:12

推荐阅读

  • 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和坑,让后来人可以有些参考。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/335755.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

常见HTTP请求错误码大全

响应码由三位十进制数字组成&#xff0c;它们出现在由HTTP服务器发送的响应的第一行。 响应码分五种类型&#xff0c;由它们的第一位数字表示&#xff1a; 1xx&#xff1a;信息&#xff0c;请求收到&#xff0c;继续处理 2xx&#xff1a;成功&#xff0c;行为被成功地接受、…

【Nacos】Nacos配置中心服务端源码分析

上文说了Nacos配置中心客户端的源码流程&#xff0c;这篇介绍下Nacos配置中心服务端的源码。 服务端的启动 先来看服务启动时干了啥&#xff1f; init()方法上面有PostConstruct&#xff0c;该方法会在ExternalDumpService实例化后执行。 com.alibaba.nacos.config.server.s…

第三方电容笔怎么样?开学适合买的电容笔

随着科学技术的进步&#xff0c;很多新型的电子产品和数码设备都出现了。比如手机&#xff0c;IPAD&#xff0c;蓝牙耳机&#xff0c;电容笔等等。实际上&#xff0c;如果你想要更好的使用ipad&#xff0c;那么你就需要一支电容笔。比如ipad&#xff0c;我们用ipad来做笔记&…

面向战场的cesium基础到进阶的案例展示(我相信VIP总是有原因的)

cesium 前置说明(友情提示,关注重点代码,其他影响复现的都可以删除或者替换数值解决) 这里面用到了cesium的模型加载、图片加载、着色器、实时改变模型状态、模型删除等知识点,这需要你自己去观摩下述会包含所有相关代码,他们的联系其实在代码中能看到(比如飞机操作类会…

告别传统繁杂的采购合同管理 打造企业自动化采购管理模式

随着企业竞争日趋激烈&#xff0c;采购成本压力剧增&#xff0c;企业对于采购合同管理更加严格&#xff0c;从而把控物资成本。对于任何一家企业采购来说&#xff0c;规范化合同的全面管理&#xff0c;是采购活动中重要的一个环节。 但在如今&#xff0c;依旧有很多企业采购合…

Windows截取gif动态图的软件 ScreenToGif 的安装、使用教程

一、概述 &#x1f449;GIF&#xff08;Graphics Interchange Format&#xff09;&#xff0c;又称图形交换格式&#xff0c;是一种公用的图像文件格式标准&#xff0c;于1987年由Compu Serve公司成功研发并推出。 &#x1f449;GIF用于以超文本标志语言方式显示索引彩色图像&a…

【FFMPEG源码分析】从ffplay源码摸清ffmpeg框架(二)

demux模块 从前面一篇文章中可以得知&#xff0c;demux模块的使用方法大致如下: 分配AVFormatContext通过avformat_open_input(…)传入AVFormatContext指针和文件路径&#xff0c;启动demux通过av_read_frame(…) 从AVFormatContext中读取demux后的audio/video/subtitle数据包…

LKWA靶场通关和源码分析

文章目录一、Blind RCE&#xff1f;二、XSSI三、PHP Object Injection四、PHP Object Injection(cookie)五、PHP Object Injection(Referer)六、PHAR七、SSRF八、Variables总结一、Blind RCE&#xff1f; 源码&#xff1a; <?php include("sidebar.php"); /***…

【程序化天空盒】过程记录01:日月 天空渐变 大气散射

1 日月 SunAndMoon 昼夜的话肯定少不了太阳和月亮&#xff0c;太阳和月亮实现的道理是一样的&#xff0c;只不过是月亮比太阳多了一个需要控制月牙程度&#xff08;or添加贴图&#xff09;的细节~ 1.1 Sun 太阳的话很简单&#xff0c;直接在shader里实现一个太阳跟随平行光旋…

Ubuntu18.04中安装Pycharm2023

下载安装包访问 Jetbrains官方网站 下载 Linux的安装包点击 Download 后下载文件名为 pycharm-community-2022.3.2.tar.gz解压安装启动终端&#xff0c;cd Downloads 进入Downloads目录&#xff08;默认下载路径&#xff09;解压压缩包 tar -xzvf pycharm-community-2020.2.2.t…

【Nacos】Nacos配置中心客户端启动源码分析

SpringCloud项目启动过程中会解析bootstrop.properties、bootstrap.yaml配置文件&#xff0c;启动父容器&#xff0c;在子容器启动过程中会加入PropertySourceBootstrapConfiguration来读取配置中心的配置。 PropertySourceBootstrapConfiguration#initialize PropertySource…

实现复选框全选和全不选的切换

今天&#xff0c;复看了一下JS的菜鸟教程&#xff0c;发现评论里面都是精华呀&#xff01;&#xff01; 看到函数这一节&#xff0c;发现就复选框的全选和全不选功能展开了讨论。我感觉挺有意思的&#xff0c;尝试实现了一下。 1. 全选、全不选&#xff0c;两个按钮&#xff…

CentOS8联网部署Ceph-Quincy集群

文章目录1.环境准备1.1 关闭selinux1.2 关闭防火墙1.3 配置免密1.4 设置yum源1.5 安装依赖1.6 设置时间同步1.7 安装docker2.安装Ceph2.1 安装cephadm2.2 部署ceph集群2.3 集群添加节点2.4 部署MON2.5 部署OSD2.6 部署MGR2.7 集群状态3.问题3.1 failed to retrieve runc versio…

腾讯云对象存储+企业网盘 打通数据链“最后一公里

对云厂商和企业用户来说&#xff0c;随着数据规模的快速增长&#xff0c;企业除了对存储功能和性能的要求不断增加&#xff0c;也越来越注重数据分发的效率。在传统数据分发的过程中&#xff0c;数据管理员往往需要先在存储桶下载对应的客户方案/交付资料&#xff0c;再使用微信…

【前言】嵌入式系统简介

随手拍拍&#x1f481;‍♂️&#x1f4f7; 日期: 2022.12.01 地点: 杭州 介绍: 2022.11.30下午两点时&#xff0c;杭州下了一场特别大的雪。隔天的12月路过食堂时&#xff0c;边上的井盖上发现了这个小雪人。此时边上的雪已经融化殆尽&#xff0c;只有这个雪人依旧维持着原状⛄…

【FLASH存储器系列十九】固态硬盘掉电后如何恢复掉电前状态?

掉电分两种&#xff0c;一种是正常掉电&#xff0c;另一种是异常掉电。不管是哪种原因导致的掉电&#xff0c;我们都希望&#xff0c;重新上电后&#xff0c;SSD都需要能从掉电中恢复过来&#xff0c;继续正常工作。正常掉电恢复&#xff0c;这个好理解&#xff0c;主机通知SSD…

Linux(centOS7)虚拟机中配置 vim

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是小童&#xff0c;Java开发工程师&#xff0c;CSDN博客博主&#xff0c;Java领域新星创作者 &#x1f4d5;系列专栏&#xff1a;前端、Java、Java中间件大全、微信小程序、微信支付、若依框架、Spring全家桶 &#x1f4…

数据库实践LAB大纲 05 JDBC 连接

概述 Java DataBase Connectivity&#xff0c;Java 数据库连接 执行SQL的Java API 为多种关系型数据提供统一访问 FUNCTION 建立与数据库的连接向数据库发送 SQL 语句处理从数据库返回的结果 四种常见JDBC驱动程序 JDBC-ODBC Bridge drivernative-API, partly Java driver…

LeetCode题目笔记——1.两数之和

文章目录题目描述题目难度——简单方法一&#xff1a;暴力代码/Python方法二&#xff1a;哈希表代码/Python代码/C总结题目描述 这道题可以说是力扣的入坑题了&#xff0c;很经典&#xff0c;好像还是面试的经典题。 给定一个整数数组 nums 和一个整数目标值 target&#xff0c…

Zookeeper技术认知

目录概念理解工作原理文件系统通知系统zookeeper在kakfa中的作用概念理解 Zookeeper是一个开源的分布式的&#xff0c;为分布式框架提供协调服务的Apache项目。 工作原理 Zookeeper 作为一个分布式的服务框架&#xff0c;主要用来解决分布式集群中应用系统的一致性问题&…