修改屏幕分辨率、刷新率udf函数

UDF一:

#include-once
;===============================================================================
;
; 函数名称:    _ChangeScreenRes()
; 详细信息:    修改 屏幕分辨率,刷新率.
; 版本:          1.0.0.1
; 参数:     $i_Width - 屏幕宽度(如1024X768 中的 1024)
;             $i_Height - 屏幕高度(如1024X768 中的 768)
;             $i_BitsPP -桌面颜色深度(如 32BIT,32位)
;             $i_RefreshRate - 屏幕刷新率(如 75 MHZ).
; 需求      AutoIt 测试版 > 3.1 以上
; 返回值  :      成功,屏幕更新,@ERROR = 0
;                   失败,屏幕不更新, @ERROR = 1
; 论坛:         http://www.autoitscript.com/forum/index.php?showtopic=20121
; 作者:        Original code - psandu.ro
;                Modifications - PartyPooper
; 翻译:        thesnow
;
;===============================================================================
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

UDF二:

;====================================================================================
;
;Function Name:  _ScreenSetting()
;Description:   改变屏幕分辨率, 颜色深度及刷新率
;Version:       1.0
;Parameters:    $iWidth   - 屏幕的像素宽度. (水平分辨率)
;               $iHeight  - 屏幕的像素高度. (垂直分辨率)
;               $iDepth   - 屏幕颜色深度 (每像素比特).
;               $iRefresh - 屏幕刷新率(赫兹).
;Return Value(s):   成功 - 屏幕得到调整
;                   失败 - 错误信息描述
;Requirement(s):    Tested on AutoIt 3.2.10.0
;Autor(s):      R.Gilman (a.k.a rasim); special thanks to amel27
;
;====================================================================================
Func _ScreenSetting($iWidth = @DesktopWidth, $iHeight = @DesktopHeight, $iDepth = @DesktopDepth, $iRefresh = @DesktopRefresh)
    Local Const $DISP_CHANGE_SUCCESSFUL = 0
    Local Const $DISP_CHANGE_RESTART    = 1
    Local Const $DISP_CHANGE_FAILED     = -1
    Local Const $DISP_CHANGE_BADMODE    = -2
    Local Const $DISP_CHANGE_NOTUPDATED = -3
    Local Const $DISP_CHANGE_BADFLAGS   = -4
    Local Const $DISP_CHANGE_BADPARAM   = -5
   
    Local Const $CDS_TEST           = 0x4
    Local Const $CDS_UPDATEREGISTRY = 0x1
   
    Local Const $DM_PELSWIDTH        = 0x80000
    Local Const $DM_PELSHEIGHT       = 0x100000
    Local Const $DM_BITSPERPEL       = 0x40000
    Local Const $DM_DISPLAYFREQUENCY = 0x400000
   
    Local Const $ENUM_CURRENT_SETTINGS   = -1
    Local Const $WM_DISPLAYCHANGE        = 0x007E
    Local Const $HWND_BROADCAST          = 0xFFFF
    Local Const $SPI_SETNONCLIENTMETRICS = 0x2A
   
    Local $DEVMODE, $DllRet
   
    $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")
                              
    $DllRet = DllCall("user32.dll", "int", "EnumDisplaySettings", "ptr", 0, "dword", $ENUM_CURRENT_SETTINGS, _
                      "ptr", DllStructGetPtr($DEVMODE))
    $DllRet = $DllRet[0]
   
    If $DllRet = 0 Then
        MsgBox(16, "Error", "Unable to get graphic mode")
        Return False
    EndIf
   
    $VGA_MAP_KEY = RegRead("HKLM\HARDWARE\DEVICEMAP\VIDEO", "\Device\Video0")
    $VGA_KEY = StringReplace($VGA_MAP_KEY, "\Registry\Machine", "HKLM")
   
    RegWrite($VGA_KEY, "PruningMode", "REG_DWORD", 0)
   
    DllStructSetData($DEVMODE, "dmSize", DllStructGetSize($DEVMODE))
    DllStructSetData($DEVMODE, "dmPelsWidth", $iWidth)
    DllStructSetData($DEVMODE, "dmPelsHeight", $iHeight)
    DllStructSetData($DEVMODE, "dmBitsPerPel", $iDepth)
    DllStructSetData($DEVMODE, "dmDisplayFrequency", $iRefresh)
    DllStructSetData($DEVMODE, "dmFields", BitOR($DM_PELSWIDTH, $DM_PELSHEIGHT, $DM_BITSPERPEL, $DM_DISPLAYFREQUENCY))

    $DllRet = DllCall("user32.dll", "int", "ChangeDisplaySettings", "ptr", DllStructGetPtr($DEVMODE), "int", $CDS_TEST)
    $DllRet = $DllRet[0]
   
    If $DllRet <> $DISP_CHANGE_SUCCESSFUL Then
        Switch $DllRet
            Case $DISP_CHANGE_RESTART
                MsgBox(48, "Warning", "Restart your computer for change display settings")
            Case $DISP_CHANGE_FAILED
                MsgBox(16, "Error", "The video driver not set a new mode")
                Return False
            Case $DISP_CHANGE_BADMODE
                MsgBox(16, "Error", "Video mode not supported")
                Return False
            Case $DISP_CHANGE_NOTUPDATED
                MsgBox(16, "Error", "Unable to write in registry")
                Return False
            Case $DISP_CHANGE_BADFLAGS
                MsgBox(16, "Error", "Bad flags")
                Return False
            Case $DISP_CHANGE_BADPARAM
                MsgBox(16, "Error", "Bad parameters")
                Return False
        EndSwitch
    EndIf

    $DllRet = DllCall("user32.dll", "int", "ChangeDisplaySettings", "ptr", DllStructGetPtr($DEVMODE), "int", $CDS_UPDATEREGISTRY)
    $DllRet = $DllRet[0]

    DllCall("user32.dll", "int", "SendMessage", "hwnd", $HWND_BROADCAST, "int", $WM_DISPLAYCHANGE, _
            "int", $SPI_SETNONCLIENTMETRICS, "int", 0)

    RegWrite($VGA_KEY, "PruningMode", "REG_DWORD", 1)

    $DEVMODE = ""
    $DllRet  = ""
EndFun
申明:本站资源大部分来自网络,如果无意侵犯了你的权利,请及时通知我们 AutoIt@FoxMail.Com,我们将尽快处理
Copyright © 2008-2009 随便复制 共享精神 人人有责 All Right Reserved
粤ICP备08009024号