Net.Like.Xue.Tokyo/Assets/BITKit/Unity/Scripts/Win64/RegistryRunAPP.cs

89 lines
3.0 KiB
C#

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Microsoft.Win32;
using UnityEngine.Events;
using System.Security.Principal;
using Cysharp.Threading.Tasks;
namespace BITKit
{
public class RegistryRunAPP : MonoBehaviour
{
[Header(Constant.Header.Settings)]
[SerializeReference,SubclassSelector] private IReference subKey;
[SerializeReference,SubclassSelector] private string executablePath;
private bool executeOnStart;
[Header(Constant.Header.Events)]
public UnityEvent<bool> onSuccess = new();
public UnityEvent onfailure = new();
public void Excute()
{
try
{
Debug.Log("正在启动注册函数");
var path = System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName;
var result = RegisterAppKey(subKey.Value, path);
Debug.Log($"正在注册启动:{subKey}:{path}");
if (result)
{
onSuccess.Invoke(true);
}
else
{
onfailure.Invoke();
}
}
catch (System.Exception e)
{
Debug.LogError(e);
Debug.LogException(e,this);
onfailure.Invoke();
}
}
async void Start()
{
await UniTask.Yield();
if (executeOnStart) Excute();
}
private static bool RegisterAppKey(string keyName, string value)
{
#if UNITY_WEBGL
Debug.LogWarning("在WebGL上无法注册启动方式");
return false;
#else
try
{
RegistryKey registryKey = Registry.ClassesRoot;
var fKey = registryKey.OpenSubKey(keyName, true)
?? registryKey.CreateSubKey(keyName);
fKey.SetValue("", value);
fKey.SetValue("", keyName);
var defaultIconKey = fKey.OpenSubKey("DefaultIcon", true) ?? fKey.CreateSubKey("DefaultIcon");
if (defaultIconKey != null)
{
defaultIconKey.SetValue("", value + ",1");
}
var shellKey = fKey.OpenSubKey("shell", true) ?? fKey.CreateSubKey("shell");
var openKey = shellKey.OpenSubKey("open", true) ?? shellKey.CreateSubKey("open");
var commandKey = openKey.OpenSubKey("command", true) ?? openKey.CreateSubKey("command");
if (commandKey != null)
{
commandKey.SetValue("", "\"" + value + "\"" + " \"%1\"");
}
fKey.SetValue("URL Protocol", value);
fKey.Close();
Debug.Log("已完成程序启动注册");
return true;
}
catch (Exception ex)
{
Debug.LogException(ex);
return false;
}
#endif
}
}
}