微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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相关的技术难题,也欢迎留言或私信~

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐