title: How to restore single instance application from system tray when clicking on desktop shortcut?
body: <p>This is my project example.</p>
  
  <p><strong>App.xaml.cs</strong></p>
  
  <pre><code>using BackgroundApplication.Single_Instance_App;
  using System.ComponentModel;
  using System.Windows;
  
  namespace BackgroundApplication
  {    
      public partial class App : Application
      {
          private System.Windows.Forms.NotifyIcon _notifyIcon;
          private bool _isExit;
  
       protected override void OnStartup(StartupEventArgs e)
          {
              WpfSingleInstance.Make("MyWpfApplication", this);
  
              base.OnStartup(e);
  
          }
  
      }
  }
  </code></pre>
  
  <p><strong>WpfSingleInstance.cs</strong></p>
  
  <pre><code>using System;
  using System.Collections.Generic;
  using System.Linq;
  using System.Text;
  using System.Threading;
  using System.Threading.Tasks;
  using System.Windows;
  
  namespace BackgroundApplication.Single_Instance_App
  {
    public  class WpfSingleInstance
      {
  
          internal static void Make(String name, Application app)
          {
  
              EventWaitHandle eventWaitHandle = null;
              String eventName = Environment.MachineName + "-" + Environment.CurrentDirectory.Replace('\\', '-') + "-" + name;
  
              bool isFirstInstance = false;
  
              try
              {
                  eventWaitHandle = EventWaitHandle.OpenExisting(eventName);
              }
              catch
              {
                  // it's first instance
                  isFirstInstance = true;
              }
  
              if (isFirstInstance)
              {
                  eventWaitHandle = new EventWaitHandle(
                      false,
                      EventResetMode.AutoReset,
                      eventName);
  
                  ThreadPool.RegisterWaitForSingleObject(eventWaitHandle, waitOrTimerCallback, app, Timeout.Infinite, false);
  
                  // not need more
                  eventWaitHandle.Close();
  
  
              }
              else
              {
                  eventWaitHandle.Set();
  
                  // For that exit no interceptions
                  Environment.Exit(0);
  
  
              }
          }
  
  
          private static void waitOrTimerCallback(Object state, Boolean timedOut)
          {
              Application app = (Application)state;
              app.Dispatcher.BeginInvoke(new activate(delegate () {
                  Application.Current.MainWindow.Activate();
              }), null);
          }
  
  
          private delegate void activate();
  
      }
  }
  </code></pre>
  
  <p><strong>MainWindow.xaml.cs</strong></p>
  
  <pre><code>using Microsoft.Win32;
  using System.Windows.Forms;
  namespace BackgroundApplication
  {   
      public partial class MainWindow : Window
      {    
          public MainWindow()
          {
              InitializeComponent();
          }
          private System.Windows.Forms.NotifyIcon _notifyIcon;
  
          private void CloseCustomButton_Click(object sender, RoutedEventArgs e)
          {
              this.ShowInTaskbar = false;
              this.Hide();
          }
          private void Window_Loaded(object sender, RoutedEventArgs e)
          {
              _notifyIcon = new System.Windows.Forms.NotifyIcon();
              _notifyIcon.DoubleClick += (s, args) =&gt; NormalMainWindow();
              _notifyIcon.Icon = BackgroundApplication.Properties.Resources.MyIcon;
              _notifyIcon.Visible = true;
              _notifyIcon.BalloonTipText = "Background Processing is running";
              _notifyIcon.BalloonTipTitle = "Information";
              _notifyIcon.ShowBalloonTip(50);
              CreateContextMenu();
          }
          private void CreateContextMenu()
          {        
              _notifyIcon.ContextMenuStrip = new System.Windows.Forms.ContextMenuStrip();
              _notifyIcon.ContextMenuStrip.Items.Add("Background Application").Click += (s, e) =&gt; NormalMainWindow();
              _notifyIcon.ContextMenuStrip.Items.Add("Maximize").Click += (s, e) =&gt; MaxMainWindow();
              _notifyIcon.ContextMenuStrip.Items.Add("Minimize").Click += (s, e) =&gt; MinMainWindow();
              _notifyIcon.ContextMenuStrip.Items.Add("Exit").Click += (s, e) =&gt; ExitApplication();
  
          }
  
          private void NormalMainWindow()
          {
              if (this.IsVisible)
              {
                  if (this.WindowState == WindowState.Minimized)
                  {
                      this.WindowState = WindowState.Normal;
                      this.ShowInTaskbar = true;
                  }
                  this.Activate();
              }
              else
              {
                  this.Show();
              }
          }
          private void MaxMainWindow()
          {
              if (this.IsVisible)
              {
                  if (this.WindowState == WindowState.Normal)
                  {
                      this.WindowState = WindowState.Maximized;
                      this.ShowInTaskbar = true;
                  }
                  this.Activate();
              }
              else
              {
                  this.Show();
                  this.WindowState = WindowState.Maximized;
                  this.Activate();
              }
          }
          private void MinMainWindow()
          {
              if (this.IsVisible)
              {
                  if ((this.WindowState == WindowState.Normal) || (this.WindowState == WindowState.Maximized))
                  {
                      this.WindowState = WindowState.Minimized;
                      this.ShowInTaskbar = true;
                  }
                  this.Activate();
              }
              else
              {
                  return;
              }
          }
          private void ExitApplication()
          {
              _isExit = true;        
              System.Windows.Application.Current.Shutdown();
              _notifyIcon.Dispose();
              _notifyIcon = null;
          }     
      }
   }
  </code></pre>
  
  <p><strong>It is exactly ok for single instance application &amp; tray system.</strong></p>
  
  <p><strong>But How can I restore this application from system tray when clicking on desktop shortcut (By clicking "Background Application.exe") ????</strong></p>