mirror of
https://github.com/cemu-project/DS4Windows.git
synced 2024-12-25 16:11:49 +01:00
172 lines
5.3 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|