多个可执行程序协同工作

2024-03-15 14:58

本文主要是介绍多个可执行程序协同工作,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

背景

最近的项目涉及到一个漫游场景和多个小实验室,一开始是把小实验室和漫游场景放置在一个工程下面并且通过场景切换的方式来链接跳转。考虑到网络应用的大趋势和程序的扩展性,这样做下去实在是难以维护日渐增加的小实验室场景和逻辑。

实现

本文将实现一个大场景打开小场景并且可以跳转回大场景和功能,这个功能建立在window平台提供的Api的基础上,涉及到程序窗口的隐藏显示,初始进程参数的传递。还有一点,虽然是在unity3d开发的程序中使用,但最后实现的场景跳转控制器应该能在任何c#开发的程序中使用.

一、设计界面

目的的设计一个程序,可以打开同样的程序可以观察到实现的效果。功能按扭和显示信息的文字组合一个形成如下的一个界面程序:

点击打开子程序将弹出文件选择窗口,实现exe文件的选中,如果打开成功,这个窗口将隐藏。同时被打开的程序中的父级窗口将显示刚才隐藏窗口的句柄(用于还原隐藏的窗口)。如果点击关闭本程序,这样程序的进行将终止,同时还原隐藏的那个程序。这样不可以无缝的实现场景的切换同时兼顾应用程序的扩展性了。

二,接口设计

有了界面显示,当然想写一个通用的场景切换的控制器(Controller),需要实现的也就保存父级句柄,接收程序初始的参数,打开子窗口,关闭子窗口还有自身关闭的清理掉所打开的进程。(bool hideThis,这个变量用于不想隐藏父级窗口)

public interface IWindowSwitchCtrl {
    IntPtr Parent { get; }
    bool OnOpenedByParent(out string[] args);
    bool OpenChildWindow(string path,bool hideThis,params string[] args);
    bool CloseChildWindow();
    void OnCloseThisWindow();
}
三,实现参数传入

unity3d程序可以在程序进行的Awake中调用控制器获取参数,接口的实现部分如下(参数用空格分割,本程序中默认第三位起为用户参数)

/// <summary>
    /// 仅当第二个参数为1时,隐藏父级
    /// </summary>
    /// <param name="pwindow"></param>
    /// <param name="hideParent"></param>
    public bool OnOpenedByParent(out string[] argus)
    {
        hideParent = false;
        parentWindow = IntPtr.Zero;
        argus = null;

        string[] CommandLineArgs = Environment.GetCommandLineArgs();

        if (CommandLineArgs.Length == 1)
        {
            //无参数
            return false;
        }

        if (CommandLineArgs.Length > 1)
        {
            parentWindow = new IntPtr(int.Parse(CommandLineArgs[1]));
        }

        if (CommandLineArgs.Length > 2)
        {
            hideParent = new IntPtr(int.Parse(CommandLineArgs[2])) == (IntPtr)1;
        }

        if (CommandLineArgs.Length > 3)
        {
            argus = new string[CommandLineArgs.Length - 3];
            for (int i = 0; i < argus.Length; i++)
            {
                argus[i] = CommandLineArgs[(i + 3)];
            }
        }

        if (hideParent)
        {
            User32.ShowWindow(parentWindow, WindowShowStyle.Hide);
        }

        return true;
    }

本程序将获取到的参数将显示在对应的小框中,父级句柄显示为3540948...

四、用进程打开程序并传入参数

上面一步已经实现了接收参数的功能,下面是打开进程并传入参数的方法

/// <summary>
    /// 打开一个子窗口,并记录
    /// </summary>
    /// <param name="path"></param>
    /// <param name="hideThis"></param>
    public bool OpenChildWindow(string path, bool hideThis,params string[] args)
    {
        if (childProcess == null|| childProcess.HasExited)
        {
            if (System.IO.File.Exists(path))
            {
                ProcessStartInfo startInfo = new ProcessStartInfo(path);
                startInfo.Arguments = (WindowCalc.GetCurrProcessWnd() + " " + (hideThis ? 1 : 0).ToString()).ToString();
                for (int i = 0; i < args.Length; i++)
                {
                    startInfo.Arguments += " " + args[i];
                }
                startInfo.UseShellExecute = true;
                startInfo.WindowStyle = ProcessWindowStyle.Normal;
                childProcess = new Process();

                childProcess.StartInfo = startInfo;
                childProcess.Start();
                return true;
            }
        }
        return false;
    }

这一中先判断了文件是否存在,不存在将不会开启进行以及后续操作。一但进程开启,将对应的参数传入就可以了。同时如果需要就可将自己的窗口进行隐藏处理

五,隐藏窗口
    /// <summary>
    /// 关闭所有打开的窗口
    /// </summary>
    public void OnCloseThisWindow()
    {
        CloseChildWindow();

        if (hideParent)
        {
            User32.ShowWindow(parentWindow, WindowShowStyle.Show);
        }
    }
在关闭所打开的窗口的同时,要将上一个窗口打开,否则只能去进程管理器关程序啦。

六、Demo其他功能

  window程序开发过程中可以使用很多window自己提供的api接口可以省不少事,比如本程序中打开选择文件的窗口就是调用Comdlg32内的方法实现的


七,程序源码

github地址:https://github.com/zouhunter/WindowSwitch




这篇关于多个可执行程序协同工作的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/812344

相关文章

struts2中的json返回指定的多个参数

要返回指定的多个参数,就必须在struts.xml中的配置如下: <action name="goodsType_*" class="goodsTypeAction" method="{1}"> <!-- 查询商品类别信息==分页 --> <result type="json" name="goodsType_findPgae"> <!--在这一行进行指定,其中lis是一个List集合,但

一款支持同一个屏幕界面同时播放多个视频的视频播放软件

GridPlayer 是一款基于 VLC 的免费开源跨平台多视频同步播放工具,支持在一块屏幕上同时播放多个视频。其主要功能包括: 多视频播放:用户可以在一个窗口中同时播放任意数量的视频,数量仅受硬件性能限制。支持多种格式和流媒体:GridPlayer 支持所有由 VLC 支持的视频格式以及流媒体 URL(如 m3u8 链接)。自定义网格布局:用户可以配置播放器的网格布局,以适应不同的观看需求。硬

C# 如何同时Ping多个IP地址

在C#中,如果需要同时ping多个IP地址,可以采用多线程或异步编程的方式来实现,以便可以同时进行多个ping操作。以下是两种常用的方法: 方法一:使用多线程(Task 或 Thread) 使用Task是更现代和推荐的方式,因为它内置了更好的线程管理和异常处理机制。以下是一个使用Task的示例,展示如何同时ping多个IP地址: using System; using System.Co

多个vue项目部署到nginx服务器

文章目录 需求一、项目打包1.vue.config.js2.request.js文件3.打包 二、nginx配置 需求 同一个域名安装多个vue项目。 比如:域名为 https://domain.com + 后缀。那么通过不同的后缀就能去访问不同的项目地址。 https://domain.com,不加任何后缀,访问官网。 https://domain.com/admin

在幼儿园管理系统中,会议管理申请会议修改模块:多个与会人员的回显和修改(编辑)!

在幼儿园管理系统中,会议管理>申请会议>修改模块:多个与会人员的回显(复选框)和修改(编辑)!在处理与会人员的回显(复选框)和修改(编辑)出点问题。无法正确的回显(复选框)出来与会人员和修改(编辑)。 最后终于解决:修改(编辑)的思路是:先把原来的该会议记录下的所有与会人员删除,在添加,即可实现修改(编辑)功能。回显(复选框)的思路是:设置一个flag,判断一下是否要选中(复选框),即可实现

CAD 多个页面在一个任务栏图标设置

命令行输入快捷键op或: 下图打对号,确定即可。

Jasperreports+jaspersoft studio 实现单个或多个jrxml(jasper)文件生成一个pdf文件,并利用Servlet发送该pdf文件到浏览器中展示

Jasperreports+jaspersoft studio 实现单个或多个jrxml(jasper)文件生成一个pdf文件,并利用Servlet发送该pdf文件到浏览器中展示; 代码如下: Demo07.jrxml <?xml version="1.0" encoding="UTF-8"?><!-- Created with Jaspersoft Studio version 6.6.

1-3 微信小程序协同工作和发布

协同工作和发布 🥟🥞以权限管理需求为例 一个项目组,一般有不同的岗位,不同角色的员工同时参与项目成员 流程 成员管理的两个方面 不同项目成员对应的权限 版本

【IDEA】建立多个子模块依赖于一个父模块(maven)

第一步,建立父模块(在IDEA中就是工程) 第二步,选中父模块(也就是工程)右键New Module建立子模块 勾选创建模板原型并一般选择 maven-archetype-quickstart,当创建web模块时选择 maven-archetype-webapp 其他子模块都是类似这样创建~ packaging打包类型有: jar,默认类型warejbea

ubuntu安装多个版本的g++和gcc,并设置默认版本的c++和g++

https://blog.csdn.net/yoyofu007/article/details/102934990