title: WPF Minimize on Taskbar Click
body: <p>I have a WPF application that by stakeholder requirement must have a WindowStyle="None", ResizeMode="NoResize" and AllowTransparency="True".  I know that by not using the Windows chrome, you have to re-implement many of the OS window-handling features.  I was able to create a working custom minimize button, however I was not able to re-implement the feature where Windows minimize the application when you click on the Taskbar icon at the bottom of your screen.</p>
  
  <p>The user requirement is such that the application should minimize on taskbar icon click and restore on clicking again.  The latter has never stopped working but I have not been able to implement the former.  Here is the code that I am using:</p>
  
  <pre><code>    public ShellView(ShellViewModel viewModel)
      {
          InitializeComponent();
  
          // Set the ViewModel as this View's data context.
          this.DataContext = viewModel;
  
          this.Loaded += new RoutedEventHandler(ShellView_Loaded);
      }
  
      private void ShellView_Loaded(object sender, RoutedEventArgs e)
      {
          var m_hWnd = new WindowInteropHelper(this).Handle;
          HwndSource.FromHwnd(m_hWnd).AddHook(WindowProc);
      }
  
      private IntPtr WindowProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
      {
          if (msg == NativeMethods.CS_DBLCLKS)
          {
              this.WindowState = WindowState.Minimized;
              // handled = true
          }
  
          return IntPtr.Zero;
      }
  
      /// &lt;summary&gt;
      /// http://msdn.microsoft.com/en-us/library/ms646360(v=vs.85).aspx
      /// &lt;/summary&gt;
      internal class NativeMethods
      {
          public const int SC_RESTORE = 0xF120;
          public const int SC_MINIMIZE = 0xF020;
          public const int SC_CLOSE = 0xF060;
          public const int WM_SYSCOMMAND = 0x0112;
          public const int WS_SYSMENU = 0x80000;
          public const int WS_MINIMIZEBOX = 0x20000;
          public const int CS_DBLCLKS = 0x8;
          NativeMethods() { }
      }
  </code></pre>