获取特定监视器的处理程序以在

时间:2017-03-01 13:29:37

标签: c++ windows winapi monitor

因此,我一直在网上寻找如何做到这一点的线索,但我似乎无法做到这一点。我默认设置了双显示器,我想选择"选择" '监控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个显示器的示例,请对这个问题有一个通用的解决方案。

1 个答案:

答案 0 :(得分:1)

MONITORINFOEX调用填充的GetMonitorInfo结构有一个 rcMonitor 字段,用于存储显示的大小(在虚拟坐标中)。

dwFlags 字段为主监视器设置了MONITORINFOF_PRIMARY。由于您只有2个显示器,因此您正在寻找没有设置此标志的显示器。