LANCommander/LANCommander.Launcher.Services/SystemService.cs
2025-10-15 20:21:54 -05:00

123 lines
No EOL
3.2 KiB
C#

using System.Diagnostics;
using System.Runtime.InteropServices;
using Microsoft.Win32;
namespace LANCommander.Launcher.Services;
public static class SystemService
{
/// <summary>
/// Registers custom lancommander:/ scheme with the system to have quick start of games
/// </summary>
public static void RegisterCustomScheme()
{
var scheme = "lancommander";
if (CustomSchemeIsRegistered(scheme))
return;
var appPath = Environment.ProcessPath
?? Process.GetCurrentProcess().MainModule?.FileName
?? throw new InvalidOperationException("Unable to determine application path.");
var baseKeyPath = $"Software\\Classes\\{scheme}";
using var baseKey = Registry.CurrentUser.CreateSubKey(baseKeyPath, writable: true);
baseKey.SetValue(null, $"URL:{scheme}", RegistryValueKind.String);
baseKey.SetValue("URL Protocol", String.Empty, RegistryValueKind.String);
using (var iconKey = baseKey.CreateSubKey("DefaultIcon", writable: true))
{
iconKey?.SetValue(null, $"{Quote(appPath)},0", RegistryValueKind.String);
}
var command = $"{Quote(appPath)} \"%1\"";
using (var commandKey = baseKey.CreateSubKey("shell\\open\\command", writable: true))
{
commandKey?.SetValue(null, command, RegistryValueKind.String);
}
}
private static bool CustomSchemeIsRegistered(string scheme)
{
using var k = Registry.CurrentUser.OpenSubKey($"Software\\Classes\\{scheme}", writable: true);
return k is not null;
}
private static string Quote(string path) =>
path.Contains(' ') || path.Contains('\t') || path.Contains('"')
? $"\"{path.Replace("\"", "\\\"")}\""
: path;
public static bool TryBrowseFiles(string path)
{
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
return BrowseFilesWindows(path);
if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
return BrowseFilesLinux(path);
if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
return BrowseFilesMac(path);
throw new PlatformNotSupportedException();
}
private static bool BrowseFilesWindows(string path)
{
try
{
Process.Start("explorer", path);
return true;
}
catch
{
return false;
}
}
private static bool BrowseFilesLinux(string path)
{
string[] fileManagers = new[]
{
"xdg-open",
"nautilus",
"gnome-open",
"dolphin",
"konqueror",
};
foreach (var fileManager in fileManagers)
{
try
{
Process.Start(fileManager, path);
return true;
}
catch
{
// ignored
}
}
return false;
}
private static bool BrowseFilesMac(string path)
{
try
{
Process.Start("open", path);
return true;
}
catch
{
return false;
}
}
}