GetDC(NULL)获取主监视器或虚拟屏幕?

环顾网络,我发现大多数人认为GetDC(NULL)将获得整个监视器的设备上下文(左上角为0,0的监视器)。 但是,我感觉大多数人只是说,因为这就是GetDC的msdn页面可能会说的。

但是,如果您查看以下两个页面(至少这两个)似乎是说GetDC(NULL)返回一个覆盖整个虚拟屏幕的设备上下文(包含连接到系统的每个监视器的屏幕)。

(1) https://www.microsoft.com/msj/0697/monitor/monitor.aspx – >在页面中搜索“这是获取虚拟桌面的RECT”并查看该语句周围的位(特别是GetDC)它上面的(NULL))。

(2) http://msdn.microsoft.com/en-gb/library/windows/desktop/dd162610%28v=vs.85%29.aspx – >在页面中搜索“GetDC(NULL)”

我一直想弄清楚它到底是哪一个,但是众多冲突的观点让我失望。

有没有人对此有任何实际经验,可以在多监视器系统上进行测试吗? (我只有一台显示器,所以我不能。)

是否有覆盖整个主监视器的DC或覆盖整个虚拟屏幕的DC?

编辑

对于任何想要试用它的人来说,在我的系统上,如果我创建一个默认项目并在WinMain中放入以下内容,则会将屏幕变为黑色。 如果您有多个显示器并且您尝试了它,问题就变成它只是将您的主显示器变为黑色或所有显示器?

HDC hdc = GetDC(NULL); RECT r = {LONG_MIN, LONG_MIN, LONG_MAX, LONG_MAX}; FillRect(hdc, &r, (HBRUSH)(COLOR_BTNTEXT + 1)); ReleaseDC(NULL, hdc); 

它获得覆盖整个虚拟屏幕的DC。 我刚刚测试过:

 #include  #include  int main() { HDC screen = GetDC(NULL); RECT r = {-1200, 100, -200, 500}; HBRUSH br = CreateSolidBrush(RGB(0, 255, 0)); FillRect(screen, &r, br); getch(); InvalidateRect(NULL, &r, true); return 0; } 

…它在我的辅助屏幕上成功绘制了一个绿色矩形(位于主屏幕的左侧,因此它具有负X坐标)。

我目前正在尝试重写gamma setter实用程序,因为它使用GetDC(NULL)而不是EnumDisplayMonitors + GetDC,因此更改了整个桌面的gamma。

您的程序类似,它将两个显示器都涂成黑色。