使用 WinAPI 附加禁用的显示设备

Attach disabled display device with WinAPI

本文关键字:显示设备 WinAPI 使用      更新时间:2023-10-16

我的问题是启用带有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);

2. 查找所有设备

while (EnumDisplayDevices(NULL, DispNum, &DisplayDevice, 0))
{
    ZeroMemory(&defaultMode, sizeof(DEVMODE));
    defaultMode.dmSize = sizeof(DEVMODE);
    //point 3 goes here
}

3.检测分离的设备

if (!(DisplayDevice.StateFlags & DISPLAY_DEVICE_ATTACHED_TO_DESKTOP))

4. 启用设备

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_FAILED代码,它不启用任何显示。有没有人有类似的经历?

尝试将CDS_NORESET添加到对 ChangeDisplaySettingsEx 的首次调用中。

这个工作:

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);