mirror of
https://github.com/MrUnknownDE/VRCX.git
synced 2026-04-11 19:03:51 +02:00
233 lines
7.1 KiB
C#
233 lines
7.1 KiB
C#
// Copyright(c) 2019-2020 pypy. All rights reserved.
|
|
//
|
|
// This work is licensed under the terms of the MIT license.
|
|
// For a copy, see <https://opensource.org/licenses/MIT>.
|
|
|
|
using CefSharp;
|
|
using Microsoft.Win32;
|
|
using System;
|
|
using System.Diagnostics;
|
|
using System.Linq;
|
|
using System.Management;
|
|
using System.Text.RegularExpressions;
|
|
using System.Windows.Forms;
|
|
using System.IO;
|
|
using System.Net;
|
|
using Windows.UI.Notifications;
|
|
using Windows.Data.Xml.Dom;
|
|
|
|
namespace VRCX
|
|
{
|
|
public class AppApi
|
|
{
|
|
public static readonly AppApi Instance;
|
|
|
|
static AppApi()
|
|
{
|
|
Instance = new AppApi();
|
|
}
|
|
|
|
public void ShowDevTools()
|
|
{
|
|
MainForm.Instance.Browser.ShowDevTools();
|
|
}
|
|
|
|
public void DeleteAllCookies()
|
|
{
|
|
Cef.GetGlobalCookieManager().DeleteCookies();
|
|
}
|
|
|
|
public string LoginWithSteam()
|
|
{
|
|
var rpc = VRChatRPC.Instance;
|
|
return rpc.Update() == true
|
|
? rpc.GetAuthSessionTicket()
|
|
: string.Empty;
|
|
}
|
|
|
|
public bool[] CheckGameRunning()
|
|
{
|
|
var isGameRunning = false;
|
|
var isGameNoVR = false;
|
|
|
|
var hwnd = WinApi.FindWindow("UnityWndClass", "VRChat");
|
|
if (hwnd != IntPtr.Zero)
|
|
{
|
|
var cmdline = string.Empty;
|
|
|
|
try
|
|
{
|
|
WinApi.GetWindowThreadProcessId(hwnd, out uint pid);
|
|
using (var searcher = new ManagementObjectSearcher($"SELECT CommandLine FROM Win32_Process WHERE ProcessId = {pid}"))
|
|
using (var objects = searcher.Get())
|
|
{
|
|
cmdline = objects.Cast<ManagementBaseObject>().SingleOrDefault()?["CommandLine"]?.ToString();
|
|
}
|
|
}
|
|
catch
|
|
{
|
|
}
|
|
|
|
isGameRunning = true;
|
|
isGameNoVR = cmdline.Contains("--no-vr");
|
|
}
|
|
|
|
return new bool[]
|
|
{
|
|
isGameRunning,
|
|
isGameNoVR
|
|
};
|
|
}
|
|
|
|
public void StartGame(string arguments)
|
|
{
|
|
// try stream first
|
|
try
|
|
{
|
|
using (var key = Registry.ClassesRoot.OpenSubKey(@"steam\shell\open\command"))
|
|
{
|
|
// "C:\Program Files (x86)\Steam\steam.exe" -- "%1"
|
|
var match = Regex.Match(key.GetValue(string.Empty) as string, "^\"(.+?)\\\\steam.exe\"");
|
|
if (match.Success == true)
|
|
{
|
|
var path = match.Groups[1].Value;
|
|
// var _arguments = Uri.EscapeDataString(arguments);
|
|
Process.Start(new ProcessStartInfo
|
|
{
|
|
WorkingDirectory = path,
|
|
FileName = $"{path}\\steam.exe",
|
|
UseShellExecute = false,
|
|
Arguments = $"-applaunch 438100 {arguments}"
|
|
}).Close();
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
catch
|
|
{
|
|
}
|
|
|
|
// fallback
|
|
try
|
|
{
|
|
using (var key = Registry.ClassesRoot.OpenSubKey(@"VRChat\shell\open\command"))
|
|
{
|
|
// "C:\Program Files (x86)\Steam\steamapps\common\VRChat\launch.bat" "C:\Program Files (x86)\Steam\steamapps\common\VRChat" "%1"
|
|
var match = Regex.Match(key.GetValue(string.Empty) as string, "^\"(.+?)\\\\launch.bat\"");
|
|
if (match.Success == true)
|
|
{
|
|
var path = match.Groups[1].Value;
|
|
Process.Start(new ProcessStartInfo
|
|
{
|
|
WorkingDirectory = path,
|
|
FileName = $"{path}\\VRChat.exe",
|
|
UseShellExecute = false,
|
|
Arguments = arguments
|
|
}).Close();
|
|
}
|
|
}
|
|
}
|
|
catch
|
|
{
|
|
}
|
|
}
|
|
|
|
public void OpenLink(string url)
|
|
{
|
|
if (url.StartsWith("http://") == true ||
|
|
url.StartsWith("https://") == true)
|
|
{
|
|
Process.Start(url).Close();
|
|
}
|
|
}
|
|
|
|
public void ShowVRForm()
|
|
{
|
|
try
|
|
{
|
|
MainForm.Instance.BeginInvoke(new MethodInvoker(() =>
|
|
{
|
|
if (VRForm.Instance == null)
|
|
{
|
|
new VRForm().Show();
|
|
}
|
|
}));
|
|
}
|
|
catch
|
|
{
|
|
}
|
|
}
|
|
|
|
public void StartVR()
|
|
{
|
|
VRCXVR.Instance.SetActive(true);
|
|
}
|
|
|
|
public void StopVR()
|
|
{
|
|
VRCXVR.Instance.SetActive(false);
|
|
}
|
|
|
|
public void RefreshVR()
|
|
{
|
|
VRCXVR.Instance.Refresh();
|
|
}
|
|
|
|
public string[][] GetVRDevices()
|
|
{
|
|
return VRCXVR.Instance.GetDevices();
|
|
}
|
|
|
|
public float CpuUsage()
|
|
{
|
|
return CpuMonitor.Instance.CpuUsage;
|
|
}
|
|
|
|
public void DesktopNotification(string BoldText, string Text, string ImageURL = "")
|
|
{
|
|
XmlDocument toastXml = ToastNotificationManager.GetTemplateContent(ToastTemplateType.ToastImageAndText02);
|
|
XmlNodeList stringElements = toastXml.GetElementsByTagName("text");
|
|
String imagePath = Path.Combine(Program.BaseDirectory, "cache\\toast");
|
|
if (ImageURL == String.Empty)
|
|
{
|
|
imagePath = Path.Combine(Program.BaseDirectory, "VRCX.ico");
|
|
}
|
|
else
|
|
{
|
|
using (var client = new WebClient())
|
|
{
|
|
client.DownloadFile(ImageURL, imagePath);
|
|
}
|
|
}
|
|
stringElements[0].AppendChild(toastXml.CreateTextNode(BoldText));
|
|
stringElements[1].AppendChild(toastXml.CreateTextNode(Text));
|
|
XmlNodeList imageElements = toastXml.GetElementsByTagName("image");
|
|
imageElements[0].Attributes.GetNamedItem("src").NodeValue = imagePath;
|
|
ToastNotification toast = new ToastNotification(toastXml);
|
|
ToastNotificationManager.CreateToastNotifier("VRCX").Show(toast);
|
|
}
|
|
|
|
public void SetStartup(bool enabled)
|
|
{
|
|
try
|
|
{
|
|
using (var key = Registry.CurrentUser.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true))
|
|
{
|
|
if (enabled == true)
|
|
{
|
|
var path = Application.ExecutablePath;
|
|
key.SetValue("VRCX", $"\"{path}\" --startup");
|
|
}
|
|
else
|
|
{
|
|
key.DeleteValue("VRCX", false);
|
|
}
|
|
}
|
|
}
|
|
catch
|
|
{
|
|
}
|
|
}
|
|
}
|
|
}
|