Я пытаюсь следовать инструкциям на MSDN дано здесь отключить дополнительный монитор.
Я пытаюсь использовать именно этот набор функций, чтобы обеспечить совместимость со старыми версиями Windows.
Тем не менее, я не могу отключить монитор. Я бегу и тестирую это на Windows 7 x64.
Все, что я получаю, — это мерцающий экран. Код определенно распознает монитор правильно — мне удалось изменить разрешение и легко просмотреть его режимы отображения.
Вот (части) моего кода — я пробовал много вариантов полей для DEVMODE
DEVMODE deleteScreenMode;
ZeroMemory(&deleteScreenMode, sizeof(DEVMODE));
deleteScreenMode.dmSize = sizeof(DEVMODE);
deleteScreenMode.dmDriverExtra = 0;
deleteScreenMode.dmFields = DM_POSITION | DM_PELSHEIGHT | DM_PELSWIDTH;
deleteScreenMode.dmPelsWidth = 0;
deleteScreenMode.dmPelsHeight = 0;
POINTL delete;
deleteion.x=0;
deleteion.y=0;
deleteScreenMode.dmPosition = deleteion;
LONG result = ChangeDisplaySettingsEx(devName,
&deleteScreenMode,
NULL,
CDS_UPDATEREGISTRY,
NULL);
У кого-нибудь есть опыт с этим? Спасибо
Я решил перейти к другой проблеме — настроить основной дисплей — и по чистой случайности я наткнулся на решение.
Есть два условия для отключения монитора, которые нигде не указаны:
1) Вы не можете отключить монитор динамически — вы должны использовать CDS_UPDATEREGISTRY, чтобы записать его в реестр.
2) Что еще более важно, по какой-то странной причине, вы должны сначала сохранить изменения в реестре (с CDS_NORESET или без него, это не имеет значения), и затем снова используйте ChangeDisplaySettingsEx со значениями NULL, чтобы изменения произошли. Это может быть что-то сделать, оба монитора подключены к одному устройству отображения, я не уверен …
В любом случае вот код, который работал для меня:
result = ChangeDisplaySettingsEx(devName, &deleteScreenMode,
NULL,
CDS_UPDATEREGISTRY | CDS_NORESET ,
NULL);
ChangeDisplaySettingsEx (NULL, NULL, NULL, NULL, NULL);
Надеюсь, это когда-нибудь кому-нибудь поможет.
На подобное решение намекают здесь:
http://support.microsoft.com/kb/308216
Это работает для прикрепление экраны. Однако, даже вооружившись этими знаниями, документация ChangeDisplaySettingsEx о том, как отрывать экран также ошибочен относительно полей DevMode, которые должны быть установлены. Как вы заметили, вы должны установить не только DM_POSITION, но и DM_PELSHEIGHT | DM_PELSWIDTH.
В Windows 7 появился новый API SetDisplayConfig, но у меня пока нет личного опыта работы с ним. Надеюсь, это лучше задокументировано!