Comment désactiver un moniteur secondaire (avec ChangeDisplaySettingsEx)?

J’essaie de suivre les instructions sur MSDN données ici pour désactiver un moniteur secondaire.

J’essaie d’utiliser spécifiquement cet ensemble de fonctions pour permettre la compatibilité avec les anciennes versions de Windows.

Cependant, je n’arrive pas à désactiver un moniteur. J’exécute et teste ceci sur Windows 7 x64. Tout ce que je reçois est un écran scintillant. Le code détecte définitivement le moniteur correctement – j’ai réussi à changer la résolution et à visualiser facilement ses modes d’affichage.

Voici (parties) de mon code – j’ai essayé beaucoup de variations sur les champs pour 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); 

Est-ce que quelqu’un a de l’expérience avec ça? Merci

J’ai décidé de passer à un autre problème – la configuration d’un affichage principal – et je suis tombé par hasard sur la solution. Il existe deux conditions pour désactiver un moniteur qui ne sont spécifiées nulle part ailleurs: 1) Vous ne pouvez pas désactiver le moniteur de manière dynamic – vous devez utiliser CDS_UPDATEREGISTRY pour l’écrire dans le registre. 2) Plus important encore, pour une raison étrange, vous devez d’abord enregistrer le changement dans le registre (avec ou sans CDS_NORESET, peu importe), puis utiliser à nouveau ChangeDisplaySettingsEx avec des valeurs NULL pour que les changements se produisent. Cela pourrait avoir quelque chose à faire les deux moniteurs connectés au même périphérique d’affichage, je ne suis pas sûr …

Quoi qu’il en soit, voici le code qui a fonctionné pour moi:

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

J’espère que ça va aider quelqu’un quelque part un jour.

Une solution similaire est suggérée ici:

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

Cela fonctionne pour attacher des écrans. Cependant, même avec cette connaissance, la documentation de ChangeDisplaySettingsEx sur la manière de détacher un écran est également fausse concernant les champs DevMode à définir. Comme vous l’avez remarqué, vous devez définir non seulement DM_POSITION, mais également DM_PELSHEIGHT | DM_PELSWIDTH.

Dans Windows 7, il existe une nouvelle API SetDisplayConfig, mais je n’ai pas encore d’expérience personnelle avec elle. J’espère que c’est mieux documenté!