Sign in to follow this  
Followers 0
orbs

how to determine the "current" GUI? (not "active window")

17 posts in this topic

"current" GUI is the GUI last created by GUICreate(), or switched to by GUISwitch().

my script uses several GUI's, and using GUISwitch() often (mostly for updating controls in a GUI pending user input in another). i have a function that needs to determine the "current" GUI among those i created or switched to. currently i'm storing the "current" GUI handle in a global var, and since i must be very strict about updating this on every GUICreate/Switch, this is cumbersome. i believe an easier and more reliable way exists.

i found >this 8-years-old thread asking the same question, left unanswered unless the "current" GUI is also the "active window", which is not my case:

thanks for any hints.

 

Share this post


Link to post
Share on other sites



orbs,

I asked much the same question a few years ago and got nowhere. I solved the problem I was having thanks to some clever code from trancexx which meant that I no longer needed to delete a GUI when using the UDF, but other then that I have never seen a solution other than maintaining a Global variable. :(>

M23


Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind._______My UDFs:

Spoiler

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

thanks Melba23, i'll stick to global var then.

Share this post


Link to post
Share on other sites

#4 ·  Posted (edited)

Oops, I had the same experiment when writing the SSCtrlHoverUDF (v1).

Was wonder a directly solution from AutoIt, but it may never happens. So I use a workaround instead. The ugly is, it use WinAPI call, which I and many others do not feel comfortable.

Func FindCurrentGUI()
  Local $idCtrlDummy = GUICtrlCreateLabel("Dummy", 0, 0, 0, 0)
  Local $hWndCurrent = _WinAPI_GetParent(GUICtrlGetHandle($idCtrlDummy)
  GUICtrlDelete($idCtrlDummy)
  Return $hWndCurrent
EndFunc
Edited by binhnx

99 little bugs in the code

99 little bugs!

Take one down, patch it around

117 little bugs in the code!

Share this post


Link to post
Share on other sites

@binhnx, very nice approach!

i relate to your emotions towards WinAPI, but this specific one is more easily understandable then the most. although it does take us into the realm of Win32 windows relationships (parent/owner/ancestor) which is everything but trivial, nevertheless it seems a decent solution. i will put it to the test. thanks!

Share this post


Link to post
Share on other sites

 

The ugly is, it use WinAPI call, which I and many others do not feel comfortable.

Really? I am surprised to hear this as you will be shocked when you find out the inner workings of AutoIt.

Also I wouldn't say that is the "ugly" problem with that code, it's just hacky creating a dummy control and then deleting, which I and many others do not feel comfortable about.


_AdapterConnections()_AlwaysRun()_AppMon()_AppMonEx()_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: 04/09/2015

Share this post


Link to post
Share on other sites

#7 ·  Posted (edited)

guinness, you really should not take other people's notions toward the apple of your eye so seriously  :) . you are a programmer. some of us are not.

Really? I am surprised to hear this ...

 

allow me to pinpoint (my viewpoint, anyway, which i think i share with binhnx):

the greatness of AutoIt - one of them, at least - is that it takes all the DllCall,ObjCreate, and such types of advanced programming mechanisms and wraps them in one-liners, easily understood, out-of-the-box usable functions. to the majority of AutoIt coders (which are not programmers, such as yourself), there are no structs and pointers or C-type syntax they need to know or care about; just numbers, strings, arrays. oh joy!

no doubt knowledge of WinAPI is a considerable benefit to the AutoIt coder; but, unlike other programming languages, it is not mandatory, so even mere mortals can produce decent code.

... as you will be shocked when you find out the inner workings of AutoIt.

 

no doubt the inner workings of AutoIt makes extensive use of the mechanisms i mentioned above; but the AutoIt coder needs not be aware of this. that's why it's called "inner workings".

it's just hacky creating a dummy control and then deleting

 

true, but i see no better solution lying around. care to pick up the gauntlet?

Edited by orbs

Share this post


Link to post
Share on other sites

#8 ·  Posted (edited)

Not this again. I thought you would have learnt from the last time not to speak for others when you yourself have limited understanding of the language. I shall not waste my time again, as I feel I am just wasting my breath.

Edited by guinness
1 person likes this

_AdapterConnections()_AlwaysRun()_AppMon()_AppMonEx()_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: 04/09/2015

Share this post


Link to post
Share on other sites

that's one thing we agree about  :) anyway your contribution to this discussion is appreciated

Share this post


Link to post
Share on other sites

#10 ·  Posted (edited)

Arr, guinness, why...so...serious?

When I using a language, I always want to strict with it as much as possible. So I'm not shocked when an C/C++ apps using many WinAPI call :)

And, you are developer. if you have access to AutoIt source code, why not add a not-hacky-solution for all of us :)

PS : Yep, agree. The most ugly part should be the create and delete :) Actually, I find every hacky workaround ugly :) A straighforward solution is what everyone want to archive :)

Edited by binhnx

99 little bugs in the code

99 little bugs!

Take one down, patch it around

117 little bugs in the code!

Share this post


Link to post
Share on other sites

Jon develops AutoIt, I just look after the help file, UDFs and build scripts.


_AdapterConnections()_AlwaysRun()_AppMon()_AppMonEx()_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: 04/09/2015

Share this post


Link to post
Share on other sites

T__T

I may true that we may never have a solution for that problems :) So, just smile and take a breath :D


99 little bugs in the code

99 little bugs!

Take one down, patch it around

117 little bugs in the code!

Share this post


Link to post
Share on other sites

Another way to circumvent such a problem (in first post) is to override GUICreate and GUISwitch with two new functions GUICreateEx and GUISwitchEx with exactly the same parameters as the original functions.

GUICreateEx can be coded like this:

Func GUICreateEx( ... )
  Local $hWnd = GUICreate( ... )
  ; In case of an error you can set and return proper error codes
  $hCurrentWindow = $hWnd ; Global
  Return $hWnd
EndFunc

Same for GUISwitchEx. Then replace all "GUICreate(" and "GUISwitch(" with "GUICreateEx(" and "GUISwitchEx(".

If you don't want to use the global $hCurrentWindow, you can use a static variable in a function:

Func SetCurrentWindow( $hWnd, $fGet = False )
  Local Static $hCurrentWindow = 0
  If $fGet Then Return $hCurrentWindow
  $hCurrentWindow = $hWnd
EndFunc

Func GetCurrentWindow()
  Return SetCurrentWindow( 0, True )
EndFunc

Then replace $hCurrentWindow = $hWnd above with SetCurrentWindow( $hWnd ) and you have no global.

Now just remember to use the new functions. But that's easy to correct with a search/replace if you forget it.

These functions (especially if you avoid the global) can be placed in a small UDF as you can include in your project if you need it.

Share this post


Link to post
Share on other sites

thanks LarsJ, that is practically how it is being handled now (except for the use of static var wrapped in a function).

but the problem is mainly with GUIDelete().

both GUICreate() & GUISwitch() result in a known GUI handle, which i can store in a global var. but the result of GUIDelete() lies in the hands of the AutoIt engine. my script needs to know which is the "current" GUI after GUIDelete(). doing that means storing not only the "current" GUI in a single var, but also the entire lineage of all GUI's, and hoping GUIDelete() is consistent in switching to the nearest ancestor.

this is where binhnx's code shows its worth. i have not yet thoroughly tested it, but i'm getting there...  :)

Share this post


Link to post
Share on other sites

Along the lines of binhnx's solution, but doesn't require creating a dummy control.

Does require that at least one control be present on the Gui though...

Func _FindCurrentGUI()
    ;requires at least one control currently exists on the Gui before this function is called
    Local $hCurrGui = _WinAPI_GetParent(GUICtrlGetHandle(-1))
    Return $hCurrGui
EndFunc ;==>_FindCurrentGUI

Share this post


Link to post
Share on other sites

@ResNullius: 

It has problem with any non-Win32-control, i.e. dummy, graphic, listview item, treeview item

It also has problem with controls have no parent, like menu or context menu  :ermm:


99 little bugs in the code

99 little bugs!

Take one down, patch it around

117 little bugs in the code!

Share this post


Link to post
Share on other sites

Of course, binhnx is right.

My bad for not testing/researching fully...

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  
Followers 0