因此,我一直在网上寻找如何做到这一点的线索,但我似乎无法做到这一点。我默认设置了双显示器,我想选择"选择" '监控2',当用户按下程序中的按钮时,我可以在全屏显示窗口。
据我所知,我需要指定监视器的处理程序作为第一步,我的方法是根据msdn调用EnumDisplayMonitors
"要检索有关所有显示器的信息,请使用以下代码":
int main()
{
EnumDisplayMonitors(NULL, NULL, MyInfoEnumProc, 0);
}
其中MyInfoEnumProc
的回调定义如下:
std::vector<HMONITOR> handlerList;
static BOOL CALLBACK MyInfoEnumProc(HMONITOR hMon, HDC hdc, LPRECT lprcMonitor, LPARAM pData)
{
MONITORINFOEX info_;
info_.cbSize = sizeof(MONITORINFOEX);
GetMonitorInfo(hMon, &info_); // retrieve monitor info, put it in info_?
handlerList.push_back(hMon); // push handler to array
std::cout << info_.szDevice; // attempt to print data
std::cout << std::endl;
return true;
}
所以这个回调应该通过连接到系统的所有显示器,但我不太明白我如何获得分辨率,ID和名称等数据?就像我从桌面进入监视器设置一样,每个监视器都有一个ID,这对我来说很有用,所以我可以把我的窗口放在监视器2而不是我的主监视器,监视器1。
关于处理程序,我把它放在一个数组但我真的需要数据,所以我知道我已经获得了哪个监视器的处理程序?当我打印显示器std::cout << info_.szDevice;
的设备名称时,我只为两个显示器获得相同的数字。
我是c ++的新手,所以我可能错过了一些明显的东西。希望任何人都可以提供帮助。
编辑:
感谢Iinspectable,他提到在回调函数中,您基本上可以检查dwFlags
属性以找到主监视器,然后您知道哪个是第二个屏幕:
static BOOL CALLBACK MyInfoEnumProc(HMONITOR hMon, HDC hdc, LPRECT lprcMonitor, LPARAM pData)
{
MONITORINFOEX info_;
info_.cbSize = sizeof(MONITORINFOEX);
GetMonitorInfo(hMon, &info_);
if (info_.dwFlags == 0) {
std::cout << std::endl;
std::cout << "Found the non-primary monitor" << std::endl;
handlerList.push_back(hMon);
}
return true;
}
如果我想要连接第三个屏幕,{2}中有dwFlags
= 0,有3个显示器的示例,请对这个问题有一个通用的解决方案。
答案 0 :(得分:1)
MONITORINFOEX调用填充的GetMonitorInfo结构有一个 rcMonitor 字段,用于存储显示的大小(在虚拟坐标中)。
dwFlags 字段为主监视器设置了MONITORINFOF_PRIMARY
。由于您只有2个显示器,因此您正在寻找没有设置此标志的显示器。