Mbee Posted June 8, 2013 Share Posted June 8, 2013 (edited) Okay, I've got a fair to middling handle on AutoIt v3 basics, but from here on the learning curve looks pretty foggy to me -- which is my problem of course, but still, I don't know what to read next and where to find it. Somewhere between the language basics and a some basic functions and so forth, and on the other end, actually implementing my goals of having a few applications perform automated tasks in their GUIs, lies a gulf of ignorance waiting for me to get lost inside. What lies in the middle? Some currently unknown (to me) Windows API calls or what? What's the operational programming map as well as learning map look like? I'm a multi-decade, highly experienced systems programmer, but NONE of my work has been on PCs of any type or any PC operating system (I've done lots of embedded through high-end engineering computers instead). I'm working on Windows XP and 7, but only as a user, not a programmer. I don't know any Windows APIs whatsoever, and I don't particularly want to learn anything much more than is necessary to program AutoIt for manipulating a half-dozen apps. To put a more practical EXAMPLE topic out there for those who prefer it such, in a current script, I'm going to activate an app, but first I want to know it it's already running. I tried obtaining and looping through a WinList() looking for a Window title that matches my app's name, but it turned out that a folder with the same name was already open, so my primitive script confused a Windows Explorer folder window name with the desired application's name because they were identical. What do I have to do to distinguish the two cases? I figure there's some additional info I should be able to find using the Window handle(s) -- such as the name of the process which created it -- but I don't know where to find that kind of info on the documentation or learning map. So I'd prefer a fuller reply than only a suggested solution to this particular practical question if possible. Thanks for your patience folks! Edited June 8, 2013 by Mbee Link to comment Share on other sites More sharing options...
water Posted June 8, 2013 Share Posted June 8, 2013 Welcome to AutoIt and the forum! As you already have basic AutoIt knowledge I think the next step is to automate your applications. To check for a running application you can either use function "ProcessExist" to check if e.g. "application.exe" exists. Or if the application has a COM interface (like Word, Excel etc.) you could try ObjGet. The next step on the learning curve is: Start coding. If you are unsure how to or run into errors, ask. We will be happy to assist. Mbee 1 My UDFs and Tutorials: Spoiler UDFs: Active Directory (NEW 2024-07-28 - Version 1.6.3.0) - Download - General Help & Support - Example Scripts - Wiki ExcelChart (2017-07-21 - Version 0.4.0.1) - Download - General Help & Support - Example Scripts OutlookEX (2021-11-16 - Version 1.7.0.0) - Download - General Help & Support - Example Scripts - Wiki OutlookEX_GUI (2021-04-13 - Version 1.4.0.0) - Download Outlook Tools (2019-07-22 - Version 0.6.0.0) - Download - General Help & Support - Wiki PowerPoint (2021-08-31 - Version 1.5.0.0) - Download - General Help & Support - Example Scripts - Wiki Task Scheduler (2022-07-28 - Version 1.6.0.1) - Download - General Help & Support - Wiki Standard UDFs: Excel - Example Scripts - Wiki Word - Wiki Tutorials: ADO - Wiki WebDriver - Wiki Link to comment Share on other sites More sharing options...
TheSaint Posted June 8, 2013 Share Posted June 8, 2013 Great to hear of you interest, and I'm sure you will find many in this community to help you, and the experience you bring may help us too. The Help file for AutoIt and this Forum are it's greatest resources, outside of individual talented members. Like anything you learn, it's an as you go learning process. You will find plenty of info about Window's and their titles, classes, instances and how to get and apply handles, both here and in the Help file. What you want to get out of AutoIt, ultimately depends on your end goal, but my advice is jump in and get dirty and then follow your instincts from there. As you seem to already know some basics, you really need to either do some of the harder tutorials available or determine a project that will give you a learning curve. If you are really serious about becoming a programmer though, you will need to do some reading from other general sources outside of AutoIt, to understand better the concepts involved. In the end, this could take you away from AutoIt. Is that what you want or do you just want to become better with AutoIt? All knowledge can be helpful anyway. Mbee 1 Make sure brain is in gear before opening mouth! Remember, what is not said, can be just as important as what is said. Spoiler What is the Secret Key? Life is like a Donut If I put effort into communication, I expect you to read properly & fully, or just not comment. Ignoring those who try to divert conversation with irrelevancies. If I'm intent on insulting you or being rude, I will be obvious, not ambiguous about it. I'm only big and bad, to those who have an over-active imagination. I may have the Artistic Liesense to disagree with you. TheSaint's Toolbox (be advised many downloads are not working due to ISP screwup with my storage) Link to comment Share on other sites More sharing options...
TheSaint Posted June 8, 2013 Share Posted June 8, 2013 (edited) My Netbook had a little conniption, and so I missed what water said, but what he said too. A personal note here may also help you. A few things have helped me with my AutoIt learning. (1) Having something I needed/wanted as a goal ..... that is particularly helpful. (2) Following information in the Help file reference links. (3) Regularly checking anything in the Examples section of the forum, that took my interest ... usually downloading code and comments for a rainy day ... of which there has been many. I've learnt much of what I know, from other people's scripts and careful experimentation. (4) Not being afraid to challenge myself or ask what might seem like stupid questions. We all have dumb days and we were all newbies once. (5) Be thorough with searching the Help file, and then the Forum, before asking for help. You gain an immeasurable amount by doing that. (6) Making mistakes, but never (or rarely) giving up. Usually when I give up, it's only until I'm in a better position to deal with the difficulty or I realize there is a better way. I don't like conquering things just for the sake of it, unless I can see a real benefit for the time spent. Edited June 8, 2013 by TheSaint Mbee 1 Make sure brain is in gear before opening mouth! Remember, what is not said, can be just as important as what is said. Spoiler What is the Secret Key? Life is like a Donut If I put effort into communication, I expect you to read properly & fully, or just not comment. Ignoring those who try to divert conversation with irrelevancies. If I'm intent on insulting you or being rude, I will be obvious, not ambiguous about it. I'm only big and bad, to those who have an over-active imagination. I may have the Artistic Liesense to disagree with you. TheSaint's Toolbox (be advised many downloads are not working due to ISP screwup with my storage) Link to comment Share on other sites More sharing options...
TheSaint Posted June 8, 2013 Share Posted June 8, 2013 Oops, I just realized we should be doing all this in Chat ... which however, you won't see because of one post only. Make sure brain is in gear before opening mouth! Remember, what is not said, can be just as important as what is said. Spoiler What is the Secret Key? Life is like a Donut If I put effort into communication, I expect you to read properly & fully, or just not comment. Ignoring those who try to divert conversation with irrelevancies. If I'm intent on insulting you or being rude, I will be obvious, not ambiguous about it. I'm only big and bad, to those who have an over-active imagination. I may have the Artistic Liesense to disagree with you. TheSaint's Toolbox (be advised many downloads are not working due to ISP screwup with my storage) Link to comment Share on other sites More sharing options...
Mbee Posted June 11, 2013 Author Share Posted June 11, 2013 Wow, the friendliness and kind willingness to help a newbie here is exemplary -- My thanks to water and especially warm thanks to TheSaint! (I would have replied earlier, but I was expecting an email notification of replies....) I've just completed successful development of my first personally-useful script, which is to activate or de-activate a specific clean-up task using R-tools R-Wipe&Clean (description here: http://download.cnet.com/R-Wipe-Clean/3000-2144_4-10159835.html) Here's my source code (suggestions for improvement would be very much appreciated!): expandcollapse popup#cs ---------------------------------------------------------------------------- MyRWipeControl Version 1.0 - 11-Jun-2013 AutoIt Version: 3.3.8.1 Author: Mbee Activate or De-Activate R-Wipe&Clean's Full Clean task If an R-wipe task is ready to run, the reg key: HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run will include the following: Subkey Value name: RWipeD - Contents: C:\PROGRAM FILES\R-WIPE&CLEAN\RWIPED.EXE #ce ---------------------------------------------------------------------------- #include <Array.au3> #include <Constants.au3> #include <Misc.au3> #include <Process.au3> #include <ProcessConstants.au3> #include <String.au3> #include <StructureConstants.au3> #include <WinAPI.au3> #include <WinAPIError.au3> #include <WindowsConstants.au3> ; Script Start - Add your code below here Opt("MustDeclareVars", 1) ; Const $Cmy_Max16bit = 65535, $Cmy_MaxWins = 256, $Cmy_MaxProcess = 256 Const $Cmy_RwipePath = "C:\Program Files\R-Wipe&Clean\RWipeRun.exe" Const $Cmy_RwipeDPath = "C:\Program Files\R-Wipe&Clean\RWipeD.exe" Const $Cmy_RWipeName = "R-Wipe&Clean" Const $Cmy_RWipeProcName = "RWipeRun.exe" ; Local $L_Stat, $L_RegString, $L_MBoxReturn, $L_ProcessID Dim $L_RWipeWinTitleList[$Cmy_MaxWins], $L_RWipeWinHandleList[$Cmy_MaxWins] Dim $L_ListOfProcs[$Cmy_MaxProcess][2] ; ProcessList returns a 2-dimensional matrix Local $L_CountOfProcs = 0, $L_RWipeProcCount = 0, $L_ThisStr = "", $L_RWipeWinHandle Local $L_RWipeStatChange = "unchanged" ; ; ; --- Entry Point - Begin ; AutoItSetOption("WinTitleMatchMode", 3) ; 3 = Exact Title Match for window titles AutoItSetOption("MouseCoordMode", 0) ; 0 = Use coordinates relative to Window ; ; First we need to see if RWipe's got a current task run set, so we read the registry... $L_Stat = 0 $L_RegString = RegRead("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run", "RWipeD") If $L_RegString == "" Then MsgBox($MB_OK, "Rwipe Reg Status", "Rwipe upon boot is INactive - Status = " & $L_Stat) $L_Stat = 0 Else MsgBox($MB_OK, "Rwipe Reg Status", "Rwipe upon boot is active - Key name = " & $L_RegString) $L_Stat = 1 EndIf ; ; Ask if the user wants to cancel or activate an Rwipe cleanup task If $L_Stat = 1 Then $L_MBoxReturn = MsgBox($MB_YESNO, "Rwipe Status Change Request", "There's an RWipe task active -- Deactivate it?") If $L_MBoxReturn <> -1 Then If $L_MBoxReturn = 6 Then ; 6 means "Yes" $L_RWipeStatChange = "cancel" EndIf EndIf Else $L_MBoxReturn = MsgBox($MB_YESNO, "Rwipe Status Change Request", "There's NO RWipe task active -- Activate it?") If $L_MBoxReturn <> -1 Then If $L_MBoxReturn = 6 Then ; 6 means "Yes" $L_RWipeStatChange = "activate" EndIf EndIf EndIf If $L_RWipeStatChange == "unchanged" Then Exit EndIf ; ; Since the user wants a status change, check to see if RWipe is already active $L_ListOfProcs = ProcessList() ;; $array[0][0] = Number of processes ;; $array[n][0] = nth Process name ;; $array[n][1] = nth Process ID (PID) ;; The list can be empty if $array[0][0] = 0. No @error set in this case. ;; $L_RWipeProcCount = 0 $L_CountOfProcs = $L_ListOfProcs[0][0] If $L_CountOfProcs > 0 Then For $L_ctrA = 1 To $L_CountOfProcs $L_ThisStr = $L_ListOfProcs[$L_ctrA][0] If StringInStr($L_ThisStr, $Cmy_RWipeProcName) Then $L_RWipeProcCount += 1 EndIf Next EndIf ; ; If Rwipe isn't active, make it so $L_ProcessID = 0 If $L_RWipeProcCount = 0 Then $L_ProcessID = Run($Cmy_RwipePath) If $L_ProcessID = 0 Then MsgBox($MB_OK, "Rwipe Windows Activation Failure", "Rwipe Activation Error") Exit -1 EndIf $L_Stat = WinWaitActive($Cmy_RWipeName) If $L_Stat = 0 Then MsgBox($MB_OK, "Rwipe Windows Activation Failure", "Rwipe Activation Error") Exit -1 EndIf EndIf ; ; If we've reached here, then the user wants to have R-Wipe change status, and it's active task, so do it. ; ; First, activate RWipe's main window $L_RWipeWinHandle = WinActivate($Cmy_RWipeName) If $L_RWipeWinHandle = 0 Then MsgBox($MB_OK, "Rwipe Tool Exiting", "RWipe Window Activation Failed") Exit EndIf ; ; Now, resize window so that we know exactly where RWipe's non-standard controls are relative to the window $L_Stat = WinMove($Cmy_RWipeName, "", Default, Default, 1040, 841) Sleep(500) ; First click on "Full Task" button near top right of RWipe page to activate the window portion we need $L_Stat = MouseClick("left", 897, 97) Sleep(500) ; Then click on "Full Clean" row in Task List $L_Stat = MouseClick("left", 480, 712) Sleep(500) ; Now click the appropriate pseudo-button If $L_RWipeStatChange == "cancel" Then $L_Stat = ControlClick($Cmy_RWipeName, "Deactivate Task", "[CLASS:Button; INSTANCE:144]") Else $L_Stat = ControlClick($Cmy_RWipeName, "Activate Task", "[CLASS:Button; INSTANCE:143]") EndIf Sleep(800) ;;;--------------- MsgBox($MB_OK, "Rwipe Tool Exiting", "RWipe Tool - Exiting") Exit 0 R-Wipe & Clean often doesn't use standard controls (if I'm interpreting AutoIt's Info tool results properly, which I very well may NOT be), and so to get the GUI into the correct mode for the ControlClick function I was finally forced (after much trial & error!) to click the mouse in a couple of places before selecting the relatively few standard controls R-Wipe does provide. ALSO, I have a major question: Since the relative coordinates for the mouse clicks I need can easily change based on whether or not the user stretched or shrunk the main window, I could think of no solution other than to force the window (with WinMove) to be a precise width and height. Otherwise the clicks could end up at the wrong place. How do others solve this problem? Another question is whether or not I shoud be completely scrupulous about checking the return status from various operations. For example, I ignore the ControlClick calls' return status in the code above, but in other cases I do check the return status and exit upon failure. This feels very arbitrary, and being arbitrary feels, well, wrong to me (I'm usually quite a stickler for such details...) Should I lighten up or darken down on this? I'm eager for feedback, so critique away! Thanks again, all! Link to comment Share on other sites More sharing options...
Mbee Posted June 11, 2013 Author Share Posted June 11, 2013 Oops, I just realized we should be doing all this in Chat ... which however, you won't see because of one post only. Hi, TheSaint! Sorry if this is another dumb newbie question that I could answer by reading a bunch of FAQs, but why should we be using Chat? What's that about? Thanks again for your very kind assistance! Link to comment Share on other sites More sharing options...
JohnQSmith Posted June 11, 2013 Share Posted June 11, 2013 but why should we be using Chat? What's that about? When the conversation started, it was just a discussion of "what can I use AutoIt for?" which is something that would be better suited for the Chat forum instead of General Help and Support. Now that there's actual code involved, it fits beautifully into its current location. Whenever someone says "pls" because it's shorter than "please", I say "no" because it's shorter than "yes". Link to comment Share on other sites More sharing options...
blckpythn Posted June 11, 2013 Share Posted June 11, 2013 ALSO, I have a major question: Since the relative coordinates for the mouse clicks I need can easily change based on whether or not the user stretched or shrunk the main window, I could think of no solution other than to force the window (with WinMove) to be a precise width and height. Otherwise the clicks could end up at the wrong place. How do others solve this problem? This is usually solved using ControlClick. Check http://www.autoitscript.com/autoit3/docs/functions/ControlClick.htm for how to use it. You can get the controlID using au3info in Scite's Tools menu. Hope that helps. Link to comment Share on other sites More sharing options...
water Posted June 11, 2013 Share Posted June 11, 2013 Another question is whether or not I shoud be completely scrupulous about checking the return status from various operations. For example, I ignore the ControlClick calls' return status in the code above, but in other cases I do check the return status and exit upon failure. This feels very arbitrary, and being arbitrary feels, well, wrong to me (I'm usually quite a stickler for such details...) Should I lighten up or darken down on this? Error checking is never a bad thing. At least I would always do some kind of error checking if a statement relies on the successful execution of a prior statement and the script would crash if an error goes unnoticed. My UDFs and Tutorials: Spoiler UDFs: Active Directory (NEW 2024-07-28 - Version 1.6.3.0) - Download - General Help & Support - Example Scripts - Wiki ExcelChart (2017-07-21 - Version 0.4.0.1) - Download - General Help & Support - Example Scripts OutlookEX (2021-11-16 - Version 1.7.0.0) - Download - General Help & Support - Example Scripts - Wiki OutlookEX_GUI (2021-04-13 - Version 1.4.0.0) - Download Outlook Tools (2019-07-22 - Version 0.6.0.0) - Download - General Help & Support - Wiki PowerPoint (2021-08-31 - Version 1.5.0.0) - Download - General Help & Support - Example Scripts - Wiki Task Scheduler (2022-07-28 - Version 1.6.0.1) - Download - General Help & Support - Wiki Standard UDFs: Excel - Example Scripts - Wiki Word - Wiki Tutorials: ADO - Wiki WebDriver - Wiki Link to comment Share on other sites More sharing options...
Solution Mbee Posted July 1, 2013 Author Solution Share Posted July 1, 2013 Sorry for the delay in responding. Life gets complicated, as you all know all too well... I just wanted to thank all the respondents for their kind and helpful comments! This is a great place, with great folks! Take care... Link to comment Share on other sites More sharing options...
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