首页 > 后端开发 > C++ > 如何使用setWindowPos正确地将窗口跨多个显示器定位?

如何使用setWindowPos正确地将窗口跨多个显示器定位?

Susan Sarandon
发布: 2025-01-30 18:31:08
原创
790 人浏览过

How to Correctly Position Windows Across Multiple Monitors Using SetWindowPos?

在多显示器环境下使用 SetWindowPos

提供的 SetWindowPosition 代码片段仅将窗口位置设置为主显示器。

理解显示器布局和虚拟屏幕

在多显示器环境中,显示器具有特定的布局和坐标:

  • 主屏幕:左上角位于 (0, 0) 的显示器。
  • 左侧显示器:具有负 X 坐标,屏幕原点为主屏幕原点减去前面屏幕宽度的总和。
  • 右侧显示器:具有正 X 坐标,屏幕原点为主屏幕原点加上包括主屏幕在内的前面屏幕宽度的总和。

计算屏幕坐标

要在特定显示器上设置窗口位置,我们需要根据屏幕布局计算正确的 X 坐标。

使用 Screen 对象

.NET Screen 类提供了几种方法来确定窗口当前显示的屏幕:

  • Screen.FromControl(Control)
  • Screen.FromHandle(Window Handle)
  • Screen.FromPoint(Point)
  • Screen.FromRectangle(Rectangle)

这些方法返回包含指定元素最大部分的 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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板