“Étendre mon bureau Windows sur ce moniteur” par programmation
Je voudrais être en mesure de définir "Étendre mon bureau Windows sur ce moniteur" via le code. Un script PowerShell serait l'idéal. WMI semble la voie à suivre, mais je n'ai aucune connaissance dans WMI.
Windows 7, 8 et 10 sont censés venir avec un petit programme qui fait exactement ceci: displayswitch.exe. Cette page répertorie les paramètres suivants:
OptionExplicitDimWshShell,Dummy,SplashOnErrorResumeNextSetWshShell=WScript.CreateObject("WScript.Shell")'Main
Call DoIt
WScript.Quit
Sub DoIt
wshshell.Run("%systemroot%\system32\control.exe desk.cpl,@0,3")
'GiveDisplayProperties time to load
WScript.Sleep1000WshShell.SendKeys"2"WScript.Sleep10WshShell.SendKeys"%E"WScript.Sleep500WshShell.SendKeys"%A"WshShell.SendKeys"{TAB}"WshShell.SendKeys"{TAB}"WshShell.SendKeys"{TAB}"WshShell.SendKeys"{TAB}"WshShell.SendKeys"{TAB}"WshShell.SendKeys"{TAB}"WshShell.SendKeys"{TAB}"WshShell.SendKeys"{TAB}"WshShell.SendKeys"{TAB}"WshShell.SendKeys"{TAB}"WshShell.SendKeys"{ENTER}"EndSub'DoIt
En Autoit, qui serait:
;;— toggle-screen.au3
;; exec cpanel app `display settings`Run(”C:\WINDOWS\system32\control.exe desk.cpl,@0,3?”); wait for window to be active
WinWaitActive(”DisplaySettings”); select 2nd display
Send(”{TAB}”)Send(”{DOWN}”); work back to the ‘extend desktop’ control
Send(”+{TAB}”)Send(”+{TAB}”)Send(”+{TAB}”)Send(”+{TAB}”)Send(”+{TAB}”)Send(”+{TAB}”)Send(”+{TAB}”)Send(”+{TAB}”)Send(”+{TAB}”); toggle ‘extend desktop’ control and apply
Send(”{SPACE}”)Send(”{ENTER}”); wait for window to be active
WinWaitActive(”DisplaySettings”); accept
Send(”{TAB}”)Send(”{ENTER}”);;— E.O.F.;
S'il vous plaît ne mettez pas cela dans le code de production Dégueulasse! Je sais qu'il y a quelques misérables cas où tout ce que vous pouvez faire est de GUI de la robotique mais de toute façon je ne pense pas que c'est l'un d'entre eux.
Ce genre d'opération n'est pas directement accessible à partir de PowerShell dans le sens qu'il n'y est pas un .NET de l'interface de ces paramètres. Beaucoup de noyau du système d'exploitation trucs de code non managé qui ne peut être manipulé via l'API win32 appels. Bien que vous peut-être quelque chose avec WMI, j'ai cherché pendant un certain temps et n'était pas en mesure de trouver une satisfaisante de la classe WMI qui est capable de manipuler ce paramètre.
La prochaine étape serait de modifier directement le registre. Il ressemble à ce paramètre se trouve sous HKLM:\system\CurrentControlSet\control\vidéo--quelque part. Je crois que c'est celui qui est appelé "Attacher.ToDesktop".
C'est une solution partielle, donc je suis marquage de la communauté wiki réponse.
Je ne suis pas certain que c'est la bonne clé de registre, et je n'ai pas de système sur lequel je peux tester le multi-écrans en ce moment. Le but de cette opération est de déterminer qui est le contrôleur principal, puis il affiche la valeur de l'attachement.ToDesktop clé.
J'ai fait une version plus propre que ne pas utiliser sendkeys.
public class DisplayHelper{[DllImport("user32.dll")]
static extern DISP_CHANGE ChangeDisplaySettings(uint lpDevMode, uint dwflags);[DllImport("user32.dll")]
static extern bool EnumDisplayDevices(string lpDevice, uint iDevNum, ref DISPLAY_DEVICE lpDisplayDevice, uint dwFlags);
enum DISP_CHANGE : int
{Successful=0,Restart=1,Failed=-1,BadMode=-2,NotUpdated=-3,BadFlags=-4,BadParam=-5,BadDualView=-1}[StructLayout(LayoutKind.Sequential,CharSet=CharSet.Ansi)]
struct DISPLAY_DEVICE
{[MarshalAs(UnmanagedType.U4)]
public int cb;[MarshalAs(UnmanagedType.ByValTStr,SizeConst=32)]
public string DeviceName;[MarshalAs(UnmanagedType.ByValTStr,SizeConst=128)]
public string DeviceString;[MarshalAs(UnmanagedType.U4)]
public DisplayDeviceStateFlagsStateFlags;[MarshalAs(UnmanagedType.ByValTStr,SizeConst=128)]
public string DeviceID;[MarshalAs(UnmanagedType.ByValTStr,SizeConst=128)]
public string DeviceKey;}[Flags()]
enum DisplayDeviceStateFlags: int
{///<summary>The device is part of the desktop.</summary>AttachedToDesktop=0x1,MultiDriver=0x2,///<summary>The device is part of the desktop.</summary>PrimaryDevice=0x4,///<summary>Represents a pseudo device used to mirror application drawing for remoting or other purposes.</summary>MirroringDriver=0x8,///<summary>The device is VGA compatible.</summary>VGACompatible=0x16,///<summary>The device is removable; it cannot be the primary display.</summary>Removable=0x20,///<summary>The device has more display modes than its output devices support.</summary>ModesPruned=0x8000000,Remote=0x4000000,Disconnect=0x2000000}
public static void EnableSecondaryDisplay(){
var secondaryIndex =1;
var secondary =GetDisplayDevice(secondaryIndex);
var id = secondary.DeviceKey.Split('\\')[7];
using (var key =Registry.CurrentConfig.OpenSubKey(string.Format(@"System\CurrentControlSet\Control\VIDEO\{0}", id), true)){
using (var subkey = key.CreateSubKey("000"+ secondaryIndex)){
subkey.SetValue("Attach.ToDesktop",1,RegistryValueKind.DWord);
subkey.SetValue("Attach.RelativeX",1024,RegistryValueKind.DWord);
subkey.SetValue("DefaultSettings.XResolution",1024,RegistryValueKind.DWord);
subkey.SetValue("DefaultSettings.YResolution",768,RegistryValueKind.DWord);
subkey.SetValue("DefaultSettings.BitsPerPel",32,RegistryValueKind.DWord);}}ChangeDisplaySettings(0,0);}
private static DISPLAY_DEVICE GetDisplayDevice(int id){
var d = new DISPLAY_DEVICE();
d.cb =Marshal.SizeOf(d);if(!EnumDisplayDevices(null,(uint)id, ref d,0))
throw new NotSupportedException("Could not find a monitor with id "+ id);return d;}}
Voici mon AutoIt Script pour la commutation des écrans comme ma carte graphique ATI ne m'autorise pas à avoir 3 moniteurs actifs en même temps. J'ai 2 moniteurs sont reliés et d'une TÉLÉVISION. Ce script est de faire ce que VonC du script, mais de manière plus efficace et plus rapide.
Il suffit de remplacer "SAMSUNG" avec votre troisième moniteurs/tv nom, et vous êtes tous ensemble!
Comme vous le savez sûrement, vous pouvez le convertir en un fichier exécutable qui s'exécute sur n'importe quelle machine, même sans AutoIt installé.
#NoEnv ; Recommended for performance and compatibility with future AutoHotkey releases.;#Warn ; Enable warnings to assist with detecting common errors.SendModeInput;Recommendedfor new scripts due to its superior speed and reliability.#Persistent Any1stKeyUWantToTurnOn::RunWait C:\Windows\System32\DisplaySwitch.exe /extend
Any2stKeyUWantToTurnOff::RunWait C:\Windows\System32\DisplaySwitch.exe /internal
J'ai dû faire quelques modifications pour obtenir VonC du script pour travailler sur mon ordinateur. Il est maintenant un peu plus générique.
;;— toggle-screen2.au3
;#include <WinAPI.au3>; exec cpanel app `display settings`Run(_WinAPI_ExpandEnvironmentStrings("%windir%")&"\system32\control.exe desk.cpl,@0,3?"); wait for window to be active
WinWaitActive("Display Properties"); select 2nd display
Send("!d")Send("{DOWN}"); toggle the ‘extend desktop’ checkbox
Send("!e"); close the dialog
Send("{ENTER}")
Windows 7, 8 et 10 sont censés venir avec un petit programme qui fait exactement ceci: displayswitch.exe. Cette page répertorie les paramètres suivants:
Pour une solution en un clic à la problématique posée, il suffit de créer un *.bat-fichier contenant la seule ligne
et l'enregistrer sur votre bureau.
[J'ai testé cela sur Windows 8.1, et il a été confirmé pour travailler sur Windows 10.]
OriginalL'auteur Communicative Algebra
Une première solution possible est... par le biais de l'interface graphique (mais sans interaction de l'utilisateur)
VB script (également décrit ici mais dans Autoit langue):
En Autoit, qui serait:
Dégueulasse! Je sais qu'il y a quelques misérables cas où tout ce que vous pouvez faire est de GUI de la robotique mais de toute façon je ne pense pas que c'est l'un d'entre eux.
OriginalL'auteur
Ce genre d'opération n'est pas directement accessible à partir de PowerShell dans le sens qu'il n'y est pas un .NET de l'interface de ces paramètres. Beaucoup de noyau du système d'exploitation trucs de code non managé qui ne peut être manipulé via l'API win32 appels. Bien que vous peut-être quelque chose avec WMI, j'ai cherché pendant un certain temps et n'était pas en mesure de trouver une satisfaisante de la classe WMI qui est capable de manipuler ce paramètre.
La prochaine étape serait de modifier directement le registre. Il ressemble à ce paramètre se trouve sous HKLM:\system\CurrentControlSet\control\vidéo--quelque part. Je crois que c'est celui qui est appelé "Attacher.ToDesktop".
C'est une solution partielle, donc je suis marquage de la communauté wiki réponse.
Je ne suis pas certain que c'est la bonne clé de registre, et je n'ai pas de système sur lequel je peux tester le multi-écrans en ce moment. Le but de cette opération est de déterminer qui est le contrôleur principal, puis il affiche la valeur de l'attachement.ToDesktop clé.
OriginalL'auteur
J'ai fait une version plus propre que ne pas utiliser sendkeys.
J'ai uniquement testé sur un ordinateur nouvellement installé. J'ai créé un un extrait ici si vous souhaitez apporter des modifications
OriginalL'auteur loraderon
Voici mon AutoIt Script pour la commutation des écrans comme ma carte graphique ATI ne m'autorise pas à avoir 3 moniteurs actifs en même temps. J'ai 2 moniteurs sont reliés et d'une TÉLÉVISION. Ce script est de faire ce que VonC du script, mais de manière plus efficace et plus rapide.
Il suffit de remplacer "SAMSUNG" avec votre troisième moniteurs/tv nom, et vous êtes tous ensemble!
Comme vous le savez sûrement, vous pouvez le convertir en un fichier exécutable qui s'exécute sur n'importe quelle machine, même sans AutoIt installé.
OriginalL'auteur MemphiZ
2 lignes dans autohotkey
2ème affichage:
2ème afficheur:
-
ou
Vous pouvez vérifier et essayer mon outil sur github /BNK3R-Boy /DisplaySwitch. J'ai publié dès maintenant.
OriginalL'auteur Bong Gutz
J'ai dû faire quelques modifications pour obtenir VonC du script pour travailler sur mon ordinateur. Il est maintenant un peu plus générique.
OriginalL'auteur David Resnick
touche windows + P bouton fera la même chose
OriginalL'auteur user3237231