AndyS01 Posted October 8, 2016 Posted October 8, 2016 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: expandcollapse popup#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
ahmet Posted October 8, 2016 Posted October 8, 2016 (edited) Try with WinMenuSelectItem($hWnd, "", "&File", "&New") There is also n o need for WinActivate(). Edited October 8, 2016 by ahmet
AndyS01 Posted October 9, 2016 Author Posted October 9, 2016 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: expandcollapse popup#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
ahmet Posted October 9, 2016 Posted October 9, 2016 Run some tests with this expandcollapse popup#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
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