注意:窗口标题和窗口文本参数总是对大小写敏感的。 
1、等待窗口系列命令/函数 
AHK和AU3都提供了用法类似的一组窗口等待命令/函数:WinWait/WinWaitActive/WinWaitClose。 
它们分别用于等待窗口出现、等待窗口被激活、等待窗口被关闭。由于这些命令/函数的参数类似,现仅以WinWait为例说明。 
AHK: 
WinWait [, 窗口标题, 窗口文本, 超时时间, 排除标题, 排除文本] 
AU3: 
WinWait ( "窗口标题" [, "窗口文本" [, 超时时间]] ) 
WinWait 的作用是在目标窗口出现之前不再执行后面的所有语句。 
假设我们要运行记事本程序,并在其窗口出现时提示用户: 
【示例 3.1.1 】

AHK: 
Run Notepad 
WinWait, 无标题 - 记事本 
MsgBox 记事本窗口已被打开! 
AU3: 
Run("Notepad") 
WinWait("无标题 - 记事本") 
MsgBox(0, "", "记事本窗口已被打开!")

2、激活窗口相关命令/函数 
让目标窗口成为活动窗口的办法就是激活它,可用的命令/函数是WinActivate: 
AHK: 
WinActivate [,窗口标题, 窗口文本, 排除标题, 排除文本] 
AU3: 
WinActivate ( "窗口标题" [, "窗口文本"] )

3、关闭窗口 
关闭窗口有两种方式,一种是正常的关闭窗口(WinClose),另一种则是强行关闭窗口(WinKill): 
AHK: 
WinClose/WinKill [,窗口标题, 窗口文本, 超时时间,, 排除标题, 排除文本] 
AU3: 
WinClose/WinKill ( "窗口标题" [, "窗口文本"] )

现在我们已经可以实现一个比较简单的功能了,比如我们可以打开系统属性窗口并等待其出现,窗口出现后激活它,接着等待3秒再关闭它: 
【示例 3.1.2 】

AHK: 
Run, Sysdm.cpl 
WinWait, 系统属性 
WinActivate, 系统属性 
WinWaitActive, 系统属性 
Sleep, 3000 
WinClose, 系统属性 
WinWaitClose, 系统属性 
AU3: 
Run("Control Sysdm.cpl") 
WinWait("系统属性") 
WinActivate("系统属性") 
WinWaitActive("系统属性") 
Sleep(3000) 
WinClose("系统属性") 
WinWaitClose("系统属性")

建议:如果程序中频繁地出现要用到这些窗口标题的地方,会带来一个问题:脚本的可读性,也许你会想,这不是很直观吗?可问题是如果这个重复出现的窗口标题是个很长的字符串呢?这将严重影响整个代码的排版美观。而且我们也无从了解这些窗口标题的“来头”,不知道这个窗口标题究竟是怎么来的。而如果我们定义一个变量(假设变量名是“AppWindow1”)保存这个窗口标题,我们就能在命令/函数中用变量来表示它,这样就达到了让代码用意更清晰一点的目的。另外,就算目标软件因某些原因(比如升级)而改变了它的窗口标题,我们也能很方便地作出修改。

4、更准确的标识窗口的方法(主要针对AHK脚本) 
程序在运行时起码会有一个进程,如果能获得这个进程ID就能在一定程度上保证对窗口的准确标识。另外,每个窗口都有定义窗口类名(Class,比如说记事本窗口的类名就是Notepad),所以我们可以以此排除与目标窗口不同的其它窗口类。其实,我们还有一个更准确的方法: 
每个窗口(包括控件在内)都被Windows指派了一个可区别于其它窗口的唯一的标识符(ID),我们称之为窗口句柄(HWND)。 
直接给定窗口标题来表示窗口的一个缺点就是无法保证在脚本运行的过程中始终以该窗口为操作目标,因为在这个过程中很有可能会有其它“同名”窗口(或者说满足匹配条件的窗口)出现,而如果我们使用这个标识符来表示窗口自然就能保证命令/函数的操作窗口总是同一个窗口了。 
我们先来了解一下获得窗口句柄的命令/函数: 
AHK: 
WinGet[, 输出变量, ID, 窗口标题, 窗口文本, 排除标题, 排除文本] 
AU3: 
WinGetHandle ( "窗口标题" [, "窗口文本"] ) 
其中WinGet获得的窗口ID将通过“输出变量”返回,而WinGetHandle的返回值就是获得的窗口ID。

我们在进行自动化操作时是要先运行某个程序,如何获得这个程序成功运行后显示的窗口句柄?一个比较保险的办法是先获得这个程序的进程ID,然后根据这个进程ID获得它的窗口句柄,AHK支持使用进程ID作为窗口标题使用;但AU3不支持这样使用,只能先获得该窗口的类名再根据该类名来获得窗口句柄(不够保险): 
【示例 3.1.3 】 
AHK: 
Run, NotePad, , , ThisPID 
WinWait, ahk_pid %ThisPID%

;这里的ahk_pid表明跟在后面的变量是进程ID 
WinGet, ThisID, ID, ahk_pid %ThisPID%

;ThisID将保存获得的窗口句柄 
AU3:

Opt("WinTitleMatchMode", 4) 
Run("Notepad") 
$handle = WinGetHandle("classname=Notepad") 
现在暂且先忘记了AU3吧,因为它的窗口函数一般都不支持使用窗口句柄作为(窗口标题)参数。 
至于如何在AHK中使用窗口句柄,简单的说,凡是有“窗口标题”参数的命令就可以用窗口句柄来代替,比如: 
【示例 3.1.4 】 
AHK: 
Run, Notepad, , , ThisPID

;先获得运行的记事本程序的进程ID 
WinWait, 无标题 - 记事本 ahk_pid %ThisPID%

;等待该进程窗口的出现 
WinGet, ThisHWND, ID, 无标题 - 记事本 ahk_pid %ThisPID%

;获得窗口句柄 
WinActivate, ahk_id %ThisHWND% 
;这里的ahk_id表明跟在后面的变量是窗口句柄 
WinWaitActive, ahk_id %ThisHWND% 
Sleep, 3000 
WinClose, ahk_id %ThisHWND% 
WinWaitClose, ahk_id %ThisHWND%

详细出处参考:http://www.jb51.net/article/14870_3.htm

AutoIt自动化编程(2)【转】的更多相关文章

  1. AutoIt自动化编程(4)【转】

    五.自动化操作轻松入门系列5 控件操作 然而,在真正实现自动化时仅靠上面的技术往往难以达到预期目的.下面开始进入最为重要的控件操作. 1.设置文本 在安装软件的过程中用户往往需要提供一些必需信息,比如 ...

  2. AutoIt自动化编程(3)【转】

    模拟鼠标点击(按钮等)控件 既然是模拟用户操作,自然就包括了模拟鼠标点击在内. 适用命令/函数:Click/MouseClick/ControlClick 其中Click/MouseClick用来模拟 ...

  3. AutoIt自动化编程(1)【转】

    1.运行程序 Run 命令或者函数用来运行外部可执行文件 AU3:Run ( "文件名" [, "工作目录" [, 标志]] ) EXAMPLE: AU3:Ru ...

  4. Ligg.WinOa-000: Windows运维自动化编程实战--前言

        本开源项目Ligg.WinOa是一个基于Ligg.EasyWinApp的Windows运维自动化应用.通过Ligg.EasyWinForm生成2个功能界面:管理员工具箱和用户工具箱:通过Lig ...

  5. autoIT 自动化上传/下载文件图文详解【python selenium】

    情景: 在用selenium进行web页面自动化时,时不时会遇到上传附件的情况,常见的情况就是一个上传按钮,点击后弹出windows窗口,选择文件后上传,如下图1所示 图1 这种情况超出了seleni ...

  6. 操作 AutoIT:界面与自动化操作结合来简化日常劳动: .Net Reactor验证License,设置License,创建License,截图AutoIt自动化实现。(六)

    自动化操作的稳定性,便利性虽然已经满足了要求,但是页面上呈现的按钮太多了,可以做的更加简单一些. 1. 简化页面的按钮,把5个按钮减少至3个,把Display HID按钮功能整合到create lic ...

  7. 使用sikuli软件进行自动化编程

    因为工作上的需要,某个信息系统不健全,因此仅仅需要一个一个的点击确认,客户端是网页版本的,抓包太复杂了,如何快速的能够自动化操作? 想到了之前学习python的时候,发现了一个基于java的图片编程软 ...

  8. Python自动化编程-树莓派的介绍与使用(一)

    Raspberry Pi(中文名为“树莓派”,简写为RPi,(或者RasPi / RPI) [1]  是为学习计算机编程教育而设计),只有信用卡大小的微型电脑,其系统基于Linux.  随着Windo ...

  9. Python自动化编程-树莓派GPIO编程(二)

    树莓派我们编程一般都直接用高效的python,针对于GPIO编程,python也是有这一方面的库的,这里最有名也是最常用的就是RPI.GPIO了.这个库是专门为树莓派GPIO编程所设计的,利用它你可以 ...

随机推荐

  1. 奇思妙想:利用野指针和lower_bound()/upper_bound()函数实现整数二分

    众所周知,c++的STL中提供了三个二分查找函数,binary_search(),lower_bound(),upper_bound(),功能分别是找某值是否在数组中出现,找到数组中第一个大于等于某值 ...

  2. python 使用abc实现接口类/虚类(2.2)

    python 使用abc实现接口类/虚类 具体类 class BaseA: def run(self): print('base A running') class ChildA(BaseA): de ...

  3. Dll注入技术之远程线程注入

    DLL注入技术之远线程注入 DLL注入技术指的是将一个DLL文件强行加载到EXE文件中,并成为EXE文件中的一部分,这样做的目的在于方便我们通过这个DLL读写EXE文件内存数据,(例如 HOOK EX ...

  4. (十七)从UML角度来理解依赖

    UML软件建模 什么是依赖?简单理解就是一个类A用到了类B,但是这种使用关系是偶然性的.临时性的.非常弱的,类B的变化会影响到类A 显示依赖与隐式依赖 依赖倒置:我们要依赖于高层业务,不依赖于低层业务 ...

  5. JS对象 substring() 方法用于提取字符串中介于两个指定下标之间的字符。

    提取字符串substring() substring() 方法用于提取字符串中介于两个指定下标之间的字符. 语法: stringObject.substring(starPos,stopPos)  参 ...

  6. [CF1244C] The Football Season【数学,思维题,枚举】

    Online Judge:Luogu,Codeforces Round #592 (Div. 2) C Label:数学,思维题, 枚举 题目描述 某球队一共打了\(n\)场比赛,总得分为\(p\), ...

  7. CSS在工程中改变之面向对象的 CSS

    oocss的概念 众多开发者忽视了css的表现(认为它) oocss将页面可重用的元素抽象成一个类,用class加以描述,而与其对应的HTML即可看成是此类的一个实例. oocss的作用 1.加强代码 ...

  8. npm 安装vue 报错Failed at the chromedriver@2.46.0 install script 'node install.js'

    原因一般是下载源被封了,我们连接淘宝的下载源下载: npm install chromedriver --chromedriver_cdnurl=http://cdn.npm.taobao.org/d ...

  9. vue type check failed for prop . Expected Number, got String

    代码是:fileNumLimit接收的类型是Number <vue-upload fileNumLimit='100'/> 改为 <vue-upload :fileNumLimit= ...

  10. Vim统计字符串出现次数

    关键命令: :%s/pattern//gn 参数说明: % - 指明操作区间,%表示全文本:可以使用1,$或者行区间代替 s – substitute,表示替换 pattern - 要查找的字符串 / ...