// // Copyright (c) PlaceholderCompany. All rights reserved. // namespace SystemTrayMenu { using System; using System.Windows.Forms; using Microsoft.Win32; using SystemTrayMenu.Business; using SystemTrayMenu.UserInterface; using SystemTrayMenu.Utilities; /// /// App contains the notifyicon, the taskbarform and the menus. /// internal class App : IDisposable { private readonly AppNotifyIcon menuNotifyIcon = new(); private readonly Menus menus = new(); private readonly TaskbarForm taskbarForm = null; public App() { AppRestart.BeforeRestarting += Dispose; SystemEvents.DisplaySettingsChanged += SystemEvents_DisplaySettingsChanged; menus.LoadStarted += menuNotifyIcon.LoadingStart; menus.LoadStopped += menuNotifyIcon.LoadingStop; menuNotifyIcon.Click += () => menus.SwitchOpenClose(true); menuNotifyIcon.OpenLog += Log.OpenLogFile; menus.MainPreload(); if (Properties.Settings.Default.ShowInTaskbar) { taskbarForm = new TaskbarForm(); taskbarForm.Activated += TasbkarItemActivated; void TasbkarItemActivated(object sender, EventArgs e) { SetStateNormal(); taskbarForm.Activate(); taskbarForm.Focus(); menus.SwitchOpenCloseByTaskbarItem(); } taskbarForm.Resize += TaskbarForm_Resize; taskbarForm.FormClosed += TaskbarForm_FormClosed; static void TaskbarForm_FormClosed(object sender, FormClosedEventArgs e) { Application.Exit(); } taskbarForm.Deactivate += TaskbarForm_Deactivate; void TaskbarForm_Resize(object sender, EventArgs e) { SetStateNormal(); } } DllImports.NativeMethods.User32ShowInactiveTopmost(taskbarForm); } public void Dispose() { taskbarForm?.Dispose(); SystemEvents.DisplaySettingsChanged -= SystemEvents_DisplaySettingsChanged; menus.Dispose(); menuNotifyIcon.Dispose(); } private void SystemEvents_DisplaySettingsChanged(object sender, EventArgs e) { if (menus.IsShortlyAfterOpening()) { Log.Info("Ignored DisplaySettingsChanged, because IsShortlyAfterOpening == true"); } else { AppRestart.ByDisplaySettings(); } } private void TaskbarForm_Deactivate(object sender, EventArgs e) { SetStateNormal(); } /// /// This ensures that next click on taskbaritem works as activate event/click event. /// private void SetStateNormal() { if (Form.ActiveForm == taskbarForm) { taskbarForm.WindowState = FormWindowState.Normal; } } } }