环境:
win7 64 +VS2015
1,使用EnumDisplayDevices先枚举出电脑上面所有的显示器
C++ 代码
list<DISPLAY_DEVICE> dev_list; //设备列表
std::list<DISPLAY_DEVICE> devices;
std::list<DEVMODE> modes;
int devId = 0;
bool ret = false;
bool isPrimary = false;
do
{
DISPLAY_DEVICE displayDevice;
ZeroMemory(&displayDevice, sizeof(DISPLAY_DEVICE));
displayDevice.cb = sizeof(displayDevice);
ret = EnumDisplayDevices(NULL, devId, &displayDevice, 0);
if (ret == true)
{
//if ((displayDevice.StateFlags & DISPLAY_DEVICE_ATTACHED_TO_DESKTOP) == DISPLAY_DEVICE_ATTACHED_TO_DESKTOP)
{
devices.push_back(displayDevice);
isPrimary = ((displayDevice.StateFlags & DISPLAY_DEVICE_PRIMARY_DEVICE) == DISPLAY_DEVICE_PRIMARY_DEVICE);
if (isPrimary)
PrimaryNum = devId;
}
}
devId++;
} while (ret);
dev_list = devices;
std::list<DISPLAY_DEVICE>::iterator it;
for (it = dev_list.begin(); it != dev_list.end(); it++)
{
DEVMODE deviceMode;
deviceMode.dmSize = sizeof(DEVMODE);
deviceMode.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT | DM_BITSPERPEL | DM_POSITION | DM_DISPLAYFREQUENCY | DM_DISPLAYFLAGS; // | DM_DISPLAYORIENTATION;
EnumDisplaySettings(it->DeviceName, (int)ENUM_REGISTRY_SETTINGS, &deviceMode);
modes.push_back(deviceMode);
}
经过上述操作 EnumDisplayDevices后 会拿到电脑上面已经连接的显示器和断开连接的显示器,其中正常连接的DISPLAY_DEVICE.StateFlags为1,未连接的为2
比如上图中 正常显示为2个,断开连接的为1个,但是有些机器可能会枚举到超过三个显示器的连接-目前还没查明原因,等后续有空研究了在补充
使用 ChangeDisplaySettingsEx来启用断开连接的显示器--已经经过验证是可以的
ChangeDisplaySettingsEx((LPCWSTR)DisplayDevice.DeviceName, &DevMode, NULL, CDS_UPDATEREGISTRY | CDS_NORESET, NULL);
ChangeDisplaySettingsEx(NULL, NULL, NULL, 0, NULL);
附上此段连接:https://stackoverflow.com/questions/35033525/attach-disabled-display-device-with-winapi
启用步骤总结:
1,调用 EnumDisplayDevices
2,调用 ChangeDisplaySettingsEx((LPCWSTR)DisplayDevice.DeviceName, &DevMode, NULL, CDS_UPDATEREGISTRY | CDS_NORESET, NULL);
ChangeDisplaySettingsEx(NULL, NULL, NULL, 0, NULL);
备注:
1,使用 sendmessage,setdisplayconfig有时候是无法启用断开的显示器
2,EnumDisplayDevices有时候可以枚举到多个不存在的显示器(除了正常和断开的显示器),不要紧,直接循环启用即可