簡體   English   中英

如何在Windows中的特定顯示器上打開窗口?

[英]How to open a window on a specific display in Windows?

我的任務是修改我們的c ++產品之一,以在Windows OS的特定顯示器上生成一個新窗口。 這適用於需要配置平鋪的多顯示器可視化的客戶端,其中每個顯示器由單台計算機上的單獨圖形卡驅動。

在Linux中,我可以通過在每個顯示器上啟動一個X服務器,然后在適當設置DISPLAY env var的情況下啟動可視化軟件的多個實例來輕松地做到這一點。 但是,在Windows中執行此操作時我迷失了。 有任何指示/建議/示例嗎?

您需要枚舉所有監視器,並在虛擬屏幕(MSDN)上檢查它們的映射。

通過調用EnumDisplayMonitors(MSDN)枚舉監視器。 這將枚舉一系列HMONITOR句柄,您可以將其傳遞給GetMonitorInfo(MSDN)以獲取監視器在虛擬屏幕上的位置。

還有一本有關多顯示器支持的完整指南,可能也值得一讀。

關於多台顯示器(Windows)@ MSDN

注意事項:由於虛擬屏幕是用戶控制的映射,因此沒有什么可以阻止用戶在虛擬坐標空間中放置監視器的相反物理位置設置監視器,反之亦然,以及任何數量的其他怪異的放置方案。 另外,某些顯示卡會嘗試假定檢測到顯示器時在顯示器上的位置,從軟件的角度來看,這可能是錯誤的,但可能是由於用戶不注意哪個顯示端口映射到左側( (甚至根本沒有標簽)。

您可以使用Win32 API中的EnumDisplayMonitors函數來獲取每個顯示器上的信息。

一旦有了所需顯示的矩形,就知道該怎么做=)

我很確定顯示器是按順序枚舉的。 但是,如果要平鋪,則可以得到所有顯示矩形的向量,然后對其進行排序。

我有一個方便的包裝器,我寫了一段時間以獲取所有顯示器信息:

宣言

class CMonitorInfoEx : public MONITORINFOEX
{
public:
    CMonitorInfoEx();

    LPCRECT GetRect() const { return &rcMonitor; }
    LPCRECT GetWorkRect() const { return &rcWork; }
    LPCTSTR DeviceName() const { return szDevice; }

    bool IsPrimary() const { return (dwFlags & MONITORINFOF_PRIMARY) ? true : false; }

    int Width() const { return rcMonitor.right - rcMonitor.left; }
    int Height() const { return rcMonitor.bottom - rcMonitor.top; }
    int WorkWidth() const { return rcWork.right - rcWork.left; }
    int WorkHeight() const { return rcWork.bottom - rcWork.top; }
};


class CSysDisplays
{
public:
    CSysDisplays();

    void Update();

    int Count() const;
    const CMonitorInfoEx& Get( int i ) const;

private:
    std::vector<CMonitorInfoEx> mInfo;
};

實作

BOOL CALLBACK MonitorEnumProc( __in  HMONITOR hMonitor, __in  HDC hdcMonitor, __in  LPRECT lprcMonitor, __in  LPARAM dwData )
{
    std::vector<CMonitorInfoEx>& infoArray = *reinterpret_cast< std::vector<CMonitorInfoEx>* >( dwData );
    CMonitorInfoEx info;
    GetMonitorInfo( hMonitor, &info );
    infoArray.push_back( info );
    return TRUE;
}

CMonitorInfoEx::CMonitorInfoEx()
{
    cbSize = sizeof(MONITORINFOEX);
}


CSysDisplays::CSysDisplays()
{
    Update();
}


void CSysDisplays::Update()
{
    mInfo.clear();
    mInfo.reserve( ::GetSystemMetrics(SM_CMONITORS) );
    EnumDisplayMonitors( NULL, NULL, MonitorEnumProc, reinterpret_cast<LPARAM>(&mInfo) );
}


int CSysDisplays::Count() const
{
    return (int)mInfo.size();
}


const CMonitorInfoEx& CSysDisplays::Get( int i ) const
{
    return mInfo[i];
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM