using System; using System.ComponentModel; using System.Windows.Forms; using NzbDrone.Common; using NzbDrone.Common.EnvironmentInfo; using NzbDrone.Host.Owin; namespace NzbDrone.SysTray { public interface ISystemTrayApp { void Start(); } public class SystemTrayApp : Form, ISystemTrayApp { private readonly IProcessProvider _processProvider; private readonly IHostController _hostController; private readonly NotifyIcon _trayIcon = new NotifyIcon(); private readonly ContextMenu _trayMenu = new ContextMenu(); public SystemTrayApp(IProcessProvider processProvider, IHostController hostController) { _processProvider = processProvider; _hostController = hostController; } public void Start() { Application.ThreadException += OnThreadException; Application.ApplicationExit += OnApplicationExit; _trayMenu.MenuItems.Add("Launch Browser", LaunchBrowser); _trayMenu.MenuItems.Add("-"); _trayMenu.MenuItems.Add("Exit", OnExit); _trayIcon.Text = String.Format("NzbDrone - {0}", BuildInfo.Version); _trayIcon.Icon = Properties.Resources.NzbDroneIcon; _trayIcon.ContextMenu = _trayMenu; _trayIcon.Visible = true; Application.Run(this); } protected override void OnClosing(CancelEventArgs e) { DisposeTrayIcon(); } protected override void OnClosed(EventArgs e) { Console.WriteLine("Closing"); base.OnClosed(e); } protected override void OnLoad(EventArgs e) { Visible = false; ShowInTaskbar = false; base.OnLoad(e); } protected override void Dispose(bool isDisposing) { if (isDisposing) { _trayIcon.Dispose(); } base.Dispose(isDisposing); } private void OnExit(object sender, EventArgs e) { Application.Exit(); } private void LaunchBrowser(object sender, EventArgs e) { try { _processProvider.OpenDefaultBrowser(_hostController.AppUrl); } catch (Exception) { } } private void OnApplicationExit(object sender, EventArgs e) { DisposeTrayIcon(); } private void OnThreadException(object sender, EventArgs e) { DisposeTrayIcon(); } private void DisposeTrayIcon() { try { _trayIcon.Visible = false; _trayIcon.Icon = null; _trayIcon.Visible = false; _trayIcon.Dispose(); } catch (Exception e) { } } } }