Bildschirmauflösung ändern

  • Hi,
    ich würde gerne unter Windows 7 SP1 64bit die Auflösung ändern.
    Ideal wäre dazu noch, wenn man auslesen könnte welche Auflösungen möglich wären.

    Damit klappt es leider nicht. Es wird nichts geändert

    Spoiler anzeigen
    [autoit]

    #include-once

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

    $x = _ChangeScreenRes(1680,1050)

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

    ;===============================================================================
    ;
    ; Function Name: _ChangeScreenRes()
    ; Description: Changes the current screen geometry, colour and refresh rate.
    ; Version: 1.0.0.1
    ; Parameter(s): $i_Width - Width of the desktop screen in pixels. (horizontal resolution)
    ; $i_Height - Height of the desktop screen in pixels. (vertical resolution)
    ; $i_BitsPP - Depth of the desktop screen in bits per pixel.
    ; $i_RefreshRate - Refresh rate of the desktop screen in hertz.
    ; Requirement(s): AutoIt Beta > 3.1
    ; Return Value(s): On Success - Screen is adjusted, @ERROR = 0
    ; On Failure - sets @ERROR = 1
    ; Forum(s): http://www.autoitscript.com/forum/index.php?showtopic=20121
    ; Author(s): Original code - psandu.ro
    ; Modifications - PartyPooper
    ;
    ;===============================================================================
    Func _ChangeScreenRes($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]
  • Hi Tweaky,

    KaFu im engl. Forum hat es so gemacht.
    Musst Dir halt die Lösung da rausnehmen ...
    http://www.autoitscript.com/forum/topic/97…post__p__698094

    MfG Schnuffel

    "Sarkasmus ist die niedrigste Form des Witzes, aber die höchste Form der Intelligenz."
    Val McDermid

    ein paar Infos ...

    Wer mehr als "nur" Hilfe benötigt, kann sich gern im Forum "Programmieranfragen" an uns wenden. Wir helfen in allen Fällen, die die Forenregeln zulassen.

    Für schnelle Hilfe benötigen wir ein ! lauffähiges ! Script, dass wir als Demonstration des Problems testen können. Wer von uns erwartet ein Teilscript erstmal lauffähig zu bekommen, der hat
    1. keine wirkliche Not
    2. keinen Respekt vor Menschen die ihm in ihrer Freizeit Ihre Hilfe anbieten
    3. oder ist einfach nur faul und meint wir coden das für ihn

    In solchen Fällen erlaube ich mir, die Anfrage einfach zu ignorieren. ;)

  • Dann machst du etwa falsch Tweaky. Ich selber nutzen eben das, von die gepostete, Script um bei rund 20 Win 7 Sp1 x64 und etwa 120 Win 7 Sp1 x32 Rechnern die Auflösung zu ändern.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Sehr seltsam, als @error bekomme ich "-2"

    Bei Schnuffels Link kann ich zwar die möglichen Auflösungen auslesen, jedoch kann ich keine anwenden :thumbdown:

  • dann liegt es nicht am Script.
    ich habe das gepostete selbst probiert unter Win 7 64bit.

    MfG Schnuffel

    "Sarkasmus ist die niedrigste Form des Witzes, aber die höchste Form der Intelligenz."
    Val McDermid

    ein paar Infos ...

    Wer mehr als "nur" Hilfe benötigt, kann sich gern im Forum "Programmieranfragen" an uns wenden. Wir helfen in allen Fällen, die die Forenregeln zulassen.

    Für schnelle Hilfe benötigen wir ein ! lauffähiges ! Script, dass wir als Demonstration des Problems testen können. Wer von uns erwartet ein Teilscript erstmal lauffähig zu bekommen, der hat
    1. keine wirkliche Not
    2. keinen Respekt vor Menschen die ihm in ihrer Freizeit Ihre Hilfe anbieten
    3. oder ist einfach nur faul und meint wir coden das für ihn

    In solchen Fällen erlaube ich mir, die Anfrage einfach zu ignorieren. ;)

  • mit deinem Skript bekomme ich folgende Fehlermeldung

    Zitat

    D:\ChangeDisplaySettings.au3(370,69) : WARNING: $CDS_FORCE: possibly used before declaration.
    $result = ChangeDisplaySettingsEx (0, $lpdm, 0, BitOR($CDS_FORCE,
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
    D:\ChangeDisplaySettings.au3(370,69) : ERROR: $CDS_FORCE: undeclared global variable.
    $result = ChangeDisplaySettingsEx (0, $lpdm, 0, BitOR($CDS_FORCE,
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^

    • Offizieller Beitrag

    Kann es nicht probieren, da ich kein 64er System habe. Aber wie Greenhorn schon richtig bemerkte: die DEVMODE-Struktur ist voll daneben, sollte so aussehen

    Spoiler anzeigen

    das entspricht dann auch der bereits angeführten Lösung von KaFu in AutoIt

    Spoiler anzeigen
    [autoit]

    $DEVMODE = DllStructCreate("char dmDeviceName[32];ushort dmSpecVersion;ushort dmDriverVersion;short dmSize;" & _
    "ushort dmDriverExtra;dword dmFields;short dmOrientation;short dmPaperSize;short dmPaperLength;" & _
    "short dmPaperWidth;short dmScale;short dmCopies;short dmDefaultSource;short dmPrintQuality;" & _
    "short dmColor;short dmDuplex;short dmYResolution;short dmTTOption;short dmCollate;" & _
    "byte dmFormName[32];dword dmBitsPerPel;int dmPelsWidth;dword dmPelsHeight;" & _
    "dword dmDisplayFlags;dword dmDisplayFrequency")

    [/autoit]
  • Nun kommt

    Zitat

    D:\ChangeDisplaySettings.au3(329,39) : WARNING: $DEVMODEW: possibly used before declaration.
    Local $dm = DllStructCreate($DEVMODEW)
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
    D:\ChangeDisplaySettings.au3(329,39) : ERROR: $DEVMODEW: undeclared global variable.
    Local $dm = DllStructCreate($DEVMODEW)
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^