C++ 使用WinAPI连接禁用的显示设备

C++ 使用WinAPI连接禁用的显示设备,c++,winapi,C++,Winapi,我的问题是使用ChangeDisplaySettingsEx启用禁用的监视器。我猜这不是火箭科学,但经过一些挖掘后,它看起来仍然是不可能的。根据找到的Microsoft代码示例,我找到了一种禁用所有辅助显示的方法。虽然它只需要基本的调整就可以工作,但重新连接从来都不起作用。我想做的是: 1。初始化显示设备 BOOL FoundSecondaryDisp = FALSE; DWORD DispNum = 0; DISPLAY_DEVICE Display

我的问题是使用
ChangeDisplaySettingsEx
启用禁用的监视器。我猜这不是火箭科学,但经过一些挖掘后,它看起来仍然是不可能的。根据找到的Microsoft代码示例,我找到了一种禁用所有辅助显示的方法。虽然它只需要基本的调整就可以工作,但重新连接从来都不起作用。我想做的是:

1。初始化显示设备

BOOL            FoundSecondaryDisp = FALSE;
DWORD           DispNum = 0;
DISPLAY_DEVICE  DisplayDevice;
LONG            Result;
TCHAR           szTemp[200];
int             i = 0;
DEVMODE   defaultMode;
ZeroMemory(&DisplayDevice, sizeof(DisplayDevice));
DisplayDevice.cb = sizeof(DisplayDevice);
if (!(DisplayDevice.StateFlags & DISPLAY_DEVICE_ATTACHED_TO_DESKTOP))
DEVMODE    DevMode;
ZeroMemory(&DevMode, sizeof(DevMode));
DevMode.dmSize = sizeof(DevMode);
DevMode.dmFields = DM_POSITION | DM_PELSWIDTH | DM_PELSHEIGHT;
DevMode.dmPelsWidth = 1920;
DevMode.dmPelsHeight = 1080;
Result = ChangeDisplaySettingsEx(DisplayDevice.DeviceName, &DevMode, NULL, CDS_UPDATEREGISTRY, NULL);
ChangeDisplaySettingsEx(NULL, NULL, NULL, NULL, NULL);
2。查找所有设备

while (EnumDisplayDevices(NULL, DispNum, &DisplayDevice, 0))
{
    ZeroMemory(&defaultMode, sizeof(DEVMODE));
    defaultMode.dmSize = sizeof(DEVMODE);
    //point 3 goes here
}
3。检测分离的设备

BOOL            FoundSecondaryDisp = FALSE;
DWORD           DispNum = 0;
DISPLAY_DEVICE  DisplayDevice;
LONG            Result;
TCHAR           szTemp[200];
int             i = 0;
DEVMODE   defaultMode;
ZeroMemory(&DisplayDevice, sizeof(DisplayDevice));
DisplayDevice.cb = sizeof(DisplayDevice);
if (!(DisplayDevice.StateFlags & DISPLAY_DEVICE_ATTACHED_TO_DESKTOP))
DEVMODE    DevMode;
ZeroMemory(&DevMode, sizeof(DevMode));
DevMode.dmSize = sizeof(DevMode);
DevMode.dmFields = DM_POSITION | DM_PELSWIDTH | DM_PELSHEIGHT;
DevMode.dmPelsWidth = 1920;
DevMode.dmPelsHeight = 1080;
Result = ChangeDisplaySettingsEx(DisplayDevice.DeviceName, &DevMode, NULL, CDS_UPDATEREGISTRY, NULL);
ChangeDisplaySettingsEx(NULL, NULL, NULL, NULL, NULL);
4。启用设备

BOOL            FoundSecondaryDisp = FALSE;
DWORD           DispNum = 0;
DISPLAY_DEVICE  DisplayDevice;
LONG            Result;
TCHAR           szTemp[200];
int             i = 0;
DEVMODE   defaultMode;
ZeroMemory(&DisplayDevice, sizeof(DisplayDevice));
DisplayDevice.cb = sizeof(DisplayDevice);
if (!(DisplayDevice.StateFlags & DISPLAY_DEVICE_ATTACHED_TO_DESKTOP))
DEVMODE    DevMode;
ZeroMemory(&DevMode, sizeof(DevMode));
DevMode.dmSize = sizeof(DevMode);
DevMode.dmFields = DM_POSITION | DM_PELSWIDTH | DM_PELSHEIGHT;
DevMode.dmPelsWidth = 1920;
DevMode.dmPelsHeight = 1080;
Result = ChangeDisplaySettingsEx(DisplayDevice.DeviceName, &DevMode, NULL, CDS_UPDATEREGISTRY, NULL);
ChangeDisplaySettingsEx(NULL, NULL, NULL, NULL, NULL);

最后一点返回DISP_CHANGE_失败代码,并且不启用任何显示。有人有过类似的经历吗?

尝试在第一次呼叫ChangeDisplaySettingsEx时添加CD\u NORESET

这一个有效:

ChangeDisplaySettingsEx((LPCWSTR)DisplayDevice.DeviceName, &DevMode, NULL, CDS_UPDATEREGISTRY | CDS_NORESET, NULL);
ChangeDisplaySettingsEx(NULL, NULL, NULL, 0, NULL);
这个不起作用:

ChangeDisplaySettingsEx((LPCWSTR)DisplayDevice.DeviceName, &DevMode, NULL, CDS_UPDATEREGISTRY | CDS_RESET, NULL);
ChangeDisplaySettingsEx(NULL, NULL, NULL, 0, NULL);
ChangeDisplaySettingsEx((LPCWSTR)DisplayDevice.DeviceName, &DevMode, NULL, CDS_UPDATEREGISTRY, NULL);
ChangeDisplaySettingsEx(NULL, NULL, NULL, 0, NULL); 
这个也不起作用:

ChangeDisplaySettingsEx((LPCWSTR)DisplayDevice.DeviceName, &DevMode, NULL, CDS_UPDATEREGISTRY | CDS_RESET, NULL);
ChangeDisplaySettingsEx(NULL, NULL, NULL, 0, NULL);
ChangeDisplaySettingsEx((LPCWSTR)DisplayDevice.DeviceName, &DevMode, NULL, CDS_UPDATEREGISTRY, NULL);
ChangeDisplaySettingsEx(NULL, NULL, NULL, 0, NULL); 

谢谢你的意见!监视器已使用
ChangeDisplaySettingsEx()
禁用,我的完整测试程序将禁用辅助显示,它们将尝试使用
ChangeDisplaySettingsEx()
重新启用。感谢您的回答!我两年前就开始自动显示了,但也许有一天我还会需要它;)也许有一天会有人需要它!