Unity C#在Windows/PC平台下打开某个文件夹/打开某个exe/带参数/含中文路径不乱码Windows API/ShellExecute

一、前言

点关注不迷路,持续输出Unity干货文章

嗨,大家好,我是新发。最近有这么个需求,Unity发布Windows平台版本,需要在游戏中启动另一个exe

可以使用Process.Start,可以参见我之前写的这篇文章《Unity中C#如何执行cmd命令(System.Diagnostics.Process的使用)》

今天呢,我要介绍另外一种方式:通过Windows APIShellExecute方法来打开某个exe支持中文参数不乱码,支持打开文件夹。

二、Windows API: ShellExecute

函数原型:

[DllImport("shell32.dll", CharSet=CharSet.Unicode)]
public static extern int ShellExecute(IntPtr hwnd, string lpszOp, string lpszFile, 
									string lpszParams, string lpszDir, int FsShowCmd);

引入命名空间

using System;
using System.Runtime.InteropServices;
using UnityEngine;

注意CharSet设置为CharSet.Unicode,否则路径或参数带中文会出现乱码,导致出错。

三、使用例子

1、打开文件

var dir = "F:\\KuGou\\KGMusic\\";
ShellExecute(IntPtr.Zero, "open", dir, "", 1);

2、打开exe

比如打开酷狗,并自动播放蔡健雅的红色高跟鞋。

var exePath = "F:\\KuGou\\KGMusic\\KuGou.exe";
var args = "/Open \"F:\\Programs\\KuGou\\蔡健雅 - 红色高跟鞋.mp3\"";
ShellExecute(IntPtr.Zero, exePath, args, 1);

执行某个python脚本。

var workdir= "D:\\py_pro\\";
ShellExecute(IntPtr.Zero, "python", workdir + "test.py", workdir, 1);

更多例子:

// 打开记事本
ShellExecute(IntPtr.Zero, "notepad", 1);       
// 打开计算器
ShellExecute(IntPtr.Zero, "calc", 1);                
// 打开注册
ShellExecute(IntPtr.Zero, "regedit", 1);            
// 打开画图板
ShellExecute(IntPtr.Zero, "mspaint", 1);         
// 打开写字板
ShellExecute(IntPtr.Zero, "write", 1);                  
// 打开任务管理器
ShellExecute(IntPtr.Zero, "taskmgr", 1);         
// 打开事件查看器
ShellExecute(IntPtr.Zero, "eventvwr", 1);              
// 打开Windows版本信息
ShellExecute(IntPtr.Zero, "winver", 1);              
// 发邮件
ShellExecute(IntPtr.Zero, "mailto: 123456789@qq.com", 1); 

四、演示

演示一下效果吧。

在这里插入图片描述


代码如下:

using System;
using System.Runtime.InteropServices;
using UnityEngine;
using UnityEngine.UI;

public class OpenExeTest : MonoBehavIoUr
{
    public InputField inputField;
    public Button btn;

    [DllImport("shell32.dll", CharSet=CharSet.Unicode)]
    public static extern int ShellExecute(IntPtr hwnd, string lpszParams, int FsShowCmd);

    void Start()
    {
        btn.onClick.AddListener(() => 
        {
            ShellExecute(IntPtr.Zero, inputField.text, 1);
        });
    }
}

完毕。
喜欢Unity的同学,不要忘记点击关注,如果有什么Unity相关的技术难题,也欢迎留言或私信~

相关文章

前言 本文记录unity3D开发环境的搭建 unity安装 unity有中文...
前言 有时候我们希望公告牌跟随镜头旋转永远平行面向屏幕,同...
前言 经过一段时间的学习与实际开发,unity3D也勉强算是强行...
前言 在unity中我们常用的获取鼠标点击的方法有: 1、在3D场...
前言 在之前的例子中,我们都没有用到unity的精髓,例如地形...
这篇文章将为大家详细讲解有关Unity3D中如何通过Animator动画...