Skript für Ändernung der Bildschirmauflösung

  • Hallo. Ich habe mir vor einiger Zeit ein Skript gebastelt womit ich die Auflösung ändern kann. Hintergrund dabei war es, die Auflösung bei anderen Mitarbeitern zu ändern, ohne sich umloggen zu müssen. Mit einem RunAs-Skript habe ich das eigentliche Skript einfach gestartet und dann unter meiner Adminkennung ausgeführt.

    Jetzt werden viele Monitore ersetzt durch welche mit Full HD-Auflösung. Habe mein Skript dahingehend erweitert. Bei meinem PC und meinem monitor - 22", etwas älter - funktioniert es einwandfrei. Bei den neuen 27" monitoren jedoch nicht. Zwar kann ich zwischen 1024*768 und 1280*1024 hin und her switchen, aber bei Full HD passiert nichts. Ich vermute dass das an der Frequenz liegt.

    Da ich die Funktion selbst nicht geschrieben habe und daher auch nicht ganz durchsteige wollte ich hier um Hilfe bitten.

    Hier das Skript:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    #include <File.au3>
    #include <ButtonConstants.au3>
    #include <ComboConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <string.au3>
    #include <Array.au3>
    #include <GuiStatusBar.au3>
    #include <ProgressConstants.au3>
    #include <GUIListBox.au3>
    #include-once

    [/autoit] [autoit][/autoit] [autoit]

    Global $tmp = "d:\tmp.txt"
    Global $atmp
    Global $pw = "d:\pw.txt"
    Global $apw
    Global $pfad = "d:\Installationen.exe"
    ;~ Dim $abenutzername[4] = ["Benutzer1", "Benutzer2", "Benutzer3"]
    Global $domain = "Domäne"

    [/autoit] [autoit][/autoit] [autoit]

    _FileReadToArray($tmp, $atmp)
    _FileReadToArray($pw, $apw)
    _ArrayDelete($atmp, 0)
    _ArrayDelete($apw, 0)

    [/autoit] [autoit][/autoit] [autoit]

    ;~ FileDelete($tmp)
    ;~ FileDelete($pw)
    ;~ If not FileExists($tmp) Then
    ;~ MsgBox(0, "FEHLER!", "Programm mit RunAs starten!")
    ;~ Exit
    ;~ EndIf

    [/autoit] [autoit][/autoit] [autoit]

    ;~ For $i = 1 To Ubound($atmp) - 1 ;für den Fall, das mehr als ein Benutzer in der Datei steht
    ;~ _ArraySearch($abenutzername, $atmp[$i])
    ;~ If @error Then
    ;~ MsgBox(0, "FEHLER!", "Programm mit RunAs starten!")
    ;~ Exit
    ;~ EndIf
    ;~ Next

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Run(@ComSpec & " /c " & "net stop spooler", "", @SW_HIDE)
    Sleep(2000)
    Run(@ComSpec & " /c " & "net start spooler", "", @SW_HIDE)

    [/autoit] [autoit][/autoit] [autoit]

    Opt("GUIOnEventMode", 1)

    [/autoit] [autoit][/autoit] [autoit]

    $Form1 = GUICreate("Installationen", 220, 80, 150, 150)
    ;von links, von oben, breite, höhe

    [/autoit] [autoit][/autoit] [autoit]

    $Group3 = GUICtrlCreateGroup("Auflösung", 10, 10, 200, 55)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    $Combo4 = GUICtrlCreateCombo("Auflösung auswählen", 30, 30, 160, 35) ;Bildschirmauflösung
    GUICtrlSetData($Combo4, "1024*768|1280*1024|1920*1080", "Auflösung auswählen")
    GUICtrlSetOnEvent($Combo4, "Combo4")
    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState(@SW_SHOW)
    GUISetOnEvent($GUI_EVENT_CLOSE, "_exit")
    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $msg = GUIGetMsg()
    Select
    Case $msg = $GUI_EVENT_CLOSE
    ExitLoop
    ;Case $msg = $ButtonDrucker
    ; MsgBox(0,"Test",GUICtrlRead($cList))
    EndSelect
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func Combo4()
    $read = GUICtrlRead($Combo4)
    If $read = "1024*768" Then
    aufloesung(1024,768)
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    If $read = "1280*1024" Then
    aufloesung(1280,1024)
    EndIf

    If $read = "1920*1080" Then
    aufloesung(1920,1080)
    EndIf
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func aufloesung($i_Width = @DesktopWidth, $i_Height = @DesktopHeight, $i_BitsPP = @DesktopDepth, $i_RefreshRate = @DesktopRefresh)
    Local Const $DM_PELSWIDTH = 0x00080000
    Local Const $DM_PELSHEIGHT = 0x00100000
    Local Const $DM_BITSPERPEL = 0x00040000
    Local Const $DM_DISPLAYFREQUENCY = 0x00400000
    Local Const $CDS_TEST = 0x00000002
    Local Const $CDS_UPDATEREGISTRY = 0x00000001
    Local Const $DISP_CHANGE_RESTART = 1
    Local Const $DISP_CHANGE_SUCCESSFUL = 0
    Local Const $HWND_BROADCAST = 0xffff
    Local Const $WM_DISPLAYCHANGE = 0x007E
    If $i_Width = "" Or $i_Width = -1 Then $i_Width = @DesktopWidth ; default to current setting
    If $i_Height = "" Or $i_Height = -1 Then $i_Height = @DesktopHeight ; default to current setting
    If $i_BitsPP = "" Or $i_BitsPP = -1 Then $i_BitsPP = @DesktopDepth ; default to current setting
    If $i_RefreshRate = "" Or $i_RefreshRate = -1 Then $i_RefreshRate = @DesktopRefresh ; default to current setting
    Local $DEVMODE = DllStructCreate("byte[32];int[10];byte[32];int[6]")
    Local $B = DllCall("user32.dll", "int", "EnumDisplaySettings", "ptr", 0, "long", 0, "ptr", DllStructGetPtr($DEVMODE))
    If @error Then
    $B = 0
    SetError(1)
    Return $B
    Else
    $B = $B[0]
    EndIf
    If $B <> 0 Then
    DllStructSetData($DEVMODE, 2, BitOR($DM_PELSWIDTH, $DM_PELSHEIGHT, $DM_BITSPERPEL, $DM_DISPLAYFREQUENCY), 5)
    DllStructSetData($DEVMODE, 4, $i_Width, 2)
    DllStructSetData($DEVMODE, 4, $i_Height, 3)
    DllStructSetData($DEVMODE, 4, $i_BitsPP, 1)
    DllStructSetData($DEVMODE, 4, $i_RefreshRate, 5)
    $B = DllCall("user32.dll", "int", "ChangeDisplaySettings", "ptr", DllStructGetPtr($DEVMODE), "int", $CDS_TEST)
    If @error Then
    $B = -1
    Else
    $B = $B[0]
    EndIf
    Select
    Case $B = $DISP_CHANGE_RESTART
    $DEVMODE = ""
    Return 2
    Case $B = $DISP_CHANGE_SUCCESSFUL
    DllCall("user32.dll", "int", "ChangeDisplaySettings", "ptr", DllStructGetPtr($DEVMODE), "int", $CDS_UPDATEREGISTRY)
    DllCall("user32.dll", "int", "SendMessage", "hwnd", $HWND_BROADCAST, "int", $WM_DISPLAYCHANGE, _
    "int", $i_BitsPP, "int", $i_Height * 2 ^ 16 + $i_Width)
    $DEVMODE = ""
    Return 1
    Case Else
    $DEVMODE = ""
    SetError(1)
    Return $B
    EndSelect
    EndIf
    EndFunc ;==>_ChangeScreenRes

    [/autoit] [autoit][/autoit] [autoit]

    Func _exit()
    FileDelete("d:\Installationen.exe")
    Exit
    EndFunc

    [/autoit]
  • Hallo. Danke für deine Antwort. Sorry, vergessen zu erwähnen. Wir setzen immernoch Windows XP ein. Ist der Autor des Skriptes einer aus unserem Forum? Ich weiss gar nicht, wo ich das Skript her hatte. Benutze es schon seid über einem jahr. man findet es auch an mehreren Stellen im Netz. :(