timg1993
Goto Top

Empfohlende Auflösung automatisch einstellen

Hallo,

wir haben an unserem Standort ca. 1000 Rechner mit den unterschiedlichsten Monitoren. In unserem standardisierten Image, ist eine sehr geringe Auflösung eingestellt, damit sie auch überall dargestellt werden kann.
Ich suche nach einer Möglichkeit, die Auflösung (per batch, wmi, powershell etc.) auf den von Windows empfohlenen Wert zu setzen.
Im Internet konnte ich leider keine Lösungen finden. Ich habe ja die Möglichkeit, die Auflösung über die Registry zu editieren, aber da die Hardware an den Abreitsplätzen variiert, kann ich da leider keinen festen Wert festlegen. Optimal wäre eben, wenn der empfohlene Wert genommen werden würde.
5df3069c4febcee0f7390a66265ff8ab
Hat jemand soetwas schonmal gemacht? Oder hat jemand einen Tipp?

Gruß

Tim

Content-Key: 278536

Url: https://administrator.de/contentid/278536

Printed on: April 23, 2024 at 11:04 o'clock

Mitglied: 122990
Solution 122990 Jul 28, 2015 updated at 08:08:28 (UTC)
Goto Top
Moin,
kein Problem, zwei Möglichkeiten findest du hier: http://www.serveradventures.com/the-adventures/set-native-resolution-in ...

Gruß grexit
Member: timg1993
timg1993 Jul 28, 2015 at 08:08:21 (UTC)
Goto Top
Hallo grexit,

ich bekomme zwar noch die Ausgabe "Failed To Change The Resolution", aber das ist wenigstens schonmal ein Anfang. Werde mich mal damit beschäftigen, vielen vielen Dank!!!

Gruß

Tim
Member: AnkhMorpork
AnkhMorpork Jul 28, 2015 at 14:44:08 (UTC)
Goto Top
Hallo,

tauch mal mit wbemtest.exe nach cim_VideoController oder cim_VideoControllerResolution

Ich weiß nicht, ob du so nur abfragen oder auch einstellen kannst. Und zum nachschauen fehlt jetzt die Zeit.

In diesem Zusammenhang mal nach den Stichworten "Powershell" und "get-wmiObject" suchen. Vielleicht bringt es was ...

Viel Erfolg

Ankh
Member: AnkhMorpork
AnkhMorpork Jul 29, 2015 updated at 12:11:50 (UTC)
Goto Top
Hallo fd13hsk,

bist du mit dem von grexit verlinkten Script weitergekommen?
Bei mir will das nicht.

Ich hole mir die höchste verfügbare Auflösung:
$colItems = Get-WmiObject -query "Select * from cim_VideoControllerResolution"  
$HorRes = $colItems[$colItems.count-1].HorizontalResolution
$VerRes = $colItems[$colItems.count-1].VerticalResolution

Mit diesen Werten (sind korrect!) rufe ich die verlinkte Funktion auf:
Set-ScreenResolution $horRes $verRes

Und was wird eingestellt? --> Die geringste vorhandene Auflösung (hier 800 x 600).
Egal welche Werte ich der Funktion mitgebe, es wird in jedem Fall 800 x 600 eingestellt ...

Hast du das am Klappen gekriegt?


Gruß

Ankh

<Edit> Ab Win8.1 ist es ganz easy: Get-DisplayResolution bzw. Set-DisplayResolution </Edit>
Member: timg1993
timg1993 Jul 29, 2015 at 13:04:29 (UTC)
Goto Top
Moin!

Wir hatten mit dem Skript auch einige Schwierigkeiten. Das größte Problem ist, dass wir viele Arbeitsplätze mit mehreren Monitoren haben, wo das Skript sowieso nicht richtig läuft (siehe Kommentar im Skript). Auch die von uns eingesetzten Windows Tablets ließen sich mit dem Skript nicht konfigurieren, da das Display intern wohl iwie anders angesprochen wird, als ein Monitor.

Ich habe daraufhin eine Krücke mit der SetRes.exe gebaut (http://www.atrandom.iansharpe.com/setres.php).

Das ist ein kleines Tools, das auf Kommandozeilenebene die Auflösung verändern kann. Ich lasse vom Powershell-Skript die empfohlenen Werte auslesen und rufe dann die SetRes.exe mit den entsprechenden Parametern auf.

Hier ist die Lösung:
<#
    Region Description
    Name:Set_Resolution.ps1
    Author: Gierse, Tim
    Version:1.00, 2015-07-28
    Description:	
    Findet die optimale Auflösung des Monitors heraus und setzt diese mit dem Programm SetRes.exe (http://www.atrandom.iansharpe.com/setres.php)
                        
    EndRegion
#> 


$SetRes = "C:\APPS\TOOLS\SetRes.exe"  

Function Set-Native-Resolution 
{
    $strComputer = "."  

    $colItems = get-wmiobject -query "select * from CIM_VideoControllerResolution" -computername $strComputer  
    $vr = $colItems[$colItems.count - 1].VerticalResolution
    #$vr
    $hr = $colItems[$colItems.count - 1].HorizontalResolution
    #$hr
    $command = ($SetRes + " h" + $hr  + " v" + $vr)  
    #$command
    Invoke-Expression $Command
    #Set-ScreenResolution $hr $vr
}

Set-Native-Resolution
Member: AnkhMorpork
AnkhMorpork Jul 29, 2015, updated at Jul 31, 2015 at 08:51:20 (UTC)
Goto Top
Auch Moin,

es läuft also wieder einmal auf 3rd Party hinaus - schade.
Ich werde es mal mit FreePascal probieren ...

Gruß und good luck

Ankh

P.S. Danke für die Info.


<Edit>
Nur, um es mal zu zeigen - mit FreePascal ist es etwas "kompakter":
function TForm1.Changeresolution(sizeX,sizeY,BpP:DWORD):Boolean;
var DeviceMode:TDeviceModeA;
    i:integer;
begin
     i:=0;
     Result:=False;
     While EnumDisplaySettings(nil,i,DeviceMode) Do
     Begin
          With DeviceMode Do
               if (dmPelsWidth=sizeX) and
                  (dmPelsHeight=sizeY) and
                  (dmBitsPerPel=BpP) Then
                  Begin
                       Case ChangeDisplaySettings(DeviceMode,CDS_TEST) of
                            DISP_CHANGE_SUCCESSFUL:Result:=True;
                            DISP_CHANGE_RESTART:ShowMessage('Neustart erforderlich');  
                            DISP_CHANGE_BADFLAGS:ShowMessage('Ungültige Einstellungen');  
                            DISP_CHANGE_FAILED:ShowMessage('Auflösung konnte nicht geändert werden');  
                            DISP_CHANGE_BADMODE:ShowMessage('Bildschirm unterstützt diese Auflösung nicht');  
                            DISP_CHANGE_NOTUPDATED:ShowMessage('Registry konnte nicht aktualisiert werden')  
                       Else
                            Result:=True;
                       End;
                       If Result Then
                          ChangeDisplaySettings(DeviceMode,CDS_FULLSCREEN);
                  End;
          Inc(i);
     End;
end;

Dazu kommen natürlich noch einige Zeilen für die Fensterdarstellung und Einbindung notwendiger Units.
Aber der Kern der Sache ist hiermit abgeknallt.

</Edit>
Mitglied: 122990
122990 Jul 30, 2015 updated at 12:16:56 (UTC)
Goto Top
Hallo nochmal.
Die haben da im Code auf der Seite etwas durcheinander gebracht...

Das hier macht hier überall das gewünschte und ist auch zuverlässiger bei der Auswahl der Auflösung, die haben dort die Modi nämlich gar nicht nach Größe sortiert und sind nur davon ausgegangen das die Liste schon sortiert ist !
Function Set-ScreenResolution {
param (
[Parameter(Mandatory=$true,
      Position = 0)]
[int]
$Width,
[Parameter(Mandatory=$true,
      Position = 1)]
[int]
$Height
)
$pinvokeCode = @"  
using System;
using System.Runtime.InteropServices;
namespace Resolution
{
  [StructLayout(LayoutKind.Sequential)]
  public struct DEVMODE1
  {
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
    public string dmDeviceName;
    public short dmSpecVersion;
    public short dmDriverVersion;
    public short dmSize;
    public short dmDriverExtra;
    public int dmFields;
    public short dmOrientation;
    public short dmPaperSize;
    public short dmPaperLength;
    public short dmPaperWidth;
    public short dmScale;
    public short dmCopies;
    public short dmDefaultSource;
    public short dmPrintQuality;
    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;
  };

  class User_32
  {
    [DllImport("user32.dll")]  
    public static extern int EnumDisplaySettings(string deviceName, int modeNum, ref DEVMODE1 devMode);
    [DllImport("user32.dll")]  
    public static extern int ChangeDisplaySettings(ref DEVMODE1 devMode, int flags);
    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 class PrmaryScreenResolution
  {
    static public string ChangeResolution(int width, int height)
    {
      DEVMODE1 dm = GetDevMode1();
      if (0 != User_32.EnumDisplaySettings(null, User_32.ENUM_CURRENT_SETTINGS, ref dm))
      {
        dm.dmPelsWidth = width;
        dm.dmPelsHeight = height;
        int iRet = User_32.ChangeDisplaySettings(ref dm, User_32.CDS_TEST);
        if (iRet == User_32.DISP_CHANGE_FAILED)
        {
          return "Unable To Process Your Request. Sorry For This Inconvenience.";  
        }
        else
        {
          iRet = User_32.ChangeDisplaySettings(ref dm, User_32.CDS_UPDATEREGISTRY);
          switch (iRet)
          {
            case User_32.DISP_CHANGE_SUCCESSFUL:
              {
                return "Success";  
              }
            case User_32.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 Resolution";  
              }
          }
        }

      }
      else
      {
        return "Failed To Change The Resolution.";  
      }
    }
    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.PrmaryScreenResolution]::ChangeResolution($width,$height)
}
$mode = gwmi -query "select * from CIM_VideoControllerResolution" | sort HorizontalResolution -Descending | select -First 1  
Set-ScreenResolution $mode.HorizontalResolution $mode.VerticalResolution