Jump to content
Sign in to follow this  

I am having trouble understanding GUIRegisterMsg()

Recommended Posts


I am working on a popup picklist based on code samples from HELP. I am having trouble understanding GUIRegisterMsg(). The code posted works OK. I am concerned because I am getting my return value from the function named by GUIRegisterMsg() by setting a value to a GLOBAL variable. Is there a better way to do this, a way that does not use a GLOBAL variable?

Thanks in advance

Jim Rumbaugh

;;; _PickList
;;; send an array of items to choose
;;; one item returned via DOUBLE CLICK with mouse or pressing ENTER key
;;; size of window automatically adjusts HEIGHT and WIDTH 
;;; to number of items in list and width of text used in list or title
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <EditConstants.au3>
#include <ListBoxConstants.au3>
#include <Array.au3>
#include <Math.au3>
#Include <Misc.au3>

Global $glExitMyList = 0
Local $aList[5] = [ 'Test1','Test2','Test3','Test4','Test123456789123456789' ]

MsgBox(1,"selected", _PickList( $aList,"My Pick List",'Test3',100 , 100  ))

Func _PickList($aList = "",$cTitle="My List",$cDefault="",$nLeft=100,$nTop=100 )

 Local $nTitleWidth, $nListWidth, $i
 Local $Form1, $mylist
;;;;;;;; determine window height per number of elements in list
 $nHeight = (UBound($aList) * 12) + 30
;;;;;;; determine window width per maximum width of elements in LIST or TITLE
 $nTitleWidth = StringLen($cTitle )*6 + 100
 For $i = 0 To UBound($aList)-1
   $nListWidth  = _Max( $nListWidth , StringLen( $aList[$i])*7 )
 $nWidth = _Max( $nTitleWidth , $nListWidth )

 $Form1  = GUICreate(  $cTitle , $nWidth , $nHeight , $nLeft , $nTop )
 $mylist = GUICtrlCreateList( "" ,10,10,$nWidth - 20,$nHeight - 20, $cDefault )
 GUICtrlSetData( $mylist , _ArrayToString( $aList,"|") ,  $cDefault )
 ;;; command to start DBL CLICK detection function

  While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
    ;;;; if ENTER KEY or LEFT ARROW  or RIGHT ARROW pressed, Exit
    If _IsPressed( "0D" ) Or _IsPressed( "25" ) Or _IsPressed( "27" ) Then
    ;; See if  _IF_LIST_DBLCLICK() detected a DBLCLICK from the list
    If $glExitMyList = $mylist    Then

 Return GUICtrlRead($mylist)

Func _IF_LIST_DBLCLICK($hWnd, $iMsg, $wParam, $lParam)
    #forceref $hWnd, $iMsg, $lParam

    $iIDFrom = BitAND($wParam, 0xFFFF) ; Low Word
    $iCode   = BitShift($wParam, 16) ; Hi Word

    Switch $iCode
        Case $LBN_DBLCLK
            ;; set global variable to ID of form 
            $glExitMyList = $iIDFrom

Share this post

Link to post
Share on other sites

No, unfortunately with certain AutoIt functions you're forced to a use a Global variable. GUIRegisterMsg is one of those functions.

Some advice, I would use this instead in GUIRegisterMsg for readability.

$iIDFrom = _WinAPI_LoWord($wParam) ; Low Word
$iCode   = _WinAPI_HiWord($wParam) ; Hi Word
Edited by guinness

UDF List:

_AdapterConnections()_AlwaysRun()_AppMon()_AppMonEx()_ArrayFilter/_ArrayReduce_BinaryBin()_CheckMsgBox()_CmdLineRaw()_ContextMenu()_ConvertLHWebColor()/_ConvertSHWebColor()_DesktopDimensions()_DisplayPassword()_DotNet_Load()/_DotNet_Unload()_Fibonacci()_FileCompare()_FileCompareContents()_FileNameByHandle()_FilePrefix/SRE()_FindInFile()_GetBackgroundColor()/_SetBackgroundColor()_GetConrolID()_GetCtrlClass()_GetDirectoryFormat()_GetDriveMediaType()_GetFilename()/_GetFilenameExt()_GetHardwareID()_GetIP()_GetIP_Country()_GetOSLanguage()_GetSavedSource()_GetStringSize()_GetSystemPaths()_GetURLImage()_GIFImage()_GoogleWeather()_GUICtrlCreateGroup()_GUICtrlListBox_CreateArray()_GUICtrlListView_CreateArray()_GUICtrlListView_SaveCSV()_GUICtrlListView_SaveHTML()_GUICtrlListView_SaveTxt()_GUICtrlListView_SaveXML()_GUICtrlMenu_Recent()_GUICtrlMenu_SetItemImage()_GUICtrlTreeView_CreateArray()_GUIDisable()_GUIImageList_SetIconFromHandle()_GUIRegisterMsg()_GUISetIcon()_Icon_Clear()/_Icon_Set()_IdleTime()_InetGet()_InetGetGUI()_InetGetProgress()_IPDetails()_IsFileOlder()_IsGUID()_IsHex()_IsPalindrome()_IsRegKey()_IsStringRegExp()_IsSystemDrive()_IsUPX()_IsValidType()_IsWebColor()_Language()_Log()_MicrosoftInternetConnectivity()_MSDNDataType()_PathFull/GetRelative/Split()_PathSplitEx()_PrintFromArray()_ProgressSetMarquee()_ReDim()_RockPaperScissors()/_RockPaperScissorsLizardSpock()_ScrollingCredits_SelfDelete()_SelfRename()_SelfUpdate()_SendTo()_ShellAll()_ShellFile()_ShellFolder()_SingletonHWID()_SingletonPID()_Startup()_StringCompact()_StringIsValid()_StringRegExpMetaCharacters()_StringReplaceWholeWord()_StringStripChars()_Temperature()_TrialPeriod()_UKToUSDate()/_USToUKDate()_WinAPI_Create_CTL_CODE()_WinAPI_CreateGUID()_WMIDateStringToDate()/_DateToWMIDateString()Au3 script parsingAutoIt SearchAutoIt3 PortableAutoIt3WrapperToPragmaAutoItWinGetTitle()/AutoItWinSetTitle()CodingDirToHTML5FileInstallrFileReadLastChars()GeoIP databaseGUI - Only Close ButtonGUI ExamplesGUICtrlDeleteImage()GUICtrlGetBkColor()GUICtrlGetStyle()GUIEventsGUIGetBkColor()Int_Parse() & Int_TryParse()IsISBN()LockFile()Mapping CtrlIDsOOP in AutoItParseHeadersToSciTE()PasswordValidPasteBinPosts Per DayPreExpandProtect GlobalsQueue()Resource UpdateResourcesExSciTE JumpSettings INISHELLHOOKShunting-YardSignature CreatorStack()Stopwatch()StringAddLF()/StringStripLF()StringEOLToCRLF()VSCROLLWM_COPYDATAMore Examples...

Updated: 22/04/2018

Share this post

Link to post
Share on other sites


Just to offer a contrary opinion, I would keep the Bit* operations - then you do not need to #include <WinAPI.au3>. But do also keep the Lo/Hi comments so that you know what the operations are doing! ;)


Public_Domain.png.2d871819fcb9957cf44f4514551a2935.png Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind

Open spoiler to see my UDFs:


ArrayMultiColSort ---- Sort arrays on multiple columns
ChooseFileFolder ---- Single and multiple selections from specified path treeview listing
Date_Time_Convert -- Easily convert date/time formats, including the language used
ExtMsgBox --------- A highly customisable replacement for MsgBox
GUIExtender -------- Extend and retract multiple sections within a GUI
GUIFrame ---------- Subdivide GUIs into many adjustable frames
GUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView items
GUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeView
Marquee ----------- Scrolling tickertape GUIs
NoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxes
Notify ------------- Small notifications on the edge of the display
Scrollbars ----------Automatically sized scrollbars with a single command
StringSize ---------- Automatically size controls to fit text
Toast -------------- Small GUIs which pop out of the notification area


Share this post

Link to post
Share on other sites

Thank you both.

I consider my question solved.


Jim Rumbaugh

Share this post

Link to post
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this