在多显示器环境下使用 SetWindowPos
提供的 SetWindowPosition 代码片段仅将窗口位置设置为主显示器。
在多显示器环境中,显示器具有特定的布局和坐标:
计算屏幕坐标
要在特定显示器上设置窗口位置,我们需要根据屏幕布局计算正确的 X 坐标。
使用 Screen 对象
.NET Screen 类提供了几种方法来确定窗口当前显示的屏幕:
这些方法返回包含指定元素最大部分的 Screen 对象。
检索 hMonitor 句柄
.NET 参考源显示,可以通过调用对象的 GetHashCode() 方法来获取 Screen 对象的 hMonitor 句柄。或者,可以使用 MonitorFromWindow 或 MonitorFromPoint 等原生 Win32 函数来检索 hMonitor 句柄。
解决方案
基于对显示器布局和屏幕坐标的理解,您可以按如下方式修改 SetWindowPosition 方法:
<code class="language-csharp">public static void SetWindowPosition(Process p, int monitorIndex, int x, int y) { IntPtr handle = p.MainWindowHandle; if (handle != IntPtr.Zero) { Screen[] screens = Screen.AllScreens; if (monitorIndex >= 0 && monitorIndex < screens.Length) { Screen targetScreen = screens[monitorIndex]; int correctedX = targetScreen.Bounds.X + x; SetWindowPos(handle, IntPtr.Zero, correctedX, targetScreen.Bounds.Y + y, 0, 0, SWP_NOSIZE); } } }</code>
此更新后的方法采用监视器索引作为附加参数,并根据屏幕布局计算相应的 X 坐标。
以上是如何使用setWindowPos正确地将窗口跨多个显示器定位?的详细内容。更多信息请关注PHP中文网其他相关文章!