• Selenium如何支持测试Windows application


    很长一段时间大家都支持Selenium是只支持测试Web应用程序的。

    纵观Selenium的成长历程,不难解释这个原因。Selenium开始的时候是作为一个Firefox中的插件出现的,而且做得是纯JS脚本的方式,目的就是一个老外测试的有点烦了,就写了一个js的脚本每天去run自己的测试项目。从这个点来看,老外真的很有才。。想想国内的同行有谁会想到做得有点烦了,去自己搞腾一个工具去做每天的工作。。。

    后面Selenium做得挺不错的,老外也感觉自己乐不如大家同乐。。。于是就开源了Selenium,后面进一步的壮大了,反而让Selenium开花结果,产生了一个真正意义上的自动化的支持。先是java版本的,然后是其他语言版本的,像Ruby ,c#,python等等。。。感觉好强大啊。

    而且Selenium就是针对QTP来干的。。。SeleniumHq,就是对着HP干的。。。看出来了吗?

    可能慢慢的你还发现Selenium做点web的测试还是可以的,可能针对Windows的程序如何用它去测试呢?

    还是强大的网友给出了答案。让Selenium支持Windows程序无缝连接。。。这里就是推荐使用AutoIt这个工具,关于如何使用你需要到网上搜索看看了。http://www.autoitscript.com/site/autoit/

    下面是可以用的的AutoIt的API 函数。

       1 /**
       2  * Copyright (c) 2011 Richard Kanavati
       3  *
       4  * Permission is hereby granted, free of charge, to any person obtaining a copy
       5  * of this software and associated documentation files (the "Software"), to deal
       6  * in the Software without restriction, including without limitation the rights
       7  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
       8  * copies of the Software, and to permit persons to whom the Software is
       9  * furnished to do so, subject to the following conditions:
      10  *
      11  * The above copyright notice and this permission notice shall be included in
      12  * all copies or substantial portions of the Software.
      13  *
      14  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
      15  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
      16  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
      17  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
      18  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
      19  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
      20  * THE SOFTWARE.
      21  */
      22 package com.hp.utility;
      23 
      24 import com.jacob.activeX.ActiveXComponent;
      25 import com.jacob.com.SafeArray;
      26 import com.jacob.com.Variant;
      27 
      28 /**
      29  * A Java AutoItX3 Bridge.
      30  * @author Richard Kanavati
      31  * this core function is wrapped ,so you should not modify this file anyway
      32  */
      33 public class AutoItXUtils {
      34 
      35     /**
      36      * The AutoItX Component.
      37      */
      38     protected ActiveXComponent autoItX;
      39     /**
      40      * Maximizes the specified window.
      41      */
      42     public final static int SW_MAXIMIZE = 3;
      43     /**
      44      * Minimizes the specified window and activates the next top-level window in the Z order.
      45      */
      46     public final static int SW_HIDE = 0;
      47     /**
      48      * Activates and displays the window. If the window is minimized or maximized, the system restores it to its original size and position. An application should specify this flag when restoring a minimized window.
      49      */
      50     public final static int SW_RESTORE = 9;
      51     /**
      52      * Activates the window and displays it in its current size and position.
      53      */
      54     public final static int SW_SHOW = 5;
      55     /**
      56      * Sets the show state based on the SW_ value specified by the program that started the application.
      57      */
      58     public final static int SW_SHOWDEFAULT = 10;
      59     /**
      60      * Activates the window and displays it as a maximized window.
      61      */
      62     public final static int SW_SHOWMAXIMIZED = 3;
      63     /**
      64      * Activates the window and displays it as a minimized window.
      65      */
      66     public final static int SW_SHOWMINIMIZED = 2;
      67     /**
      68      * Displays the window as a minimized window. This value is similar to SW_SHOWMINIMIZED, except the window is not activated.
      69      */
      70     public final static int SW_SHOWMINNOACTIVE = 7;
      71     /**
      72      * Displays the window in its current size and position. This value is similar to SW_SHOW, except the window is not activated.
      73      */
      74     public final static int SW_SHOWNA = 8;
      75     /**
      76      * Displays a window in its most recent size and position. This value is similar to SW_SHOWNORMAL, except the window is not actived.
      77      */
      78     public final static int SW_SHOWNOACTIVATE = 4;
      79     /**
      80      * Activates and displays a window. If the window is minimized or maximized, the system restores it to its original size and position. An application should specify this flag when displaying the window for the first time.
      81      */
      82     public final static int SW_SHOWNORMAL = 1;
      83     /**
      84      * Sets the way coords are used in the caret functions, either absolute coords or coords relative to the current active window:
      85      * <br/>0 = relative coords to the active window,
      86      * <br/>1 = absolute screen coordinates (default),
      87      * <br/>2 = relative coords to the client area of the active window.
      88      */
      89     public final static String OPT_CARET_COORD_MODE = "CaretCoordMode";
      90     /**
      91      * Alters the length of the brief pause in between mouse clicks.
      92      * Time in milliseconds to pause (default=10).
      93      */
      94     public final static String OPT_MOUSE_CLICK_DELAY = "MouseClickDelay";
      95     /**
      96      * Alters the length of the brief pause in between mouse clicks.
      97      * Time in milliseconds to pause (default=10).
      98      */
      99     public final static String OPT_MOUSE_CLICK_DOWN_DELAY = "MouseClickDownDelay";
     100     /**
     101      * Alters the length of the brief pause at the start and end of a mouse drag operation.
     102      * Time in milliseconds to pause (default=250).
     103      */
     104     public final static String OPT_MOUSE_CLICK_DRAG_DELAY = "MouseClickDragDelay";
     105     /**
     106      * Sets the way coords are used in the mouse functions, either absolute coords or coords relative to the current active window:
     107      * <br/>0 = relative coords to the active window
     108      * <br/>1 = absolute screen coordinates (default)
     109      * <br/>2 = relative coords to the client area of the active window
     110      */
     111     public final static String OPT_MOUSE_COORD_MODE = "MouseCoordMode";
     112     /**
     113      * Sets the way coords are used in the mouse functions, either absolute coords or coords relative to the current active window:
     114      * <br/>0 = relative coords to the active window
     115      * <br/>1 = absolute screen coordinates (default)
     116      * <br/>2 = relative coords to the client area of the active window
     117      */
     118     public final static String OPT_PIXEL_COORD_MODE = "PixelCoordMode";
     119     /**
     120      * Sets the way coords are used in the pixel functions, either absolute coords or coords relative to the current active window:
     121      * <br/>0 = relative coords to the active window
     122      * <br/>1 = absolute screen coordinates (default)
     123      * <br/>2 = relative coords to the client area of the active window
     124      */
     125     public final static String OPT_SEND_ATTACH_MODE = "SendAttachMode";
     126     /**
     127      * Specifies if AutoIt attaches input threads when using then Send() function. When not attaching (default mode=0) detecting the state of capslock/scrolllock and numlock can be unreliable under NT4. However, when you specify attach mode=1 the Send("{... down/up}") syntax will not work and there may be problems with sending keys to "hung" windows. ControlSend() ALWAYS attaches and is not affected by this mode.
     128      * <br/>0 = don't attach (default)
     129      * <br/>1 = attach
     130      */
     131     public final static String OPT_SEND_CAPSLOCK_MODE = "SendCapslockMode";
     132     /**
     133      * Specifies if AutoIt should store the state of capslock before a Send function and restore it afterwards.
     134      * <br/>0 = don't store/restore
     135      * <br/>1 = store and restore (default)
     136      */
     137     public final static String OPT_SEND_KEY_DELAY = "SendKeyDelay";
     138     /**
     139      * Alters the length of time a key is held down before released during a keystroke. For applications that take a while to register keypresses (and many games) you may need to raise this value from the default.
     140      * Time in milliseconds to pause (default=1).
     141      */
     142     public final static String OPT_SEND_KEY_DOWN_DELAY = "SendKeyDownDelay";
     143     /**
     144      * Specifies if hidden window text can be "seen" by the window matching functions.
     145      * <br/>0 = Do not detect hidden text (default)
     146      * <br/>1 = Detect hidden text
     147      */
     148     public final static String OPT_WIN_DETECT_HIDDEN_TEXT = "WinDetectHiddenText";
     149     /**
     150      * Allows the window search routines to search child windows as well as top-level windows.
     151      * <br/>0 = Only search top-level windows (default)
     152      * <br/>1 = Search top-level and child windows
     153      */
     154     public final static String OPT_WIN_SEARCH_CHILDREN = "WinSearchChildren";
     155     /**
     156      * Alters the method that is used to match window text during search operations.
     157      * <br/>1 = Complete / Slow mode (default)
     158      * <br/>2 = Quick mode
     159      * In quick mode AutoIt can usually only "see" dialog text, button text and the captions of some controls. In the default mode much more text can be seen (for instance the contents of the Notepad window).
     160      * If you are having performance problems when performing many window searches then changing to the "quick" mode may help.
     161      */
     162     public final static String OPT_WIN_TEXT_MATCH_MODE = "WinTextMatchMode";
     163     /**
     164      * Alters the method that is used to match window titles during search operations.
     165      * <br/>1 = Match the title from the start (default)
     166      * <br/>2 = Match any substring in the title
     167      * <br/>3 = Exact title match
     168      * <br/>4 = Advanced mode, see Window Titles & Text (Advanced)
     169      */
     170     public final static String OPT_WIN_TITLE_MATCH_MODE = "WinTitleMatchMode";
     171     /**
     172      * Alters how long a script should briefly pause after a successful window-related operation.
     173      * Time in milliseconds to pause (default=250).
     174      */
     175     public final static String OPT_WIN_WAIT_DELAY = "WinWaitDelay";
     176    
     177 
     178     /**
     179      * Initializes the AutoItX Jacob COM object.
     180      */
     181     public AutoItXUtils() {
     182         autoItX = new ActiveXComponent("AutoItX3.Control");
     183     }
     184 
     185     
     186     /**
     187      * The AutoItX version.
     188      * @return The AutoItX version.
     189      */
     190     public String getVersion() {
     191         return autoItX.getProperty("version").getString();
     192     }
     193 
     194     /**
     195      * Value of the error flag.
     196      * @return The value of the error flag.
     197      */
     198     public int getError() {
     199         Variant error = autoItX.invoke("error");
     200         return error.getInt();
     201     }
     202 
     203     /**
     204      * Retrieves text from the clipboard.
     205      * @return A string containing the text on the clipboard. Sets error to 1 if clipboard is empty or contains a non-text entry.
     206      */
     207     public String clipGet() {
     208        return autoItX.invoke("ClipGet").getString();
     209     }
     210 
     211     /**
     212      * Writes text to the clipboard.
     213      * @param value The text to write to the clipboard.
     214      */
     215     public void clipPut(String value) {
     216         autoItX.invoke("ClipPut", new Variant(value));
     217     }
     218 
     219     /**
     220      * Maps a network drive.
     221      * <p><b>Doesn't always work</b></p>
     222      * @param device The device to map, for example "O:" or "LPT1:". If you pass a blank string for this parameter a connection is made but not mapped to a specific drive. If you specify "*" an unused drive letter will be automatically selected.
     223      * @param remote The remote share to connect to in the form "\servershare".
     224      * @return True if success, false otherwise
     225      */
     226     public boolean driveMapAdd(String device, String remote) {
     227         return driveMapAdd(device, remote, 0, "", "");
     228     }
     229 
     230     /**
     231      * Maps a network drive.     
     232      * @param device The device to map, for example "O:" or "LPT1:". If you pass a blank string for this parameter a connection is made but not mapped to a specific drive. If you specify "*" an unused drive letter will be automatically selected.
     233      * @param remote The remote share to connect to in the form "\servershare".
     234      * @param flags A combination of the following:0 = default, 1 = Persistent mapping, 8 = Show authentication dialog if required
     235      * @param username The username
     236      * @param password The password
     237      * @return True if success, false otherwise
     238      */
     239     public boolean driveMapAdd(String device, String remote, int flags, String username, String password) {
     240         Variant vDevice = new Variant(device);
     241         Variant vRemote = new Variant(remote);
     242         Variant vFlags = new Variant(flags);
     243         Variant vUsername = new Variant(username);
     244         Variant vPassword = new Variant(password);
     245         Variant[] params = new Variant[]{vDevice, vRemote, vFlags, vUsername, vPassword};
     246         Variant result = autoItX.invoke("DriveMapAdd", params);
     247         if (result.getvt() == Variant.VariantString) {
     248             return oneToTrue(Integer.parseInt(result.getString()));
     249         }
     250         return oneToTrue(result.getInt());
     251     }
     252 
     253     /**
     254      * Maps a network drive.
     255      * @param device The device to map, for example "O:" or "LPT1:". If you pass a blank string for this parameter a connection is made but not mapped to a specific drive. If you specify "*" an unused drive letter will be automatically selected.
     256      * @param remote The remote share to connect to in the form "\servershare".
     257      * @param flags A combination of the following:0 = default, 1 = Persistent mapping, 8 = Show authentication dialog if required
     258      * @return True if success, false otherwise
     259      */
     260     public boolean driveMapAdd(String device, String remote, int flags) {
     261         Variant vDevice = new Variant(device);
     262         Variant vRemote = new Variant(remote);
     263         Variant vFlags = new Variant(flags);
     264         Variant[] params = new Variant[]{vDevice, vRemote, vFlags};
     265         Variant result = autoItX.invoke("DriveMapAdd", params);
     266         if (result.getvt() == Variant.VariantString) {
     267             return oneToTrue(Integer.parseInt(result.getString()));
     268         }
     269         return oneToTrue(result.getInt());
     270     }
     271 
     272     /**
     273      * Disconnects a network drive.
     274      * @param device The device to disconnect, e.g. "O:" or "LPT1:".
     275      * @return True if success, false otherwise
     276      */
     277     public boolean driveMapDelete(String device) {
     278         Variant result = autoItX.invoke("DriveMapDel", device);
     279         return oneToTrue(result);
     280     }
     281 
     282     /**
     283      * The device (drive or printer) letter to query. Eg. "O:" or "LPT1:"
     284      * @param device The device to disconnect, e.g. "O:" or "LPT1:".
     285      * @return Details of the mapping, e.g. \servershare. If blank, sets .error() to 1.
     286      */
     287     public String driveMapGet(String device) {
     288         Variant result = autoItX.invoke("DriveMapGet", device);
     289         return result.getString();
     290     }
     291 
     292     /**
     293      * Deletes a value from a standard format .ini file.
     294      * @param filename The filename of the .ini file.
     295      * @param section The section name in the .ini file.
     296      * @param key The key name in the in the .ini file. If no key name is given the entire section is deleted.
     297      * @return True if success, false otherwise
     298      */
     299     public boolean iniDelete(String filename, String section, String key) {
     300         Variant vFilename = new Variant(filename);
     301         Variant vSection = new Variant(section);
     302         Variant vKey = new Variant(key);
     303         Variant[] params = new Variant[]{vFilename, vSection, vKey};
     304         Variant result = autoItX.invoke("IniDelete", params);
     305         return oneToTrue(result);
     306     }
     307 
     308     /**
     309      * Deletes a value from a standard format .ini file.
     310      * @param filename The filename of the .ini file.
     311      * @param section The section name in the .ini file.
     312      * @return True if success, false otherwise
     313      */
     314     public boolean iniDelete(String filename, String section) {
     315         return iniDelete(filename, section, "");
     316     }
     317 
     318     /**
     319      * Reads a value from a standard format .ini file.
     320      * @param filename The filename of the .ini file.
     321      * @param section The section name in the .ini file.
     322      * @param key The key name in the in the .ini file.
     323      * @param defaultVal The default value to return if the requested key is not found.
     324      * @return The requested key value if found, otherwise the default value.
     325      */
     326     public String iniRead(String filename, String section, String key, String defaultVal) {
     327         Variant vFilename = new Variant(filename);
     328         Variant vSection = new Variant(section);
     329         Variant vKey = new Variant(key);
     330         Variant vDefault = new Variant(defaultVal);
     331         Variant[] params = new Variant[]{vFilename, vSection, vKey, vDefault};
     332         Variant result = autoItX.invoke("IniRead", params);
     333         return result.getString();
     334     }
     335 
     336     /**
     337      * Writes a value to a standard format .ini file.
     338      * @param filename The filename of the .ini file.
     339      * @param section The section name in the .ini file.
     340      * @param key The key name in the in the .ini file.
     341      * @param value The value to write/change.
     342      * @return True if success, false otherwise.
     343      */
     344     public Boolean iniWrite(String filename, String section, String key, String value) {
     345         Variant vFilename = new Variant(filename);
     346         Variant vSection = new Variant(section);
     347         Variant vKey = new Variant(key);
     348         Variant vValue = new Variant(value);
     349         Variant[] params = new Variant[]{vFilename, vSection, vKey, vValue};
     350         Variant result = autoItX.invoke("IniWrite", params);
     351         return oneToTrue(result);
     352     }
     353 
     354     /**
     355      * Generates a checksum for a region of pixels.
     356      * @param left Left coordinate of rectangle.
     357      * @param top Top coordinate of rectangle.
     358      * @param right Right coordinate of rectangle.
     359      * @param bottom Bottom coordinate of rectangle.
     360      * @param step Instead of checksumming each pixel use a value larger than 1 to skip pixels (for speed). E.g. A value of 2 will only check every other pixel. Default is 1.
     361      * @return The checksum value of the region.
     362      */
     363     public double pixelChecksum(int left, int top, int right, int bottom, int step) {
     364         Variant vLeft = new Variant(left);
     365         Variant vTop = new Variant(top);
     366         Variant vRight = new Variant(right);
     367         Variant vBottom = new Variant(bottom);
     368         Variant vStep = new Variant(step);
     369         Variant[] params = new Variant[]{vLeft, vTop, vRight, vBottom, vStep};
     370         Variant result = autoItX.invoke("PixelChecksum", params);
     371         return result.getDouble();
     372     }
     373 
     374     /**
     375      * Generates a checksum for a region of pixels.
     376      * @param left Left coordinate of rectangle.
     377      * @param top Top coordinate of rectangle.
     378      * @param right Right coordinate of rectangle.
     379      * @param bottom Bottom coordinate of rectangle.
     380      * @return The checksum value of the region.
     381      */
     382     public double pixelChecksum(int left, int top, int right, int bottom) {
     383         return pixelChecksum(left, top, right, bottom, 0);
     384     }
     385 
     386     /**
     387      * Returns a pixel color according to x,y pixel coordinates.
     388      * @param x x coordinate of pixel.
     389      * @param y y coordinate of pixel.
     390      * @return Decimal value of pixel's color.
     391      */
     392     public float pixelGetColor(int x, int y) {
     393         Variant vX = new Variant(x);
     394         Variant vY = new Variant(y);
     395         Variant[] params = new Variant[]{vX, vY};
     396         Variant result = autoItX.invoke("PixelGetColor", params);
     397         return result.getInt();
     398     }
     399 
     400     /**
     401      * Searches a rectangle of pixels for the pixel color provided.
     402      * @param left left coordinate of rectangle.
     403      * @param top top coordinate of rectangle.
     404      * @param right right coordinate of rectangle.
     405      * @param bottom bottom coordinate of rectangle.
     406      * @param color Color value of pixel to find (in decimal or hex).
     407      * @param shadeVariation A number between 0 and 255 to indicate the allowed number of shades of variation of the red, green, and blue components of the colour. Default is 0 (exact match).
     408      * @param step Instead of searching each pixel use a value larger than 1 to skip pixels (for speed). E.g. A value of 2 will only check every other pixel. Default is 1.
     409      * @return The pixel's coordinates in a 2 element array, otherwise sets .error() to one.
     410      */
     411     public long[] pixelSearch(int left, int top, int right, int bottom, int color, int shadeVariation, int step) {
     412         Variant vLeft = new Variant(left);
     413         Variant vTop = new Variant(top);
     414         Variant vRight = new Variant(right);
     415         Variant vBottom = new Variant(bottom);
     416         Variant vColor = new Variant(color);
     417         Variant vShadeVariation = new Variant(shadeVariation);
     418         Variant vStep = new Variant(step);
     419         Variant[] params = new Variant[]{vLeft, vTop, vRight, vBottom, vColor, vShadeVariation, vStep};
     420         Variant result = autoItX.invoke("PixelSearch", params);
     421         long[] l = new long[2];
     422 
     423         if (result.getvt() == 8204) {
     424             l[0] = result.toSafeArray().getLong(0);
     425             l[1] = result.toSafeArray().getLong(1);
     426             return l;
     427         }
     428         return l;
     429     }
     430 
     431     /**
     432      * Searches a rectangle of pixels for the pixel color provided.
     433      * @param left left coordinate of rectangle.
     434      * @param top top coordinate of rectangle.
     435      * @param right right coordinate of rectangle.
     436      * @param bottom bottom coordinate of rectangle.
     437      * @param color Color value of pixel to find (in decimal or hex).
     438      * @return The pixel's coordinates in a 2 element array, otherwise sets .error() to one.
     439      */
     440     public long[] pixelSearch(int left, int top, int right, int bottom, int color) {
     441         return pixelSearch(left, top, right, bottom, color, 0, 1);
     442     }
     443 
     444     /**
     445      * Sends simulated keystrokes to the active window.
     446      * @param keys The sequence of keys to send.
     447      * @param isRaw Changes how "keys" is processed:   true -  Text contains special characters like + and ! to indicate SHIFT and ALT key presses.  false, keys are sent raw.
     448      */
     449     public void send(String keys, boolean isRaw) {
     450         Variant vKeys = new Variant(keys);
     451         Variant vFlag = new Variant(isRaw ? 1 : 0);
     452         Variant[] params = new Variant[]{vKeys, vFlag};
     453         autoItX.invoke("Send", params);
     454     }
     455 
     456     /**
     457      * Sends simulated keystrokes to the active window.
     458      * @param keys The sequence of keys to send.
     459      */
     460     public void send(String keys) {
     461         send(keys, true);
     462     }
     463 
     464     /**
     465      * Creates a tooltip anywhere on the screen.
     466      * @param text The text of the tooltip. (An empty string clears a displaying tooltip)
     467      * @param x The x,y position of the tooltip.
     468      * @param y The x,y position of the tooltip.
     469      */
     470     public void toolTip(String text, int x, int y) {
     471         Variant vText = new Variant(text);
     472         Variant vX = new Variant(x);
     473         Variant vY = new Variant(y);
     474         Variant[] params = new Variant[]{vText, vX, vY};
     475         autoItX.invoke("ToolTip", params);
     476     }
     477 
     478     /**
     479      *  Creates a tooltip anywhere on the screen.
     480      * @param text The text of the tooltip. (An empty string clears a displaying tooltip)
     481      */
     482     public void toolTip(String text) {
     483         autoItX.invoke("ToolTip", text);
     484     }
     485 
     486     /**
     487      * Disable/enable the mouse and keyboard.
     488      * Requires admin rights in Vista and Windows 7.
     489      * @param disableInput True = disable user input, false = re-enable it.
     490      */
     491     public void blockInput(boolean disableInput) {
     492         autoItX.invoke("BlockInput", (disableInput ? 1 : 0));
     493     }
     494 
     495     /**
     496      * Opens or closes the CD tray.
     497      * @param drive The drive letter of the CD tray to control, in the format D:, E:, etc.
     498      * @param status Specifies if you want the CD tray to be open or closed: "open" or "closed"
     499      * @return True if success, false if drive is locked via CD burning software or if the drive letter is not a CD drive.
     500      */
     501     public boolean cdTray(String drive, String status) {
     502         Variant vDrive = new Variant(drive);
     503         Variant vStatus = new Variant(status);
     504         Variant[] params = new Variant[]{vDrive, vStatus};
     505         Variant result = autoItX.invoke("CDTray", params);
     506         return oneToTrue(result);
     507     }
     508 
     509     /**
     510      * Checks if the current user has administrator privileges.
     511      * @return True if is admin, false otherwise.
     512      */
     513     public boolean isAdmin() {
     514         return oneToTrue(autoItX.invoke("IsAdmin"));
     515     }
     516 
     517     /**
     518      * Changes the operation of various AutoIt functions/parameters.
     519      * @param option The option to change.
     520      * @param param The parameter (varies by option).
     521      * @return Value of the previous setting.
     522      */
     523     public String autoItSetOption(String option, String param) {
     524         Variant vOption = new Variant(option);
     525         Variant vParam = new Variant(param);
     526         Variant[] params = new Variant[]{vOption, vParam};
     527         Variant result = autoItX.invoke("AutoItSetOption", params);
     528         if (result.getvt() == Variant.VariantInt) {
     529             int i = result.getInt();
     530             return String.valueOf(i);
     531         }
     532         return result.getString();
     533     }
     534 
     535     /**
     536      * Changes the operation of various AutoIt functions/parameters.
     537      * @param option The option to change.
     538      * @param param The parameter (varies by option).
     539      * @return Value of the previous setting.
     540      */
     541     public String setOption(String option, String param) {
     542         return autoItSetOption(option, param);
     543     }
     544 
     545     /**
     546      * Perform a mouse click operation.
     547      * @param button The button to click: "left", "right", "middle", "main", "menu", "primary", "secondary".
     548      * @param x The x/y coordinates to move the mouse to. If no x and y coords are given, the current position is used.
     549      * @param y The x/y coordinates to move the mouse to. If no x and y coords are given, the current position is used.
     550      * @param clicks The number of times to click the mouse. Default is 1.
     551      * @param speed The speed to move the mouse in the range 1 (fastest) to 100 (slowest). A speed of 0 will move the mouse instantly. Default speed is 10.
     552      */
     553     public void mouseClick(String button, int x, int y, int clicks, int speed) {
     554         Variant vButton = new Variant(button);
     555         Variant vX = new Variant(x);
     556         Variant vY = new Variant(y);
     557         Variant vClicks = new Variant(clicks);
     558         Variant vSpeed = new Variant(speed);
     559         Variant[] params = new Variant[]{vButton, vX, vY, vClicks, vSpeed};
     560         autoItX.invoke("MouseClick", params);
     561 
     562     }
     563 
     564     /**
     565      * Perform a mouse click operation.
     566      * @param button The button to click: "left", "right", "middle", "main", "menu", "primary", "secondary".
     567      * @param clicks The number of times to click the mouse. Default is 1.
     568      * @param speed The speed to move the mouse in the range 1 (fastest) to 100 (slowest). A speed of 0 will move the mouse instantly. Default speed is 10.
     569      */
     570     public void mouseClick(String button, int clicks, int speed) {
     571         Variant vButton = new Variant(button);
     572         Variant vClicks = new Variant(clicks);
     573         Variant vSpeed = new Variant(speed);
     574         Variant[] params = new Variant[]{vButton, vClicks, vSpeed};
     575         autoItX.invoke("MouseClick", params);
     576     }
     577 
     578     /**
     579      * Perform a mouse click and drag operation.
     580      * @param button The button to click: "left", "right", "middle", "main", "menu", "primary", "secondary".
     581      * @param x The x/y coords to start the drag operation from.
     582      * @param y The x/y coords to start the drag operation from.
     583      * @param x2 The x/y coords to start the drag operation to.
     584      * @param y2 The x/y coords to start the drag operation to.
     585      * @param speed The speed to move the mouse in the range 1 (fastest) to 100 (slowest). A speed of 0 will move the mouse instantly. Default speed is 10.
     586      */
     587     public void mouseClickDrag(String button, int x, int y, int x2, int y2, int speed) {
     588         Variant vButton = new Variant(button);
     589         Variant vX = new Variant(x);
     590         Variant vY = new Variant(y);
     591         Variant vX2 = new Variant(x2);
     592         Variant vY2 = new Variant(y2);
     593         Variant vSpeed = new Variant(speed);
     594         Variant[] params = new Variant[]{vButton, vX, vY, vX2, vY2, vSpeed};
     595         autoItX.invoke("MouseClickDrag", params);
     596     }
     597 
     598     /**
     599      * Perform a mouse click and drag operation.
     600      * @param button The button to click: "left", "right", "middle", "main", "menu", "primary", "secondary".
     601      * @param x The x/y coords to start the drag operation from.
     602      * @param y The x/y coords to start the drag operation from.
     603      * @param x2 The x/y coords to start the drag operation to.
     604      * @param y2 The x/y coords to start the drag operation to.
     605      */
     606     public void mouseClickDrag(String button, int x, int y, int x2, int y2) {
     607         mouseClickDrag(button, x, y, x2, y2, 10);
     608     }
     609 
     610     /**
     611      * Perform a mouse down event at the current mouse position.
     612      * @param button The button to click: "left", "right", "middle", "main", "menu", "primary", "secondary".
     613      */
     614     public void mouseDown(String button) {
     615         autoItX.invoke("MouseDown", button);
     616     }
     617 
     618     /**
     619      * Returns a cursor ID Number of the current Mouse Cursor.
     620      * @return  0 = UNKNOWN (this includes pointing and grabbing hand icons)
     621      * <br/> 1 = APPSTARTING
     622      * <br/> 2 = ARROW
     623      * <br/> 3 = CROSS
     624      * <br/> 4 = HELP
     625      * <br/> 5 = IBEAM
     626      * <br/> 6 = ICON
     627      * <br/> 7 = NO
     628      * <br/> 8 = SIZE
     629      * <br/> 9 = SIZEALL
     630      * <br/> 10 = SIZENESW
     631      * <br/> 11 = SIZENS
     632      * <br/> 12 = SIZENWSE
     633      * <br/> 13 = SIZEWE
     634      * <br/> 14 = UPARROW
     635      * <br/> 15 = WAIT
     636      */
     637     public int mouseGetCursor() {
     638         return autoItX.invoke("MouseGetCursor").getInt();
     639     }
     640 
     641     /**
     642      * Retrieves the current X position of the mouse cursor.
     643      * @return The current X position of the mouse cursor.
     644      */
     645     public int mouseGetPosX() {
     646         return autoItX.invoke("MouseGetPosX").getInt();
     647     }
     648 
     649     /**
     650      * Retrieves the current Y position of the mouse cursor.
     651      * @return The current Y position of the mouse cursor.
     652      */
     653     public int mouseGetPosY() {
     654         return autoItX.invoke("MouseGetPosY").getInt();
     655     }
     656 
     657     /**
     658      * Moves the mouse pointer.
     659      * @param x The screen x coordinate to move the mouse to.
     660      * @param y The screen y coordinate to move the mouse to.
     661      * @param speed The speed to move the mouse in the range 1 (fastest) to 100 (slowest). A speed of 0 will move the mouse instantly. Default speed is 10.
     662      * @return true if success, false otherwise (is this correct)?
     663      */
     664     public boolean mouseMove(int x, int y, int speed) {
     665         Variant vX = new Variant(x);
     666         Variant vY = new Variant(y);
     667         Variant vSpeed = new Variant(speed);
     668         Variant[] params = new Variant[]{vX, vY, vSpeed};
     669         return oneToTrue(autoItX.invoke("MouseMove", params).getInt());
     670     }
     671 
     672     /**
     673      * Moves the mouse pointer.
     674      * @param x The screen x coordinate to move the mouse to.
     675      * @param y The screen y coordinate to move the mouse to.
     676      * @return true if success, false otherwise (is this correct)?
     677      */
     678     public boolean mouseMove(int x, int y) {
     679         return mouseMove(x, y, 10);
     680     }
     681 
     682     /**
     683      * Perform a mouse up event at the current mouse position.
     684      * @param button The button to click: "left", "right", "middle", "main", "menu", "primary", "secondary".
     685      */
     686     public void mouseUp(String button) {
     687         autoItX.invoke("MouseUp", button);
     688     }
     689 
     690     /**
     691      * Moves the mouse wheel up or down. NT/2000/XP ONLY.
     692      * @param direction "up" or "down"
     693      * @param clicks The number of times to move the wheel. Default is 1.
     694      */
     695     public void mouseWheel(String direction, int clicks) {
     696         Variant vDirection = new Variant(direction);
     697         Variant vClicks = new Variant(clicks);
     698         Variant[] params = new Variant[]{vDirection, vClicks};
     699         autoItX.invoke("MouseWheel", params);
     700     }
     701 
     702     /**
     703      * Moves the mouse wheel up or down. NT/2000/XP ONLY.
     704      * @param direction "up" or "down"
     705      */
     706     public void mouseWheel(String direction) {
     707         mouseWheel(direction, 1);
     708     }
     709 
     710     /**
     711      * Terminates a named process.
     712      * @param process The title or PID of the process to terminate.
     713      */
     714     public void processClose(String process) {
     715         autoItX.invoke("ProcessClose", process);
     716     }
     717 
     718     /**
     719      * Checks to see if a specified process exists.
     720      * @param process The name or PID of the process to check.
     721      * @return The PID of the process. 0 if process does not exist.
     722      */
     723     public int processExists(String process) {
     724         return autoItX.invoke("ProcessExists", process).getInt();
     725     }
     726 
     727     /**
     728      * Changes the priority of a process
     729      * @param process The name or PID of the process to check.
     730      * @param priority A flag which determines what priority to set
     731      * <br/>    0 - Idle/Low
     732      * <br/>    1 - Below Normal (Not supported on Windows 95/98/ME)
     733      * <br/>    2 - Normal
     734      * <br/>    3 - Above Normal (Not supported on Windows 95/98/ME)
     735      * <br/>    4 - High
     736      * <br/>    5 - Realtime (Use with caution, may make the system unstable)
     737      * @return True if success, false otherwise.
     738      */
     739     public boolean processSetPriority(String process, int priority) {
     740         Variant vProcess = new Variant(process);
     741         Variant vPriority = new Variant(priority);
     742         Variant[] params = new Variant[]{vProcess, vPriority};
     743         Variant result = autoItX.invoke("ProcessSetPriority", params);
     744         return oneToTrue(result.getInt());
     745     }
     746 
     747     /**
     748      * Pauses script execution until a given process exists.
     749      * @param process The name of the process to check.
     750      * @param timeout Specifies how long to wait (default is to wait indefinitely).
     751      * @return True if success, false otherwise.
     752      */
     753     public boolean processWait(String process, int timeout) {
     754         Variant vProcess = new Variant(process);
     755         Variant vTimeout = new Variant(timeout);
     756         Variant[] params = new Variant[]{vProcess, vTimeout};
     757         Variant result = autoItX.invoke("ProcessWait", params);
     758         return oneToTrue(result.getInt());
     759     }
     760 
     761     /**
     762      * Pauses script execution until a given process exists.
     763      * @param process The name of the process to check.
     764      * @return True if success, false otherwise.
     765      */
     766     public boolean processWait(String process) {
     767         Variant result = autoItX.invoke("ProcessWait", process);
     768         return oneToTrue(result.getInt());
     769     }
     770 
     771     /**
     772      * Pauses script execution until a given process exists.
     773      * @param process The name of the process to check.
     774      * @param timeout Specifies how long to wait (default is to wait indefinitely).
     775      * @return True if success, false otherwise.
     776      */
     777     public boolean processWaitClose(String process, int timeout) {
     778         Variant vProcess = new Variant(process);
     779         Variant vTimeout = new Variant(timeout);
     780         Variant[] params = new Variant[]{vProcess, vTimeout};
     781         Variant result = autoItX.invoke("ProcessWaitClose", params);
     782         return oneToTrue(result.getInt());
     783     }
     784 
     785     /**
     786      * Pauses script execution until a given process exists.
     787      * @param process The name of the process to check.
     788      * @return True if success, false otherwise.
     789      */
     790     public boolean processWaitClose(String process) {
     791         Variant result = autoItX.invoke("ProcessWaitClose", process);
     792         return oneToTrue(result.getInt());
     793     }
     794 
     795     /**
     796      * Runs an external program.
     797      * @param filename The name of the executable (EXE, BAT, COM, or PIF) to run.
     798      * @param workingDirectory The working directory.
     799      * @param flag The "show" flag of the executed program:
     800      * <br/>SW_HIDE = Hidden window
     801      * <br/>SW_MINIMIZE = Minimized window
     802      * <br/>SW_MAXIMIZE = Maximized window
     803      * @return The PID of the process that was launched. After running the requested program the script continues. To pause execution of the script until the spawned program has finished use the RunWait function instead.
     804      * The error property is set to 1 as an indication of failure.
     805      */
     806     public int run(String filename, String workingDirectory, int flag) {
     807         Variant vFilename = new Variant(filename);
     808         Variant vWorkingDirectory = new Variant(workingDirectory);
     809         Variant vFlag = new Variant(flag);
     810         Variant[] params = new Variant[]{vFilename, vWorkingDirectory, vFlag};
     811         return autoItX.invoke("Run", params).getInt();
     812     }
     813 
     814     /**
     815      * Runs an external program.
     816      * @param filename The name of the executable (EXE, BAT, COM, or PIF) to run.
     817      * @param workingDirectory The working directory.
     818      * @return The PID of the process that was launched. After running the requested program the script continues. To pause execution of the script until the spawned program has finished use the RunWait function instead.
     819      * The error property is set to 1 as an indication of failure.
     820      */
     821     public int run(String filename, String workingDirectory) {
     822         Variant vFilename = new Variant(filename);
     823         Variant vWorkingDirectory = new Variant(workingDirectory);
     824         Variant[] params = new Variant[]{vFilename, vWorkingDirectory};
     825         return autoItX.invoke("Run", params).getInt();
     826     }
     827 
     828     /**
     829      * Runs an external program.
     830      * @param filename The name of the executable (EXE, BAT, COM, or PIF) to run.
     831      * @return The PID of the process that was launched. After running the requested program the script continues. To pause execution of the script until the spawned program has finished use the RunWait function instead.
     832      * The error property is set to 1 as an indication of failure.
     833      */
     834     public int run(String filename) {
     835         return autoItX.invoke("Run", filename).getInt();
     836     }
     837 
     838     /**
     839      * Initialize a set of user credentials to use during Run and RunWait operations. 2000/XP or later ONLY.
     840      * @param username The user name to use.
     841      * @param domain The domain name to use.
     842      * @param password The password to use.
     843      * @param options 0 = do not load the user profile, 1 = (default) load the user profile, 2 = use for net credentials only
     844      * @return Returns 0 if the operating system does not support this function.
     845      * Otherwise returns 1--regardless of success. (If the login information was invalid, subsequent Run/RunWait commands will fail....)
     846      */
     847     public int runAsSet(String username, String domain, String password, int options) {
     848         Variant vUsername = new Variant(username);
     849         Variant vDomain = new Variant(domain);
     850         Variant vPassword = new Variant(password);
     851         Variant vOptions = new Variant(options);
     852         Variant[] params = new Variant[]{vUsername, vDomain, vPassword, vOptions};
     853         return autoItX.invoke("RunAsSet", params).getInt();
     854     }
     855 
     856     /**
     857      * Initialize a set of user credentials to use during Run and RunWait operations. 2000/XP or later ONLY.
     858      * @param username The user name to use.
     859      * @param domain The domain name to use.
     860      * @param password The password to use.
     861      * @return Returns 0 if the operating system does not support this function.
     862      * Otherwise returns 1--regardless of success. (If the login information was invalid, subsequent Run/RunWait commands will fail....)
     863      */
     864     public int runAsSet(String username, String domain, String password) {
     865         return runAsSet(username, domain, password, 1);
     866     }
     867 
     868     /**
     869      * Runs an external program and pauses script execution until the program finishes.
     870      * @param filename The name of the executable (EXE, BAT, COM, PIF) to run.
     871      * @param workingDirectory The working directory.
     872      * @param flag The "show" flag of the executed program:
     873      * <br/>            SW_HIDE = Hidden window
     874      * <br/>            SW_MINIMIZE = Minimized window
     875      * <br/>            SW_MAXIMIZE = Maximized window
     876      * @return Returns the exit code of the program that was run. The error property is set to 1 as an indication of failure.
     877      */
     878     public int runWait(String filename, String workingDirectory, int flag) {
     879         Variant vFilename = new Variant(filename);
     880         Variant vWorkingDirectory = new Variant(workingDirectory);
     881         Variant vFlag = new Variant(flag);
     882         Variant[] params = new Variant[]{vFilename, vWorkingDirectory, vFlag};
     883         return autoItX.invoke("RunWait", params).getInt();
     884     }
     885 
     886     /**
     887      * Runs an external program and pauses script execution until the program finishes.
     888      * @param filename The name of the executable (EXE, BAT, COM, PIF) to run.
     889      * @param workingDirectory The working directory.
     890      * @return Returns the exit code of the program that was run. The error property is set to 1 as an indication of failure.
     891      */
     892     public int runWait(String filename, String workingDirectory) {
     893         Variant vFilename = new Variant(filename);
     894         Variant vWorkingDirectory = new Variant(workingDirectory);
     895         Variant[] params = new Variant[]{vFilename, vWorkingDirectory};
     896         return autoItX.invoke("RunWait", params).getInt();
     897     }
     898 
     899     /**
     900      * Runs an external program and pauses script execution until the program finishes.
     901      * @param filename The name of the executable (EXE, BAT, COM, PIF) to run.
     902      * @return Returns the exit code of the program that was run. The error property is set to 1 as an indication of failure.
     903      */
     904     public int runWait(String filename) {
     905         return autoItX.invoke("RunWait", filename).getInt();
     906     }
     907 
     908     /**
     909      * Shuts down the system.
     910      * @param code The shutdown code is a combination of the following values:
     911      * <br/>0 = Logoff
     912      * <br/>1 = Shutdown
     913      * <br/>2 = Reboot
     914      * <br/>4 = Force
     915      * <br/>8 = Power down
     916      * Add the required values together. To shutdown and power down, for example, the code would be 9 (shutdown + power down = 1 + 8 = 9).
     917      * @return True if success, false otherwise.
     918      */
     919     public boolean shutdown(int code) {
     920         return oneToTrue(autoItX.invoke("Shutdown", new Variant(code)).getInt());
     921     }
     922 
     923     /**
     924      * Deletes a key from the registry.
     925      * @param keyname The registry key to write to.
     926      * @return Success: Returns 1. Special: Returns 0 if the key does not exist. Failure: Returns 2 if error deleting key. 
     927      */
     928     public int regDeleteKey(String keyname) {
     929         return autoItX.invoke("RegDeleteKey", keyname).getInt();
     930     }
     931 
     932     /**
     933      * Deletes a value from the registry.
     934      * @param keyname The registry key to write to.
     935      * @return Success: Returns 1. Special: Returns 0 if the key does not exist. Failure: Returns 2 if error deleting key.
     936      */
     937     public int regDeleteVal(String keyname) {
     938         return autoItX.invoke("RegDeleteVal", keyname).getInt();
     939     }
     940 
     941     /**
     942      * Reads the name of a subkey according to it's instance.
     943      * @param keyname The registry key to read.
     944      * @param instance The 1-based key instance to retrieve.
     945      * @return Success: Returns the requested subkey name. Otherwise Returns "" and sets the .error() flag,  1 if unable to open requested key, -1 if unable to retrieve requested subkey (key instance out of range)
     946      */
     947     public String regEnumKey(String keyname, int instance) {
     948         Variant vKeyname = new Variant(keyname);
     949         Variant vInstance = new Variant(instance);
     950         Variant[] params = new Variant[]{vKeyname, vInstance};
     951         return autoItX.invoke("RegEnumKey", params).getString();
     952     }
     953 
     954     /**
     955      * Reads the name of a value according to it's instance.
     956      * @param keyname The registry key to read.
     957      * @param instance The 1-based key instance to retrieve.
     958      * @return Success: Returns the requested subkey name. Otherwise Returns "" and sets the .error() flag,  1 if unable to open requested key, -1 if unable to retrieve requested subkey (key instance out of range)
     959      */
     960     public String regEnumVal(String keyname, int instance) {
     961         Variant vKeyname = new Variant(keyname);
     962         Variant vInstance = new Variant(instance);
     963         Variant[] params = new Variant[]{vKeyname, vInstance};
     964         return autoItX.invoke("RegEnumVal", params).getString();
     965     }
     966 
     967     /**
     968      * Reads the name of a value according to it's instance.
     969      * @param keyname The registry key to read.
     970      * @param valueName The registry value to read.
     971      * @return Success:Returns the requested registry value value.
     972      * Otherwise Returns numeric 1 and sets the oAutoIt.error flag:
     973      * <br/>1 if unable to open requested key
     974      * <br/>-1 if unable to open requested value
     975      * <br/>-2 if value type not supported
     976      */
     977     public String regRead(String keyname, String valueName) {
     978         Variant vKeyname = new Variant(keyname);
     979         Variant vValueName = new Variant(valueName);
     980         Variant[] params = new Variant[]{vKeyname, vValueName};
     981         Variant result = autoItX.invoke("RegRead", params);
     982         if (result.getvt() == Variant.VariantInt) {
     983             return String.valueOf(result.getInt());
     984         }
     985         if (result.getvt() == Variant.VariantString) {
     986             return result.getString();
     987         }
     988         return "";
     989     }
     990 
     991     /**
     992      * Creates a key or value in the registry.
     993      * @param keyname The registry key to write to. If no other parameters are specified this key will simply be created.
     994      * @param valueName The valuename to write to.
     995      * @param type Type of key to write: "REG_SZ", "REG_MULTI_SZ", "REG_EXPAND_SZ", "REG_DWORD", or "REG_BINARY".
     996      * @param value The value to write.
     997      * @return True if success, false otherwise.
     998      */
     999     public boolean regWrite(String keyname, String valueName, String type, String value) {
    1000         Variant vKeyname = new Variant(keyname);
    1001         Variant vValueName = new Variant(valueName);
    1002         Variant vType = new Variant(type);
    1003         Variant vValue = new Variant(value);
    1004         Variant[] params = new Variant[]{vKeyname, vValueName, vType, vValue};
    1005         Variant result = autoItX.invoke("RegWrite", params);
    1006         return oneToTrue(result.getInt());
    1007     }
    1008 
    1009     /**
    1010      * Pause script execution.
    1011      * @param delay Amount of time to pause (in milliseconds).
    1012      */
    1013     public void sleep(int delay) {
    1014         autoItX.invoke("sleep", delay);
    1015     }
    1016 
    1017     /**
    1018      * Sends a mouse click command to a given control.
    1019      * @param title The title of the window to access.
    1020      * @param text The text of the window to access.
    1021      * @param controlID The control to interact with.
    1022      * @param button The button to click, "left", "right" or "middle". Default is the left button.
    1023      * @param clicks The number of times to click the mouse. Default is center.
    1024      * @param x The x position to click within the control. Default is center.
    1025      * @param y The y position to click within the control. Default is center.
    1026      * @return True if success, false otherwise.
    1027      */
    1028     public boolean controlClick(String title, String text, String controlID, String button, int clicks, int x, int y) {
    1029         Variant vTitle = new Variant(title);
    1030         Variant vText = new Variant(text);
    1031         Variant vControlID = new Variant(controlID);
    1032         Variant vButton = new Variant(button);
    1033         Variant vClicks = new Variant(clicks);
    1034         Variant vX = new Variant(x);
    1035         Variant vY = new Variant(y);
    1036         Variant[] params = new Variant[]{vTitle, vText, vControlID, vButton, vClicks, vX, vY};
    1037         Variant result = autoItX.invoke("ControlClick", params);
    1038         return oneToTrue(result.getInt());
    1039     }
    1040 
    1041     /**
    1042      * Sends a mouse click command to a given control.
    1043      * @param title The title of the window to access.
    1044      * @param text The text of the window to access.
    1045      * @param controlID The control to interact with.
    1046      * @param button The button to click, "left", "right" or "middle". Default is the left button.
    1047      * @param clicks The number of times to click the mouse. Default is center.
    1048      * @return True if success, false otherwise.
    1049      */
    1050     public boolean controlClick(String title, String text, String controlID, String button, int clicks) {
    1051         Variant vTitle = new Variant(title);
    1052         Variant vText = new Variant(text);
    1053         Variant vControlID = new Variant(controlID);
    1054         Variant vButton = new Variant(button);
    1055         Variant vClicks = new Variant(clicks);
    1056         Variant[] params = new Variant[]{vTitle, vText, vControlID, vButton, vClicks};
    1057         Variant result = autoItX.invoke("ControlClick", params);
    1058         return oneToTrue(result.getInt());
    1059     }
    1060 
    1061     /**
    1062      * Sends a mouse click command to a given control.
    1063      * @param title The title of the window to access.
    1064      * @param text The text of the window to access.
    1065      * @param controlID The control to interact with.
    1066      * @param button The button to click, "left", "right" or "middle". Default is the left button.
    1067      * @return True if success, false otherwise.
    1068      */
    1069     public boolean controlClick(String title, String text, String controlID, String button) {
    1070         return controlClick(title, text, controlID, button, 1);
    1071     }
    1072 
    1073     /**
    1074      * Sends a mouse click command to a given control.
    1075      * @param title The title of the window to access.
    1076      * @param text The text of the window to access.
    1077      * @param controlID The control to interact with.
    1078      * @return True if success, false otherwise.
    1079      */
    1080     public boolean controlClick(String title, String text, String controlID) {
    1081         return controlClick(title, text, controlID, "left", 1);
    1082     }
    1083 
    1084     protected String controlCommandString(String title, String text, String control, String command, String option) {
    1085         Variant result = controlCommandVariant(title, text, control, command, option);
    1086         return result.getString();
    1087     }
    1088 
    1089     protected void controlCommandVoid(String title, String text, String control, String command, String option) {
    1090         controlCommandVariant(title, text, control, command, option);
    1091 
    1092     }
    1093 
    1094     protected Variant controlCommandVariant(String title, String text, String control, String command, String option) {
    1095         Variant vTitle = new Variant(title);
    1096         Variant vText = new Variant(text);
    1097         Variant vControl = new Variant(control);
    1098         Variant vCommand = new Variant(command);
    1099         Variant vOption = new Variant(option);
    1100         Variant[] params = new Variant[]{vTitle, vText, vControl, vCommand, vOption};
    1101         return autoItX.invoke("ControlCommand", params);
    1102     }
    1103 
    1104     /**
    1105      * Drops a ComboBox
    1106      * @param title The title of the window to access.
    1107      * @param text The text of the window to access.
    1108      * @param control The control to interact with.
    1109      */
    1110     public void controlCommandShowDropdown(String title, String text, String control) {
    1111         controlCommandVoid(title, text, control, "ShowDropDown", "");
    1112     }
    1113 
    1114     /**
    1115      * Undrops a ComboBox
    1116      * @param title The title of the window to access.
    1117      * @param text The text of the window to access.
    1118      * @param control The control to interact with.
    1119      */
    1120     public void controlCommandHideDropDown(String title, String text, String control) {
    1121         controlCommandVoid(title, text, control, "HideDropDown", "");
    1122     }
    1123 
    1124     /**
    1125      * Checks radio or check Button
    1126      * @param title The title of the window to access.
    1127      * @param text The text of the window to access.
    1128      * @param control The control to interact with.
    1129      */
    1130     public void controlCommandCheck(String title, String text, String control) {
    1131         controlCommandVoid(title, text, control, "Check", "");
    1132     }
    1133 
    1134     /**
    1135      * Unchecks radio or check Button
    1136      * @param title The title of the window to access.
    1137      * @param text The text of the window to access.
    1138      * @param control The control to interact with.
    1139      */
    1140     public void controlCommandUncheck(String title, String text, String control) {
    1141         controlCommandVoid(title, text, control, "UnCheck", "");
    1142     }
    1143 
    1144     /**
    1145      * Adds a string to the end in a ListBox or ComboBox
    1146      * @param title The title of the window to access.
    1147      * @param text The text of the window to access.
    1148      * @param control The control to interact with.
    1149      */
    1150     public void controlCommandAddString(String title, String text, String control, String string) {
    1151         controlCommandVoid(title, text, control, "AddString", string);
    1152     }
    1153 
    1154     /**
    1155      * Deletes a string according to occurrence in a ListBox or ComboBox.
    1156      * @param title The title of the window to access.
    1157      * @param text The text of the window to access.
    1158      * @param control The control to interact with.
    1159      */
    1160     public void controlCommandDeleteString(String title, String text, String control, String occurance) {
    1161         controlCommandVoid(title, text, control, "DelString", occurance);
    1162     }
    1163 
    1164     /**
    1165      * Pastes the 'string' at the Edit's caret position.
    1166      * @param title The title of the window to access.
    1167      * @param text The text of the window to access.
    1168      * @param control The control to interact with.
    1169      */
    1170     public void controlCommandEditPaste(String title, String text, String control, String string) {
    1171         controlCommandVoid(title, text, control, "EditPaste", string);
    1172     }
    1173 
    1174     /**
    1175      * Sets selection to occurrence ref in a ListBox or ComboBox.
    1176      * @param title The title of the window to access.
    1177      * @param text The text of the window to access.
    1178      * @param control The control to interact with.
    1179      */
    1180     public void controlCommandSetCurrentSelection(String title, String text, String control, String occurance) {
    1181         controlCommandVoid(title, text, control, "SetCurrentSelection", occurance);
    1182     }
    1183 
    1184     /**
    1185      * Sets selection according to string in a ListBox or ComboBox
    1186      * @param title The title of the window to access.
    1187      * @param text The text of the window to access.
    1188      * @param control The control to interact with.
    1189      */
    1190     public void controlCommandSelectString(String title, String text, String control, String string) {
    1191         controlCommandVoid(title, text, control, "SelectString", string);
    1192     }
    1193 
    1194     protected boolean controlCommandBoolean(String title, String text, String control, String command, String option) {
    1195         return oneToTrue(controlCommandInts(title, text, control, command, option));
    1196     }
    1197 
    1198     /**
    1199      * Checks whether a control is visible.
    1200      * @param title The title of the window to access.
    1201      * @param text The text of the window to access.
    1202      * @param control The control to interact with.
    1203      * @return True if is visible.
    1204      */
    1205     public boolean controlCommandIsVisible(String title, String text, String control) {
    1206         return controlCommandBoolean(title, text, control, "IsVisible", "");
    1207     }
    1208 
    1209     /**
    1210      * Checks whether a control is checked.
    1211      * @param title The title of the window to access.
    1212      * @param text The text of the window to access.
    1213      * @param control The control to interact with.
    1214      * @return True if is checked.
    1215      */
    1216     public boolean controlCommandIsChecked(String title, String text, String control) {
    1217         return controlCommandBoolean(title, text, control, "IsChecked", "");
    1218     }
    1219 
    1220     /**
    1221      * Checks whether a control is enabled.
    1222      * @param title The title of the window to access.
    1223      * @param text The text of the window to access.
    1224      * @param control The control to interact with.
    1225      * @return True if is enabled.
    1226      */
    1227     public boolean controlCommandIsEnabled(String title, String text, String control) {
    1228         return controlCommandBoolean(title, text, control, "IsEnabled", "");
    1229     }
    1230 
    1231     /**
    1232      * Returns occurrence ref of the exact string in a ListBox or ComboBox.
    1233      * @param title The title of the window to access.
    1234      * @param text The text of the window to access.
    1235      * @param control The control to interact with.
    1236      * @return Returns occurrence ref of the exact string in a ListBox or ComboBox.
    1237      */
    1238     public int controlCommandFindString(String title, String text, String control, String string) {
    1239         return controlCommandInts(title, text, control, "FindString", string);
    1240     }
    1241 
    1242     protected int controlCommandInts(String title, String text, String control, String command, String option) {
    1243         Variant result = controlCommandVariant(title, text, control, command, option);
    1244         int iResult = 0;
    1245         if (result.getvt() == Variant.VariantString) {
    1246             iResult = Integer.parseInt(result.getString());
    1247         }
    1248         return iResult;
    1249     }
    1250 
    1251     /**
    1252      * Returns the line # where the caret is in an Edit
    1253      * @param title The title of the window to access.
    1254      * @param text The text of the window to access.
    1255      * @param control The control to interact with.
    1256      * @return Returns the line # where the caret is in an Edit
    1257      */
    1258     public int controlCommandGetCurrentLine(String title, String text, String control) {
    1259         return controlCommandInts(title, text, control, "GetCurrentLine", "");
    1260     }
    1261 
    1262     /**
    1263      * Returns the column # where the caret is in an Edit
    1264      * @param title The title of the window to access.
    1265      * @param text The text of the window to access.
    1266      * @param control The control to interact with.
    1267      * @return Returns the line # where the caret is in an Edit
    1268      */
    1269     public int controlCommandGetCurrentCol(String title, String text, String control) {
    1270         return controlCommandInts(title, text, control, "GetCurrentCol", "");
    1271     }
    1272 
    1273     /**
    1274      * Returns the column # where the caret is in an Edit
    1275      * @param title The title of the window to access.
    1276      * @param text The text of the window to access.
    1277      * @param control The control to interact with.
    1278      * @return Returns the line # where the caret is in an Edit
    1279      */
    1280     public int controlCommandGetLineCount(String title, String text, String control) {
    1281         return controlCommandInts(title, text, control, "GetLineCount", "");
    1282     }
    1283 
    1284     /**
    1285      * Sets selection according to string in a ListBox or ComboBox
    1286      * @param title The title of the window to access.
    1287      * @param text The text of the window to access.
    1288      * @param control The control to interact with.
    1289      * @param charLength The er size.
    1290      */
    1291     public String controlCommandGetCurrentSelection(String title, String text, String control, int charLength) {
    1292         return controlCommandString(title, text, control, "GetCurrentSelection", "");
    1293     }
    1294 
    1295     /**
    1296      * Returns selected text of an Edit.
    1297      * @param title The title of the window to access.
    1298      * @param text The text of the window to access.
    1299      * @param control The control to interact with.
    1300      */
    1301     public String controlCommandGetSelected(String title, String text, String control, int charLength) {
    1302         return controlCommandString(title, text, control, "GetSelected", "");
    1303     }
    1304 
    1305     /**
    1306      * Moves to the next tab to the right of a SysTabControl32
    1307      * @param title The title of the window to access.
    1308      * @param text The text of the window to access.
    1309      * @param control The control to interact with.
    1310      */
    1311     public void controlCommandTabLeft(String title, String text, String control) {
    1312         controlCommandVoid(title, text, control, "TabLeft", "");
    1313     }
    1314 
    1315     /**
    1316      * Moves to the next tab to the right of a SysTabControl32
    1317      * @param title The title of the window to access.
    1318      * @param text The text of the window to access.
    1319      * @param control The control to interact with.
    1320      */
    1321     public void controlCommandTabRight(String title, String text, String control) {
    1322         controlCommandVoid(title, text, control, "TabRight", "");
    1323     }
    1324 
    1325     /**
    1326      * Returns the current Tab shown of a SysTabControl32.
    1327      * @param title The title of the window to access.
    1328      * @param text The text of the window to access.
    1329      * @param control The control to interact with.
    1330      */
    1331     public String controlCommandCurrentTab(String title, String text, String control) {
    1332         return controlCommandString(title, text, control, "CurrentTab", "");
    1333     }
    1334 
    1335     /**
    1336      * Disables or "grays-out" a control.
    1337      * @param title The title of the window to access.
    1338      * @param text The text of the window to access.
    1339      * @param control The control to interact with.
    1340      * @return True if success, false otherwise.
    1341      */
    1342     public boolean controlDisable(String title, String text, String control) {
    1343         Variant vTitle = new Variant(title);
    1344         Variant vText = new Variant(text);
    1345         Variant vControl = new Variant(control);
    1346         Variant[] params = new Variant[]{vTitle, vText, vControl};
    1347         Variant result = autoItX.invoke("ControlDisable", params);
    1348         return oneToTrue(result.getInt());
    1349     }
    1350 
    1351     /**
    1352      * Enables a "grayed-out" control.
    1353      * Use with caution.
    1354      * When using a control name in the Control functions, you need to add a number to the end of the name to indicate which control. For example, if there two controls listed called "MDIClient", you would refer to these as "MDIClient1" and "MDIClient2".
    1355      * @param title The title of the window to access.
    1356      * @param text The text of the window to access.
    1357      * @param control The control to interact with.
    1358      * @return True if success, false otherwise.
    1359      */
    1360     public boolean controlEnable(String title, String text, String control) {
    1361         Variant vTitle = new Variant(title);
    1362         Variant vText = new Variant(text);
    1363         Variant vControl = new Variant(control);
    1364         Variant[] params = new Variant[]{vTitle, vText, vControl};
    1365         Variant result = autoItX.invoke("ControlEnable", params);
    1366         return oneToTrue(result.getInt());
    1367     }
    1368 
    1369     /**
    1370      * Sets input focus to a given control on a window.
    1371      * @param title The title of the window to access.
    1372      * @param text The text of the window to access.
    1373      * @param control The control to interact with.
    1374      * @return True if success, false otherwise.
    1375      */
    1376     public boolean controlFocus(String title, String text, String control) {
    1377         return controlBool(title, text, control, "ControlFocus");
    1378     }
    1379 
    1380     /**
    1381      * Returns the ControlRef# of the control that has keyboard focus within a specified window.
    1382      * @param title Title of window to check.
    1383      * @param text Text from window to check.
    1384      * @return ControlRef# of the control that has keyboard focus within a specified window. Otherwise returns a blank string and sets .error() to 1 if window is not found.
    1385      */
    1386     public String controlGetFocus(String title, String text) {
    1387         Variant vTitle = new Variant(title);
    1388         Variant vText = new Variant(text);
    1389         Variant[] params = new Variant[]{vTitle, vText};
    1390         return autoItX.invoke("ControlGetFocus", params).getString();
    1391     }
    1392 
    1393     /**
    1394      * Returns the ControlRef# of the control that has keyboard focus within a specified window.
    1395      * @param title Title of window to check.
    1396      * @return ControlRef# of the control that has keyboard focus within a specified window. Otherwise returns a blank string and sets .error() to 1 if window is not found.
    1397      */
    1398     public String controlGetFocus(String title) {
    1399         return autoItX.invoke("ControlGetFocus", title).getString();
    1400     }
    1401 
    1402     /**
    1403      * Retrieves the internal handle of a control.
    1404      * @param title The title of the window to read.
    1405      * @param text The text of the window to read.
    1406      * @param controlID The control to interact with.
    1407      * @return Returns a string containing the control handle value. Otherwise returns "" (blank string) and sets oAutoIt.error to 1 if no window matches the criteria.
    1408      */
    1409     public String controlGetHandle(String title, String text, String controlID) {
    1410         return controlString(title, text, controlID, "ControlGetHandle");
    1411     }
    1412 
    1413     /**
    1414      * Retrieves the position and size of a control relative to it's window.
    1415      * @param title The title of the window to access.
    1416      * @param text The text of the window to access.
    1417      * @param controlID The control to interact with.
    1418      * @return The X coordinate of the control. Otherwise returns the X coordinate of the control.
    1419      */
    1420     public int controlGetPosX(String title, String text, String controlID) {
    1421         return controlInt(title, text, controlID, "ControlGetPosX");
    1422     }
    1423 
    1424     /**
    1425      * Retrieves the position and size of a control relative to it's window.
    1426      * @param title The title of the window to access.
    1427      * @param text The text of the window to access.
    1428      * @param controlID The control to interact with.
    1429      * @return The Y coordinate of the control. Otherwise returns the Y coordinate of the control.
    1430      */
    1431     public int controlGetPosY(String title, String text, String controlID) {
    1432         return controlInt(title, text, controlID, "ControlGetPosY");
    1433     }
    1434 
    1435     /**
    1436      * Retrieves the position and size of a control relative to it's window.
    1437      * @param title The title of the window to access.
    1438      * @param text The text of the window to access.
    1439      * @param controlID The control to interact with.
    1440      * @return The width of the control. Otherwise sets .error() to 1.
    1441      */
    1442     public int controlGetPosWidth(String title, String text, String controlID) {
    1443         return controlInt(title, text, controlID, "ControlGetPosWidth");
    1444     }
    1445 
    1446     /**
    1447      * Retrieves the position and size of a control relative to it's window.
    1448      * @param title The title of the window to access.
    1449      * @param text The text of the window to access.
    1450      * @param controlID The control to interact with.
    1451      * @return Returns the height of the control. Otherwise returns the Y coordinate of the control.
    1452      */
    1453     public int controlGetPosHeight(String title, String text, String controlID) {
    1454         return controlInt(title, text, controlID, "ControlGetPosHeight");
    1455     }
    1456 
    1457     /**
    1458      * Retrieves text from a control.
    1459      * @param title The title of the window to access.
    1460      * @param text The text of the window to access.
    1461      * @param controlID The control to interact with.
    1462      * @return Text from a control. If fails, sets .error() to 1 and returns a blank string of "".
    1463      */
    1464     public String controlGetText(String title, String text, String controlID) {
    1465         return controlString(title, text, controlID, "ControlGetText");
    1466     }
    1467 
    1468     /**
    1469      * Hides a control.
    1470      * @param title The title of the window to access.
    1471      * @param text The text of the window to access.
    1472      * @param controlID The control to interact with.
    1473      * @return True if success, false otherwise.
    1474      */
    1475     public boolean controlHide(String title, String text, String controlID) {
    1476         return controlBool(title, text, controlID, "ControlHide");
    1477     }
    1478 
    1479     /**
    1480      * Returns the item index of the string. Returns -1 if the string is not found.
    1481      * @param title The title of the window to access.
    1482      * @param text The text of the window to access.
    1483      * @param control The control to interact with.
    1484      * @param string String to find
    1485      * @param subitem The SubItem
    1486      * @return Returns the item index of the string. Returns -1 if the string is not found.
    1487      */
    1488     public int controlListViewFindItem(String title, String text, String control, String string, String subitem) {
    1489         return controlListViewInt(title, text, control, "FindItem", string, subitem);
    1490     }
    1491 
    1492     protected int controlListViewInt(String title, String text, String control, String command, String option, String option2) {
    1493         return controlView(title, text, control, command, option, option2, "ControlListView").getInt();
    1494     }
    1495 
    1496     protected String controlListViewString(String title, String text, String control, String command, String option, String option2) {
    1497         return controlView(title, text, control, command, option, option2, "ControlListView").getString();
    1498     }
    1499 
    1500     protected Variant controlView(String title, String text, String control, String command, String option, String option2, String function) {
    1501         Variant vTitle = new Variant(title);
    1502         Variant vText = new Variant(text);
    1503         Variant vControl = new Variant(control);
    1504         Variant vCommand = new Variant(command);
    1505         Variant vOption = new Variant(option);
    1506         Variant vOption2 = new Variant(option2);
    1507         Variant[] params = new Variant[]{vTitle, vText, vControl, vCommand, vOption, vOption2};
    1508         return autoItX.invoke(function, params);
    1509     }
    1510 
    1511     /**
    1512      * Returns the number of list items.
    1513      * @param title The title of the window to access.
    1514      * @param text The text of the window to access.
    1515      * @param control The control to interact with.
    1516      * @return Returns the number of list items.
    1517      */
    1518     public int controlListViewGetItemCount(String title, String text, String control) {
    1519         return controlListViewInt(title, text, control, "GetItemCount", "", "");
    1520 
    1521     }
    1522 
    1523     /**
    1524      * Returns the number of items that are selected.
    1525      * @param title The title of the window to access.
    1526      * @param text The text of the window to access.
    1527      * @param control The control to interact with.
    1528      * @return Returns the number of items that are selected.
    1529      */
    1530     public int controlListViewGetSelectedCount(String title, String text, String control) {
    1531         return controlListViewInt(title, text, control, "GetSelectedCount", "", "");
    1532     }
    1533 
    1534     /**
    1535      * Returns the number of subitems.
    1536      * @param title The title of the window to access.
    1537      * @param text The text of the window to access.
    1538      * @param control The control to interact with.
    1539      * @return Returns the number of subitems.
    1540      */
    1541     public int controlListViewGetSubItemCount(String title, String text, String control) {
    1542         return controlListViewInt(title, text, control, "GetSubItemCount", "", "");
    1543     }
    1544 
    1545     /**
    1546      * Returns the text of a given item/subitem.
    1547      * @param title The title of the window to access.
    1548      * @param text The text of the window to access.
    1549      * @param control The control to interact with.
    1550      * @param item The text of an item.
    1551      * @param subitem The text of a subitem.
    1552      * @return Returns the text of a given item/subitem.
    1553      */
    1554     public String controlListViewGetText(String title, String text, String control, String item, String subitem) {
    1555         return controlListViewString(title, text, control, "GetText", item, subitem);
    1556     }
    1557 
    1558     /**
    1559      * Returns 1 if the item is selected, otherwise returns 0.
    1560      * Returns the text of a given item/subitem.
    1561      * @param title The title of the window to access.
    1562      * @param text The text of the window to access.
    1563      * @param control The control to interact with.
    1564      * @param item The text of an item.
    1565      * @return Returns 1 if the item is selected, otherwise returns 0.
    1566      */
    1567     public boolean controlListViewIsSelected(String title, String text, String control, String item) {
    1568         return oneToTrue(controlListViewInt(title, text, control, "IsSelected", item, ""));
    1569     }
    1570 
    1571     /**
    1572      * Returns a string containing the item index of selected items. If option=0 (default) only the first selected item is returned. If option=1 then all the selected items are returned delimited by |, e.g: "0|3|4|10". If no items are selected a blank "" string is returned.
    1573      * @param title The title of the window to access.
    1574      * @param text The text of the window to access.
    1575      * @param control The control to interact with.
    1576      * @return Returns a string containing the item index of selected items. If option=0 (default) only the first selected item is returned. If option=1 then all the selected items are returned delimited by |, e.g: "0|3|4|10". If no items are selected a blank "" string is returned.
    1577      */
    1578     public String controlListViewGetSelected(String title, String text, String control) {
    1579         return controlListViewString(title, text, control, "GetSelected", "", "");
    1580     }
    1581 
    1582     /**
    1583      * Returns a string containing the item index of selected items. If option=0 (default) only the first selected item is returned. If option=1 then all the selected items are returned delimited by |, e.g: "0|3|4|10". If no items are selected a blank "" string is returned.
    1584      * If no items are selected a blank "" string is returned.
    1585      * @param title The title of the window to access.
    1586      * @param text The text of the window to access.
    1587      * @param control The control to interact with.
    1588      * @return Returns a string containing the item index of selected items. If option=0 (default) only the first selected item is returned. If option=1 then all the selected items are returned delimited by |, e.g: "0|3|4|10". If no items are selected a blank "" string is returned.
    1589      */
    1590     public String[] controlListViewGetSelectedArray(String title, String text, String control) {
    1591         SafeArray safeArr = controlView(title, text, control, "GetSelected", "", "", "ControlListView").toSafeArray();
    1592         return safeArr.toStringArray();
    1593     }
    1594 
    1595     /**
    1596      * Selects one or more items.
    1597      * @param title The title of the window to access.
    1598      * @param text The text of the window to access.
    1599      * @param control The control to interact with.
    1600      * @param from The start index.
    1601      * @param to The to index.
    1602      */
    1603     public void controlListViewSelect(String title, String text, String control, String from, String to) {
    1604         controlView(title, text, control, "Select", from, to, "ControlListView");
    1605     }
    1606 
    1607     /**
    1608      * Selects all items.
    1609      * @param title The title of the window to access.
    1610      * @param text The text of the window to access.
    1611      * @param control The control to interact with.
    1612      */
    1613     public void controlListViewSelectAll(String title, String text, String control, String from, String to) {
    1614         controlView(title, text, control, "SelectAll", from, to, "ControlListView");
    1615     }
    1616 
    1617     /**
    1618      * Selects all items.
    1619      * @param title The title of the window to access.
    1620      * @param text The text of the window to access.
    1621      * @param control The control to interact with.
    1622      * @param from The start index.
    1623      */
    1624     public void controlListViewSelectAll(String title, String text, String control, String from) {
    1625         Variant vTitle = new Variant(title);
    1626         Variant vText = new Variant(text);
    1627         Variant vControl = new Variant(control);
    1628         Variant vCommand = new Variant("SelectAll");
    1629         Variant vFrom = new Variant(from);
    1630         Variant[] params = new Variant[]{vTitle, vText, vControl, vCommand, vFrom};
    1631         autoItX.invoke("ControlListView", params);
    1632     }
    1633 
    1634     /**
    1635      * Clears the selection of all items.
    1636      * @param title The title of the window to access.
    1637      * @param text The text of the window to access.
    1638      * @param control The control to interact with.
    1639      */
    1640     public void controlListViewSelectClear(String title, String text, String control) {
    1641         controlView(title, text, control, "SelectClear", "", "", "ControlListView");
    1642     }
    1643 
    1644     /**
    1645      * Inverts the current selection.
    1646      * @param title The title of the window to access.
    1647      * @param text The text of the window to access.
    1648      * @param control The control to interact with.
    1649 
    1650      */
    1651     public void controlListViewSelectInvert(String title, String text, String control) {
    1652         controlView(title, text, control, "SelectInvert", "", "", "ControlListView");
    1653     }
    1654 
    1655     /**
    1656      * Changes the current view. Valid views are "list", "details", "smallicons", "largeicons".
    1657      * @param title The title of the window to access.
    1658      * @param text The text of the window to access.
    1659      * @param control The control to interact with.
    1660      * @param view Valid views are "list", "details", "smallicons", "largeicons".
    1661      */
    1662     public void controlListViewSelectViewChange(String title, String text, String control, String view) {
    1663         controlView(title, text, control, "ViewChnage", view, "", "ControlListView");
    1664     }
    1665 
    1666     protected Variant controlVariant(String title, String text, String control, String function) {
    1667         Variant vTitle = new Variant(title);
    1668         Variant vText = new Variant(text);
    1669         Variant vControl = new Variant(control);
    1670         Variant[] params = new Variant[]{vTitle, vText, vControl};
    1671         return autoItX.invoke(function, params);
    1672     }
    1673 
    1674     protected boolean controlBool(String title, String text, String control, String function) {
    1675         Variant result = controlVariant(title, text, control, function);
    1676         return oneToTrue(result.getInt());
    1677     }
    1678 
    1679     protected int controlInt(String title, String text, String control, String function) {
    1680         Variant result = controlVariant(title, text, control, function);
    1681         return result.getInt();
    1682     }
    1683 
    1684     protected String controlString(String title, String text, String control, String function) {
    1685         Variant result = controlVariant(title, text, control, function);
    1686         if (result.getvt() == Variant.VariantString) {
    1687             return result.getString();
    1688         }
    1689         if (result.getvt() == Variant.VariantInt) {
    1690             return String.valueOf(result.getInt());
    1691         }
    1692         return "";
    1693     }
    1694 
    1695     /**
    1696      * Moves a control within a window.
    1697      * @param title The title of the window to access.
    1698      * @param text The text of the window to access.
    1699      * @param control The control to interact with.
    1700      * @param x X coordinate to move to.
    1701      * @param y Y coordinate to move to.
    1702      * @param width New width of the window.
    1703      * @param height New height of the window.
    1704      * @return True if success, false otherwise
    1705      */
    1706     public boolean controlMove(String title, String text, String control, int x, int y, int width, int height) {
    1707         Variant vTitle = new Variant(title);
    1708         Variant vText = new Variant(text);
    1709         Variant vControl = new Variant(control);
    1710         Variant vX = new Variant(x);
    1711         Variant vY = new Variant(y);
    1712         Variant vWidth = new Variant(width);
    1713         Variant vHeight = new Variant(height);
    1714         Variant[] params = new Variant[]{vTitle, vText, vControl, vX, vY, vWidth, vHeight};
    1715         Variant result = autoItX.invoke("ControlMove", params);
    1716         return oneToTrue(result.getInt());
    1717     }
    1718 
    1719     /**
    1720      * Moves a control within a window.
    1721      * @param title The title of the window to access.
    1722      * @param text The text of the window to access.
    1723      * @param control The control to interact with.
    1724      * @param x X coordinate to move to.
    1725      * @param y Y coordinate to move to.
    1726      * @return True if success, false otherwise
    1727      */
    1728     public boolean controlMove(String title, String text, String control, int x, int y) {
    1729         Variant vTitle = new Variant(title);
    1730         Variant vText = new Variant(text);
    1731         Variant vControl = new Variant(control);
    1732         Variant vX = new Variant(x);
    1733         Variant vY = new Variant(y);
    1734         Variant[] params = new Variant[]{vTitle, vText, vControl, vX, vY};
    1735         Variant result = autoItX.invoke("ControlMove", params);
    1736         return oneToTrue(result.getInt());
    1737     }
    1738 
    1739     /**
    1740      * Sends a string of characters to a control.
    1741      * @param title The title of the window to access.
    1742      * @param text The text of the window to access.
    1743      * @param control The control to interact with.
    1744      * @param string String of characters to send to the control.
    1745      * @param sendRawKeys If true, text contains special characters like + to indicate SHIFT and {LEFT} to indicate left arrow. If false, text is sent raw.
    1746      * @return  True if success, false otherwise
    1747      */
    1748     public boolean controlSend(String title, String text, String control, String string, boolean sendRawKeys) {
    1749         Variant vTitle = new Variant(title);
    1750         Variant vText = new Variant(text);
    1751         Variant vControl = new Variant(control);
    1752         Variant vString = new Variant(string);
    1753         int flag = (sendRawKeys) ? 1 : 0;
    1754         Variant vFlag = new Variant(flag);
    1755         Variant[] params = new Variant[]{vTitle, vText, vControl, vString, vFlag};
    1756         Variant result = autoItX.invoke("ControlSend", params);
    1757         return oneToTrue(result.getInt());
    1758     }
    1759 
    1760     /**
    1761      * Sends a string of characters to a control.
    1762      * @param title The title of the window to access.
    1763      * @param text The text of the window to access.
    1764      * @param control The control to interact with.
    1765      * @param string String of characters to send to the control.
    1766      * @return True if success, false otherwise
    1767      */
    1768     public boolean controlSend(String title, String text, String control, String string) {
    1769         return controlSend(title, text, control, string, false);
    1770     }
    1771 
    1772     /**
    1773      * Sets text of a control.
    1774      * Sends a string of characters to a control.
    1775      * @param title The title of the window to access.
    1776      * @param text The text of the window to access.
    1777      * @param control The control to interact with.
    1778      * @param string The new text to be set into the control.
    1779      * @return True if success, false otherwise
    1780      */
    1781     public boolean ControlSetText(String title, String text, String control, String string) {
    1782         Variant vTitle = new Variant(title);
    1783         Variant vText = new Variant(text);
    1784         Variant vControl = new Variant(control);
    1785         Variant vString = new Variant(string);
    1786         Variant[] params = new Variant[]{vTitle, vText, vControl, vString};
    1787         Variant result = autoItX.invoke("ControlSetText", params);
    1788         return oneToTrue(result.getInt());
    1789     }
    1790 
    1791     /**
    1792      * Shows a control that was hidden.
    1793      * @param title The title of the window to access.
    1794      * @param text The text of the window to access.
    1795      * @param control The control to interact with.
    1796      * @return True if success, false otherwise.
    1797      */
    1798     public boolean controlShow(String title, String text, String control) {
    1799         return controlBool(title, text, control, "ControlShow");
    1800     }
    1801 
    1802     protected String controlTreeViewString(String title, String text, String control, String command, String option, String option2) {
    1803         return controlView(title, text, control, command, option, option2, "ControlTreeView").getString();
    1804     }
    1805 
    1806     protected int controlTreeViewInt(String title, String text, String control, String command, String option, String option2) {
    1807         return controlView(title, text, control, command, option, option2, "ControlTreeView").getInt();
    1808     }
    1809 
    1810     public boolean controlTreeViewBoolean(String title, String text, String control, String command, String option, String option2) {
    1811         Variant result = controlView(title, text, control, command, option, option2, "ControlTreeView");
    1812         return oneToTrue(result.getInt());
    1813     }
    1814 
    1815     /**
    1816      * Checks an item (if the item supports it).
    1817      * @param title The title of the window to access.
    1818      * @param text The text of the window to access.
    1819      * @param control The control to interact with.
    1820      * @param item The item to check
    1821      */
    1822     public void controlTreeViewCheck(String title, String text, String control, String item) {
    1823         controlView(title, text, control, "Check", item, "", "ControlTreeView");
    1824     }
    1825 
    1826     /**
    1827      * Collapses an item to hide its children.
    1828      * @param title The title of the window to access.
    1829      * @param text The text of the window to access.
    1830      * @param control The control to interact with.
    1831      * @param item The item to check
    1832      */
    1833     public void controlTreeViewCollapse(String title, String text, String control, String item) {
    1834         controlView(title, text, control, "Collapse", item, "", "ControlTreeView");
    1835     }
    1836 
    1837     /**
    1838      * Checks if an item exists
    1839      * @param title The title of the window to access.
    1840      * @param text The text of the window to access.
    1841      * @param control The control to interact with.
    1842      * @param item The item to check
    1843      */
    1844     public Boolean controlTreeViewExists(String title, String text, String control, String item) {
    1845         return controlTreeViewBoolean(title, text, control, "Exists", item, "");
    1846     }
    1847 
    1848     /**
    1849      * Expands an item to show its children.
    1850      * @param title The title of the window to access.
    1851      * @param text The text of the window to access.
    1852      * @param control The control to interact with.
    1853      * @param item The item to expand
    1854      */
    1855     public void controlTreeViewExpand(String title, String text, String control, String item) {
    1856         controlView(title, text, control, "Expand", item, "", "ControlTreeView");
    1857     }
    1858 
    1859     /**
    1860      * Returns the number of children for a selected item.
    1861      * @param title The title of the window to access.
    1862      * @param text The text of the window to access.
    1863      * @param control The control to interact with.
    1864      * @param item The item to check
    1865      * @return The number of children for a selected item.
    1866      */
    1867     public int controlTreeViewGetItemCount(String title, String text, String control, String item) {
    1868         return controlTreeViewInt(title, text, control, "GetItemCount", item, "");
    1869     }
    1870 
    1871     /**
    1872      * Returns the item reference of the current selection using the index reference of the item.
    1873      * @param title The title of the window to access.
    1874      * @param text The text of the window to access.
    1875      * @param control The control to interact with.
    1876      * @return The item reference of the current selection using the index reference of the item.
    1877      */
    1878     public int controlTreeViewGetSelectedItemIndex(String title, String text, String control) {
    1879         Variant vTitle = new Variant(title);
    1880         Variant vText = new Variant(text);
    1881         Variant vControl = new Variant(control);
    1882         Variant vCommand = new Variant("GetSelected");
    1883         Variant vIndex = new Variant(1);
    1884         Variant[] params = new Variant[]{vTitle, vText, vControl, vCommand, vIndex};
    1885         return autoItX.invoke("ControlTreeView", params).getInt();
    1886     }
    1887 
    1888     /**
    1889      * Returns the item reference of the current selection using the text reference of the item.
    1890      * @param title The title of the window to access.
    1891      * @param text The text of the window to access.
    1892      * @param control The control to interact with.
    1893      * @return The item reference of the current selection using the text reference of the item.
    1894      */
    1895     public String controlTreeViewGetSelectedItemText(String title, String text, String control) {
    1896         Variant vTitle = new Variant(title);
    1897         Variant vText = new Variant(text);
    1898         Variant vControl = new Variant(control);
    1899         Variant vCommand = new Variant("GetSelected");
    1900         Variant vIndex = new Variant(0);
    1901         Variant[] params = new Variant[]{vTitle, vText, vControl, vCommand, vIndex};
    1902         return autoItX.invoke("ControlTreeView", params).getString();
    1903     }
    1904 
    1905     /**
    1906      * GetText
    1907      * @param title The title of the window to access.
    1908      * @param text The text of the window to access.
    1909      * @param control The control to interact with.
    1910      * @param item The item to get
    1911      * @return The the text of an item.
    1912      */
    1913     public String controlTreeViewGetText(String title, String text, String control, String item) {
    1914         return controlTreeViewString(title, text, control, "GetText", item, "");
    1915     }
    1916 
    1917     /**
    1918      * Returns the state of an item. 1:checked, 0:unchecked, -1:not a checkbox.
    1919      * @param title The title of the window to access.
    1920      * @param text The text of the window to access.
    1921      * @param control The control to interact with.
    1922      * @return Returns the state of an item. 1:checked, 0:unchecked, -1:not a checkbox.
    1923      */
    1924     public int controlTreeViewIsChecked(String title, String text, String control) {
    1925         return controlView(title, text, control, "IsChecked", "", "", "ControlTreeView").getInt();
    1926     }
    1927 
    1928     /**
    1929      * Selects an item.
    1930      * @param title The title of the window to access.
    1931      * @param text The text of the window to access.
    1932      * @param control The control to interact with.
    1933      * @param item The item to select
    1934      */
    1935     public void controlTreeViewSelect(String title, String text, String control, String item) {
    1936         controlView(title, text, control, "Select", item, "", "ControlTreeView");
    1937     }
    1938 
    1939     /**
    1940      * Uncheck an item.
    1941      * @param title The title of the window to access.
    1942      * @param text The text of the window to access.
    1943      * @param control The control to interact with.
    1944      * @param item The item to select
    1945      */
    1946     public void controlTreeViewUncheck(String title, String text, String control, String item) {
    1947         controlView(title, text, control, "Uncheck", item, "", "ControlTreeView");
    1948     }
    1949 
    1950     /**
    1951      * Retrieves the text from a standard status bar control.
    1952      * @param title The title of the window to check.
    1953      * @param text The text of the window to check.
    1954      * @param part The "part" number of the status bar to read - the default is 1. 1 is the first possible part and usually the one that contains the useful messages like "Ready" "Loading...", etc.
    1955      * @return The text from a standard status bar control.
    1956      */
    1957     public String statusbarGetText(String title, String text, int part) {
    1958         Variant vTitle = new Variant(title);
    1959         Variant vText = new Variant(text);
    1960         Variant vPart = new Variant(part);
    1961         Variant[] params = new Variant[]{vTitle, vText, vPart};
    1962         return autoItX.invoke("StatusbarGetText", params).getString();
    1963     }
    1964 
    1965     /**
    1966      * Retrieves the text from a standard status bar control.
    1967      * @param title The title of the window to check.
    1968      * @param text The text of the window to check.
    1969      * @return  The text from a standard status bar control.
    1970      */
    1971     public String StatusbarGetText(String title, String text) {
    1972         return winVariant(title, text, "StatusbarGetText").getString();
    1973 
    1974     }
    1975 
    1976     protected Variant winVariant(String title, String text, String function) {
    1977         Variant vTitle = new Variant(title);
    1978         Variant vText = new Variant(text);
    1979         Variant[] params = new Variant[]{vTitle, vText};
    1980         return autoItX.invoke(function, params);
    1981     }
    1982 
    1983     protected Variant winVariant(String title, String function) {
    1984         Variant vTitle = new Variant(title);
    1985         Variant[] params = new Variant[]{vTitle};
    1986         return autoItX.invoke(function, params);
    1987     }
    1988 
    1989     /**
    1990      * Activates (gives focus to) a window.
    1991      * @param title The title of the window to activate.
    1992      * @param text The text of the window to activate.
    1993      */
    1994     public void winActivate(String title, String text) {
    1995         winVariant(title, text, "WinActivate");
    1996     }
    1997 
    1998     /**
    1999      * Activates (gives focus to) a window.
    2000      * @param title The title of the window to activate.
    2001      */
    2002     public void winActivate(String title) {
    2003         winVariant(title, "WinActivate");
    2004     }
    2005 
    2006     /**
    2007      * Checks to see if a specified window exists and is currently active.
    2008      * @param title The title of the window to activate.
    2009      * @param text The text of the window to activate.
    2010      */
    2011     public void winActive(String title, String text) {
    2012         winVariant(title, text, "WinActive");
    2013     }
    2014 
    2015     /**
    2016      * Checks to see if a specified window exists and is currently active.
    2017      * @param title The title of the window to activate.
    2018      */
    2019     public void winActive(String title) {
    2020         winVariant(title, "WinActive");
    2021     }
    2022 
    2023     /**
    2024      * Closes a window.
    2025      * @param title The title of the window to activate.
    2026      * @param text The text of the window to activate.
    2027      */
    2028     public void winClose(String title, String text) {
    2029         winVariant(title, text, "WinClose");
    2030     }
    2031 
    2032     /**
    2033      * Closes a window.
    2034      * @param title The title of the window to activate.
    2035      */
    2036     public void winClose(String title) {
    2037         winVariant(title, "WinClose");
    2038     }
    2039 
    2040     /**
    2041      * Checks to see if a specified window exists.
    2042      * @param title The title of the window to activate.
    2043      * @param text The text of the window to activate.
    2044      * @return True if window exists, false otherwise.
    2045      */
    2046     public boolean winExists(String title, String text) {
    2047         Variant result = winVariant(title, text, "WinExists");
    2048         return oneToTrue(result.getInt());
    2049     }
    2050 
    2051     /**
    2052      * Checks to see if a specified window exists.
    2053      * @param title The title of the window to activate.
    2054      * @return True if window exists, false otherwise.
    2055      */
    2056     public boolean winExists(String title) {
    2057         Variant result = winVariant(title, "WinExists");
    2058         return oneToTrue(result.getInt());
    2059     }
    2060 
    2061     /**
    2062      * Returns the coordinates of the caret in the foreground window
    2063      * @return The coordinates of the caret in the foreground window
    2064      */
    2065     public int winGetCaretPosX() {
    2066         return autoItX.invoke("WinGetCaretPosX").getInt();
    2067     }
    2068 
    2069     /**
    2070      * Returns the coordinates of the caret in the foreground window
    2071      * @return The coordinates of the caret in the foreground window
    2072      */
    2073     public int winGetCaretPosY() {
    2074         return autoItX.invoke("WinGetCaretPosY").getInt();
    2075     }
    2076 
    2077     /**
    2078      * Retrieves the classes from a window.
    2079      * @param title The title of the window to read.
    2080      * @param text The text of the window to read.
    2081      * @return A string containing the window classes read, otherwise returns empty string and sets .error() to 1.
    2082      */
    2083     public String winGetClassList(String title, String text) {
    2084         Variant vTitle = new Variant(title);
    2085         Variant vText = new Variant(text);
    2086         Variant[] params = new Variant[]{vTitle, vText};
    2087         Variant result = autoItX.invoke("WinGetClassList", params);
    2088         return safeString(result);
    2089     }
    2090 
    2091     /**
    2092      * Retrieves the size of a given window's client area.
    2093      * @param title The title of the window to read.
    2094      * @param text The text of the window to read.
    2095      * @return Returns the width of the window's client area, else returns 1 and sets .error() =1;
    2096      */
    2097     public int winGetClientSizeWidth(String title, String text) {
    2098         Variant result = winVariant(title, text, "WinGetClientSizeWidth");
    2099         return result.getInt();
    2100     }
    2101 
    2102     /**
    2103      * Retrieves the size of a given window's client area.
    2104      * @param title The title of the window to read.
    2105      * @param text The text of the window to read.
    2106      * @return Returns the height of the window's client area, else returns 1 and sets .error() =1;
    2107      */
    2108     public int winGetClientSizeHeight(String title, String text) {
    2109         Variant result = winVariant(title, text, "WinGetClientSizeHeight");
    2110         return result.getInt();
    2111     }
    2112 
    2113     /**
    2114      * Retrieves the size of a given window's client area.
    2115      * @param title The title of the window to read.
    2116      * @return Returns the width of the window's client area, else returns 1 and sets .error() =1;
    2117      */
    2118     public int winGetClientSizeWidth(String title) {
    2119         Variant result = winVariant(title, "WinGetClientSizeWidth");
    2120         return result.getInt();
    2121     }
    2122 
    2123     /**
    2124      * Retrieves the size of a given window's client area.
    2125      * @param title The title of the window to read.
    2126      * @return Returns the height of the window's client area, else returns 1 and sets .error() =1;
    2127      */
    2128     public int winGetClientSizeHeight(String title) {
    2129         Variant result = winVariant(title, "WinGetClientSizeHeight");
    2130         return result.getInt();
    2131     }
    2132 
    2133     protected String safeString(Variant v) {
    2134         String safeResult = "";
    2135         if (v.getvt() == Variant.VariantString) {
    2136             safeResult = v.getString();
    2137         }
    2138         return safeResult;
    2139     }
    2140 
    2141     /**
    2142      * Retrieves the internal handle of a window.
    2143      * @param title The title of the window to read.
    2144      * @param text The text of the window to read.
    2145      * @return A string containing the window handle value. Otherwise returns "" and sets .error() to 1.
    2146      */
    2147     public String winGetHandle(String title, String text) {
    2148         Variant result = winVariant(title, text, "WinGetHandle");
    2149         return result.getString();
    2150     }
    2151 
    2152     /**
    2153      * Retrieves the internal handle of a window.
    2154      * @param title The title of the window to read.
    2155      * @return A string containing the window handle value. Otherwise returns "" and sets .error() to 1.
    2156      */
    2157     public String winGetHandle(String title) {
    2158         Variant result = winVariant(title, "WinGetHandle");
    2159         return result.getString();
    2160     }
    2161 
    2162     /**
    2163      * Retrieves the position and size of a given window.
    2164      * @param title The title of the window to read.
    2165      * @param text The text of the window to read.
    2166      * @return Returns the X coordinate of the window. Otherwise returns 1 and sets .error() = 1
    2167      */
    2168     public int winGetPosX(String title, String text) {
    2169         Variant result = winVariant(title, text, "WinGetPosX");
    2170         return result.getInt();
    2171     }
    2172 
    2173     /**
    2174      * Retrieves the position and size of a given window.
    2175      * @param title The title of the window to read.
    2176      * @return Returns the X coordinate of the window. Otherwise returns 1 and sets .error() = 1
    2177      */
    2178     public int winGetPosX(String title) {
    2179         Variant result = winVariant(title, "WinGetPosX");
    2180         return result.getInt();
    2181     }
    2182 
    2183     /**
    2184      * Retrieves the position and size of a given window.
    2185      * @param title The title of the window to read.
    2186      * @param text The text of the window to read.
    2187      * @return Returns the Y coordinate of the window. Otherwise returns 1 and sets .error() = 1
    2188      */
    2189     public int winGetPosY(String title, String text) {
    2190         Variant result = winVariant(title, text, "WinGetPosY");
    2191         return result.getInt();
    2192     }
    2193 
    2194     /**
    2195      * Retrieves the position and size of a given window.
    2196      * @param title The title of the window to read.
    2197      * @return Returns the Y coordinate of the window. Otherwise returns 1 and sets .error() = 1
    2198      */
    2199     public int winGetPosY(String title) {
    2200         Variant result = winVariant(title, "WinGetPosY");
    2201         return result.getInt();
    2202     }
    2203 
    2204     /**
    2205      * Retrieves the position and size of a given window.
    2206      * @param title The title of the window to read.
    2207      * @param text The text of the window to read.
    2208      * @return Returns the width of the window. Otherwise returns 1 and sets .error() = 1
    2209      */
    2210     public int winGetPosWidth(String title, String text) {
    2211         Variant result = winVariant(title, text, "WinGetPosWidth");
    2212         return result.getInt();
    2213     }
    2214 
    2215     /**
    2216      * Retrieves the position and size of a given window.
    2217      * @param title The title of the window to read.
    2218      * @return Returns the width of the window. Otherwise returns 1 and sets .error() = 1
    2219      */
    2220     public int winGetPosWidth(String title) {
    2221         Variant result = winVariant(title, "WinGetPosWidth");
    2222         return result.getInt();
    2223     }
    2224 
    2225     /**
    2226      * Retrieves the position and size of a given window.
    2227      * @param title The title of the window to read.
    2228      * @param text The text of the window to read.
    2229      * @return Returns the height of the window. Otherwise returns 1 and sets .error() = 1
    2230      */
    2231     public int winGetPosHeight(String title, String text) {
    2232         Variant result = winVariant(title, text, "WinGetPosHeight");
    2233         return result.getInt();
    2234     }
    2235 
    2236     /**
    2237      * Retrieves the position and size of a given window.
    2238      * @param title The title of the window to read.
    2239      * @return Returns the height of the window. Otherwise returns 1 and sets .error() = 1
    2240      */
    2241     public int winGetPosHeight(String title) {
    2242         Variant result = winVariant(title, "WinGetPosHeight");
    2243         return result.getInt();
    2244     }
    2245 
    2246     /**
    2247      * Retrieves the Process ID (PID) associated with a window.
    2248      * @param title The title of the window to read.
    2249      * @param text The text of the window to read.
    2250      * @return The PID, otherwise returns "".
    2251      */
    2252     public String winGetProcess(String title, String text) {
    2253         Variant v = winVariant(title, text, "WinGetProcess");
    2254         return v.getString();
    2255     }
    2256 
    2257     /**
    2258      * Retrieves the Process ID (PID) associated with a window.
    2259      * @param title The title of the window to read.
    2260      * @return The PID, otherwise returns "".
    2261      */
    2262     public String winGetProcess(String title) {
    2263         Variant v = winVariant(title, "WinGetProcess");
    2264         return v.getString();
    2265     }
    2266 
    2267     /**
    2268      * Retrieves the state of a given window.
    2269      * @param title The title of the window to read.
    2270      * @param text The text of the window to read.
    2271      * @return  Returns a value indicating the state of the window. Multiple values are added together so use BitAND() to examine the part you are interested in:
    2272      * 1 =  Window exists
    2273      * 2 = Window is visible
    2274      * 4 = Windows is enabled
    2275      * 8 = Window is active
    2276      * 16 = Window is minimized
    2277      * otherwise returns 0 and sets oAutoIt.error to 1 if the window is not found.
    2278      */
    2279     public int winGetState(String title, String text) {
    2280         Variant result = winVariant(title, text, "WinGetState");
    2281         return result.getInt();
    2282     }
    2283 
    2284     /**
    2285      * Retrieves the state of a given window.
    2286      * @param title The title of the window to read.
    2287      * @return  Returns a value indicating the state of the window. Multiple values are added together so use BitAND() to examine the part you are interested in:
    2288      * <br/> 1 =  Window exists
    2289      * <br/> 2 = Window is visible
    2290      * <br/> 4 = Windows is enabled
    2291      * <br/> 8 = Window is active
    2292      * <br/> 16 = Window is minimized
    2293      * <br/> otherwise returns 0 and sets oAutoIt.error to 1 if the window is not found.
    2294      */
    2295     public int winGetState(String title) {
    2296         Variant result = winVariant(title, "WinGetState");
    2297         return result.getInt();
    2298     }
    2299 
    2300     /**
    2301      * Retrieves up to 64KB of text from a window.
    2302      * <p>WinGetText works on minimized windows, but only works on hidden windows if you've set AutoItSetOption("WinDetectHiddenText", 1)
    2303      * If multiple windows match the criteria for WinGetText, the information for the most recently active match is returned.
    2304      * Use WinGetText("") to get the active window's text.</p>
    2305      * @param title The title of the window to read.
    2306      * @param text The text of the window to read.
    2307      * @return Returns a string containing up to 64k of the window text read.
    2308      */
    2309     public String winGetText(String title, String text) {
    2310         Variant result = winVariant(title, text, "WinGetText");
    2311         return result.getString();
    2312     }
    2313 
    2314     /**
    2315      * Retrieves up to 64KB of text from a window.
    2316      * <p>WinGetText works on minimized windows, but only works on hidden windows if you've set AutoItSetOption("WinDetectHiddenText", 1)
    2317      * If multiple windows match the criteria for WinGetText, the information for the most recently active match is returned.
    2318      * Use WinGetText("") to get the active window's text.</p>
    2319      * @param title The title of the window to read.
    2320      * @return Returns a string containing up to 64k of the window text read.
    2321      */
    2322     public String winGetText(String title) {
    2323         Variant result = winVariant(title, "WinGetText");
    2324         return result.getString();
    2325     }
    2326 
    2327     /**
    2328      * Retrieves the full title from a window.
    2329      * @param title The title of the window to read.
    2330      * @param text The text of the window to read.
    2331      * @return  A string containing the complete window title. Otherwise "".
    2332      */
    2333     public String winGetTitle(String title, String text) {
    2334         Variant result = winVariant(title, text, "WinGetTitle");
    2335         if (result.getvt() == Variant.VariantString) {
    2336             return result.getString();
    2337         }
    2338         return "";
    2339     }
    2340 
    2341     /**
    2342      * Retrieves the full title from a window.
    2343      * @param title The title of the window to read.
    2344      * @return  A string containing the complete window title. Otherwise "".
    2345      */
    2346     public String winGetTitle(String title) {
    2347         Variant result = winVariant(title, "WinGetTitle");
    2348         if (result.getvt() == Variant.VariantString) {
    2349             return result.getString();
    2350         }
    2351         return "";
    2352     }
    2353 
    2354     /**
    2355      * Forces a window to close.
    2356      * @param title The title of the window.
    2357      * @param text The text of the window.
    2358      */
    2359     public void winKill(String title, String text) {
    2360         winVariant(title, text, "WinKill");
    2361     }
    2362 
    2363     /**
    2364      * Forces a window to close.
    2365      * @param title The title of the window.
    2366      */
    2367     public void winKill(String title) {
    2368         winVariant(title, "WinKill");
    2369     }
    2370 
    2371     /**
    2372      * Retrieves a list of windows.
    2373      * @param title The title of the window.
    2374      * @param text The text of the window.
    2375      * @return Returns a 2 dimensional array containing the window titles and corresponding handles.
    2376      */
    2377     public String[][] winList(String title, String text) {
    2378         Variant result = winVariant(title, text, "WinList");
    2379         SafeArray arr = result.toSafeArray();
    2380         int entries = arr.getInt(0, 0);
    2381         String[][] resultArr = new String[2][entries + 1];
    2382         for (int i = 0; i <= entries; i++) {
    2383             resultArr[0][i] = arr.getString(0, i);
    2384             resultArr[1][i] = arr.getString(1, i);
    2385         }
    2386         return resultArr;
    2387     }
    2388 
    2389     /**
    2390      * Retrieves a list of windows.
    2391      * @param title The title of the window.
    2392      * @return Returns a 2 dimensional array containing the window titles and corresponding handles.
    2393      */
    2394     public String[][] winList(String title) {
    2395         Variant result = winVariant(title, "WinList");
    2396         SafeArray arr = result.toSafeArray();
    2397         int entries = arr.getInt(0, 0);
    2398         String[][] resultArr = new String[2][entries + 1];
    2399         for (int i = 0; i <= entries; i++) {
    2400             resultArr[0][i] = arr.getString(0, i);
    2401             resultArr[1][i] = arr.getString(1, i);
    2402         }
    2403         return resultArr;
    2404     }
    2405 
    2406     /**
    2407      * Invokes a menu item of a window.
    2408      * @param title The title of the window to read.
    2409      * @param text The text of the window to read.
    2410      * @param item Text of Menu Item
    2411      * @return True if success, false otherwise.
    2412      */
    2413     public boolean winMenuSelectItem(String title, String text, String item) {
    2414         Variant vTitle = new Variant(title);
    2415         Variant vText = new Variant(text);
    2416         Variant vItem = new Variant(item);
    2417         Variant[] params = new Variant[]{vTitle, vText, vItem};
    2418         Variant result = autoItX.invoke("WinMenuSelectItem", params);
    2419         return oneToTrue(result.getInt());
    2420     }
    2421 
    2422     /**
    2423      * Invokes a menu item of a window.
    2424      * @param title The title of the window to read.
    2425      * @param text The text of the window to read.
    2426      * @param item Text of Menu Item
    2427      * @param item2 Text of Menu Item
    2428      * @return True if success, false otherwise.
    2429      */
    2430     public boolean winMenuSelectItem(String title, String text, String item, String item2) {
    2431         Variant vTitle = new Variant(title);
    2432         Variant vText = new Variant(text);
    2433         Variant vItem = new Variant(item);
    2434         Variant vItem2 = new Variant(item2);
    2435         Variant[] params = new Variant[]{vTitle, vText, vItem, vItem2};
    2436         Variant result = autoItX.invoke("WinMenuSelectItem", params);
    2437         return oneToTrue(result.getInt());
    2438     }
    2439 
    2440     /**
    2441      * Invokes a menu item of a window.
    2442      * @param title The title of the window to read.
    2443      * @param text The text of the window to read.
    2444      * @param item Text of Menu Item
    2445      * @param item2 Text of Menu Item
    2446      * @param item3 Text of Menu Item
    2447      * @return True if success, false otherwise.
    2448      */
    2449     public boolean winMenuSelectItem(String title, String text, String item, String item2, String item3) {
    2450         Variant vTitle = new Variant(title);
    2451         Variant vText = new Variant(text);
    2452         Variant vItem = new Variant(item);
    2453         Variant vItem2 = new Variant(item2);
    2454         Variant vItem3 = new Variant(item3);
    2455         Variant[] params = new Variant[]{vTitle, vText, vItem, vItem2, vItem3};
    2456         Variant result = autoItX.invoke("WinMenuSelectItem", params);
    2457         return oneToTrue(result.getInt());
    2458     }
    2459 
    2460     /**
    2461      * Invokes a menu item of a window.
    2462      * @param title The title of the window to read.
    2463      * @param text The text of the window to read.
    2464      * @param item Text of Menu Item
    2465      * @param item2 Text of Menu Item
    2466      * @param item3 Text of Menu Item
    2467      * @param item4 Text of Menu Item
    2468      * @param item5 Text of Menu Item
    2469      * @param item6 Text of Menu Item
    2470      * @param item7 Text of Menu Item
    2471      * @return True if success, false otherwise.
    2472      */
    2473     public boolean winMenuSelectItem(String title, String text, String item, String item2, String item3, String item4, String item5, String item6, String item7) {
    2474         Variant vTitle = new Variant(title);
    2475         Variant vText = new Variant(text);
    2476         Variant vItem = new Variant(item);
    2477         Variant vItem2 = new Variant(item2);
    2478         Variant vItem3 = new Variant(item3);
    2479         Variant vItem4 = new Variant(item4);
    2480         Variant vItem5 = new Variant(item5);
    2481         Variant vItem6 = new Variant(item6);
    2482         Variant vItem7 = new Variant(item7);
    2483         Variant[] params = new Variant[]{vTitle, vText, vItem, vItem2, vItem3, vItem4, vItem5, vItem6, vItem7};
    2484         Variant result = autoItX.invoke("WinMenuSelectItem", params);
    2485         return oneToTrue(result.getInt());
    2486     }
    2487 
    2488     /**
    2489      * Minimizes all windows.
    2490      */
    2491     public void winMinimizeAll() {
    2492         autoItX.invoke("WinMinimizeAll");
    2493     }
    2494 
    2495     /**
    2496      * Undoes a previous WinMinimizeAll function.
    2497      */
    2498     public void winMinimizeAllUndo() {
    2499         autoItX.invoke("WinMinimizeAllUndo");
    2500     }
    2501 
    2502     /**
    2503      * Moves and/or resizes a window.
    2504      * @param title The title of the window to move/resize.
    2505      * @param text The text of the window to move/resize.
    2506      * @param x X coordinate to move to.
    2507      * @param y Y coordinate to move to.
    2508      * @param width New width of the window.
    2509      * @param height New height of the window.
    2510      */
    2511     public void winMove(String title, String text, int x, int y, int width, int height) {
    2512         Variant vTitle = new Variant(title);
    2513         Variant vText = new Variant(text);
    2514         Variant vX = new Variant(x);
    2515         Variant vY = new Variant(y);
    2516         Variant vWidth = new Variant(width);
    2517         Variant vHeight = new Variant(height);
    2518         Variant[] params = new Variant[]{vTitle, vText, vX, vY, vWidth, vHeight};
    2519         autoItX.invoke("WinMove", params);
    2520     }
    2521 
    2522     /**
    2523      * Moves and/or resizes a window.
    2524      * @param title The title of the window to move/resize.
    2525      * @param text The text of the window to move/resize.
    2526      * @param x X coordinate to move to.
    2527      * @param y Y coordinate to move to.
    2528      */
    2529     public void winMove(String title, String text, int x, int y) {
    2530         Variant vTitle = new Variant(title);
    2531         Variant vText = new Variant(text);
    2532         Variant vX = new Variant(x);
    2533         Variant vY = new Variant(y);
    2534         Variant[] params = new Variant[]{vTitle, vText, vX, vY};
    2535         autoItX.invoke("WinMove", params);
    2536     }
    2537 
    2538     /**
    2539      * Change a window's "Always On Top" attribute.
    2540      * @param title The title of the window to affect.
    2541      * @param text The text of the window to affect.
    2542      * @param isTopMost Determines whether the window should have the "TOPMOST" flag set.
    2543      * true=set on top flag, false = remove on top flag
    2544      */
    2545     public void winSetOnTop(String title, String text, boolean isTopMost) {
    2546         Variant vTitle = new Variant(title);
    2547         Variant vText = new Variant(text);
    2548         int flag = 0;
    2549         if (isTopMost) {
    2550             flag = 1;
    2551         }
    2552         Variant vFlag = new Variant(flag);
    2553         Variant[] params = new Variant[]{vTitle, vText, vFlag};
    2554         autoItX.invoke("WinSetOnTop", params);
    2555     }
    2556 
    2557     /**
    2558      * Shows, hides, minimizes, maximizes, or restores a window.
    2559      * @param title The title of the window to affect.
    2560      * @param text The text of the window to affect.
    2561      * @param flag The "show" flag of the executed program:
    2562      * <br/>SW_HIDE = Hide window,
    2563      * <br/>SW_SHOW = Shows a previously hidden window,
    2564      * <br/>SW_MINIMIZE = Minimize window,
    2565      * <br/>SW_MAXIMIZE = Maximize window,
    2566      * <br/>SW_RESTORE = Undoes a window minimization or maximization.
    2567      */
    2568     public void winSetState(String title, String text, int flag) {
    2569         Variant vTitle = new Variant(title);
    2570         Variant vText = new Variant(text);
    2571         Variant vFlag = new Variant(flag);
    2572         Variant[] params = new Variant[]{vTitle, vText, vFlag};
    2573         autoItX.invoke("WinSetState", params);
    2574     }
    2575 
    2576     /**
    2577      * Changes the title of a window.
    2578      * @param title The title of the window to affect.
    2579      * @param text The text of the window to affect.
    2580      * @param newtitle The new title to give to the window.
    2581      */
    2582     public void winSetTitle(String title, String text, String newtitle) {
    2583         Variant vTitle = new Variant(title);
    2584         Variant vText = new Variant(text);
    2585         Variant vNewtitle = new Variant(newtitle);
    2586         Variant[] params = new Variant[]{vTitle, vText, vNewtitle};
    2587         autoItX.invoke("WinSetTitle", params);
    2588     }
    2589 
    2590     /**
    2591      * Sets the transparency of a window. (Windows 2000/XP or later)
    2592      * @param title The title of the window to affect.
    2593      * @param text The text of the window to affect.
    2594      * @param transparency A number in the range 0 - 255. The larger the number, the more transparent the window will become.
    2595      * @return True on success, false on failure. .error() will be set to 1 if the function isn't supported on an OS.
    2596      */
    2597     public boolean winSetTrans(String title, String text, int transparency) {
    2598         Variant vTitle = new Variant(title);
    2599         Variant vText = new Variant(text);
    2600         Variant vTransparency = new Variant(transparency);
    2601         Variant[] params = new Variant[]{vTitle, vText, vTransparency};
    2602         Variant result = autoItX.invoke("WinSetTrans", params);
    2603         int iResult = result.getInt();
    2604         if (iResult != 0) {
    2605             return true;
    2606         }
    2607         return false;
    2608     }
    2609 
    2610     /**
    2611      * Pauses execution of the script until the requested window exists.
    2612      * The script polls for window match every 250 milliseconds or so.
    2613      * @param title The title of the window to check.
    2614      * @param text The text of the window to check.
    2615      * @param timeout Timeout in seconds
    2616      * @return True if success, false otherwise.
    2617      */
    2618     public boolean winWait(String title, String text, int timeout) {
    2619         return winVariantBool(title, text, timeout, "WinWait");
    2620     }
    2621 
    2622     /**
    2623      * Pauses execution of the script until the requested window exists.
    2624      * The script polls for window match every 250 milliseconds or so.
    2625      * @param title The title of the window to check.
    2626      * @return True if success, false otherwise.
    2627      */
    2628     public boolean winWait(String title) {
    2629         return winVariantBool(title, "WinWait");
    2630     }
    2631 
    2632     /**
    2633      * Pauses execution of the script until the requested window exists.
    2634      * The script polls for window match every 250 milliseconds or so.
    2635      * @param title The title of the window to check.
    2636      * @param text The text of the window to check.
    2637      * @return True if success, false otherwise.
    2638      */
    2639     public boolean winWait(String title, String text) {
    2640         return winVariantBool(title, text, "WinWait");
    2641     }
    2642 
    2643     /**
    2644      * Pauses execution of the script until the requested window is active.
    2645      * @param title The title of the window to check.
    2646      * @param text The text of the window to check.
    2647      * @param timeout The timeout in seconds.
    2648      * @return True if success, false otherwise.
    2649      */
    2650     public boolean winWaitActive(String title, String text, int timeout) {
    2651         return winVariantBool(title, text, timeout, "WinWaitActive");
    2652     }
    2653 
    2654     /**
    2655      * Pauses execution of the script until the requested window is active.
    2656      * @param title The title of the window to check.
    2657      * @param text The text of the window to check.
    2658      * @return True if success, false otherwise.
    2659      */
    2660     public boolean winWaitActive(String title, String text) {
    2661         return winVariantBool(title, text, "WinWaitActive");
    2662     }
    2663 
    2664     /**
    2665      * Pauses execution of the script until the requested window is active.
    2666      * @param title The title of the window to check.
    2667      * @return True if success, false otherwise.
    2668      */
    2669     public boolean winWaitActive(String title) {
    2670         return winVariantBool(title, "WinWaitActive");
    2671     }
    2672 
    2673     /**
    2674      * Pauses execution of the script until the requested window does not exist.
    2675      * @param title The title of the window to check.
    2676      * @param text The text of the window to check.
    2677      * @param timeout The timeout in seconds.
    2678      * @return True if success, false otherwise.
    2679      */
    2680     public boolean winWaitClose(String title, String text, int timeout) {
    2681         return winVariantBool(title, text, timeout, "WinWaitClose");
    2682     }
    2683 
    2684     /**
    2685      * Pauses execution of the script until the requested window does not exist.
    2686      * @param title The title of the window to check.
    2687      * @return True if success, false otherwise.
    2688      */
    2689     public boolean winWaitClose(String title) {
    2690         return winVariantBool(title, "WinWaitClose");
    2691     }
    2692 
    2693     /**
    2694      * Pauses execution of the script until the requested window does not exist.
    2695      * @param title The title of the window to check.
    2696      * @param text The text of the window to check.
    2697      * @return True if success, false otherwise.
    2698      */
    2699     public boolean winWaitClose(String title, String text) {
    2700         return winVariantBool(title, text, "WinWaitClose");
    2701     }
    2702 
    2703     /**
    2704      * Pauses execution of the script until the requested window is not active.
    2705      * @param title The title of the window to check.
    2706      * @param text The text of the window to check.
    2707      * @param timeout The timeout in seconds.
    2708      * @return True if success, false otherwise.
    2709      */
    2710     public boolean winWaitNoActive(String title, String text, int timeout) {
    2711         return winVariantBool(title, text, timeout, "WinWaitNotActive");
    2712     }
    2713 
    2714     /**
    2715      * Pauses execution of the script until the requested window is not active.
    2716 
    2717 
    2718 
    2719      * @param title The title of the window to check.
    2720      * @return True if success, false otherwise.
    2721      */
    2722     public boolean winWaitNoActive(String title) {
    2723         return winVariantBool(title, "WinWaitNotActive");
    2724     }
    2725 
    2726     /**
    2727      * Pauses execution of the script until the requested window is not active.
    2728      * @param title The title of the window to check.
    2729      * @param text The text of the window to check.
    2730      * @return True if success, false otherwise.
    2731      */
    2732     public boolean winWaitNoActive(String title, String text) {
    2733         return winVariantBool(title, text, "WinWaitNotActive");
    2734     }
    2735 
    2736     protected boolean winVariantBool(String title, String text, int timeout, String function) {
    2737         Variant vTitle = new Variant(title);
    2738         Variant vText = new Variant(text);
    2739         Variant vTimeout = new Variant(timeout);
    2740         Variant[] params = new Variant[]{vTitle, vText, vTimeout};
    2741         Variant result = autoItX.invoke(function, params);
    2742         return oneToTrue(result.getInt());
    2743     }
    2744 
    2745     protected boolean winVariantBool(String title, String text, String function) {
    2746         Variant vTitle = new Variant(title);
    2747         Variant vText = new Variant(text);
    2748         Variant[] params = new Variant[]{vTitle, vText};
    2749         Variant result = autoItX.invoke(function, params);
    2750         return oneToTrue(result.getInt());
    2751     }
    2752 
    2753     protected boolean winVariantBool(String title, String function) {
    2754         Variant vTitle = new Variant(title);
    2755         Variant[] params = new Variant[]{vTitle};
    2756         Variant result = autoItX.invoke(function, params);
    2757         return oneToTrue(result.getInt());
    2758     }
    2759 
    2760     /**
    2761      * Retrieves the text from a standard status bar control.
    2762      * @param title The title of the window to check.
    2763      * @return  The text from a standard status bar control.
    2764      */
    2765     public String statusbarGetText(String title) {
    2766         return autoItX.invoke("StatusbarGetText", title).getString();
    2767     }
    2768 
    2769     /**
    2770      * Converts the value 1 to true, anything else to false.
    2771      * @param i The value to convert to true/false
    2772      * @return 1 = true, anything else = false.
    2773      */
    2774     protected boolean oneToTrue(int i) {
    2775         return (i == 1) ? true : false;
    2776     }
    2777 
    2778     /**
    2779      * Converts the value 1 to true, anything else to false.
    2780      * @param i The value to convert to true/false
    2781      * @return 1 = true, anything else = false.
    2782      */
    2783     protected boolean oneToTrue(Variant v) {
    2784         if (v.getvt() == Variant.VariantInt
    2785                 || v.getvt() == Variant.VariantShort) {
    2786             return (v.getInt() == 1) ? true : false;
    2787         }
    2788         return false;
    2789     }
    2790 }
    View Code

    需要两个文件才能使用Autoit提供的外部操作API.

    一个是jacob文件,这个是java操作DCOM的一个桥梁API工具;

    一个是AutoitX3.dll文件;

    下载了上面的两个文件,一个是在本地register所需要的autoit dll文件。

    采用命令:regsvr32 autoitx3.dll 文件即可;

    然后再java代码中如下调用即可:

        File file;
            try{
               file= new File("lib", "jacob-1.18-M1-x86.dll"); //path to the jacob dll
               logger.info("Using jacob dll x86 bit file to load the jacob now...");
            }catch(UnsatisfiedLinkError error){
                logger.info("the java VM is x86 so we change to load the jacob dll with x64 bit:"+error.getMessage());
                file= new File("lib", "jacob-1.18-M1-x64.dll"); //path to the jacob dll
            }
            logger.info("Get the jacob dll file path is:"+file.getAbsolutePath());
            System.setProperty(LibraryLoader.JACOB_DLL_PATH, file.getAbsolutePath());
    View Code

    ,之后你就能在你的java程序中调用Autoit的API即可。

    如下:

    AutoItXUtils autoit=getAutoItX();   //得到Autoit的实体类
            autoit.winWait(title, text, 120);   //激活一个windows窗口,只需要指定窗口的标题和对应的可见文本,这里会等待窗口出现,如果在120秒内还是没有出现就返回false
            autoit.winActivate(title, text);  //激活窗口
            boolean clicked=autoit.controlClick(title, text, controlID); //点击一个控件,需要指定这个控件的windows id,还有控件所对应的title及其可见的text

    是不是很不错,可以的话,你可以尝试下去操作弄弄。

    不过使用了AutoIt的话,你就不能使用Selenium的RemoteWebDriver的特性了,也就是分布式执行的相关操作了,因为所有的Autoit的脚本其实都是运行在本地的,所以如果你需要让Selenium继续可以在不同的机器上运行,你可能需要使用Jenkins操作了。

  • 相关阅读:
    Java学习第七周汇报
    Java暑期学习第四十三天日报
    Java暑期学习第四十七天日报
    Java学习第六周汇报
    SQL server数据库优化
    c#在WinForm中重写ProgressBar控件(带%的显示)
    javascript事件处理在IE和FireFox中的区别
    c# winform 关于DataGridView的一些操作
    JavaScript验证中文,特殊字符
    VB.NET与C#.NET比较
  • 原文地址:https://www.cnblogs.com/seniortestingdev/p/3323835.html
Copyright © 2020-2023  润新知