cemu-DS4Windows/DS4Windows/StartupMethods.cs

172 lines
5.3 KiB
C#

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using Microsoft.Win32.TaskScheduler;
using Task = Microsoft.Win32.TaskScheduler.Task;
namespace DS4WinWPF
{
[System.Security.SuppressUnmanagedCodeSecurity]
public static class StartupMethods
{
public static string lnkpath = Environment.GetFolderPath(Environment.SpecialFolder.Startup) + "\\DS4Windows.lnk";
private static string taskBatPath = Path.Combine(DS4Windows.Global.exedirpath, "task.bat");
public static bool HasStartProgEntry()
{
bool exists = File.Exists(Environment.GetFolderPath(Environment.SpecialFolder.Startup) + "\\DS4Windows.lnk");
return exists;
}
public static bool HasTaskEntry()
{
TaskService ts = new TaskService();
Task tasker = ts.FindTask("RunDS4Windows");
return tasker != null;
}
public static bool RunAtStartup()
{
return HasStartProgEntry() || HasTaskEntry();
}
public static void WriteStartProgEntry()
{
Type t = Type.GetTypeFromCLSID(new Guid("72C24DD5-D70A-438B-8A42-98424B88AFB8")); // Windows Script Host Shell Object
dynamic shell = Activator.CreateInstance(t);
try
{
var lnk = shell.CreateShortcut(lnkpath);
try
{
string app = DS4Windows.Global.exelocation;
lnk.TargetPath = DS4Windows.Global.exelocation;
lnk.Arguments = "-m";
//lnk.TargetPath = Assembly.GetExecutingAssembly().Location;
//lnk.Arguments = "-m";
lnk.IconLocation = app.Replace('\\', '/');
lnk.Save();
}
finally
{
Marshal.FinalReleaseComObject(lnk);
}
}
finally
{
Marshal.FinalReleaseComObject(shell);
}
}
public static void DeleteStartProgEntry()
{
if (File.Exists(lnkpath) && !new FileInfo(lnkpath).IsReadOnly)
{
File.Delete(lnkpath);
}
}
public static void DeleteOldTaskEntry()
{
TaskService ts = new TaskService();
Task tasker = ts.FindTask("RunDS4Windows");
if (tasker != null)
{
foreach(Microsoft.Win32.TaskScheduler.Action act in tasker.Definition.Actions)
{
if (act.ActionType == TaskActionType.Execute)
{
ExecAction temp = act as ExecAction;
if (temp.Path != taskBatPath)
{
ts.RootFolder.DeleteTask("RunDS4Windows");
break;
}
}
}
}
}
public static bool CanWriteStartEntry()
{
bool result = false;
if (!new FileInfo(lnkpath).IsReadOnly)
{
result = true;
}
return result;
}
public static void WriteTaskEntry()
{
DeleteTaskEntry();
TaskService ts = new TaskService();
TaskDefinition td = ts.NewTask();
td.Triggers.Add(new LogonTrigger());
string dir = DS4Windows.Global.exedirpath;
td.Actions.Add(new ExecAction($@"{dir}\task.bat",
"",
dir));
td.Principal.RunLevel = TaskRunLevel.Highest;
ts.RootFolder.RegisterTaskDefinition("RunDS4Windows", td);
}
public static void DeleteTaskEntry()
{
TaskService ts = new TaskService();
Task tasker = ts.FindTask("RunDS4Windows");
if (tasker != null)
{
ts.RootFolder.DeleteTask("RunDS4Windows");
}
}
public static bool CheckStartupExeLocation()
{
string lnkprogpath = ResolveShortcut(lnkpath);
return lnkprogpath != DS4Windows.Global.exelocation;
}
public static void LaunchOldTask()
{
TaskService ts = new TaskService();
Task tasker = ts.FindTask("RunDS4Windows");
if (tasker != null)
{
tasker.Run("");
}
}
private static string ResolveShortcut(string filePath)
{
Type t = Type.GetTypeFromCLSID(new Guid("72C24DD5-D70A-438B-8A42-98424B88AFB8")); // Windows Script Host Shell Object
dynamic shell = Activator.CreateInstance(t);
string result;
try
{
var shortcut = shell.CreateShortcut(filePath);
result = shortcut.TargetPath;
Marshal.FinalReleaseComObject(shortcut);
}
catch (COMException)
{
// A COMException is thrown if the file is not a valid shortcut (.lnk) file
result = null;
}
finally
{
Marshal.FinalReleaseComObject(shell);
}
return result;
}
}
}