Windows下提示显示器信息主要通过两个函数实现。一个是EnumDisplayDevices(), 另一个是EnumDisplayMonitors(). EnumDisplayDevices()枚举所有显示设备,而EnumDisplayMonitors枚举的是所有显示器。显示设备和显示器不一样,比如显卡算显示设备,但是不是显示器。具体差别后面会分析。EnumDisplayMonitors()还会枚举出不可见的伪显示器,如果只是想得到实际的显示器数目的话可以用GetSystemMetrics(SM_CMONITORS), 该函数不包括虚拟显示器。
下面一段代码展示了这三个函数的用法和差别(参考自https://social.msdn.microsoft.com/Forums/windowsdesktop/en-US/668e3cf9-4e00-4b40-a6f8-c7d2fc1afd39/how-can-i-retrieve-monitor-information?forum=windowsgeneraldevelopmentissues)
// MonitorSerialCtrlApp.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <windows.h>
using namespace std;
BOOL CALLBACK MyInfoEnumProc(
HMONITOR hMonitor,
HDC hdcMonitor,
LPRECT lprcMonitor,
LPARAM dwData
)
{
MONITORINFOEX mi;
ZeroMemory(&mi, sizeof(mi));
mi.cbSize = sizeof(mi);
GetMonitorInfo(hMonitor, &mi);
wprintf(L"DisplayDevice: %s\n", mi.szDevice);
return TRUE;
}
int _tmain(int argc, _TCHAR* argv[])
{
int numMonitor;
int run=0;
while(1)
{
printf("*********************%d****************\n",run);
run++;
printf("\n\n\EnumDisplayDevices\n\n\n");
DISPLAY_DEVICE dd;
ZeroMemory(&dd, sizeof(dd));
dd.cb = sizeof(dd);
for(int i=0; EnumDisplayDevices(NULL, i, &dd, 0); i++)
{
//EnumDisplayDevices(NULL, i, &dd, 0);
wprintf(L"\n\nDevice %d:"