/// <summary> /// Moves a window to a screen. /// </summary> /// <param name="hWnd"> The window to move. </param> /// <param name="screen"> The screen or null to move to the primary screen. </param> /// <remarks> /// <para> /// Nothing happens if <paramref name="hWnd" /> is <see cref="IntPtr.Zero" />. /// </para> /// </remarks> public static void MoveWindowToScreen(IntPtr hWnd, Screen screen) { if (hWnd == IntPtr.Zero) { return; } screen = screen ?? Screen.PrimaryScreen; WINDOWINFO info = new WINDOWINFO(); info.cbSize = (uint)Marshal.SizeOf(info); WindowsWindow.GetWindowInfo(hWnd, ref info); WINDOWPLACEMENT placement = new WINDOWPLACEMENT(); placement.Length = (uint)Marshal.SizeOf(placement); WindowsWindow.GetWindowPlacement(hWnd, ref placement); bool isMaximized = placement.ShowCmd == WindowsWindow.SwShowmaximized; bool isMinimized = placement.ShowCmd == WindowsWindow.SwShowminimized; bool isNormal = placement.ShowCmd == WindowsWindow.SwShownormal; int width = info.rcWindow.Right - info.rcWindow.Left; int height = info.rcWindow.Bottom - info.rcWindow.Top; if (isMaximized || isMinimized) { WindowsWindow.ShowWindow(hWnd, (int)WindowsWindow.SwShownormal); } WindowsWindow.SetWindowPos(hWnd, IntPtr.Zero, screen.WorkingArea.Left, screen.WorkingArea.Top, 0, 0, WindowsWindow.SwpNozorder | WindowsWindow.SwpNosize); if (isNormal) { WindowsWindow.SetWindowPos(hWnd, IntPtr.Zero, screen.WorkingArea.Left + ((screen.WorkingArea.Width - width) / 2), screen.WorkingArea.Top + ((screen.WorkingArea.Height - height) / 2), 0, 0, WindowsWindow.SwpNozorder | WindowsWindow.SwpNosize); } else if (isMaximized) { WindowsWindow.ShowWindow(hWnd, (int)WindowsWindow.SwShowmaximized); } else if (isMinimized) { WindowsWindow.ShowWindow(hWnd, (int)WindowsWindow.SwShowminimized); } }