Tumulus Posted April 26, 2016 Share Posted April 26, 2016 (edited) So I am retrieving monitor details and need to get the maximum resolution possible for the monitor. So far I have the following code. It was originally a single array returning both vertical and horizontal resolutions together, but I was having trouble returning the last value of the array, so changed it to return two different arrays. I want to return the maxes for each and assign them to two different variables. I now have two issues however. Neither array will display even though I use the _ArrayDisplay function. Also, I am getting an error in the For statements finding the maxes at the end of the code. expandcollapse popup#include <Array.au3> #include <File.au3> Global $sTempFile=@ScriptDir&'\~scriptomatic.tmp' Global $aResultH[0] Global $aResultV[0] $wbemFlagReturnImmediately = 0x10 $wbemFlagForwardOnly = 0x20 $colItems = "" $sComputer = "localhost" $OutputH = "" $OutputV = "" $oWMIService = ObjGet("winmgmts:\\" & $sComputer & "\") $colItems = $oWMIService.ExecQuery("SELECT * FROM CIM_VideoControllerResolution", "WQL", _ $wbemFlagReturnImmediately + $wbemFlagForwardOnly) If IsObj($colItems) Then For $objItem In $colItems $OutputH = $OutputH & $objItem.HorizontalResolution & @CRLF Next $hTmp=FileOpen($sTempFile,2) FileWrite($hTmp,$OutputH) FileClose($hTmp) _FileReadToArray($sTempFile,$aResultH,$FRTA_NOCOUNT, @TAB) _ArrayDisplay($aResultH) FileDelete($sTempFile) Else MsgBox(0, "WMI Output", "No WMI Objects Found for class: " & "CIM_VideoControllerResolution") EndIf IF IsObj($colItems) Then For $objItem In $colItems $OutputV = $OutputV & $objItem.VerticalResolution & @CRLF Next $vTmp=FileOpen($sTempFile,2) FileWrite($vTmp,$OutputV) FileClose($vTmp) _FileReadToArray($sTempFile,$aResultV,$FRTA_NOCOUNT, @TAB) _ArrayDisplay($aResultV) FileDelete($sTempFile) Else MsgBox(0, "WMI Output", "No WMI Objects Found for class: " & "CIM_VideoControllerResolution") EndIf Local $i = 0 Local $j = 0 Local $iMaxHorizontal = 0 Local $iMaxVertical = 0 For $aObj in $aResultH If $aResultH[$i] > $iMaxHorizontal Then $iMaxHorizontal = $aResultH[$i] $i = $i + 1 EndIf Next For $aObj in $aResultV If $aResultV[$j] > $iMaxVertical Then $iMaxVertical = $aResultV[$j] $j = $j + 1 EndIf Next Any help would be very appreciated. Edited April 26, 2016 by Tumulus Link to comment Share on other sites More sharing options...
BrewManNH Posted April 26, 2016 Share Posted April 26, 2016 Here's a better way to do it, that actually works and doesn't require writing/reading a file. expandcollapse popup#include <Array.au3> #include <File.au3> Global $sTempFile = @ScriptDir & '\~scriptomatic.tmp' Global $aResultH[0] Global $aResultV[0] $wbemFlagReturnImmediately = 0x10 $wbemFlagForwardOnly = 0x20 $colItems = "" $sComputer = "localhost" $OutputH = "" $OutputV = "" $oWMIService = ObjGet("winmgmts:\\" & $sComputer & "\") $colItems = $oWMIService.ExecQuery("SELECT * FROM CIM_VideoControllerResolution", "WQL", _ $wbemFlagReturnImmediately + $wbemFlagForwardOnly) If IsObj($colItems) Then For $objItem In $colItems $OutputH = $OutputH & $objItem.HorizontalResolution & @CRLF $OutputV = $OutputV & $objItem.VerticalResolution & @CRLF Next $aResultH = StringSplit($OutputH, @CRLF, 1) $aResultV = StringSplit($OutputV, @CRLF, 1) _ArrayDisplay($aResultH) _ArrayDisplay($aResultV) FileDelete($sTempFile) Else MsgBox(0, "WMI Output", "No WMI Objects Found for class: " & "CIM_VideoControllerResolution") EndIf Local $i = 0 Local $j = 0 Local $iMaxHorizontal = 0 Local $iMaxVertical = 0 $iMaxHorizontal = _ArrayMax($aResultH, 1) $iMaxVertical = _ArrayMax($aResultV, 1) ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $iMaxVertical = ' & $iMaxVertical & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $iMaxHorizontal = ' & $iMaxHorizontal & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console If I posted any code, assume that code was written using the latest release version unless stated otherwise. Also, if it doesn't work on XP I can't help with that because I don't have access to XP, and I'm not going to.Give a programmer the correct code and he can do his work for a day. Teach a programmer to debug and he can do his work for a lifetime - by Chirag GudeHow to ask questions the smart way! I hereby grant any person the right to use any code I post, that I am the original author of, on the autoitscript.com forums, unless I've specifically stated otherwise in the code or the thread post. If you do use my code all I ask, as a courtesy, is to make note of where you got it from. Back up and restore Windows user files _Array.au3 - Modified array functions that include support for 2D arrays. - ColorChooser - An add-on for SciTE that pops up a color dialog so you can select and paste a color code into a script. - Customizable Splashscreen GUI w/Progress Bar - Create a custom "splash screen" GUI with a progress bar and custom label. - _FileGetProperty - Retrieve the properties of a file - SciTE Toolbar - A toolbar demo for use with the SciTE editor - GUIRegisterMsg demo - Demo script to show how to use the Windows messages to interact with controls and your GUI. - Latin Square password generator Link to comment Share on other sites More sharing options...
Tumulus Posted April 26, 2016 Author Share Posted April 26, 2016 (edited) Thanks! I got that from scriptomatic and was really confused why there needed to be a file opened. I figured there was a better way to assign values to an array, but I asked a few colleagues and none was familiar enough with AutoIT to give me the right direction. Thanks! And just for understanding; the StringSplit function just parses the data for inclusion in the array? Edited April 26, 2016 by Tumulus Link to comment Share on other sites More sharing options...
Tumulus Posted April 26, 2016 Author Share Posted April 26, 2016 So I have edited the script above and it helped a ton. I added it to the following script that detects monitor details and sets the max resolution. I am actually getting it to work (sort of). I work on a 3 monitor setup so did some testing there. The settings are read for monitor 1 but then change on monitor two. We are applying the script to computers with a single monitor, so I figured I would try it on a single monitor setup, but it won't work at all there. I feel like I might be changing the resolution on a different monitor than the monitor I am getting the data from, but I can't find anything in my code that would cause that. My GetRes function is taken from a thread on the forum. The function was coded by @MrYonG. expandcollapse popup#include <Array.au3> #include <File.au3> ;Default entries $OKMSGBOX = 0 $DEFAULT = "" ;program variables Global $i_WidthScreen Global $i_HeightScreen ;GetRes finds the maximum supported resolution setting on the monitor Func GetRes(ByRef $i_WidthScreen, ByRef $i_HeightScreen) Local $i_MaxHorizontal Local $i_MaxVertical Local $a_ResultH[0] Local $a_ResultV[0] $wbemFlagReturnImmediately = 0x10 $wbemFlagForwardOnly = 0x20 $colItems = "" $sComputer = "localhost" $OutputH = "" $OutputV = "" $oWMIService = ObjGet("winmgmts:\\" & $sComputer & "\") $colItems = $oWMIService.ExecQuery("SELECT * FROM CIM_VideoControllerResolution", "WQL", _ $wbemFlagReturnImmediately + $wbemFlagForwardOnly) If IsObj($colItems) Then For $objItem In $colItems $OutputH = $OutputH & $objItem.HorizontalResolution & @CRLF $OutputV = $OutputV & $objItem.VerticalResolution & @CRLF Next $a_ResultH = StringSplit($OutputH, @CRLF, 1) $a_ResultV = StringSplit($OutputV, @CRLF, 1) ;_ArrayDisplay($aResultH) ;these are for testing purposes to make sure the arrays populate correctly ;_ArrayDisplay($aResultV) Else MsgBox(0, "WMI Output", "No WMI Objects Found for class: " & "CIM_VideoControllerResolution") EndIf $i_MaxHorizontal = _ArrayMax($a_ResultH, 1) $i_MaxVertical = _ArrayMax($a_ResultV, 1) ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $i_MaxVertical = ' & $i_MaxVertical & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $i_MaxHorizontal = ' & $i_MaxHorizontal & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console $i_WidthScreen = $i_MaxHorizontal $i_HeightScreen = $i_MaxVertical ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $i_WidthScreen = ' & $i_WidthScreen & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $i_HeightScreen = ' & $i_HeightScreen & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console ;MsgBox($OKMSGBOX, "GetRes", "The Get Resolution function resolved") ;This is for testing to make sure the funct ran properly EndFunc;==>GetRes ;ChangeRes changes the resolution settings Func ChangeRes($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 EndIf If $i_Height = "" Or $i_Height = -1 Then $i_Height = @DesktopHeight EndIf If $i_BitsPP = "" Or $i_BitsPP = -1 Then $i_BitsPP = @DesktopDepth EndIf If $i_RefreshRate = "" Or $i_RefreshRate = -1 Then $i_RefreshRate = @DesktopRefresh EndIf 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 MsgBox($OKMSGBOX, "Change Resolution", "The screen resolution has been set to " & $i_WidthScreen & "x" & $i_HeightScreen) EndFunc ;==> ChangeRes ;Main prog- runs the above functions GetRes($i_WidthScreen, $i_HeightScreen) ChangeRes($i_WidthScreen, $i_HeightScreen, $DEFAULT, $DEFAULT) ;End prog Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now