internal static void KeepInsideNearestMonitor(this ILayoutElementForFloatingWindow paneInsideFloatingWindow) { RECT normalPosition = new RECT(); normalPosition.Left = (int)paneInsideFloatingWindow.FloatingLeft; normalPosition.Top = (int)paneInsideFloatingWindow.FloatingTop; normalPosition.Bottom = normalPosition.Top + (int)paneInsideFloatingWindow.FloatingHeight; normalPosition.Right = normalPosition.Left + (int)paneInsideFloatingWindow.FloatingWidth; // Are we using only one monitor? if (SystemParameters.PrimaryScreenWidth == SystemParameters.VirtualScreenWidth && SystemParameters.PrimaryScreenHeight == SystemParameters.VirtualScreenHeight) { RECT primaryscreen = new RECT((int)SystemParameters.VirtualScreenLeft, (int)SystemParameters.VirtualScreenTop, (int)SystemParameters.PrimaryScreenWidth, (int)SystemParameters.PrimaryScreenHeight); if (!RectanglesIntersect(normalPosition, primaryscreen)) { normalPosition = PlaceOnScreen(primaryscreen, normalPosition); paneInsideFloatingWindow.FloatingLeft = normalPosition.Left; paneInsideFloatingWindow.FloatingTop = normalPosition.Top; paneInsideFloatingWindow.FloatingHeight = normalPosition.Bottom - normalPosition.Top; paneInsideFloatingWindow.FloatingWidth = normalPosition.Right - normalPosition.Left; paneInsideFloatingWindow.RaiseFloatingPropertiesUpdated(); } return; } else { RECT primaryscreen = new RECT((int)SystemParameters.VirtualScreenLeft, (int)SystemParameters.VirtualScreenTop, (int)SystemParameters.VirtualScreenWidth, (int)SystemParameters.VirtualScreenHeight); if (!RectanglesIntersect(normalPosition, primaryscreen)) { normalPosition = PlaceOnScreen(primaryscreen, normalPosition); paneInsideFloatingWindow.FloatingLeft = normalPosition.Left; paneInsideFloatingWindow.FloatingTop = normalPosition.Top; paneInsideFloatingWindow.FloatingHeight = normalPosition.Bottom - normalPosition.Top; paneInsideFloatingWindow.FloatingWidth = normalPosition.Right - normalPosition.Left; paneInsideFloatingWindow.RaiseFloatingPropertiesUpdated(); } return; } }
internal static void KeepInsideNearestMonitor(this ILayoutElementForFloatingWindow paneInsideFloatingWindow) { var r = new RECT { Left = (int)paneInsideFloatingWindow.FloatingLeft, Top = (int)paneInsideFloatingWindow.FloatingTop }; r.Bottom = r.Top + (int)paneInsideFloatingWindow.FloatingHeight; r.Right = r.Left + (int)paneInsideFloatingWindow.FloatingWidth; const uint monitorDefaulttonearest = 0x00000002; const uint monitorDefaulttonull = 0x00000000; System.IntPtr monitor = User32.MonitorFromRect(ref r, monitorDefaulttonull); if (monitor == System.IntPtr.Zero) { System.IntPtr nearestmonitor = User32.MonitorFromRect(ref r, monitorDefaulttonearest); if (nearestmonitor != System.IntPtr.Zero) { MonitorInfo monitorInfo = new MonitorInfo(); monitorInfo.cbSize = Marshal.SizeOf(monitorInfo); User32.GetMonitorInfo(nearestmonitor, monitorInfo); if (paneInsideFloatingWindow.FloatingLeft < monitorInfo.rcWork.Left) { paneInsideFloatingWindow.FloatingLeft = monitorInfo.rcWork.Left + 10; } if (paneInsideFloatingWindow.FloatingLeft + paneInsideFloatingWindow.FloatingWidth > monitorInfo.rcWork.Right) { paneInsideFloatingWindow.FloatingLeft = monitorInfo.rcWork.Right - (paneInsideFloatingWindow.FloatingWidth + 10); } if (paneInsideFloatingWindow.FloatingTop < monitorInfo.rcWork.Top) { paneInsideFloatingWindow.FloatingTop = monitorInfo.rcWork.Top + 10; } if (paneInsideFloatingWindow.FloatingTop + paneInsideFloatingWindow.FloatingHeight > monitorInfo.rcWork.Bottom) { paneInsideFloatingWindow.FloatingTop = monitorInfo.rcWork.Bottom - (paneInsideFloatingWindow.FloatingHeight + 10); } } } }
internal static void KeepInsideNearestMonitor(this ILayoutElementForFloatingWindow paneInsideFloatingWindow) { var r = new Win32Helper.RECT(); r.Left = (int)paneInsideFloatingWindow.FloatingLeft; r.Top = (int)paneInsideFloatingWindow.FloatingTop; r.Bottom = r.Top + (int)paneInsideFloatingWindow.FloatingHeight; r.Right = r.Left + (int)paneInsideFloatingWindow.FloatingWidth; uint MONITOR_DEFAULTTONEAREST = 0x00000002; uint MONITOR_DEFAULTTONULL = 0x00000000; var monitor = Win32Helper.MonitorFromRect(ref r, MONITOR_DEFAULTTONULL); if (monitor == IntPtr.Zero) { var nearestmonitor = Win32Helper.MonitorFromRect(ref r, MONITOR_DEFAULTTONEAREST); if (nearestmonitor != IntPtr.Zero) { var monitorInfo = new Win32Helper.MonitorInfo(); monitorInfo.Size = Marshal.SizeOf(monitorInfo); Win32Helper.GetMonitorInfo(nearestmonitor, monitorInfo); if (paneInsideFloatingWindow.FloatingLeft < monitorInfo.Work.Left) { paneInsideFloatingWindow.FloatingLeft = monitorInfo.Work.Left + 10; } if (paneInsideFloatingWindow.FloatingLeft + paneInsideFloatingWindow.FloatingWidth > monitorInfo.Work.Right) { paneInsideFloatingWindow.FloatingLeft = monitorInfo.Work.Right - (paneInsideFloatingWindow.FloatingWidth + 10); } if (paneInsideFloatingWindow.FloatingTop < monitorInfo.Work.Top) { paneInsideFloatingWindow.FloatingTop = monitorInfo.Work.Top + 10; } if (paneInsideFloatingWindow.FloatingTop + paneInsideFloatingWindow.FloatingHeight > monitorInfo.Work.Bottom) { paneInsideFloatingWindow.FloatingTop = monitorInfo.Work.Bottom - (paneInsideFloatingWindow.FloatingHeight + 10); } } } }
internal static void KeepInsideNearestMonitor(this ILayoutElementForFloatingWindow paneInsideFloatingWindow) { Win32Helper.RECT rECT = new Win32Helper.RECT() { Left = (int)paneInsideFloatingWindow.FloatingLeft, Top = (int)paneInsideFloatingWindow.FloatingTop, Bottom = rECT.Top + (int)paneInsideFloatingWindow.FloatingHeight, Right = rECT.Left + (int)paneInsideFloatingWindow.FloatingWidth }; uint num = 2; if (Win32Helper.MonitorFromRect(ref rECT, 0) == IntPtr.Zero) { IntPtr intPtr = Win32Helper.MonitorFromRect(ref rECT, num); if (intPtr != IntPtr.Zero) { Win32Helper.MonitorInfo monitorInfo = new Win32Helper.MonitorInfo() { Size = Marshal.SizeOf(monitorInfo) }; Win32Helper.GetMonitorInfo(intPtr, monitorInfo); if (paneInsideFloatingWindow.FloatingLeft < (double)monitorInfo.Work.Left) { paneInsideFloatingWindow.FloatingLeft = (double)(monitorInfo.Work.Left + 10); } if (paneInsideFloatingWindow.FloatingLeft + paneInsideFloatingWindow.FloatingWidth > (double)monitorInfo.Work.Right) { paneInsideFloatingWindow.FloatingLeft = (double)monitorInfo.Work.Right - (paneInsideFloatingWindow.FloatingWidth + 10); } if (paneInsideFloatingWindow.FloatingTop < (double)monitorInfo.Work.Top) { paneInsideFloatingWindow.FloatingTop = (double)(monitorInfo.Work.Top + 10); } if (paneInsideFloatingWindow.FloatingTop + paneInsideFloatingWindow.FloatingHeight > (double)monitorInfo.Work.Bottom) { paneInsideFloatingWindow.FloatingTop = (double)monitorInfo.Work.Bottom - (paneInsideFloatingWindow.FloatingHeight + 10); } } } }