private static bool DispatchSystemCommandMessage(ref System.Windows.Forms.Message m, TaskbarWindow taskbarWindow) { if (m.Msg == (int)WindowMessage.SystemCommand) { if (((int)m.WParam) == TabbedThumbnailNativeMethods.ScClose) { // Raise the event if (taskbarWindow.TabbedThumbnail.OnTabbedThumbnailClosed()) { // Remove the taskbar window from our internal list if (_taskbarWindowList.Contains(taskbarWindow)) { _taskbarWindowList.Remove(taskbarWindow); } taskbarWindow.Dispose(); taskbarWindow = null; } } else if (((int)m.WParam) == TabbedThumbnailNativeMethods.ScMaximize) { // Raise the event taskbarWindow.TabbedThumbnail.OnTabbedThumbnailMaximized(); } else if (((int)m.WParam) == TabbedThumbnailNativeMethods.ScMinimize) { // Raise the event taskbarWindow.TabbedThumbnail.OnTabbedThumbnailMinimized(); } return(true); } return(false); }
private static bool DispatchSystemCommandMessage(ref System.Windows.Forms.Message m, TaskbarWindow taskbarWindow) { if (m.Msg == (int)WindowMessage.SystemCommand) { if (((int)m.WParam) == (int)SystemMenuCommands.Close) // Raise the event if (taskbarWindow.TabbedThumbnail.OnTabbedThumbnailClosed()) { // Remove the taskbar window from our internal list if (_taskbarWindowList.Contains(taskbarWindow)) _ = _taskbarWindowList.Remove(taskbarWindow); taskbarWindow.Dispose(); taskbarWindow = null; } else if (((uint)m.WParam) == (uint)SystemMenuCommands.Maximize) // Raise the event taskbarWindow.TabbedThumbnail.OnTabbedThumbnailMaximized(); else if (((uint)m.WParam) == (uint)SystemMenuCommands.Minimize) // Raise the event taskbarWindow.TabbedThumbnail.OnTabbedThumbnailMinimized(); return true; } return false; }
/// <summary> /// Remove the tabbed thumbnail from the taskbar. /// </summary> /// <param name="windowsControl">TabbedThumbnail associated with the WPF Control (UIElement) that /// is to be removed from the taskbar</param> public void RemoveThumbnailPreview(UIElement windowsControl) { if (windowsControl == null) { throw new ArgumentNullException("windowsControl"); } if (tabbedThumbnailListWPF.ContainsKey(windowsControl)) { TaskbarWindowManager.Instance.UnregisterTab(tabbedThumbnailListWPF[windowsControl].TaskbarWindow); tabbedThumbnailListWPF.Remove(windowsControl); TaskbarWindow taskbarWindow = TaskbarWindowManager.Instance.GetTaskbarWindow(windowsControl, TaskbarProxyWindowType.TabbedThumbnail); if (taskbarWindow != null) { if (TaskbarWindowManager.Instance.taskbarWindowList.Contains(taskbarWindow)) { TaskbarWindowManager.Instance.taskbarWindowList.Remove(taskbarWindow); } taskbarWindow.Dispose(); taskbarWindow = null; } } else { throw new ArgumentException("The given control has not been added to the taskbar."); } }
/// <summary> /// Remove the tabbed thumbnail from the taskbar. /// </summary> /// <param name="windowHandle">TabbedThumbnail associated with the window handle that /// is to be removed from the taskbar</param> public void RemoveThumbnailPreview(IntPtr windowHandle) { if (tabbedThumbnailList.ContainsKey(windowHandle)) { TaskbarWindowManager.Instance.UnregisterTab(tabbedThumbnailList[windowHandle].TaskbarWindow); tabbedThumbnailList.Remove(windowHandle); TaskbarWindow taskbarWindow = TaskbarWindowManager.Instance.GetTaskbarWindow(windowHandle, TaskbarProxyWindowType.TabbedThumbnail); if (taskbarWindow != null) { if (TaskbarWindowManager.Instance.taskbarWindowList.Contains(taskbarWindow)) { TaskbarWindowManager.Instance.taskbarWindowList.Remove(taskbarWindow); } taskbarWindow.Dispose(); taskbarWindow = null; } } else { throw new ArgumentException("The given control has not been added to the taskbar."); } }
/// <summary> /// Remove the tabbed thumbnail from the taskbar. /// </summary> /// <param name="windowsControl">TabbedThumbnail associated with the WPF Control (UIElement) that /// is to be removed from the taskbar</param> public void RemoveThumbnailPreview(UIElement windowsControl) { if (windowsControl == null) { throw new ArgumentNullException("windowsControl"); } if (!_tabbedThumbnailCacheWPF.ContainsKey(windowsControl)) { throw new ArgumentException(LocalizedMessages.ThumbnailManagerControlNotAdded, "windowsControl"); } TaskbarWindowManager.UnregisterTab(_tabbedThumbnailCacheWPF[windowsControl].TaskbarWindow); _tabbedThumbnailCacheWPF.Remove(windowsControl); TaskbarWindow taskbarWindow = TaskbarWindowManager.GetTaskbarWindow(windowsControl, TaskbarProxyWindowType.TabbedThumbnail); if (taskbarWindow != null) { if (TaskbarWindowManager._taskbarWindowList.Contains(taskbarWindow)) { TaskbarWindowManager._taskbarWindowList.Remove(taskbarWindow); } taskbarWindow.Dispose(); taskbarWindow = null; } }
internal static void AddThumbnailButtons(System.Windows.UIElement control, params ThumbnailToolBarButton[] buttons) { // Try to get an existing taskbar window for this user uielement TaskbarWindow taskbarWindow = GetTaskbarWindow(control, TaskbarProxyWindowType.ThumbnailToolbar); TaskbarWindow temp = null; try { AddThumbnailButtons( taskbarWindow ?? (temp = new TaskbarWindow(control, buttons)), taskbarWindow == null, buttons); } catch { if (temp != null) { temp.Dispose(); } throw; } }
internal static void AddThumbnailButtons(IntPtr userWindowHandle, params ThumbnailToolBarButton[] buttons) { // Try to get an existing taskbar window for this user windowhandle TaskbarWindow taskbarWindow = GetTaskbarWindow(userWindowHandle, TaskbarProxyWindowType.ThumbnailToolbar); TaskbarWindow temp = null; try { AddThumbnailButtons( taskbarWindow ?? (temp = new TaskbarWindow(userWindowHandle, buttons)), taskbarWindow == null, buttons); } catch { if (temp != null) { temp.Dispose(); } throw; } }
private static bool DispatchNCDestroyMessage(ref System.Windows.Forms.Message m, TaskbarWindow taskbarWindow) { if (m.Msg == (int)WindowMessage.NCDestroy) { // Raise the event taskbarWindow.TabbedThumbnail.OnTabbedThumbnailClosed(); // Remove the taskbar window from our internal list if (_taskbarWindowList.Contains(taskbarWindow)) { _taskbarWindowList.Remove(taskbarWindow); } taskbarWindow.Dispose(); return(true); } return(false); }
internal static void AddThumbnailButtons(System.Windows.UIElement control, params ThumbnailToolBarButton[] buttons) { // Try to get an existing taskbar window for this user uielement TaskbarWindow taskbarWindow = GetTaskbarWindow(control, TaskbarProxyWindowType.ThumbnailToolbar); TaskbarWindow temp = null; try { AddThumbnailButtons( taskbarWindow ?? (temp = new TaskbarWindow(control, buttons)), taskbarWindow == null, buttons); } catch { temp?.Dispose(); throw; } }
internal static void AddThumbnailButtons(IntPtr userWindowHandle, params ThumbnailToolBarButton[] buttons) { // Try to get an existing taskbar window for this user windowhandle TaskbarWindow taskbarWindow = GetTaskbarWindow(userWindowHandle, TaskbarProxyWindowType.ThumbnailToolbar); TaskbarWindow temp = null; try { AddThumbnailButtons( taskbarWindow ?? (temp = new TaskbarWindow(userWindowHandle, buttons)), taskbarWindow == null, buttons); } catch { if (temp != null) temp.Dispose(); throw; } }
/// <summary> /// Remove the tabbed thumbnail from the taskbar. /// </summary> /// <param name="windowHandle">TabbedThumbnail associated with the window handle that /// is to be removed from the taskbar</param> public void RemoveThumbnailPreview(IntPtr windowHandle) { if (!_tabbedThumbnailCache.ContainsKey(windowHandle)) { throw new ArgumentException(LocalizedMessages.ThumbnailManagerControlNotAdded, "windowHandle"); } TaskbarWindowManager.UnregisterTab(_tabbedThumbnailCache[windowHandle].TaskbarWindow); _tabbedThumbnailCache.Remove(windowHandle); TaskbarWindow taskbarWindow = TaskbarWindowManager.GetTaskbarWindow(windowHandle, TaskbarProxyWindowType.TabbedThumbnail); if (taskbarWindow != null) { if (TaskbarWindowManager._taskbarWindowList.Contains(taskbarWindow)) { TaskbarWindowManager._taskbarWindowList.Remove(taskbarWindow); } taskbarWindow.Dispose(); taskbarWindow = null; } }
/// <summary> /// Dispatches a window message so that the appropriate events /// can be invoked. This is used for the Taskbar's thumbnail toolbar feature. /// </summary> /// <param name="m">The window message, typically obtained /// from a Windows Forms or WPF window procedure.</param> /// <param name="taskbarWindow">Taskbar window for which we are intercepting the messages</param> /// <returns>Returns true if this method handles the window message</returns> internal bool DispatchMessage(ref Message m, TaskbarWindow taskbarWindow) { if (taskbarWindow.EnableThumbnailToolbars) { if (m.Msg == (int)TaskbarNativeMethods.WM_TASKBARBUTTONCREATED) { AddButtons(taskbarWindow); } else { if (!buttonsAdded) AddButtons(taskbarWindow); switch (m.Msg) { case TaskbarNativeMethods.WM_COMMAND: if (CoreNativeMethods.HIWORD(m.WParam.ToInt64(), 16) == THUMBBUTTON.THBN_CLICKED) { int buttonId = CoreNativeMethods.LOWORD(m.WParam.ToInt64()); var buttonsFound = from b in taskbarWindow.ThumbnailButtons where b.Id == buttonId select b; foreach (ThumbnailToolbarButton button in buttonsFound) { button.FireClick(taskbarWindow); } } break; } // End switch } // End else } // End if // If we are removed from the taskbar, ignore all the messages if (taskbarWindow.EnableTabbedThumbnails) { if (taskbarWindow.TabbedThumbnail.RemovedFromTaskbar) return false; else if (m.Msg == (int)TabbedThumbnailNativeMethods.WM_ACTIVATE) { // Raise the event taskbarWindow.TabbedThumbnail.OnTabbedThumbnailActivated(); SetActiveTab(taskbarWindow); return true; } else if (m.Msg == (int)TaskbarNativeMethods.WM_DWMSENDICONICTHUMBNAIL) { int width = (int)((long)m.LParam >> 16); int height = (int)(((long)m.LParam) & (0xFFFF)); Size requestedSize = new Size(width, height); // Fire an event to let the user update their bitmap // Raise the event taskbarWindow.TabbedThumbnail.OnTabbedThumbnailBitmapRequested(); IntPtr hBitmap = IntPtr.Zero; // Default size for the thumbnail Size realWindowSize = new Size(200, 200); if (taskbarWindow.TabbedThumbnail.WindowHandle != IntPtr.Zero) TabbedThumbnailNativeMethods.GetClientSize(taskbarWindow.TabbedThumbnail.WindowHandle, out realWindowSize); else if (taskbarWindow.TabbedThumbnail.WindowsControl != null) realWindowSize = new Size( Convert.ToInt32(taskbarWindow.TabbedThumbnail.WindowsControl.RenderSize.Width), Convert.ToInt32(taskbarWindow.TabbedThumbnail.WindowsControl.RenderSize.Height)); if ((realWindowSize.Height == -1) && (realWindowSize.Width == -1)) realWindowSize.Width = realWindowSize.Height = 199; // capture the bitmap for the given control // If the user has already specified us a bitmap to use, use that. if (taskbarWindow.TabbedThumbnail.ClippingRectangle != null && taskbarWindow.TabbedThumbnail.ClippingRectangle.Value != Rectangle.Empty) { if (taskbarWindow.TabbedThumbnail.CurrentHBitmap == IntPtr.Zero) hBitmap = GrabBitmap(taskbarWindow, realWindowSize); else hBitmap = taskbarWindow.TabbedThumbnail.CurrentHBitmap; // Clip the bitmap we just got Bitmap bmp = Bitmap.FromHbitmap(hBitmap); Rectangle clippingRectangle = taskbarWindow.TabbedThumbnail.ClippingRectangle.Value; // If our clipping rect is out of bounds, update it if (clippingRectangle.Height > requestedSize.Height) clippingRectangle.Height = requestedSize.Height; if (clippingRectangle.Width > requestedSize.Width) clippingRectangle.Width = requestedSize.Width; bmp = bmp.Clone(clippingRectangle, bmp.PixelFormat); // Make sure we dispose the bitmap before assigning, otherwise we'll have a memory leak if (hBitmap != IntPtr.Zero && taskbarWindow.TabbedThumbnail.CurrentHBitmap == IntPtr.Zero) { ShellNativeMethods.DeleteObject(hBitmap); } hBitmap = bmp.GetHbitmap(); } else { // Else, user didn't want any clipping, if they haven't provided us a bitmap, // use the screencapture utility and capture it. hBitmap = taskbarWindow.TabbedThumbnail.CurrentHBitmap; // If no bitmap, capture one using the utility if (hBitmap == IntPtr.Zero) hBitmap = GrabBitmap(taskbarWindow, realWindowSize); } // Only set the thumbnail if it's not null. // If it's null (either we didn't get the bitmap or size was 0), // let DWM handle it if (hBitmap != IntPtr.Zero) { Bitmap temp = TabbedThumbnailScreenCapture.ResizeImageWithAspect(hBitmap, requestedSize.Width, requestedSize.Height, true); if (taskbarWindow.TabbedThumbnail.CurrentHBitmap == IntPtr.Zero) ShellNativeMethods.DeleteObject(hBitmap); hBitmap = temp.GetHbitmap(); TabbedThumbnailNativeMethods.SetIconicThumbnail(taskbarWindow.WindowToTellTaskbarAbout, hBitmap); temp.Dispose(); } // If the bitmap we have is not coming from the user (i.e. we created it here), // then make sure we delete it as we don't need it now. if (taskbarWindow.TabbedThumbnail.CurrentHBitmap == IntPtr.Zero) ShellNativeMethods.DeleteObject(hBitmap); return true; } else if (m.Msg == (int)TaskbarNativeMethods.WM_DWMSENDICONICLIVEPREVIEWBITMAP) { // Try to get the width/height int width = (int)(((long)m.LParam) >> 16); int height = (int)(((long)m.LParam) & (0xFFFF)); // Default size for the thumbnail Size realWindowSize = new Size(200, 200); if (taskbarWindow.TabbedThumbnail.WindowHandle != IntPtr.Zero) TabbedThumbnailNativeMethods.GetClientSize(taskbarWindow.TabbedThumbnail.WindowHandle, out realWindowSize); else if (taskbarWindow.TabbedThumbnail.WindowsControl != null) realWindowSize = new Size( Convert.ToInt32(taskbarWindow.TabbedThumbnail.WindowsControl.RenderSize.Width), Convert.ToInt32(taskbarWindow.TabbedThumbnail.WindowsControl.RenderSize.Height)); // If we don't have a valid height/width, use the original window's size if (width <= 0) width = realWindowSize.Width; if (height <= 0) height = realWindowSize.Height; // Fire an event to let the user update their bitmap // Raise the event taskbarWindow.TabbedThumbnail.OnTabbedThumbnailBitmapRequested(); // capture the bitmap for the given control // If the user has already specified us a bitmap to use, use that. IntPtr hBitmap = taskbarWindow.TabbedThumbnail.CurrentHBitmap == IntPtr.Zero ? GrabBitmap(taskbarWindow, realWindowSize) : taskbarWindow.TabbedThumbnail.CurrentHBitmap; // If we have a valid parent window handle, // calculate the offset so we can place the "peek" bitmap // correctly on the app window if (taskbarWindow.TabbedThumbnail.ParentWindowHandle != IntPtr.Zero && taskbarWindow.TabbedThumbnail.WindowHandle != IntPtr.Zero) { Point offset = new Point(); // if we don't have a offset specified already by the user... if (!taskbarWindow.TabbedThumbnail.PeekOffset.HasValue) { offset = WindowUtilities.GetParentOffsetOfChild(taskbarWindow.TabbedThumbnail.WindowHandle, taskbarWindow.TabbedThumbnail.ParentWindowHandle); } else { offset = new Point(Convert.ToInt32(taskbarWindow.TabbedThumbnail.PeekOffset.Value.X), Convert.ToInt32(taskbarWindow.TabbedThumbnail.PeekOffset.Value.Y)); } // Only set the peek bitmap if it's not null. // If it's null (either we didn't get the bitmap or size was 0), // let DWM handle it if (hBitmap != IntPtr.Zero) { if (offset.X >= 0 && offset.Y >= 0) TabbedThumbnailNativeMethods.SetPeekBitmap(taskbarWindow.WindowToTellTaskbarAbout, hBitmap, offset, taskbarWindow.TabbedThumbnail.DisplayFrameAroundBitmap); } // If the bitmap we have is not coming from the user (i.e. we created it here), // then make sure we delete it as we don't need it now. if (taskbarWindow.TabbedThumbnail.CurrentHBitmap == IntPtr.Zero) ShellNativeMethods.DeleteObject(hBitmap); return true; } // Else, we don't have a valid window handle from the user. This is mostly likely because // we have a WPF UIElement control. If that's the case, use a different screen capture method // and also couple of ways to try to calculate the control's offset w.r.t it's parent. else if (taskbarWindow.TabbedThumbnail.ParentWindowHandle != IntPtr.Zero && taskbarWindow.TabbedThumbnail.WindowsControl != null) { System.Windows.Point offset; if (!taskbarWindow.TabbedThumbnail.PeekOffset.HasValue) { // Calculate the offset for a WPF UIElement control // For hidden controls, we can't seem to perform the transform. GeneralTransform objGeneralTransform = taskbarWindow.TabbedThumbnail.WindowsControl.TransformToVisual(taskbarWindow.TabbedThumbnail.WindowsControlParentWindow); offset = objGeneralTransform.Transform(new System.Windows.Point(0, 0)); } else { offset = new System.Windows.Point(taskbarWindow.TabbedThumbnail.PeekOffset.Value.X, taskbarWindow.TabbedThumbnail.PeekOffset.Value.Y); } // Only set the peek bitmap if it's not null. // If it's null (either we didn't get the bitmap or size was 0), // let DWM handle it if (hBitmap != IntPtr.Zero) { if (offset.X >= 0 && offset.Y >= 0) TabbedThumbnailNativeMethods.SetPeekBitmap(taskbarWindow.WindowToTellTaskbarAbout, hBitmap, new Point((int)offset.X, (int)offset.Y), taskbarWindow.TabbedThumbnail.DisplayFrameAroundBitmap); else TabbedThumbnailNativeMethods.SetPeekBitmap(taskbarWindow.WindowToTellTaskbarAbout, hBitmap, taskbarWindow.TabbedThumbnail.DisplayFrameAroundBitmap); } // If the bitmap we have is not coming from the user (i.e. we created it here), // then make sure we delete it as we don't need it now. if (taskbarWindow.TabbedThumbnail.CurrentHBitmap == IntPtr.Zero) ShellNativeMethods.DeleteObject(hBitmap); return true; } else { // Else (no parent specified), just set the bitmap. It would take over the entire // application window (would work only if you are a MDI app) // Only set the peek bitmap if it's not null. // If it's null (either we didn't get the bitmap or size was 0), // let DWM handle it if (hBitmap != null) TabbedThumbnailNativeMethods.SetPeekBitmap(taskbarWindow.WindowToTellTaskbarAbout, hBitmap, taskbarWindow.TabbedThumbnail.DisplayFrameAroundBitmap); // If the bitmap we have is not coming from the user (i.e. we created it here), // then make sure we delete it as we don't need it now. if (taskbarWindow.TabbedThumbnail.CurrentHBitmap == IntPtr.Zero) ShellNativeMethods.DeleteObject(hBitmap); return true; } } else if (m.Msg == (int)TabbedThumbnailNativeMethods.WM_DESTROY) { TaskbarManager.Instance.TaskbarList.UnregisterTab(taskbarWindow.WindowToTellTaskbarAbout); taskbarWindow.TabbedThumbnail.RemovedFromTaskbar = true; return true; } else if (m.Msg == (int)TabbedThumbnailNativeMethods.WM_NCDESTROY) { // Raise the event taskbarWindow.TabbedThumbnail.OnTabbedThumbnailClosed(); // Remove the taskbar window from our internal list if (taskbarWindowList.Contains(taskbarWindow)) taskbarWindowList.Remove(taskbarWindow); taskbarWindow.Dispose(); taskbarWindow = null; return true; } else if (m.Msg == (int)TabbedThumbnailNativeMethods.WM_SYSCOMMAND) { if (((int)m.WParam) == TabbedThumbnailNativeMethods.SC_CLOSE) { // Raise the event taskbarWindow.TabbedThumbnail.OnTabbedThumbnailClosed(); // Remove the taskbar window from our internal list if (taskbarWindowList.Contains(taskbarWindow)) taskbarWindowList.Remove(taskbarWindow); taskbarWindow.Dispose(); taskbarWindow = null; } else if (((int)m.WParam) == TabbedThumbnailNativeMethods.SC_MAXIMIZE) { // Raise the event taskbarWindow.TabbedThumbnail.OnTabbedThumbnailMaximized(); } else if (((int)m.WParam) == TabbedThumbnailNativeMethods.SC_MINIMIZE) { // Raise the event taskbarWindow.TabbedThumbnail.OnTabbedThumbnailMinimized(); } return true; } } return false; }
private static bool DispatchSystemCommandMessage(ref System.Windows.Forms.Message m, TaskbarWindow taskbarWindow) { if (m.Msg == (int)WindowMessage.SystemCommand) { if (((int)m.WParam) == TabbedThumbnailNativeMethods.ScClose) { // Raise the event if (taskbarWindow.TabbedThumbnail.OnTabbedThumbnailClosed()) { // Remove the taskbar window from our internal list if (_taskbarWindowList.Contains(taskbarWindow)) { _taskbarWindowList.Remove(taskbarWindow); } taskbarWindow.Dispose(); taskbarWindow = null; } } else if (((int)m.WParam) == TabbedThumbnailNativeMethods.ScMaximize) { // Raise the event taskbarWindow.TabbedThumbnail.OnTabbedThumbnailMaximized(); } else if (((int)m.WParam) == TabbedThumbnailNativeMethods.ScMinimize) { // Raise the event taskbarWindow.TabbedThumbnail.OnTabbedThumbnailMinimized(); } return true; } return false; }
private static bool DispatchNCDestroyMessage(ref System.Windows.Forms.Message m, TaskbarWindow taskbarWindow) { if (m.Msg == (int)WindowMessage.NCDestroy) { // Raise the event taskbarWindow.TabbedThumbnail.OnTabbedThumbnailClosed(); // Remove the taskbar window from our internal list if (_taskbarWindowList.Contains(taskbarWindow)) { _taskbarWindowList.Remove(taskbarWindow); } taskbarWindow.Dispose(); return true; } return false; }
/// <summary> /// Dispatches a window message so that the appropriate events /// can be invoked. This is used for the Taskbar's thumbnail toolbar feature. /// </summary> /// <param name="m">The window message, typically obtained /// from a Windows Forms or WPF window procedure.</param> /// <param name="taskbarWindow">Taskbar window for which we are intercepting the messages</param> /// <returns>Returns true if this method handles the window message</returns> internal bool DispatchMessage(ref Message m, TaskbarWindow taskbarWindow) { if (taskbarWindow.EnableThumbnailToolbars) { if (m.Msg == (int)TaskbarNativeMethods.WM_TASKBARBUTTONCREATED) { AddButtons(taskbarWindow); } else { if (!buttonsAdded) { AddButtons(taskbarWindow); } switch (m.Msg) { case TaskbarNativeMethods.WM_COMMAND: if (CoreNativeMethods.HIWORD(m.WParam.ToInt64(), 16) == THUMBBUTTON.THBN_CLICKED) { int buttonId = CoreNativeMethods.LOWORD(m.WParam.ToInt64()); var buttonsFound = from b in taskbarWindow.ThumbnailButtons where b.Id == buttonId select b; foreach (ThumbnailToolbarButton button in buttonsFound) { button.FireClick(taskbarWindow); } } break; } // End switch } // End else } // End if // If we are removed from the taskbar, ignore all the messages if (taskbarWindow.EnableTabbedThumbnails) { if (taskbarWindow.TabbedThumbnail.RemovedFromTaskbar) { return(false); } else if (m.Msg == (int)TabbedThumbnailNativeMethods.WM_ACTIVATE) { // Raise the event taskbarWindow.TabbedThumbnail.OnTabbedThumbnailActivated(); SetActiveTab(taskbarWindow); return(true); } else if (m.Msg == (int)TaskbarNativeMethods.WM_DWMSENDICONICTHUMBNAIL) { int width = (int)((long)m.LParam >> 16); int height = (int)(((long)m.LParam) & (0xFFFF)); Size requestedSize = new Size(width, height); // Fire an event to let the user update their bitmap // Raise the event taskbarWindow.TabbedThumbnail.OnTabbedThumbnailBitmapRequested(); IntPtr hBitmap = IntPtr.Zero; // Default size for the thumbnail Size realWindowSize = new Size(200, 200); if (taskbarWindow.TabbedThumbnail.WindowHandle != IntPtr.Zero) { TabbedThumbnailNativeMethods.GetClientSize(taskbarWindow.TabbedThumbnail.WindowHandle, out realWindowSize); } else if (taskbarWindow.TabbedThumbnail.WindowsControl != null) { realWindowSize = new Size( Convert.ToInt32(taskbarWindow.TabbedThumbnail.WindowsControl.RenderSize.Width), Convert.ToInt32(taskbarWindow.TabbedThumbnail.WindowsControl.RenderSize.Height)); } if ((realWindowSize.Height == -1) && (realWindowSize.Width == -1)) { realWindowSize.Width = realWindowSize.Height = 199; } // capture the bitmap for the given control // If the user has already specified us a bitmap to use, use that. if (taskbarWindow.TabbedThumbnail.ClippingRectangle != null && taskbarWindow.TabbedThumbnail.ClippingRectangle.Value != Rectangle.Empty) { if (taskbarWindow.TabbedThumbnail.CurrentHBitmap == IntPtr.Zero) { hBitmap = GrabBitmap(taskbarWindow, realWindowSize); } else { hBitmap = taskbarWindow.TabbedThumbnail.CurrentHBitmap; } // Clip the bitmap we just got Bitmap bmp = Bitmap.FromHbitmap(hBitmap); Rectangle clippingRectangle = taskbarWindow.TabbedThumbnail.ClippingRectangle.Value; // If our clipping rect is out of bounds, update it if (clippingRectangle.Height > requestedSize.Height) { clippingRectangle.Height = requestedSize.Height; } if (clippingRectangle.Width > requestedSize.Width) { clippingRectangle.Width = requestedSize.Width; } bmp = bmp.Clone(clippingRectangle, bmp.PixelFormat); // Make sure we dispose the bitmap before assigning, otherwise we'll have a memory leak if (hBitmap != IntPtr.Zero && taskbarWindow.TabbedThumbnail.CurrentHBitmap == IntPtr.Zero) { ShellNativeMethods.DeleteObject(hBitmap); } hBitmap = bmp.GetHbitmap(); } else { // Else, user didn't want any clipping, if they haven't provided us a bitmap, // use the screencapture utility and capture it. hBitmap = taskbarWindow.TabbedThumbnail.CurrentHBitmap; // If no bitmap, capture one using the utility if (hBitmap == IntPtr.Zero) { hBitmap = GrabBitmap(taskbarWindow, realWindowSize); } } // Only set the thumbnail if it's not null. // If it's null (either we didn't get the bitmap or size was 0), // let DWM handle it if (hBitmap != IntPtr.Zero) { Bitmap temp = TabbedThumbnailScreenCapture.ResizeImageWithAspect(hBitmap, requestedSize.Width, requestedSize.Height, true); if (taskbarWindow.TabbedThumbnail.CurrentHBitmap == IntPtr.Zero) { ShellNativeMethods.DeleteObject(hBitmap); } hBitmap = temp.GetHbitmap(); TabbedThumbnailNativeMethods.SetIconicThumbnail(taskbarWindow.WindowToTellTaskbarAbout, hBitmap); temp.Dispose(); } // If the bitmap we have is not coming from the user (i.e. we created it here), // then make sure we delete it as we don't need it now. if (taskbarWindow.TabbedThumbnail.CurrentHBitmap == IntPtr.Zero) { ShellNativeMethods.DeleteObject(hBitmap); } return(true); } else if (m.Msg == (int)TaskbarNativeMethods.WM_DWMSENDICONICLIVEPREVIEWBITMAP) { // Try to get the width/height int width = (int)(((long)m.LParam) >> 16); int height = (int)(((long)m.LParam) & (0xFFFF)); // Default size for the thumbnail Size realWindowSize = new Size(200, 200); if (taskbarWindow.TabbedThumbnail.WindowHandle != IntPtr.Zero) { TabbedThumbnailNativeMethods.GetClientSize(taskbarWindow.TabbedThumbnail.WindowHandle, out realWindowSize); } else if (taskbarWindow.TabbedThumbnail.WindowsControl != null) { realWindowSize = new Size( Convert.ToInt32(taskbarWindow.TabbedThumbnail.WindowsControl.RenderSize.Width), Convert.ToInt32(taskbarWindow.TabbedThumbnail.WindowsControl.RenderSize.Height)); } // If we don't have a valid height/width, use the original window's size if (width <= 0) { width = realWindowSize.Width; } if (height <= 0) { height = realWindowSize.Height; } // Fire an event to let the user update their bitmap // Raise the event taskbarWindow.TabbedThumbnail.OnTabbedThumbnailBitmapRequested(); // capture the bitmap for the given control // If the user has already specified us a bitmap to use, use that. IntPtr hBitmap = taskbarWindow.TabbedThumbnail.CurrentHBitmap == IntPtr.Zero ? GrabBitmap(taskbarWindow, realWindowSize) : taskbarWindow.TabbedThumbnail.CurrentHBitmap; // If we have a valid parent window handle, // calculate the offset so we can place the "peek" bitmap // correctly on the app window if (taskbarWindow.TabbedThumbnail.ParentWindowHandle != IntPtr.Zero && taskbarWindow.TabbedThumbnail.WindowHandle != IntPtr.Zero) { Point offset = new Point(); // if we don't have a offset specified already by the user... if (!taskbarWindow.TabbedThumbnail.PeekOffset.HasValue) { offset = WindowUtilities.GetParentOffsetOfChild(taskbarWindow.TabbedThumbnail.WindowHandle, taskbarWindow.TabbedThumbnail.ParentWindowHandle); } else { offset = new Point(Convert.ToInt32(taskbarWindow.TabbedThumbnail.PeekOffset.Value.X), Convert.ToInt32(taskbarWindow.TabbedThumbnail.PeekOffset.Value.Y)); } // Only set the peek bitmap if it's not null. // If it's null (either we didn't get the bitmap or size was 0), // let DWM handle it if (hBitmap != IntPtr.Zero) { if (offset.X >= 0 && offset.Y >= 0) { TabbedThumbnailNativeMethods.SetPeekBitmap(taskbarWindow.WindowToTellTaskbarAbout, hBitmap, offset, taskbarWindow.TabbedThumbnail.DisplayFrameAroundBitmap); } } // If the bitmap we have is not coming from the user (i.e. we created it here), // then make sure we delete it as we don't need it now. if (taskbarWindow.TabbedThumbnail.CurrentHBitmap == IntPtr.Zero) { ShellNativeMethods.DeleteObject(hBitmap); } return(true); } // Else, we don't have a valid window handle from the user. This is mostly likely because // we have a WPF UIElement control. If that's the case, use a different screen capture method // and also couple of ways to try to calculate the control's offset w.r.t it's parent. else if (taskbarWindow.TabbedThumbnail.ParentWindowHandle != IntPtr.Zero && taskbarWindow.TabbedThumbnail.WindowsControl != null) { System.Windows.Point offset; if (!taskbarWindow.TabbedThumbnail.PeekOffset.HasValue) { // Calculate the offset for a WPF UIElement control // For hidden controls, we can't seem to perform the transform. GeneralTransform objGeneralTransform = taskbarWindow.TabbedThumbnail.WindowsControl.TransformToVisual(taskbarWindow.TabbedThumbnail.WindowsControlParentWindow); offset = objGeneralTransform.Transform(new System.Windows.Point(0, 0)); } else { offset = new System.Windows.Point(taskbarWindow.TabbedThumbnail.PeekOffset.Value.X, taskbarWindow.TabbedThumbnail.PeekOffset.Value.Y); } // Only set the peek bitmap if it's not null. // If it's null (either we didn't get the bitmap or size was 0), // let DWM handle it if (hBitmap != IntPtr.Zero) { if (offset.X >= 0 && offset.Y >= 0) { TabbedThumbnailNativeMethods.SetPeekBitmap(taskbarWindow.WindowToTellTaskbarAbout, hBitmap, new Point((int)offset.X, (int)offset.Y), taskbarWindow.TabbedThumbnail.DisplayFrameAroundBitmap); } else { TabbedThumbnailNativeMethods.SetPeekBitmap(taskbarWindow.WindowToTellTaskbarAbout, hBitmap, taskbarWindow.TabbedThumbnail.DisplayFrameAroundBitmap); } } // If the bitmap we have is not coming from the user (i.e. we created it here), // then make sure we delete it as we don't need it now. if (taskbarWindow.TabbedThumbnail.CurrentHBitmap == IntPtr.Zero) { ShellNativeMethods.DeleteObject(hBitmap); } return(true); } else { // Else (no parent specified), just set the bitmap. It would take over the entire // application window (would work only if you are a MDI app) // Only set the peek bitmap if it's not null. // If it's null (either we didn't get the bitmap or size was 0), // let DWM handle it if (hBitmap != null) { TabbedThumbnailNativeMethods.SetPeekBitmap(taskbarWindow.WindowToTellTaskbarAbout, hBitmap, taskbarWindow.TabbedThumbnail.DisplayFrameAroundBitmap); } // If the bitmap we have is not coming from the user (i.e. we created it here), // then make sure we delete it as we don't need it now. if (taskbarWindow.TabbedThumbnail.CurrentHBitmap == IntPtr.Zero) { ShellNativeMethods.DeleteObject(hBitmap); } return(true); } } else if (m.Msg == (int)TabbedThumbnailNativeMethods.WM_DESTROY) { TaskbarManager.Instance.TaskbarList.UnregisterTab(taskbarWindow.WindowToTellTaskbarAbout); taskbarWindow.TabbedThumbnail.RemovedFromTaskbar = true; return(true); } else if (m.Msg == (int)TabbedThumbnailNativeMethods.WM_NCDESTROY) { // Raise the event taskbarWindow.TabbedThumbnail.OnTabbedThumbnailClosed(); // Remove the taskbar window from our internal list if (taskbarWindowList.Contains(taskbarWindow)) { taskbarWindowList.Remove(taskbarWindow); } taskbarWindow.Dispose(); taskbarWindow = null; return(true); } else if (m.Msg == (int)TabbedThumbnailNativeMethods.WM_SYSCOMMAND) { if (((int)m.WParam) == TabbedThumbnailNativeMethods.SC_CLOSE) { // Raise the event taskbarWindow.TabbedThumbnail.OnTabbedThumbnailClosed(); // Remove the taskbar window from our internal list if (taskbarWindowList.Contains(taskbarWindow)) { taskbarWindowList.Remove(taskbarWindow); } taskbarWindow.Dispose(); taskbarWindow = null; } else if (((int)m.WParam) == TabbedThumbnailNativeMethods.SC_MAXIMIZE) { // Raise the event taskbarWindow.TabbedThumbnail.OnTabbedThumbnailMaximized(); } else if (((int)m.WParam) == TabbedThumbnailNativeMethods.SC_MINIMIZE) { // Raise the event taskbarWindow.TabbedThumbnail.OnTabbedThumbnailMinimized(); } return(true); } } return(false); }