Jump to content

WinMenuSelectItem() fails


Recommended Posts

I have a script that opens an editor (Notepad) and inserts text into its window, but the text insertion fails.  The WinActivate() does not always give focus to the newly loaded Notepad and the WinMenuSelectItem() fails.

Here is my test file:
 

#NoTrayIcon
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Icon=THTracker.ico
#AutoIt3Wrapper_UseUpx=n
#AutoIt3Wrapper_Au3Check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6
#AutoIt3Wrapper_UseX64=N
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****

Opt('MustDeclareVars', 1)
Opt("WinTitleMatchMode", -2) ;1=start, 2=subStr, 3=exact, 4=advanced, -1 to -4=Nocase

_Main()

Func _Main()
    add2editor("Line1" & @CRLF & "Line2" & @CRLF & "Line3" & @CRLF)
EndFunc   ;==>_Main

Func add2editor($sOutput)
    Local $cmd, $hWnd, $ret, $title, $loopcnt, $maxcnt = 10

    $cmd = "C:\windows\system32\notepad.exe"

    ConsoleWrite("Start the editor" & @CRLF)
    Run($cmd)

    $title = "Notepad"

    ConsoleWrite("Wait til the editor gui exists" & @CRLF)
    $loopcnt = 0
    While (1)
        $ret = WinWait($title, "", 3)
        ConsoleWrite("+++:" & @ScriptLineNumber & ":[" & $loopcnt & "] $ret = " & $ret & @CRLF)
        $hWnd = $ret
        If ($ret <> 0) Then ExitLoop
        $loopcnt += 1
        If ($loopcnt > $maxcnt) Then Exit
        Sleep(125)
    WEnd

    MsgBox(0, "A-" & @ScriptLineNumber, Hex($hWnd))

    ConsoleWrite("Give focus to the editor" & @CRLF)
    $loopcnt = 0
    While (1)
        $ret = WinActivate($hWnd)
        ConsoleWrite("+++:" & @ScriptLineNumber & ":[" & $loopcnt & "] @error = " & @error & ", $ret = " & $ret & @CRLF)
        $hWnd = $ret
        If ($ret <> 0) Then ExitLoop
        $loopcnt += 1
        If ($loopcnt > $maxcnt) Then Exit
        Sleep(125)
    WEnd

    MsgBox(0, "B-" & @ScriptLineNumber, Hex($hWnd))

    ConsoleWrite("Do a File -> New" & @CRLF)
    $loopcnt = 0
    While (1)
        ;
        $ret = WinMenuSelectItem($hWnd, "", "&File", "New")
        ConsoleWrite("+++:" & @ScriptLineNumber & ":[" & $loopcnt & "] @error = " & @error & ", $ret = " & $ret & @CRLF)
        If ($ret = 1) Then ExitLoop
        $loopcnt += 1
        If ($loopcnt > $maxcnt) Then Exit
        Sleep(125)
    WEnd

    MsgBox(0, "C-" & @ScriptLineNumber, Hex($hWnd))

;Local $str = ClipGet() ; save whatever is in the clipboard

    Send("^a") ; select all existing text in the editor's window

    ConsoleWrite("put the new text into the clipboard" & @CRLF)
    ClipPut($sOutput)

    Send("^v") ; paste it into the editor's window

    ;;;ClipPut($str) ; restore the previous contents of the clipboard

EndFunc   ;==>add2editor

 

Link to comment
Share on other sites

That made it work once in a while, but not every time.  Change the code to run the SciTE editor (I assume that's what you're running the test with) and exit before doing the ClipPut().  This should open a new tab (File -> New), but it doesn't.  It fails every time.  What I've given you is a stripped down version of me actual script.  In the full script, I'm opening an editor called LopeEdit which has a tabbed interface like the SciTE editor.

Here is the test code (with WinActivate and the MsgBox's removed) that opens the SciTE editor instead of Notepad:

#NoTrayIcon
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Icon=THTracker.ico
#AutoIt3Wrapper_UseUpx=n
#AutoIt3Wrapper_Au3Check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6
#AutoIt3Wrapper_UseX64=N
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****

Opt('MustDeclareVars', 1)
Opt("WinTitleMatchMode", -2) ;1=start, 2=subStr, 3=exact, 4=advanced, -1 to -4=Nocase

_Main()

Func _Main()
    add2editor("Line1" & @CRLF & "Line2" & @CRLF & "Line3" & @CRLF)
EndFunc   ;==>_Main

Func add2editor($sOutput)
    Local $cmd, $hWnd, $ret, $title, $loopcnt, $maxcnt = 10

$cmd = "C:\Program Files\AutoIt3\SciTE\SciTE.exe"

    ConsoleWrite("Start the editor" & @CRLF)
    Run($cmd)

    $title = "Notepad"

    ConsoleWrite("Wait til the editor gui exists" & @CRLF)
    $loopcnt = 0
    While (1)
        $ret = WinWait($title, "", 3)
        ConsoleWrite("+++:" & @ScriptLineNumber & ":[" & $loopcnt & "] $ret = " & $ret & @CRLF)
        $hWnd = $ret
        If ($ret <> 0) Then ExitLoop
        $loopcnt += 1
        If ($loopcnt > $maxcnt) Then Exit
        Sleep(125)
    WEnd

    ConsoleWrite("Do a File -> New" & @CRLF)
    $loopcnt = 0
    While (1)
        ;
        $ret = WinMenuSelectItem($hWnd, "", "&File", "&New")
        ConsoleWrite("+++:" & @ScriptLineNumber & ":[" & $loopcnt & "] @error = " & @error & ", $ret = " & $ret & @CRLF)
        If ($ret = 1) Then ExitLoop
        $loopcnt += 1
        If ($loopcnt > $maxcnt) Then Exit
        Sleep(125)
    WEnd

Exit ;<======================== !!!

    Send("^a") ; select all existing text in the editor's window

    ConsoleWrite("put the new text into the clipboard" & @CRLF)
    ClipPut($sOutput)

    Send("^v") ; paste it into the editor's window

EndFunc   ;==>add2editor

 

Link to comment
Share on other sites

Run some tests with this

#NoTrayIcon
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Icon=THTracker.ico
#AutoIt3Wrapper_UseUpx=n
#AutoIt3Wrapper_Au3Check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6
#AutoIt3Wrapper_UseX64=N
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <GuiMenu.au3>



;Opt('MustDeclareVars', 1)
Opt("WinTitleMatchMode", -2) ;1=start, 2=subStr, 3=exact, 4=advanced, -1 to -4=Nocase

_Main()

Func _Main()
    add2editor("Line1" & @CRLF & "Line2" & @CRLF & "Line3" & @CRLF)
EndFunc   ;==>_Main

Func add2editor($sOutput)
    Local $cmd, $hWnd, $ret, $title, $loopcnt, $maxcnt = 10
    Local $hMenu, $iCnt, $sMsg
    $cmd = "notepad.exe"

    ConsoleWrite("Start the editor" & @CRLF)
    ;Run($cmd)

    $title = "- SciTE"

    ConsoleWrite("Wait til the editor gui exists" & @CRLF)
    $loopcnt = 0
    While (1)
        $ret = WinWait($title, "", 3)
        ConsoleWrite("+++:" & @ScriptLineNumber & ":[" & $loopcnt & "] $ret = " & $ret & @CRLF)
        $hWnd = $ret
        If ($ret <> 0) Then ExitLoop
        $loopcnt += 1
        If ($loopcnt > $maxcnt) Then Exit
        Sleep(125)
    WEnd

    ;MsgBox(0, "A-" & @ScriptLineNumber, Hex($hWnd))

    ConsoleWrite("Give focus to the editor" & @CRLF)
    $loopcnt = 0
    While (1)
        ExitLoop
        $ret = WinActivate($hWnd)
        ConsoleWrite("+++:" & @ScriptLineNumber & ":[" & $loopcnt & "] @error = " & @error & ", $ret = " & $ret & @CRLF)
        $hWnd = $ret
        If ($ret <> 0) Then ExitLoop
        $loopcnt += 1
        If ($loopcnt > $maxcnt) Then Exit
        Sleep(125)
    WEnd
    MsgBox(0, "Window title", WinGetTitle($hWnd))
    ;MsgBox(0, "B-" & @ScriptLineNumber, Hex($hWnd))
    $hMenu = _GUICtrlMenu_GetMenu($hWnd)
    If $hMenu = 0 Then Exit MsgBox(0, "Error", "No menu")
    $hMenu = _GUICtrlMenu_GetItemSubMenu($hMenu, 0)
    $iCnt = _GUICtrlMenu_GetItemCount($hMenu)
    $sMsg = "There are " & $iCnt & " items in the menu:" & @CRLF
    For $n = 0 To $iCnt - 1
        $sMsg &= @TAB & $n & ": " & _GUICtrlMenu_GetItemText($hMenu, $n) & @CRLF
    Next
    MsgBox(64, "Menu: FIle", $sMsg)
    ConsoleWrite($sMsg)
    ConsoleWrite("Do a File -> New" & @CRLF)
    $loopcnt = 0
    While (1)
        ;
        ;WinWaitActive($hWnd)
        $ret = WinMenuSelectItem($hWnd, "", "&File", "&New")
        ConsoleWrite("+++:" & @ScriptLineNumber & ":[" & $loopcnt & "] @error = " & @error & ", $ret = " & $ret & @CRLF)
        If ($ret = 1) Then ExitLoop
        $loopcnt += 1
        If ($loopcnt > $maxcnt) Then Exit
        Sleep(125)
    WEnd

    ;MsgBox(0, "C-" & @ScriptLineNumber, Hex($hWnd))

    ;Local $str = ClipGet() ; save whatever is in the clipboard
    WinActivate($hWnd)
    WinWaitActive($hWnd)
    Send("^a") ; select all existing text in the editor's window

    ConsoleWrite("put the new text into the clipboard" & @CRLF)
    ClipPut($sOutput)

    Send("^v") ; paste it into the editor's window

    ;;;ClipPut($str) ; restore the previous contents of the clipboard

EndFunc   ;==>add2editor

 

Link to comment
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
 Share

×
×
  • Create New...