找回密码
 加入
搜索
查看: 3446|回复: 10

[AU3基础] 请教个关于窗口的类名的问题~!

  [复制链接]
发表于 2014-1-17 14:15:12 | 显示全部楼层 |阅读模式
使用WinExists ("[CLASS:Notepad]", "")可以成功返回“1”,但是类名不全的时候比如说类名是“Notepad”,用WinExists ("[CLASS:Notepa]", "")返回“0”,只用类名的一部分不成功。
Opt("WinTitleMatchMode", 2)这里设置成2也不管用,怎么办?
发表于 2014-1-17 14:32:08 | 显示全部楼层
我说个例子吧.你就明白你这么定位窗口就是个错.
就拿广告说吧. 它能模拟IE类 或者 IME类. 让你无从下手 去杀了那些窗口.既然他们都没个定性.你为何纠结在这个类名定义上呢? 那个称呼只是给人很好的阅读分辨窗口特征的好意.但是实际上窗口的类名 可以是随机的.
发表于 2014-1-17 14:41:07 | 显示全部楼层
#include <WindowsConstants.au3>
#include <Process.au3>
#include <WinAPI.au3>
#Include <WinAPIEx.au3>         ;WinAPIEx调用
#include <Array.au3>
HotKeySet("{ESC}", "Close") ; Set ESC as a hotkey to exit the script.

Global $tStruct = DllStructCreate($tagPOINT), $MouseX, $MouseY

Example()

Func Example()
        Local $classN = '[CLASS:'
        While 1
                If MouseGetPos(0) <> $MouseX Or MouseGetPos(1) <> $MouseY Then
                        Local $x0 = Null, $x0c = Null, $x0t = Null, $x0d = Null, $x0n = Null, $x0p = Null
                        Local $x1 = Null, $x1c = Null, $x1t = Null, $x1d = Null, $x1n = Null, $x1p = Null
                        Local $x2 = Null, $x2c = Null, $x2t = Null, $x2d = Null, $x2n = Null, $x2p = Null, $x2a = Null, $x2list = Null
                        Position() ; Update the X and Y elements with the X and Y co-ordinates of the mouse.
                        
                        $x0  = _WinAPI_GetForegroundWindow() ;返回激活前台窗口句柄
                        $x0d = WinGetProcess($x0)
                        $x0n = _ProcessGetName($x0d)
                        $x0p = WinGetPos($x0)
                        $x0c = $classN & _WinAPI_GetClassName($x0) & ']'
                        $x0t = _WinAPI_GetWindowText($x0)

                        $x1  = _WinAPI_WindowFromPoint($tStruct)   ; 检索包含指定XY坐标的窗口句柄
                        $x1d = WinGetProcess($x1)
                        $x1n = _ProcessGetName($x1d)
                        $x1p = WinGetPos($x1)
                        $x1c = $classN & _WinAPI_GetClassName($x1) & ']'      ;返回ClassName
                        $x1t = _WinAPI_GetWindowText($x1)
                        
                        $x2  = _WinAPI_GetAncestor($x1, $GA_ROOT)  ; 检索父窗口活链接的根窗口
                        If @error Then
                                If IsArray($x0p) And IsArray($x1p) Then
                                        ToolTip('激活前台窗口>> 进程名=' & $x0n & ' |||PID=' & $x0d & ' |||句柄=' & $x0 & ' |||类名=' & $x0c & ' |||窗名=' & $x0t & ' |||尺寸=x:' & $x0p[0] & ' y:' & $x0p[1] & ' w:' & $x0p[2] & ' h:' & $x0p[3] & @CRLF & _
                                        @CRLF & '鼠标坐标窗口>> 进程名=' & $x1n & ' |||PID=' & $x1d & ' |||句柄=' & $x1 & ' |||类名=' & $x1c & ' |||窗名=' & $x1t & ' |||尺寸=x:' & $x1p[0] & ' y:' & $x1p[1] & ' w:' & $x1p[2] & ' h:' & $x1p[3], _
                                        200, 50)
                                EndIf
                        Else
                                $x2d = WinGetProcess($x2)
                                $x2n = _ProcessGetName($x2d)
                                $x2p = WinGetPos($x2)
                                $x2c = $classN & _WinAPI_GetClassName($x2) & ']'
                                $x2t = _WinAPI_GetWindowText($x2)
                                $x2a = _WinAPI_EnumChildWindows($x2)
                                If Not @error Then
                                        If $x2a[0][0] > 0 Then
                                                For $i = 1 To $x2a[0][0]
                                                        Local $x = ControlGetPos($x2a[$i][0], "", '')
;~                                                         If $x2a[$i][1] = 'Internet Explorer_Server' Then
;~                                                                 ControlHide($x2a[$i][0], '', '')
;~                                                                 Sleep(1000)
;~                                                                 _WinAPI_PostMessage($x2a[$i][0], 0x0010, 0, 0)
;~                                                         EndIf
                                                        If $x2list Then
                                                                If $x2a[$i][0] = $x1 Then
                                                                        $x2list &= @CRLF& $x2a[$i][0] &' || [CLASS:'& $x2a[$i][1] &'] ||x:'& $x[0] &' y:'& $x[1] &' w:'& $x[2] &' h:'& $x[3] & '        <<-- 鼠标坐标子窗 '&$x1
                                                                Else
                                                                        $x2list &= @CRLF& $x2a[$i][0] &' || [CLASS:'& $x2a[$i][1] &'] ||x:'& $x[0] &' y:'& $x[1] &' w:'& $x[2] &' h:'& $x[3]
                                                                EndIf
                                                        Else
                                                                If $x2a[$i][0] = $x1 Then
                                                                        $x2list = '=========枚举[句柄: '&$x2&']父窗下的子窗=========' &@CRLF& $x2a[$i][0] &' || [CLASS:'& $x2a[$i][1] &'] ||x:'& $x[0] &' y:'& $x[1] &' w:'& $x[2] &' h:'& $x[3] & '        <<-- 鼠标坐标子窗 '&$x1
                                                                Else
                                                                        $x2list = '=========枚举[句柄: '&$x2&']父窗下的子窗=========' &@CRLF& $x2a[$i][0] &' || [CLASS:'& $x2a[$i][1] &'] ||x:'& $x[0] &' y:'& $x[1] &' w:'& $x[2] &' h:'& $x[3]
                                                                EndIf
                                                        EndIf
                                                Next
                                        EndIf
                                EndIf
                                If IsArray($x0p) And IsArray($x1p) And IsArray($x2p) Then
                                        ToolTip('激活前台窗口>> 进程名=' & $x0n & ' |||PID=' & $x0d & ' |||句柄=' & $x0 & ' |||类名=' & $x0c & ' |||窗名=' & $x0t & ' |||尺寸=x:' & $x0p[0] & ' y:' & $x0p[1] & ' w:' & $x0p[2] & ' h:' & $x0p[3] & @CRLF & _
                                        @CRLF & '鼠标坐标父窗>> 进程名=' & $x2n & ' |||PID=' & $x2d & ' |||句柄=' & $x2 & ' |||类名=' & $x2c & ' |||窗名=' & $x2t & ' |||尺寸=x:' & $x2p[0] & ' y:' & $x2p[1] & ' w:' & $x2p[2] & ' h:' & $x2p[3] & _
                                        @CRLF & '鼠标坐标窗口>> 进程名=' & $x1n & ' |||PID=' & $x1d & ' |||句柄=' & $x1 & ' |||类名=' & $x1c & ' |||窗名=' & $x1t & ' |||尺寸=x:' & $x1p[0] & ' y:' & $x1p[1] & ' w:' & $x1p[2] & ' h:' & $x1p[3] & @CRLF & $x2list, _
                                        200, 50)
                                EndIf
                        EndIf
                EndIf
                Sleep(3000)
        WEnd
EndFunc   ;==>Example
;

Func Position()
        $MouseX = MouseGetPos(0)
        $MouseY = MouseGetPos(1)
        DllStructSetData($tStruct, "x", $MouseX)
        DllStructSetData($tStruct, "y", $MouseY)
EndFunc   ;==>Position

Func Close()
        Exit
EndFunc   ;==>Close
发表于 2014-1-17 14:41:48 | 显示全部楼层
送个代码给你 试试. 会对你有一定帮助
 楼主| 发表于 2014-1-17 14:43:00 | 显示全部楼层
本帖最后由 sunkiss 于 2014-1-17 14:44 编辑

回复 2# rogerabc

但是这个窗口没有别的信息,只能通过大小和类名可以,大小我试了可以,但是类名不行。类名前缀一样,只有后面不一样,别的信息没有啊~!句柄每次都换,怎么获得这个窗口啊?就算是错的。我也是想,问问大家,因为我自己不会啊~!主要是学习一下。
发表于 2014-1-17 14:46:25 | 显示全部楼层
我那代码有点BUG. 懒得修复了. 我想不影响啥的
作用就是给人容易分析窗口
发表于 2014-1-17 14:48:55 | 显示全部楼层
反正是窗口都有特征.主副 尺寸 窗口里的控件,只有完全搞懂 才能找到它.把它给控制了.
发表于 2014-1-17 14:53:56 | 显示全部楼层
最近也遇到这样的问题,很苦恼
 楼主| 发表于 2014-1-17 15:28:26 | 显示全部楼层
谢谢了,回家消化消化。
发表于 2014-1-18 08:21:18 | 显示全部楼层
这个很复杂啊!办法要多才给力
发表于 2014-1-18 08:37:37 | 显示全部楼层
高级窗口描述
在此模式下,一些特殊的字符串可用来代替窗口标题参数,这样我们就可以使用下面的 属性 来识别一个窗口:

TITLE - 窗口标题
CLASS - 内部窗口类名
REGEXPTITLE -窗口标题使用 正则表达式 (如果正则表达式错误,将把 @error 设置为 2)
REGEXPCLASS -窗口类名使用 正则表达式 (如果正则表达式错误,将把 @error 设置为 2)
LAST - 使用上一次成功匹配的窗口,这样就不必三番四次地指定窗口标题和窗口文本了.
ACTIVE - 当前活动窗口
X(坐标) \ Y(坐标) \ W(宽度) \ H(高度) - 窗口坐标与大小
INSTANCE - 基于1开始的接口(instance,原翻译为枚举) 由程序自动分配的唯一标识.
一个窗口中的标题参数包含一个或者多个属性,使用下列格式

[属性1:值1; 属性2:值2]

注意: 如果一个值中包含了一个 ";" 它必须是成对的(it must be doubled).

  

例如: 等待一个类名为 "Notepad" 的窗口

WinWaitActive("[CLASS:Notepad]", "")



例如: 关闭当前活动窗口

WinClose("[ACTIVE]", "")



例如: 等待接口(instance,原翻译为枚举)为2,窗口标题为"我的窗口" 和 类名 "我的类"的窗口

WinWaitActive("[TITLE:我的窗口; CLASS:我的类; INSTANCE:2]", "")



例如: 列出类名匹配正则表达式的窗口

WinList("[REGEXPCLASS:#\d+]")
复制了一点帮助文件的内容
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-11-16 21:40 , Processed in 0.075015 second(s), 19 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表