Jump to content

Recommended Posts

Posted

I have written a program to help me automate a lot of testing that I have to do.  The program fully runs without any errors.  However, every now and then it seems a button press gets stuck.  My code will re-run the code I have in a button.  In the below, if I press 'Run Main Script', it will run and finish usually within 24 hours.  Then it exits back to the main while loop and automatically runs the 'Run Main Script' again. 

Since my code is very long, here is a condensed version just to give you an idea of what I have:

;Main GUI for user interaction
Func MainGui()
    $butTest = GUICtrlCreateButton("Test Main Script", 115, 130, 100, 25)
    $butRun    = GUICtrlCreateButton("Run Main Script", 220, 130, 100, 25)
    
    While 1
        Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE    ;close GUI
            $posMainGui = WinGetPos($MainGui)
            _FileWriteFromArray(@ScriptDir & '\PosMainGui.ini', $posMainGui)
            ExitLoop(1)
            
        Case $butTest            ;Test MainScript
            GUICtrlSetState($MainGui, $GUI_DISABLE)
            RunMainScript(True)
            GUICtrlSetState($MainGui, $GUI_ENABLE)
            _WinWaitActivate($MainGui)

        Case $butRun            ;Run MainScript
            GUICtrlSetState($MainGui, $GUI_DISABLE)
            RunMainScript(False)
            GUICtrlSetState($MainGui, $GUI_ENABLE)
            _WinWaitActivate($MainGui)
        
        EndSwitch

    WEnd

    ; Delete the previous GUI and all controls.
    GUIDelete($MainGui)
EndFunc

;Runs $Exe until it completes
;Returns: exitcode of the process
Func _RunWait($Exe)
    ;Runs other autoit files
    ;not pasting this code...
    Return $exitCode
EndFunc

;--Main Loop--
Func RunMainScript($Testing)
    ;Opens and saves files
    ;Checks $Testing boolean
    ;while loop
        ;for loop
            ;calls _RunWait 
        ;next
    ;wend
    ;another while loop
        ;more for loops
            ;calls _RunWait 
        ;next
    ;wend
EndFunc

  • Developers
Posted
9 minutes ago, Mavnus04 said:

Since my code is very long, here is a condensed version just to give you an idea of what I have

Can you get the described issue running this version as I see nothing in there that could cause the extra button presses?

Jos

SciTE4AutoIt3 Full installer Download page   - Beta files       Read before posting     How to post scriptsource   Forum etiquette  Forum Rules 
 
Live for the present,
Dream of the future,
Learn from the past.
  :)

Posted
1 hour ago, Jos said:

Can you get the described issue running this version as I see nothing in there that could cause the extra button presses?

Jos

I haven't tested the above code.  Also highly doubt it. 
Just didn't want to post 1500+ lines of code that I use for work.  I was trying to give an idea of what I am seeing to see if anyone else has something similar. 

  • 1 month later...
Posted
#include <GUIConstantsEx.au3>
#include <Misc.au3>

Local $bW=115, $bH=25
$RecGUI = GUICreate("Record & Test", 500, 400)
$butRec = GUICtrlCreateButton("Record Selected", 10, 10, $bW, $bH)
$lblText = GUICtrlCreateLabel("", 10, 50, 300, 25)
$lblText2 = GUICtrlCreateLabel("", 10, 100, 300, 25)
GUISetState(@SW_SHOW, $RecGUI)

While 1
    Switch GUIGetMsg()
        Case $butRec
            Local $userDLL = DllOpen("user32.dll")
            GUICtrlSetData($lblText, "Press F2 to exit button loop")
            GUICtrlSetData($lblText2, "Press F3 to record clicking")
            Do
                If(_IsPressed("72",$userDLL)) Then  ;F3 for clicks
                    $CurrWinName = WinGetTitle("[active]")
                    ConsoleWrite("Before click: " & $CurrWinName & @CRLF)
                    ToolTip("Click on window")
                    Do
                        Sleep(10)
                    Until(_IsPressed("01",$userDLL))
                    Sleep(50)
                    $CurrWinName = WinGetTitle("[active]")
                    ToolTip("")
                    While _IsPressed("01",$userDLL)
                        Sleep(10)
                    WEnd
                    ConsoleWrite("After click: " & $CurrWinName & @CRLF)
                EndIf

            Until (_IsPressed("71",$userDLL) )  ;Stop on F2 press

            GUICtrlSetData($lblText, "")
            GUICtrlSetData($lblText2, "")

            DllClose($userDLL)
            ToolTip("")

        Case $GUI_EVENT_CLOSE
            ExitLoop(1)

    EndSwitch
WEnd
GUIDelete($RecGUI)

I finally got around to reducing a section of my code to re-create this problem.  It happens maybe 1/20 times?  It is hard to do.  But every once in a while, the $butRec will activate itself after I have left it's loop. 

Posted

It's a ugly: Turn off the GuiGetMsg-Mode with

Opt("GUIOnEventMode", 1)

everytime you begin looping with _IsPressed and after ending the looping just turn on with

Opt("GUIOnEventMode", 0)

 

Posted

I just noticed this thread and want to mention that I've been experiencing the same kind of thing when processing right mouse clicks ($GUI_EVENT_SECONDARYUP).

About once every 6 or 8 clicks, my script processes what I've termed a bounce click.  I have no reason to think it's the mouse, itself because the effect never occurs with other software.

This led me to wonder: what's the proper way to clear any pending events for a GUI?  Is turning off the mode the correct approach?

For my particular case, I'd like to be able to "clear the decks" right before the Wend statement if ANY event has been received and processed.

  • 1 month later...
Posted
28 minutes ago, Mavnus04 said:

Can you show an example?

#include <GUIConstantsEx.au3>
#include <Misc.au3>

Local $bW = 115, $bH = 25
$RecGUI = GUICreate("Record & Test", 500, 400)
$butRec = GUICtrlCreateButton("Record Selected", 10, 10, $bW, $bH)
$lblText = GUICtrlCreateLabel("", 10, 50, 300, 25)
$lblText2 = GUICtrlCreateLabel("", 10, 100, 300, 25)
GUISetState(@SW_SHOW, $RecGUI)

While 1
    Switch GUIGetMsg()
        Case $butRec
            Local $userDLL = DllOpen("user32.dll")
            GUICtrlSetData($lblText, "Press F2 to exit button loop")
            GUICtrlSetData($lblText2, "Press F3 to record clicking")
            Opt("GUIOnEventMode", 1)
            Do
                If (_IsPressed("72", $userDLL)) Then ;F3 for clicks
                    $CurrWinName = WinGetTitle("[active]")
                    ConsoleWrite("Before click: " & $CurrWinName & @CRLF)
                    ToolTip("Click on window")
                    Do
                        Sleep(10)
                    Until (_IsPressed("01", $userDLL))
                    Sleep(50)
                    $CurrWinName = WinGetTitle("[active]")
                    ToolTip("")
                    While _IsPressed("01", $userDLL)
                        Sleep(10)
                    WEnd
                    ConsoleWrite("After click: " & $CurrWinName & @CRLF)
                EndIf

            Until (_IsPressed("71", $userDLL)) ;Stop on F2 press
            Opt("GUIOnEventMode", 0)
            GUICtrlSetData($lblText, "")
            GUICtrlSetData($lblText2, "")

            DllClose($userDLL)
            ToolTip("")

        Case $GUI_EVENT_CLOSE
            ExitLoop (1)

    EndSwitch
WEnd
GUIDelete($RecGUI)

 

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
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...