Как отключить дополнительный монитор (с помощью ChangeDisplaySettingsEx)?

Я пытаюсь следовать инструкциям на 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);

У кого-нибудь есть опыт с этим? Спасибо

6

Решение

Я решил перейти к другой проблеме — настроить основной дисплей — и по чистой случайности я наткнулся на решение.
Есть два условия для отключения монитора, которые нигде не указаны:
1) Вы не можете отключить монитор динамически — вы должны использовать CDS_UPDATEREGISTRY, чтобы записать его в реестр.
2) Что еще более важно, по какой-то странной причине, вы должны сначала сохранить изменения в реестре (с CDS_NORESET или без него, это не имеет значения), и затем снова используйте ChangeDisplaySettingsEx со значениями NULL, чтобы изменения произошли. Это может быть что-то сделать, оба монитора подключены к одному устройству отображения, я не уверен …

В любом случае вот код, который работал для меня:

result = ChangeDisplaySettingsEx(devName, &deleteScreenMode,
NULL,
CDS_UPDATEREGISTRY | CDS_NORESET ,
NULL);
ChangeDisplaySettingsEx (NULL, NULL, NULL, NULL, NULL);

Надеюсь, это когда-нибудь кому-нибудь поможет.

3

Другие решения

На подобное решение намекают здесь:

http://support.microsoft.com/kb/308216

Это работает для прикрепление экраны. Однако, даже вооружившись этими знаниями, документация ChangeDisplaySettingsEx о том, как отрывать экран также ошибочен относительно полей DevMode, которые должны быть установлены. Как вы заметили, вы должны установить не только DM_POSITION, но и DM_PELSHEIGHT | DM_PELSWIDTH.

В Windows 7 появился новый API SetDisplayConfig, но у меня пока нет личного опыта работы с ним. Надеюсь, это лучше задокументировано!

0

По вопросам рекламы [email protected]