Optimus1 Asked:2020-05-20 17:22:30 +0000 UTC2020-05-20 17:22:30 +0000 UTC 2020-05-20 17:22:30 +0000 UTC 分别获取所有连接屏幕的 HDC 上下文 WinApi 772 请告诉我,我完全糊涂了:我需要获取上下文 - 每个屏幕分别具有 HDC 类型的上下文。 在MSDN 上它说: 任何返回显示设备上下文 (DC) 的函数通常都会返回主监视器的 DC。要为另一台显示器获取 DC,请使用 EnumDisplayMonitors 函数 但是 EnumDisplayMonitors 函数不返回或枚举显示上下文(好吧,或者我不明白如何获取它们),此外,我必须将 HDC 显示上下文指定为函数的第一个参数。 winapi 1 个回答 Voted Best Answer t3f 2020-05-21T08:31:40Z2020-05-21T08:31:40Z 据我了解,hdc函数中的参数EnumDisplayMonitors限制了枚举。因此,您需要指定一个同时覆盖所有监视器的 HDC。并且有这样一个 HDC,如CreateDC 函数的描述中所述: 如果系统上有多个监视器,调用 CreateDC(TEXT("DISPLAY"),NULL,NULL,NULL)将创建一个覆盖所有监视器的 DC。 据此,我们做出以下决定: HDC common_dc = CreateDC(TEXT("DISPLAY"), NULL, NULL, NULL); EnumDisplayMonitors(common_dc, NULL, (MONITORENUMPROC)MonitorEnumProc, NULL); 在回调函数中,我们得到每个监视器的 HDC: BOOL MonitorEnumProc(HMONITOR monitor, HDC hdc, LPRECT rect, LPARAM data) { dc_list.push_back(hdc); return TRUE; } 也可以发送为EnumDisplayMonitorsNULL。在这种情况下,回调函数也将接收 NULL 而不是 HDC,但 HMONITOR 将可用。因此可以获取设备名称并使用此名称创建 DC: BOOL MonitorEnumProc(HMONITOR monitor, HDC hdc, LPRECT rect, LPARAM data) { MONITORINFOEX info; info.cbSize = sizeof(MONITORINFOEX); GetMonitorInfo(monitor, &info); dc_list.push_back(CreateDC(NULL, info.szDevice, NULL, NULL)); return TRUE; }
据我了解,
hdc函数中的参数EnumDisplayMonitors限制了枚举。因此,您需要指定一个同时覆盖所有监视器的 HDC。并且有这样一个 HDC,如CreateDC 函数的描述中所述:据此,我们做出以下决定:
在回调函数中,我们得到每个监视器的 HDC:
也可以发送为
EnumDisplayMonitorsNULL。在这种情况下,回调函数也将接收 NULL 而不是 HDC,但 HMONITOR 将可用。因此可以获取设备名称并使用此名称创建 DC: