获取特定监视器的处理程序以放置弹出窗口 window
Get handler of a specific monitor to place pop-up window in
所以我一直在网上寻找如何执行此操作的线索,但我似乎无法正确处理。默认情况下,我有一个双显示器设置,我想 "pick" 'Monitor 2',所以我可以在用户按下程序中的按钮时全屏显示 window。
据我了解,我需要指定监视器的处理程序作为第一步,我的方法是根据 msdn 调用 EnumDisplayMonitors
"To retrieve information about all of the display monitors, use code like this":
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,获取这些 ID 会很有用,这样我就可以将我的 window 放在监视器 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;
}
万一我想连接第三个屏幕,对于这个问题有一个通用的解决方案会很有用,dwFlags
= 0 在 2 个例子中有 3 个显示器。
MONITORINFOEX structure populated by the call to GetMonitorInfo 有一个 rcMonitor 字段,存储显示的大小(在虚拟坐标中)。
dwFlags 字段为主监视器设置了 MONITORINFOF_PRIMARY
。由于您只有 2 个显示器,您正在寻找没有设置此标志的显示器。
所以我一直在网上寻找如何执行此操作的线索,但我似乎无法正确处理。默认情况下,我有一个双显示器设置,我想 "pick" 'Monitor 2',所以我可以在用户按下程序中的按钮时全屏显示 window。
据我了解,我需要指定监视器的处理程序作为第一步,我的方法是根据 msdn 调用 EnumDisplayMonitors
"To retrieve information about all of the display monitors, use code like this":
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,获取这些 ID 会很有用,这样我就可以将我的 window 放在监视器 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;
}
万一我想连接第三个屏幕,对于这个问题有一个通用的解决方案会很有用,dwFlags
= 0 在 2 个例子中有 3 个显示器。
MONITORINFOEX structure populated by the call to GetMonitorInfo 有一个 rcMonitor 字段,存储显示的大小(在虚拟坐标中)。
dwFlags 字段为主监视器设置了 MONITORINFOF_PRIMARY
。由于您只有 2 个显示器,您正在寻找没有设置此标志的显示器。