using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows.Controls; using System.Windows.Media.Imaging; using System.Windows.Media; using System.Windows; using System.Windows.Interop; namespace Foo.GUILib { /// /// Class used to keep WPF Windows Hidden permanently. /// Should be called by Performance WPF Window 'Hidden' loads /// when constructed, and when loaded. /// /// Note: All WPFWindow's that use this class don't set certain properties on the /// window until they are loaded and it's NOT a performance Cache window. /// public static class WPFHiddenWindow { private static Dictionary s_hWndToWindowMap = new Dictionary(); /// /// * Core * 'Hiding' Function. Makes sure that the Window is and /// stays hidden. /// /// a WPF window object private static void HideWPFWindow(Window wpfWindow) { // Force Opacity wpfWindow.WindowStyle = WindowStyle.None; wpfWindow.Opacity = 0.0; wpfWindow.ShowInTaskbar = false; wpfWindow.ShowActivated = false; // Force a tiny Window in top-left corner wpfWindow.Width = 5; wpfWindow.Height = 5; wpfWindow.Top = 0; wpfWindow.Left = 0; wpfWindow.WindowStartupLocation = WindowStartupLocation.Manual; } /// /// Call this to execute a Show() call on a wpfWindow Performance cache window. Returns true /// if bPerformanceCache is true. This means that this Function did something to the window. /// /// a WPF window object /// Pass in true, if this is a performance Cache window /// true if bPerformanceCache is true, false otherwise public static bool ExecuteShowOnAHiddenWindow(Window wpfWindow, bool bPerformanceCache) { if (bPerformanceCache) { HideWPFWindow(wpfWindow); wpfWindow.Show(); wpfWindow.Hide(); return true; } return false; } /// /// Call this in your WPFWindow's constructor. Returns true if bPerformanceCache is true. /// This means that this Function did something to the window. /// /// a WPF window object /// Pass in true, if this is a performance Cache window /// true if bPerformanceCache is true, false otherwise public static bool HiddenWindowConstructor(Window wpfWindow, bool bPerformanceCache) { if (bPerformanceCache) { HideWPFWindow(wpfWindow); return true; } return false; } /// /// Call this from your WPFWindow's OnLoad Event. Returns true if bPerformanceCache is true. /// This means that this Function did something to the window. /// /// a WPF window object /// Pass in true, if this is a performance Cache window /// true if bPerformanceCache is true, false otherwise public static bool HiddenWindowOnLoad(Window wpfWindow, bool bPerformanceCache) { if (bPerformanceCache) { HideWPFWindow(wpfWindow); // Add Message Hook for performanceCache WPForm * To make sure it is always invisible * WindowInteropHelper interop = new WindowInteropHelper(wpfWindow); HwndSource source = HwndSource.FromHwnd(interop.Handle); source.AddHook(new HwndSourceHook(MessageHook)); s_hWndToWindowMap[interop.Handle] = wpfWindow; return true; } return false; } /// /// Call this from your WPFWindow's Closing Event. Returns true if bPerformanceCache is true. /// This means that this Function did something to the window. /// /// a WPF window object /// Pass in true, if this is a performance Cache window /// true if bPerformanceCache is true, false otherwise public static bool HiddenWindowClosing(Window wpfWindow, bool bPerformanceCache) { if (s_hWndToWindowMap.ContainsValue(wpfWindow)) { foreach (IntPtr hWnd in s_hWndToWindowMap.Keys) { if (s_hWndToWindowMap[hWnd] == wpfWindow) { s_hWndToWindowMap.Remove(hWnd); break; } } return true; } return false; } /// /// This Message Hook is for the Hidden wpfForm that we use for better performance, /// We want to make sure that it is never displayed *It can occur that explorer.exe can show it, without this hook* /// ~i.e. when explorer.exe crashes, and get's restarted /// private static IntPtr MessageHook(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) { // Get the Proper WPF Object and make sure it is Hidden if (s_hWndToWindowMap.ContainsKey(hwnd)) { Window wpfWindow = s_hWndToWindowMap[hwnd]; if (wpfWindow != null) HideWPFWindow(wpfWindow); } handled = false; return System.IntPtr.Zero; } } }