static void Main(string[] args) { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); try { Logging.LogManager.Initialize("Tray"); } catch (Exception ex) { #if DEBUG Debug.WriteLine("Failed to initialize logging"); Debug.WriteLine(ex); #endif MessageBox.Show($"Failed to initialize logging: {ex}"); Environment.Exit(-1); } _logger.Info($"{Namespace} v{Version} initializing..."); _logger.Debug($"ComamndLine: {Environment.CommandLine}"); var ownProcess = Process.GetCurrentProcess(); var openProcesses = Process.GetProcessesByName(ownProcess.ProcessName).Where(p => p.SessionId == ownProcess.SessionId); if (openProcesses.Count() > 1) { // There is already another process in this session. Just exit _logger.Info($"Another instance of {ownProcess.ProcessName} is already running. Exiting..."); Environment.Exit(0); } _logger.Trace("Reading settings ..."); Settings = ToolkitEnvironment.Settings.GetTrayAppSettings(); _logger.Trace("Creating LanguageManager..."); try { LanguageManager = new LanguageManager(); } catch (Exception ex) { _logger.Fatal(ex, "Failed to create LanguageManager. Exiting..."); MessageBox.Show($"Failed to initialize LanguageManager: {ex}"); Environment.Exit(-1); } _logger.Trace("Creating AppList..."); FormAppList = new AppList(); _logger.Trace("Creating TrayIcon..."); try { TrayIcon = new NotifyIcon { Icon = new Icon("Tray.ico"), Text = "DeploymentToolkit TrayApp" }; } catch (Exception ex) { _logger.Fatal(ex, "Failed to create tray icon"); Environment.Exit(-2); } _logger.Trace("Creating ContextMenu..."); var contextMenu = new ContextMenu(); if (Settings.EnableAppList) { _logger.Trace("Creating Show MenuItem..."); MenuItemToggleVisibility = new MenuItem { Index = 0, Text = "Show" }; MenuItemToggleVisibility.Click += ToggleTrayAppClicked; contextMenu.MenuItems.Add(MenuItemToggleVisibility); } else { _logger.Debug("AppList not enabled. Not creating 'Show' MenuItem"); } _logger.Trace("Creating Close MenuItem..."); MenuItemExit = new MenuItem { Index = 1, Text = "Close" }; MenuItemExit.Click += CloseTrayAppClicked; contextMenu.MenuItems.Add(MenuItemExit); #if DEBUG _logger.Trace("Creating debug MenuItems..."); { var item = new MenuItem() { Index = 2, Text = "DEBUG: View CloseApplication (cmd.exe)" }; item.Click += delegate(object sender, EventArgs e) { FormCloseApplication?.Dispose(); FormCloseApplication = new CloseApplication(new[] { "cmd.exe" }, 0); ShowForm(FormCloseApplication); }; contextMenu.MenuItems.Add(item); } { var item = new MenuItem() { Index = 3, Text = "DEBUG: View DeploymentDeferal" }; item.Click += delegate(object sender, EventArgs e) { FormDeploymentDeferal?.Dispose(); FormDeploymentDeferal = new DeploymentDeferal(1, DateTime.Now.AddDays(7)); ShowForm(FormDeploymentDeferal); }; contextMenu.MenuItems.Add(item); // Make sure this is never null as we may test dialogs DeploymentInformation = new DeploymentInformationMessage() { DeploymentName = "DEBUG", SequenceType = SequenceType.Installation, DisplaySettings = new DisplaySettings() { BlockScreensDuringInstallation = false, PersistentPrompt = false } }; } { var item = new MenuItem() { Index = 4, Text = "DEBUG: Logoff" }; item.Click += delegate(object sender, EventArgs e) { Util.PowerUtil.Logoff(); }; contextMenu.MenuItems.Add(item); } { var item = new MenuItem() { Index = 5, Text = "DEBUG: Restart" }; item.Click += delegate(object sender, EventArgs e) { Util.PowerUtil.Restart(); }; contextMenu.MenuItems.Add(item); } #endif _logger.Trace("Finishing TrayIcon..."); TrayIcon.ContextMenu = contextMenu; TrayIcon.Visible = true; _logger.Trace("Creating PipeServer..."); _pipeServer = new PipeServer(TrayIcon); _pipeServer.OnNewMessage += OnNewMessage; _logger.Trace("Checking commandline arguments..."); StartUpParameter = args.Any(a => a.ToLower() == "--requested"); if (args.Any(a => a.ToLower() == "--startup") || !Settings.EnableAppList) { _logger.Info($"Detected '--startup' commandline or EnableAppList is set to false. Starting application in Tray only ({args.Any(a => a.ToLower() == "--startup")}/{StartUpParameter}/{Settings.EnableAppList})"); StartUp = true; // create handles var handle = FormAppList.Handle; Application.Run(FormAppList); } else { _logger.Info("No valid commandline detected. Executing normal start"); Application.Run(FormAppList); } }
private static void OnNewMessage(object sender, NewMessageEventArgs e) { // NOT ON GUI THREAD !! try { switch (e.MessageId) { case MessageId.DeploymentInformationMessage: { _logger.Trace("Received DeploymentInformationMessage"); DeploymentInformation = e.Message as DeploymentInformationMessage; _logger.Trace($"Deploymentmethod: {DeploymentInformation.SequenceType}"); _logger.Trace($"Deploymentname: {DeploymentInformation.DeploymentName}"); } break; case MessageId.DeploymentStarted: case MessageId.DeploymentSuccess: case MessageId.DeploymentError: { if (e.MessageId == MessageId.DeploymentStarted && DeploymentInformation.DisplaySettings.BlockScreensDuringInstallation) { _logger.Trace("BlockScreensDuringInstallation specified. Blocking ..."); BlockScreen(); } else { UnblockScreen(); } var language = LanguageManager.Language; var text = DeploymentInformation.SequenceType == SequenceType.Installation ? language.DeploymentType_Install : language.DeploymentType_UnInstall; text += " "; var icon = ToolTipIcon.Info; if (e.MessageId == MessageId.DeploymentStarted) { text += language.BalloonText_Start; } else if (e.MessageId == MessageId.DeploymentSuccess) { text += language.BalloonText_Complete; } else if (e.MessageId == MessageId.DeploymentError) { icon = ToolTipIcon.Error; text += language.BalloonText_Error; } _logger.Trace($"Icon: {icon}"); _logger.Trace($"Final balloon tip text: {text}"); FormAppList.Invoke((Action) delegate() { TrayIcon.BalloonTipIcon = icon; TrayIcon.BalloonTipTitle = DeploymentInformation.DeploymentName; TrayIcon.BalloonTipText = text; TrayIcon.ShowBalloonTip(10000); if (e.MessageId == MessageId.DeploymentSuccess || e.MessageId == MessageId.DeploymentError) { // Enable exit again MenuItemExit.Enabled = true; } }); } break; case MessageId.DeploymentRestart: { var message = e.Message as DeploymentRestartMessage; FormAppList.Invoke((Action) delegate() { #if !DEBUG // Disable exit of the program MenuItemExit.Enabled = false; #endif if (FormRestart != null && !FormRestart.IsDisposed) { FormRestart.Dispose(); } FormRestart = new RestartDialog(message.TimeUntilForceRestart); ShowForm(FormRestart); }); } break; case MessageId.DeploymentLogoff: { var message = e.Message as DeploymentLogoffMessage; FormAppList.Invoke((Action) delegate() { TrayIcon.BalloonTipIcon = ToolTipIcon.Warning; TrayIcon.BalloonTipTitle = DeploymentInformation.DeploymentName; TrayIcon.BalloonTipText = $"You will be logged off in {message.TimeUntilForceLogoff} seconds"; TrayIcon.ShowBalloonTip(10000); System.Threading.Tasks.Task.Factory.StartNew(async() => { await System.Threading.Tasks.Task.Delay(message.TimeUntilForceLogoff * 1000); Util.PowerUtil.Logoff(); }); }); } break; case MessageId.CloseApplications: { var message = e.Message as CloseApplicationsMessage; #if !DEBUG // Disable exit of the program MenuItemExit.Enabled = false; #endif FormAppList.Invoke((Action) delegate() { if (FormCloseApplication != null && !FormCloseApplication.IsDisposed) { FormCloseApplication.Dispose(); } FormCloseApplication = new CloseApplication(message.ApplicationNames, message.TimeUntilForceClose); ShowForm(FormCloseApplication); }); } break; case MessageId.DeferDeployment: { var message = e.Message as DeferMessage; #if !DEBUG // Disable exit of the program MenuItemExit.Enabled = false; #endif FormAppList.Invoke((Action) delegate() { if (FormDeploymentDeferal != null && !FormDeploymentDeferal.IsDisposed) { FormDeploymentDeferal.Dispose(); } FormDeploymentDeferal = new DeploymentDeferal(message.RemainingDays, message.DeadLine); ShowForm(FormDeploymentDeferal); }); } break; } } catch (Exception ex) { _logger.Fatal(ex, "Failed to process message"); } }