Automatisieren Sie die Anordnung mehrerer Anzeigen in Windows 10

413
kftb

Ich arbeite in einem Open Space-Büro mit externen Monitoren an jedem einzelnen Arbeitsplatz. Ich habe keinen festen Arbeitsbereich, so dass ich jedes Mal, wenn ich mich mit einem neuen externen Monitor verbinde, die Standardeinstellung von zwei nebeneinander liegenden Bildschirmen öffnet. Ich arbeite ausschließlich in einem Modus, in dem die beiden Bildschirme im Arrangierfenster übereinander liegen.

Gibt es eine Möglichkeit, die Anordnung in Windows 10 zu automatisieren, z. B. wenn ich einen neuen Monitor anschließe, um einen schnellen Stapelbefehl auszuführen, um die Anordnung festzulegen?

Ich weiß, dass es bei regelmäßiger Ausführung nur etwa 3 Klicks ist, aber es wird ärgerlich, wenn es jeden Tag vorkommt.

Vielen Dank!

2

1 Antwort auf die Frage

2
motosubatsu

Sie können dies mit PowerShell tun. Erstellen Sie zuerst ein Powershell-Skript mit dem Namen "MoveScreens.ps1", kopieren Sie den folgenden Code und fügen Sie ihn ein:

Function Set-ScreenPosition {  param (  [Parameter(Mandatory=$true,  Position = 0)]  [int]  $x,  [Parameter(Mandatory=$true,  Position = 1)]  [int]  $y  )  $pinvokeCode = @"  using System;  using System.Runtime.InteropServices;  namespace Mover {  [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] public struct DEVMODE { [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)] public string dmDeviceName;  public short dmSpecVersion; public short dmDriverVersion; public short dmSize; public short dmDriverExtra; public int dmFields; public int dmPositionX; public int dmPositionY; public int dmDisplayOrientation; public int dmDisplayFixedOutput; public short dmColor; public short dmDuplex; public short dmYResolution; public short dmTTOption; public short dmCollate;  [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)] public string dmFormName;  public short dmLogPixels; public short dmBitsPerPel; public int dmPelsWidth; public int dmPelsHeight; public int dmDisplayFlags; public int dmDisplayFrequency; public int dmICMMethod; public int dmICMIntent; public int dmMediaType; public int dmDitherType; public int dmReserved1; public int dmReserved2; public int dmPanningWidth; public int dmPanningHeight; }; public class NativeMethods { // PInvoke declaration for EnumDisplaySettings Win32 API [System.Runtime.InteropServices.DllImport("user32.dll")] public static extern int EnumDisplaySettings(string lpszDeviceName, int iModeNum, ref DEVMODE lpDevMode);  // PInvoke declaration for ChangeDisplaySettings Win32 API [System.Runtime.InteropServices.DllImport("user32.dll")] public static extern int ChangeDisplaySettings(ref DEVMODE lpDevMode, int dwFlags);   // constants public const int ENUM_CURRENT_SETTINGS = -1; public const int CDS_UPDATEREGISTRY = 0x01; public const int CDS_TEST = 0x02; public const int DISP_CHANGE_SUCCESSFUL = 0; public const int DISP_CHANGE_RESTART = 1; public const int DISP_CHANGE_FAILED = -1;    public static DEVMODE CreateDevmode() { DEVMODE dm = new DEVMODE(); dm.dmDeviceName = new String(new char[32]); dm.dmFormName = new String(new char[32]); dm.dmSize = (short)Marshal.SizeOf(dm); return dm; } }    public class PrimaryScreenPosition {  static public string ChangePosition(int x, int y)  {  DEVMODE dm = CreateDevmode();  if (0 != NativeMethods.EnumDisplaySettings(@"\\.\DISPLAY1", NativeMethods.ENUM_CURRENT_SETTINGS, ref dm))  {  dm.dmPositionX = x; dm.dmPositionY = y;  int iRet = NativeMethods.ChangeDisplaySettings(ref dm, NativeMethods.CDS_TEST);  if (iRet == NativeMethods.DISP_CHANGE_FAILED)  {  return "Unable To Process Your Request. Sorry For This Inconvenience.";  }  else  {  iRet = NativeMethods.ChangeDisplaySettings(ref dm, 0);  switch (iRet)  {  case NativeMethods.DISP_CHANGE_SUCCESSFUL:  {  return "Success";  }  case NativeMethods.DISP_CHANGE_RESTART:  {  return "You Need To Reboot For The Change To Happen.\n If You Feel Any Problem After Rebooting Your Machine\nThen Try To Change Resolution In Safe Mode.";  }  default:  {  return "Failed To Change The Position";  }  }  }  }  else  {  return "Failed To Change The Position.";  }  }  private static DEVMODE1 GetDevMode1()  {  DEVMODE1 dm = new DEVMODE1();  dm.dmDeviceName = new String(new char[32]);  dm.dmFormName = new String(new char[32]);  dm.dmSize = (short)Marshal.SizeOf(dm);  return dm;  }  }  }  "@  Add-Type $pinvokeCode -ErrorAction SilentlyContinue  [Resolution.PrmaryScreenPosition]::ChangePosition($x,$y)  } 

Dann erstellen Sie ein anderes Skript, um das obige auszuführen (die Zahlen sind die Breite bzw. Höhe Ihres zweiten Bildschirms, und natürlich müssen Sie den Pfad dahin aktualisieren, wo Sie das erste Skript ablegen!):

.\C:\Temp\MoveScreeens.ps1 Set-ScreenPosition 1920 1080 

Dann müssen Sie nur das zweite Skript ausführen und es sollte die Bildschirme mit der Primärseite auf dem Boden stapeln.

Vorsichtsmaßnahme: Abhängig von den Einstellungen für die Skriptausführung auf dem Computer funktioniert dies möglicherweise nicht. Wenn Sie das ausführen, müssen Sie das Skript mit der entsprechenden Einstellung ausführen:

PowerShell.exe -ExecutionPolicy Bypass -File .\MoveScreens_Stack.ps1 

Eine weitere Einschränkung: Dieses Skript geht davon aus, dass die Monitore horizontal angeordnet sind, wobei die linke Anzeige # 1 ist. Wenn sie sich in einer anderen Anordnung befinden (z. B. bereits in einer vertikalen Anordnung), kann dies zu einer Verrücktheit führen!