using System.Diagnostics;using System.Runtime.InteropServices; internal static string Folder get { return Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "Programs", Program.Name); } internal static bool Offer(string[] args, string dir) if (Program.Whale || Program.Reroller || args.Length > 0) return false; if (File.Exists(Path.Combine(dir, "IdleMafiaBot.ini"))) return false; return !Same(dir, Folder); catch (Exception) { return false; } static bool Same(string a, string b) return string.Equals(Path.GetFullPath(a).TrimEnd('\\'), Path.GetFullPath(b).TrimEnd('\\'), StringComparison.OrdinalIgnoreCase); internal static bool AskAndRun(string exePath) var answer = MessageBox.Show( "Install " + Program.Name + " on this PC?\n\n" + "It goes in its own folder with a shortcut on your desktop and in the Start menu. " + "Check for updates keeps it up to date there.\n\n" + "No: it runs from this folder, as before.", Program.Name, MessageBoxButton.YesNo, MessageBoxImage.Question); if (answer != MessageBoxResult.Yes) return false; string why = Copy(exePath, Folder); MessageBox.Show("Couldn't install it (" + why + "). It runs from this folder instead.", Program.Name); string installed = Path.Combine(Folder, "IdleMafiaBot.exe"); Process.Start(new ProcessStartInfo(installed, "--restarted") { WorkingDirectory = Folder, UseShellExecute = true }); MessageBox.Show("It was installed, but Windows wouldn't start it (" + e.Message + "). Start it from the shortcut on your desktop.", Program.Name); internal static string Copy(string exePath, string folder) Directory.CreateDirectory(folder); string target = Path.Combine(folder, "IdleMafiaBot.exe"); Version have, mine = Version.Parse(Program.Version); var info = FileVersionInfo.GetVersionInfo(target); if (Version.TryParse(info.FileVersion ?? "", out have) && have > mine) replace = false; string fresh = target + ".new"; File.Copy(exePath, fresh, true); if (File.Exists(target)) File.Delete(target); File.Move(fresh, target); string readme = Path.Combine(Path.GetDirectoryName(exePath), "README.txt"); if (File.Exists(readme)) File.Copy(readme, Path.Combine(folder, "README.txt"), true); catch (Exception e) { return e.Message; } internal static void Shortcuts(string exe) string name = Program.Name + ".lnk"; foreach (var place in new[] { Environment.SpecialFolder.DesktopDirectory, Environment.SpecialFolder.Programs }) try { MakeLink(Path.Combine(Environment.GetFolderPath(place), name), exe); } static void MakeLink(string lnk, string exe) var link = (IShellLinkW)new ShellLink(); link.SetWorkingDirectory(Path.GetDirectoryName(exe)); link.SetIconLocation(exe, 0); link.SetDescription(Program.Name); ((IPersistFile)link).Save(lnk, true); Marshal.ReleaseComObject(link); [ComImport, Guid("00021401-0000-0000-C000-000000000046")] [ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("000214F9-0000-0000-C000-000000000046")] void GetPath([Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder file, int max, IntPtr fd, int flags); void GetIDList(out IntPtr ppidl); void SetIDList(IntPtr pidl); void GetDescription([Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder name, int max); void SetDescription([MarshalAs(UnmanagedType.LPWStr)] string name); void GetWorkingDirectory([Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder dir, int max); void SetWorkingDirectory([MarshalAs(UnmanagedType.LPWStr)] string dir); void GetArguments([Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder args, int max); void SetArguments([MarshalAs(UnmanagedType.LPWStr)] string args); void GetHotkey(out short key); void SetHotkey(short key); void GetShowCmd(out int cmd); void SetShowCmd(int cmd); void GetIconLocation([Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder path, int max, out int icon); void SetIconLocation([MarshalAs(UnmanagedType.LPWStr)] string path, int icon); void SetRelativePath([MarshalAs(UnmanagedType.LPWStr)] string path, int reserved); void Resolve(IntPtr hwnd, int flags); void SetPath([MarshalAs(UnmanagedType.LPWStr)] string file); [ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("0000010b-0000-0000-C000-000000000046")] void GetClassID(out Guid clsid); [PreserveSig] int IsDirty(); void Load([MarshalAs(UnmanagedType.LPWStr)] string file, int mode); void Save([MarshalAs(UnmanagedType.LPWStr)] string file, [MarshalAs(UnmanagedType.Bool)] bool remember); void SaveCompleted([MarshalAs(UnmanagedType.LPWStr)] string file); void GetCurFile([MarshalAs(UnmanagedType.LPWStr)] out string file);