如何在Windows中打开特定显示器上的窗口
How to open a window on a specific display in Windows?
我的任务是修改我们的一个c++产品,在Windows操作系统的特定显示上生成一个新窗口。这适用于需要能够配置平铺多显示可视化的客户端,其中每个显示都由单个计算机上的单独显卡驱动。
在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];
}
相关文章:
- 如何在Qt窗口小部件中使用QStringView(或QStringRef)
- 问:如何使用C++中的按钮从窗口打开窗口
- SDL 窗口不会弹出
- 在createdialog创建的窗口中捕获用于编辑控件的OnMouseMove消息
- 如何在cpp文件之间切换窗口?在Qt中
- QuadTree只在窗口的右上角绘制
- VS Code "command":"make"与终端窗口中的命令行"make"不同
- 如何在C++中找到active directory中禁用和锁定的窗口帐户
- 处理闪烁窗口事件
- 如何通过按下第三个窗口中的按钮,将QString从一个窗口获取到另一个窗口
- C++win32 API创建多个类似视口的窗口
- SFML RenderWindow打开窗口需要很长时间
- 如何将不同的可执行文件合并到一个窗口框架中进行编码?像浏览器一样
- 使用多个显示器 - XOpenDisplay(NULL) 有时无法获取窗口的当前显示吗?
- 如何使用OpenCV在不同的显示器中显示不同的窗口
- 窗口多个显示器位置
- 在特定显示器上打开 GL 的 X11 窗口
- 拔下/切换扩展显示器时是否有消息发送到应用程序窗口
- 在双显示器设置中,监视器A的全屏模式在将窗口从监视器B移动到监视器B时中断
- 如何在Windows中打开特定显示器上的窗口