admin管理员组

文章数量:1794759

外部程序控制应用——Unity/C# Process (Start,Kill等)

外部程序控制应用——Unity/C# Process (Start,Kill等)

1、启动外部程序

Process.Start();以及其多个重载;

using System.Diagnostics; using System.Security; using UnityEngine; public class OpenProject : MonoBehaviour { public void ClickOpenBtn() { //方法重载(1) //ProjectOpen(); //方法重载(2) //ProjectOpen(ProcessStartInfo)方法示例 ProcessStartInfo processStartInfo = new ProcessStartInfo(); processStartInfo.FileName = "C:/Users/admin/Desktop/Test.exe"; processStartInfo.Arguments = "61eaf8 9999 000";//每个参数之间需要空格进行分割 ProjectOpen(processStartInfo); /* 注:被启动的项目接收的参数格式为CommandLineArgs * string[] CommandLineArgs = Environment.GetCommandLineArgs(); * * 其中: * CommandLineArgs[0],是processStartInfo.FileName,即"C:/Users/admin/Desktop/Test.exe"; * CommandLineArgs[1],是processStartInfo.Arguments里的第一个参数,即"61eaf8"; * CommandLineArgs[2],是processStartInfo.Arguments里的第二个参数,即"9999"; * CommandLineArgs[3],是processStartInfo.Arguments里的第三个参数,即"000"; */ //方法重载(3) //ProjectOpen(fileName)方法示例 //测试1:打开微信 //string fileName = "C:/RG/WeChat/Setup/WeChat/WeChat.exe"; //测试2:打开目标程序 //string fileName = "C:/Users/admin/Desktop/Test.exe"; //ProjectOpen(fileName); //方法重载(4) //Process.Start(name, parameters);方法示例 //测试1:打开浏览器 //string filePath = "C:/Program Files (x86)/Microsoft/Edge/Application/msedge.exe";//Microsoft Edge浏览器 //string paramters = "so.csdn/"; //测试2:向被打开的应用传目标参数 //string paramters = "OpenPanel"; //执行方法 //ProjectOpen(filePath, paramters); } private void ProjectOpen() { try { Process myprocess = new Process(); string filePath = "C:/Users/admin/Desktop/Test.exe"; string exeArgus = "test"; ProcessStartInfo startInfo = new ProcessStartInfo(filePath, exeArgus); myprocess.StartInfo = startInfo; myprocess.StartInfo.UseShellExecute = false; myprocess.Start(); Application.Quit(); } catch (Exception ex) { UnityEngine.Debug.LogFormat("出错原因:{0}", ex.Message); } } /// <summary> /// 启动由包含进程启动信的参数指定的进程资源,并将该资源与新的Process组件关联。 /// </summary> /// <param name="startInfo">启动信的参数(例如,要启动的进程的文件名)</param> private void ProjectOpen(ProcessStartInfo startInfo) { Process.Start(startInfo); } /// <summary> /// 不带参数直接启动外部程序 /// </summary> /// <param name="name">应用程序的名称,如:"C:/Users/admin/Desktop/Test/XXX.exe"</param> private void ProjectOpen(string name) { Process.Start(name); } /// <summary> /// 带命令行参数的启动一个外部应用程序 /// </summary> /// <param name="name">应用程序的名称</param> /// <param name="parameters">一组命令行参数</param> private void ProjectOpen(string name,string parameters) { Process.Start(name, parameters); } /// <summary> /// 带用户信参数的启动一个外部应用程序 /// </summary> /// <param name="name">应用程序的名称</param> /// <param name="userName">用户名</param> /// <param name="userPass">密码</param> /// <param name="region">域</param> private void ProjectOpen(string name,string userName,SecureString userPass,string region) { Process.Start(name, userName, userPass, region); } /// <summary> /// 带用户信和一组命令行参数的启动一个外部应用程序 /// </summary> /// <param name="name">应用程序的名称</param> /// <param name="paramters">一组命令行参数</param> /// <param name="userName">用户名</param> /// <param name="userPass">密码</param> /// <param name="region">域</param> private void ProjectOpen(string name,string paramters,string userName,SecureString userPass,string region) { Process.Start(name, paramters, userName, userPass, region); } } 2、程序打开时接收传递过来的参数:

Environment.GetCommandLineArgs();获取传递过来的参数;

using System.Collections; using System.Collections.Generic; using UnityEngine; using TMPro; using System; public class StartProject : MonoBehaviour { public TMP_Text text1; // 项目被打开运行时 private IEnumerator Start() { yield return new WaitUntil(() => ApiConfig.instance.loaded); #if UNITY_EDITOR //在编辑器环境下 #else //在打包后运行状态下 //OpenProject1(); //也可正常使用 OpenProject(); #endif yield break; } /// <summary> /// 根据传给项目的参数,打开目标项目 /// </summary> private void OpenProject1() { string[] CommandLineArgs = Environment.GetCommandLineArgs(); if (CommandLineArgs.Length < 2) { text1.text = "没有参数"; Application.Quit(); } else { if (CommandLineArgs[1] == "") { text1.text = "CommandLineArgs[1]值为空"; } else { string[] args = Environment.GetCommandLineArgs(); text1.text = args.Length.ToString(); for (int i = 0; i < args.Length; i++) { text1.text += "\\n" + "Arg" + i + ": " + args[i]; } } } } /// <summary> /// 根据传给项目的参数,打开目标项目 /// </summary> private void OpenProject() { string[] CommandLineArgs = Environment.GetCommandLineArgs(); //只有路径名一个参数 if (CommandLineArgs.Length <= 1) Application.Quit(); //有除了项目名/项目路径外的其他参数 else { if (CommandLineArgs.Length == 5 && CommandLineArgs[4] == "OpenProject") { OpenProject.ProjectOption projectOption = new OpenProject.ProjectOption(); projectOption.projectID = CommandLineArgs[1]; projectOption.projectName = CommandLineArgs[2]; projectOption.projectVersion = CommandLineArgs[3]; ProjectManagement.instance.OpneProject(projectOption); } } } } 3、关闭正在运行的自身程序:

Process.GetCurrentProcess().Kill(); 

//关闭自身 private void KillCurProcess() { #if UNITY_EDITOR UnityEditor.EditorApplication.isPlaying = false; //#elif UNITY_ANDROID || UNITY_IOS || UNITY_STANDALONE_WIN //Application.Quit(); #else System.Diagnostics.Process.GetCurrentProcess().Kill(); #endif } 4、关闭外部程序时:使用 process.Kill();来关闭外部程序 ; (1)先获取进程/目标程序的进程名称

Process.GetCurrentProcess().MainModule.FileName;完整进程名;

Path.GetFileNameWithoutExtension(Process.GetCurrentProcess().MainModule.FileName);进程名;

using TMPro; using System; using UnityEngine; using System.Linq; using UnityEngine.UI; using Newtonsoft.Json; using System.Collections; using Newtonsoft.Json.Linq; using System.Collections.Generic; using System.Diagnostics; using System.IO; ... ... ... private void GetCurProcessName() { //完整程序名称/地址,如:D:\\XXX\\YYY\\ZZZ\\MMM.exe string name1 = Process.GetCurrentProcess().MainModule.FileName; //仅程序名称,不加地址和后缀,这个name2,也就是执行关闭进程时,输入的processName,如:MMM; string name2 = Path.GetFileNameWithoutExtension(Process.GetCurrentProcess().MainModule.FileName); //testText.text = string.Format("当前进程的进程名1:{0},进程名2:{1} ", name1, name2); } (2)知道要关闭的进程名后,执行关闭操作

process.HasExited;进程是否退出;

process.Kill();关闭指定进程

private void KillProjectApplication(string processName) { Process[] processes = Process.GetProcesses(); foreach (Process process in processes) { try { if (!process.HasExited && process.ProcessName == processName) process.Kill(); } catch (InvalidOperationException ex) { UnityEngine.Debug.Log(ex); } } }

本文标签: 程序控制UnityPROCESSstartkill