Что нового

Изменение разрешения экрана

Fantasy22

Новичок
Сообщения
11
Репутация
0
Здравствуйте!
Как сделать чтобы изменялось разрешение экрана из выбранного списка
С функцией _WinAPI_EnumDisplaySettings разобрался как передать список разрешений в Combo, а вот с функцией _ChangeScreenRes никак
Код:
#include <Array.au3>
#include <ComboConstants.au3>
#include <GUIConstantsEx.au3>
#include <WinAPIGdi.au3>
#include <WindowsConstants.au3>

Local $i = 0, $hForm, $aData, $idCombo

$hForm = GUICreate('Test', 300, 100)
$aData = _WinAPI_EnumDisplaySettings('', $ENUM_CURRENT_SETTINGS)
$aData = StringIsDigit(_ArrayToString($aData, '|', 1))
GUICtrlCreateLabel('Разрешение:', 15, 29, 62, 14)
$idCombo = GUICtrlCreateCombo('', 90, 25, 165, 21, BitOR($CBS_DROPDOWNLIST,$WS_VSCROLL))
GUISetState(@SW_SHOW)

While 1
     $aData = _WinAPI_EnumDisplaySettings('', $i)
    If IsArray($aData) Then
		GUICtrlSetData(-1, $aData[0] & ' x ' & $aData[1] & ' x ' & $aData[2] & ' bit' & ' x ' & $aData[3] & ' Hz' & @CRLF)
        EndIf
    $i += 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			ExitLoop
	EndSwitch
WEnd
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
С функцией _WinAPI_EnumDisplaySettings разобрался как передать список разрешений в Combo
В Вашем варианте Combo не заполняется
Вот, можно так :
Код:
#include <Array.au3>
#include <ComboConstants.au3>
#include <GUIConstantsEx.au3>
#include <WinAPIGdi.au3>
#include <WindowsConstants.au3>

Local $i = 0, $hForm, $aData, $idCombo

$hForm = GUICreate('Test', 300, 100)
GUICtrlCreateLabel('Разрешение:', 15, 29, 62, 14)
$idCombo = GUICtrlCreateCombo('', 90, 25, 165, 21, BitOR($CBS_DROPDOWNLIST, $WS_VSCROLL))
$SetButton = GUICtrlCreateButton('Установить', 90, 60, 165, 30)
GUISetState(@SW_SHOW)

Local $CurSet = _WinAPI_EnumDisplaySettings('', $ENUM_CURRENT_SETTINGS)
While 1
	$aData = _WinAPI_EnumDisplaySettings('', $i)
	If IsArray($aData) Then
		GUICtrlSetData($idCombo, $aData[0] & ' x ' & $aData[1] & ' x ' & $aData[2] & ' bit ' & $aData[3] & 'hertz', $CurSet)
	Else
		ExitLoop
	EndIf
	$i += 1
WEnd


While 1

	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			ExitLoop
		Case $SetButton

			Local $NewSet = StringRegExp(GUICtrlRead($idCombo), '(\d++)', 3)
			_ChangeScreenRes($NewSet[0], $NewSet[1], $NewSet[2], $NewSet[3])

	EndSwitch
WEnd


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
 
Верх