mirror of
https://github.com/casksteven/Sweaty-Launcher.git
synced 2024-06-24 21:09:27 +00:00
187 lines
5.9 KiB
C#
187 lines
5.9 KiB
C#
|
using CommunityToolkit.Mvvm.Input;
|
|||
|
using Launcher.Control;
|
|||
|
using Microsoft.Win32;
|
|||
|
using System;
|
|||
|
using System.Diagnostics;
|
|||
|
using System.IO;
|
|||
|
using System.Runtime.InteropServices;
|
|||
|
using System.Text;
|
|||
|
using System.Windows;
|
|||
|
|
|||
|
namespace Launcher.Common
|
|||
|
{
|
|||
|
internal class GameHelper
|
|||
|
{
|
|||
|
[DllImport("InjectorLib.dll", CallingConvention = CallingConvention.Cdecl)]
|
|||
|
extern static bool Begin(string game_path, string dll_path);
|
|||
|
|
|||
|
|
|||
|
|
|||
|
public static void StartGame(string filePath,string target_dll)
|
|||
|
{
|
|||
|
string currentDir = Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName);
|
|||
|
string dll_file = Path.Combine(currentDir, "InjectorLib.dll");
|
|||
|
if (File.Exists(filePath))
|
|||
|
{
|
|||
|
//if (!File.Exists("InjectorLib.dll"))
|
|||
|
//{
|
|||
|
// EmbedFileManager.ExtractFile("InjectorLib.dll", dll_file);
|
|||
|
//}
|
|||
|
|
|||
|
target_dll =Path.Combine(currentDir, target_dll);
|
|||
|
bool r=Begin(filePath, target_dll);
|
|||
|
|
|||
|
if (r)
|
|||
|
{
|
|||
|
SnackBar.Show("Inject Success!",null);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
SnackBar.Show("Inject Failed!", null);
|
|||
|
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public static class GameRegReader
|
|||
|
{
|
|||
|
/// <summary>
|
|||
|
/// 获取游戏目录,是静态方法
|
|||
|
/// </summary>
|
|||
|
/// <returns></returns>
|
|||
|
public static string GetGamePath()
|
|||
|
{
|
|||
|
try
|
|||
|
{
|
|||
|
string startpath = "";
|
|||
|
string launcherpath = GetLauncherPath();
|
|||
|
#region 获取游戏启动路径,和官方配置一致
|
|||
|
string cfgPath = Path.Combine(launcherpath, "config.ini");
|
|||
|
if (File.Exists(launcherpath) || File.Exists(cfgPath))
|
|||
|
{
|
|||
|
//获取游戏本体路径
|
|||
|
using (StreamReader reader = new StreamReader(cfgPath))
|
|||
|
{
|
|||
|
string[] abc = reader.ReadToEnd().Split(new string[] { "\r\n" }, StringSplitOptions.None);
|
|||
|
foreach (var item in abc)
|
|||
|
{
|
|||
|
//从官方获取更多配置
|
|||
|
if (item.IndexOf("game_install_path") != -1)
|
|||
|
{
|
|||
|
startpath += item.Substring(item.IndexOf("=") + 1);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
byte[] bytearr = Encoding.UTF8.GetBytes(startpath);
|
|||
|
string path = Encoding.UTF8.GetString(bytearr);
|
|||
|
return path;
|
|||
|
}
|
|||
|
catch
|
|||
|
{
|
|||
|
return null;
|
|||
|
}
|
|||
|
#endregion
|
|||
|
}
|
|||
|
/// <summary>
|
|||
|
/// 启动器地址
|
|||
|
/// </summary>
|
|||
|
/// <returns></returns>
|
|||
|
public static string GetLauncherPath()
|
|||
|
{
|
|||
|
try
|
|||
|
{
|
|||
|
RegistryKey key = Registry.LocalMachine; //打开指定注册表根
|
|||
|
//获取官方启动器路径
|
|||
|
string launcherpath = "";
|
|||
|
try
|
|||
|
{
|
|||
|
launcherpath = key.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\原神").GetValue("InstallPath").ToString();
|
|||
|
|
|||
|
|
|||
|
}
|
|||
|
catch (Exception)
|
|||
|
{
|
|||
|
launcherpath = key.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Genshin Impact").GetValue("InstallPath").ToString();
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
byte[] bytepath = Encoding.UTF8.GetBytes(launcherpath); //编码转换
|
|||
|
string path = Encoding.UTF8.GetString(bytepath);
|
|||
|
return path;
|
|||
|
|
|||
|
}
|
|||
|
catch
|
|||
|
{
|
|||
|
return null;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public static string GetGameExePath()
|
|||
|
{
|
|||
|
|
|||
|
var gamepath = GetGamePath();
|
|||
|
if (gamepath == null)
|
|||
|
{
|
|||
|
return null;
|
|||
|
}
|
|||
|
var cnpath = gamepath + @"/YuanShen.exe";
|
|||
|
var ospath = gamepath + @"/GenshinImpact.exe";
|
|||
|
|
|||
|
if (File.Exists(cnpath))
|
|||
|
{
|
|||
|
return cnpath;
|
|||
|
}
|
|||
|
else if (File.Exists(ospath))
|
|||
|
{
|
|||
|
return ospath;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
return null;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
public static class GameLocalReader
|
|||
|
{
|
|||
|
|
|||
|
public static string GetGameExePath()
|
|||
|
{
|
|||
|
string Self = Process.GetCurrentProcess().MainModule.FileName;
|
|||
|
var Folder = Path.GetDirectoryName(Self);
|
|||
|
string ret;
|
|||
|
string cn = Path.Combine(Folder, "YuanShen.exe");
|
|||
|
string os = Path.Combine(Folder, "GenshinImpact.exe");
|
|||
|
if (File.Exists(cn))
|
|||
|
{
|
|||
|
ret = Path.Combine(Folder, cn);
|
|||
|
}
|
|||
|
else if (File.Exists(os))
|
|||
|
{
|
|||
|
ret = Path.Combine(Folder, os);
|
|||
|
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
throw new Exception("未能从当前路径找到原神游戏文件!");
|
|||
|
}
|
|||
|
return ret;
|
|||
|
}
|
|||
|
|
|||
|
public static string GetGameExeFolder()
|
|||
|
{
|
|||
|
return Path.GetDirectoryName(GetGameExePath());
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
}
|
|||
|
}
|
|||
|
}
|