1、摘要:
涉及Process的Start,Kill方法;
实现功能包括:启动程序,传递参数,关闭自身程序,关闭外部程序等。
2、启动外部程序 Process.Start();
(1)Process.Start(ProcessStartInfo)
启动由包含进程启动信息的参数指定的进程资源,并将该资源与新的Process组件关联。
参数ProcessStartInfo:启动程序要传递的信息 ,如要启动的进程的文件名
private void ProjectOpen(ProcessStartInfo startInfo)
{
Process.Start(startInfo);
}
(2) 不带参数直接启动外部程序
输出的参数:完整的应用程序的路径名称,如:"C:/Users/admin/Desktop/Test/XXX.exe"
private void ProjectOpen(string name)
{
Process.Start(name);
}
(3) 带命令行参数的启动一个外部应用程序
参数1:应用程序的名称,参见上个方法
参数2:一组命令行参数
private void ProjectOpen(string name,string parameters)
{
Process.Start(name, parameters);
}
(4) 带用户信息参数的启动一个外部应用程序
参数:应用程序路径名称,用户名,密码,域
private void ProjectOpen(string name,string userName,SecureString userPass,string region)
{
Process.Start(name, userName, userPass, region);
}
(5) 带用户信息和一组命令行参数的启动一个外部应用程序
参数:应用程序路径名称,一组命令行参数,用户名,密码,域
private void ProjectOpen(string name,string paramters,string userName,SecureString userPass,string region)
{
Process.Start(name, paramters, userName, userPass, region);
}
(6)示例
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 = "https://so.csdn.net/";
//测试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);
}
}
3、获取解析传递过来的参数;
(1)接收参数
程序打开时接收传递过来的参数:Environment.GetCommandLineArgs();
string[] args = Environment.GetCommandLineArgs();
(2)解析参数
对照上面启动程序,使用不同重载,解析参数不同
private void OpenProject()
{
string[] args = Environment.GetCommandLineArgs();
if (args .Length <= 1) Application.Quit();//只有路径名一个参数
else //有除了项目名/项目路径外的其他参数
{
if (args .Length == 5 && args [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)示例
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);
}
}
}
}
4、关闭正在运行的自身程序
(1)核心语句
Process.GetCurrentProcess().Kill();
(2)示例
//关闭自身
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
}
5、关闭外部程序时
(1)使用 process.Kill();来关闭外部程序 ;
process.Kill();
(2)步骤:
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);
}
}
}