diff --git a/DisplayMagician/DisplayMagician.csproj b/DisplayMagician/DisplayMagician.csproj index 5ab5320..280d460 100644 --- a/DisplayMagician/DisplayMagician.csproj +++ b/DisplayMagician/DisplayMagician.csproj @@ -396,12 +396,6 @@ - - - {1cacda43-01c7-4cd4-bf6e-9421a29510fc} - DisplayMagicianShared - - {F935DC20-1CF0-11D0-ADB9-00C04FD58A0B} @@ -422,6 +416,12 @@ True + + + {1cacda43-01c7-4cd4-bf6e-9421a29510fc} + DisplayMagicianShared + + "$(DevEnvDir)TextTransform.exe" -a !!BuildConfiguration!$(Configuration) "$(ProjectDir)Properties\AssemblyInfo.tt" diff --git a/DisplayMagician/Program.cs b/DisplayMagician/Program.cs index c9e9005..15a4b45 100644 --- a/DisplayMagician/Program.cs +++ b/DisplayMagician/Program.cs @@ -21,6 +21,7 @@ using System.Collections.Generic; using AutoUpdaterDotNET; using Newtonsoft.Json; using System.Threading; +using Microsoft.Win32; namespace DisplayMagician { @@ -39,6 +40,7 @@ namespace DisplayMagician { public static string AppUplayIconFilename = Path.Combine(AppIconPath, @"Uplay.ico"); public static string AppEpicIconFilename = Path.Combine(AppIconPath, @"Epic.ico"); public static string AppDownloadsPath = Utils.GetDownloadsPath(); + public static string AppPermStartMenuPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonPrograms), "DisplayMagician","DisplayMagician.lnk"); public static string AppTempStartMenuPath = Path.Combine( Environment.GetFolderPath(Environment.SpecialFolder.Programs),"DisplayMagician.lnk"); public const string AppUserModelId = "LittleBitBig.DisplayMagician"; public const string AppActivationId = "4F319902-EB8C-43E6-8A51-8EA74E4308F8"; @@ -51,6 +53,7 @@ namespace DisplayMagician { private static readonly NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger(); private static SharedLogger sharedLogger; private static bool _gamesLoaded = false; + private static bool _tempShortcutRegistered = false; /// /// The main entry point for the application. @@ -59,20 +62,7 @@ namespace DisplayMagician { private static int Main(string[] args) { - // This sets the Application User Model ID to "LittleBitBig.DisplayMagician" so that - // Windows 10 recognises the application, and allows features such as Toasts, - // taskbar pinning and similar. - // Register AUMID, COM server, and activator - DesktopNotificationManagerCompat.RegisterAumidAndComServer(AppUserModelId); - DesktopNotificationManagerCompat.RegisterActivator(); - - // Force toasts to work even if we're not 'installed' per se by creating a temp DisplayMagician start menu icon - // Allows running from a ZIP file rather than forcing the app to be installed - if (!File.Exists(AppTempStartMenuPath)) - { - ShortcutManager.RegisterAppForNotifications( - AppTempStartMenuPath, Assembly.GetExecutingAssembly().Location, null, AppUserModelId, AppActivationId); - } + RegisterDisplayMagicianWithWindows(); // Prepare NLog for internal logging - Comment out when not required //NLog.Common.InternalLogger.LogLevel = NLog.LogLevel.Debug; @@ -321,6 +311,7 @@ namespace DisplayMagician { app.HelpOption("-?|-h|--help", inherited:true); app.VersionOption("-v|--version", () => { + DeRegisterDisplayMagicianWithWindows(); return string.Format("Version {0}", Assembly.GetExecutingAssembly().GetName().Version); }); @@ -396,6 +387,7 @@ namespace DisplayMagician { GameLibrary.LoadGamesInBackground(); RunShortcut(argumentShortcut.Value); + DeRegisterDisplayMagicianWithWindows(); return 0; }); }); @@ -465,11 +457,13 @@ namespace DisplayMagician { try { RunProfile(argumentProfile.Value); + DeRegisterDisplayMagicianWithWindows(); return 0; } catch (Exception ex) { logger.Error(ex, $"Program/Main exception running ApplyProfile(profileToUse)"); + DeRegisterDisplayMagicianWithWindows(); return 1; } }); @@ -534,6 +528,7 @@ namespace DisplayMagician { logger.Debug($"CreateProfile commandline command was invoked!"); Console.WriteLine("Starting up and creating a new Display Profile..."); CreateProfile(); + DeRegisterDisplayMagicianWithWindows(); return 0; }); }); @@ -615,6 +610,7 @@ namespace DisplayMagician { GameLibrary.LoadGamesInBackground(); StartUpApplication(); + DeRegisterDisplayMagicianWithWindows(); return 0; }); @@ -1028,7 +1024,7 @@ namespace DisplayMagician { private static void AutoUpdaterOnParseUpdateInfoEvent(ParseUpdateInfoEventArgs args) { dynamic json = JsonConvert.DeserializeObject(args.RemoteData); - logger.Trace($"MainForm/AutoUpdaterOnParseUpdateInfoEvent: Received the following Update JSON file from {AutoUpdater.AppCastURL}: {args.RemoteData}"); + logger.Trace($"Program/AutoUpdaterOnParseUpdateInfoEvent: Received the following Update JSON file from {AutoUpdater.AppCastURL}: {args.RemoteData}"); try { logger.Trace($"MainForm/AutoUpdaterOnParseUpdateInfoEvent: Trying to create an UpdateInfoEventArgs object from the received Update JSON file."); @@ -1052,7 +1048,7 @@ namespace DisplayMagician { } catch (Exception ex) { - logger.Error(ex, $"MainForm/AutoUpdaterOnParseUpdateInfoEvent: Exception trying to create an UpdateInfoEventArgs object from the received Update JSON file."); + logger.Error(ex, $"Program/AutoUpdaterOnParseUpdateInfoEvent: Exception trying to create an UpdateInfoEventArgs object from the received Update JSON file."); } } @@ -1067,12 +1063,12 @@ namespace DisplayMagician { if (Program.AppProgramSettings.ShowSplashScreen && Program.AppSplashScreen != null && !Program.AppSplashScreen.Disposing && !Program.AppSplashScreen.IsDisposed) Program.AppSplashScreen.Invoke(new Action(() => Program.AppSplashScreen.Close())); - logger.Info($"MainForm/AutoUpdaterOnCheckForUpdateEvent - There is an upgrade to version {args.CurrentVersion} available from {args.DownloadURL}. We're using version {args.InstalledVersion} at the moment."); + logger.Info($"Program/AutoUpdaterOnCheckForUpdateEvent - There is an upgrade to version {args.CurrentVersion} available from {args.DownloadURL}. We're using version {args.InstalledVersion} at the moment."); DialogResult dialogResult; if (args.Mandatory.Value) { - logger.Info($"MainForm/AutoUpdaterOnCheckForUpdateEvent - New version {args.CurrentVersion} available. Current version is {args.InstalledVersion}. Mandatory upgrade."); + logger.Info($"Program/AutoUpdaterOnCheckForUpdateEvent - New version {args.CurrentVersion} available. Current version is {args.InstalledVersion}. Mandatory upgrade."); dialogResult = MessageBox.Show( $@"There is new version {args.CurrentVersion} available. You are using version {args.InstalledVersion}. This is required update. Press Ok to begin updating the application.", @"Update Available", @@ -1081,7 +1077,7 @@ namespace DisplayMagician { } else { - logger.Info($"MainForm/AutoUpdaterOnCheckForUpdateEvent - New version {args.CurrentVersion} available. Current version is {args.InstalledVersion}. Optional upgrade."); + logger.Info($"Program/AutoUpdaterOnCheckForUpdateEvent - New version {args.CurrentVersion} available. Current version is {args.InstalledVersion}. Optional upgrade."); dialogResult = MessageBox.Show( $@"There is new version {args.CurrentVersion} available. You are using version { @@ -1098,16 +1094,16 @@ namespace DisplayMagician { { try { - logger.Info($"MainForm/AutoUpdaterOnCheckForUpdateEvent - Downloading {args.InstalledVersion} update."); + logger.Info($"Program/AutoUpdaterOnCheckForUpdateEvent - Downloading {args.InstalledVersion} update."); if (AutoUpdater.DownloadUpdate(args)) { - logger.Info($"MainForm/AutoUpdaterOnCheckForUpdateEvent - Restarting to apply {args.InstalledVersion} update."); + logger.Info($"Program/AutoUpdaterOnCheckForUpdateEvent - Restarting to apply {args.InstalledVersion} update."); Application.Exit(); } } catch (Exception ex) { - logger.Warn(ex, $"MainForm/AutoUpdaterOnCheckForUpdateEvent - Exception during update download."); + logger.Warn(ex, $"Program/AutoUpdaterOnCheckForUpdateEvent - Exception during update download."); MessageBox.Show(ex.Message, ex.GetType().ToString(), MessageBoxButtons.OK, MessageBoxIcon.Error); } @@ -1122,14 +1118,14 @@ namespace DisplayMagician { if (args.Error is WebException) { - logger.Warn(args.Error, $"MainForm/AutoUpdaterOnCheckForUpdateEvent - WebException - There was a problem reaching the update server."); + logger.Warn(args.Error, $"Program/AutoUpdaterOnCheckForUpdateEvent - WebException - There was a problem reaching the update server."); MessageBox.Show( @"There is a problem reaching update server. Please check your internet connection and try again later.", @"Update Check Failed", MessageBoxButtons.OK, MessageBoxIcon.Error); } else { - logger.Warn(args.Error, $"MainForm/AutoUpdaterOnCheckForUpdateEvent - There was a problem performing the update: {args.Error.Message}"); + logger.Warn(args.Error, $"Program/AutoUpdaterOnCheckForUpdateEvent - There was a problem performing the update: {args.Error.Message}"); MessageBox.Show(args.Error.Message, args.Error.GetType().ToString(), MessageBoxButtons.OK, MessageBoxIcon.Error); @@ -1137,10 +1133,77 @@ namespace DisplayMagician { } } - } - + private static void RegisterDisplayMagicianWithWindows() + { + // This sets the Application User Model ID to "LittleBitBig.DisplayMagician" so that + // Windows 10 recognises the application, and allows features such as Toasts, + // taskbar pinning and similar. + // Register AUMID, COM server, and activator + DesktopNotificationManagerCompat.RegisterAumidAndComServer(AppUserModelId); + DesktopNotificationManagerCompat.RegisterActivator(); - public class LoadingInstalledGamesException : Exception + // Force toasts to work if we're not 'installed' per se by creating a temp DisplayMagician start menu icon + // Allows running from a ZIP file rather than forcing the app to be installed. If we don't do this then Toasts just wouldn't work. + try + { + if (!IsInstalledVersion()) + { + _tempShortcutRegistered = true; + ShortcutManager.RegisterAppForNotifications( + AppTempStartMenuPath, Assembly.GetExecutingAssembly().Location, null, AppUserModelId, AppActivationId); + } + } + catch (Exception ex) + { + logger.Warn(ex, $"Program/RegisterDisplayMagicianWithWindows - Exception while trying to register the temporary application shortcut {AppTempStartMenuPath}. Windows Toasts will not work."); + } + } + + + private static void DeRegisterDisplayMagicianWithWindows() + { + // Remove the temporary shortcut if we have added it + if (_tempShortcutRegistered) + { + try + { + File.Delete(AppTempStartMenuPath); + } + catch(Exception ex) + { + logger.Warn(ex, $"Program/DeRegisterDisplayMagicianWithWindows - Exception while deleting the temporary application shortcut {AppTempStartMenuPath} "); + } + _tempShortcutRegistered = false; + } + } + + public static bool IsInstalledVersion() + + { + string installKey = @"SOFTWARE\DisplayMagician"; + string thisInstallDir = Path.GetDirectoryName(Application.ExecutablePath) + "\\"; + + try + { + using (RegistryKey rk = Registry.LocalMachine.OpenSubKey(installKey)) + { + if (rk.GetValue("InstallDir") != null && rk.GetValue("InstallDir").ToString() == thisInstallDir) + { + return true; //exists + } + } + return false; + } + catch (Exception ex) + { + return false; + } + } + + } + + +public class LoadingInstalledGamesException : Exception { public LoadingInstalledGamesException() { } diff --git a/DisplayMagician/Properties/AssemblyInfo.cs b/DisplayMagician/Properties/AssemblyInfo.cs index ac72ce8..f63f940 100644 --- a/DisplayMagician/Properties/AssemblyInfo.cs +++ b/DisplayMagician/Properties/AssemblyInfo.cs @@ -26,8 +26,8 @@ using System.Resources; [assembly: Guid("e4ceaf5e-ad01-4695-b179-31168eb74c48")] // Version information -[assembly: AssemblyVersion("2.1.1.24")] -[assembly: AssemblyFileVersion("2.1.1.24")] +[assembly: AssemblyVersion("2.1.1.36")] +[assembly: AssemblyFileVersion("2.1.1.36")] [assembly: NeutralResourcesLanguageAttribute( "en" )] [assembly: CLSCompliant(true)]