首頁 > 後端開發 > 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
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板