Unity3D啟動外部程序並傳遞參數的實現

之前開發項目,一直都使用的是外殼程序加子程序的模式,通過外殼程序去啟動子程序,外殼程序和子程序之間的通信,是使用配置文件完成的。

我總覺得這樣通信很麻煩,因為外殼程序需要對配置文件進行更改和寫入,然後子程序又要讀取信息。而且整合的時候,會導致有很多配置文件,而且需要對路徑做很多處理和限制。

我發現Process.Start()函數中,是可以傳遞參數的。

也就是說,我們是可以在使用Process.Start()函數啟動外部程序時,傳遞參數的進行通信的。

具體操作如下:

public void StartEXE()
    {
        ProcessStartInfo processStartInfo = new ProcessStartInfo();
        processStartInfo.FileName = "C:/Users/Administrator/Desktop/Test/Demo.exe";
        processStartInfo.Arguments = "啟動 程序 1 2  3";
        Process.Start(processStartInfo);
    }

需要註意的是,如果存在多個參數的話,參數之間需要使用空格進行分隔。

外殼程序已經傳遞瞭參數,那麼子程序如何接受參數呢?具體操作如下:

private void Start()
    {
        string[] args = Environment.GetCommandLineArgs();
        text.text = args.Length.ToString();
        for (int i = 0; i < args.Length; i++)
        {
            text.text += "\n" + "Arg" + i + ":  " + args[i];
        }
    }

我將所有的參數信息,打印在瞭一個Text上面。運行效果圖如下:

補充:Unity3D:啟動外部exe傳參以及設置窗口位置和大小

好久沒有更新博客瞭,最近項目上沒有太大的突破,也沒有涉及到新東西,所以想寫博客,但是無奈沒有新東西,好在最近有點新的功能要做,之前也做過,但是並沒有整理成博客,現在就記錄一下。省的還要去百度找。(最近好像新的Unity版本不能破解瞭,官網有時候也上不去,不知道Unity要搞什麼東東。)

今天要說的是Unity啟動外部exe,並且傳遞參數,改變外部exe窗口位置以及窗口大小。啟動exe這個百度搜一大堆,主要是怎麼設置窗口位置及大小。窗口大小的方法Unity有自己的方法,但是位置就沒法設置瞭,我今天用的方法是Windows原生的方法。需要引用user32.dll。

廢話不多說瞭,下面上代碼

using UnityEngine;
using System.Runtime.InteropServices;
using System;
using System.Diagnostics; 
public class ProperWindows : MonoBehaviour
{
    [DllImport("user32.dll")]
    static extern IntPtr SetWindowLong(IntPtr hWnd, int _nIndex, int dwNewLong);
    [DllImport("user32.dll")]
    static extern bool SetWindowPos(IntPtr hWnd, int hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);
    [DllImport("user32.dll")]
    static extern IntPtr GetForegroundWindow(); //獲取最前端窗體句柄
    [DllImport("user32.dll")]
    static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
    //[DllImport("user32.dll")]
    //static extern IntPtr GetWindowThreadProcessld(); 
    private void Awake()
    {
        //啟動時傳過來的string數組,下標為0的是啟動的外部exe程序的完整路徑,下標為1及之後的參數是想要傳過來的參數。
        string[] args = Environment.GetCommandLineArgs();
        var winInfo = JsonUtility.FromJson<WinInfo>(args[1]);
        // 設置屏大小和顯示位置
        SetWindowPos(GetForegroundWindow(), 0, winInfo.x, winInfo.y, winInfo.width, winInfo.height, 0x0040);
    }
    // Use this for initialization
    void Start()
    {
        //啟動外部exe程序,第一個參數為exe完整路徑,第二個參數為要傳入的參數。
        string winInfo = JsonUtility.ToJson(new WinInfo(0, 0, 1000, 500));
        Process.Start(@"C:\Users\wangbo\Desktop\2\2.exe", winInfo);
    } 
    // Update is called once per frame
    void Update()
    { 
    }
}
[Serializable]
public class WinInfo
{
    public int x;
    public int y;
    public int width;
    public int height;    
    public WinInfo(int x, int y, int width, int height)
    {
        this.x = x;
        this.y = y;
        this.width = width;
        this.height = height;
    }
}

上面的代碼裡我傳的參數是json格式的,在Start裡啟動一個exe,在Awake裡接收參數,設置窗口位置以及大小。

以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。如有錯誤或未考慮完全的地方,望不吝賜教。

推薦閱讀:

    None Found