sunkiss 发表于 2014-1-17 14:15:12

请教个关于窗口的类名的问题~!

使用WinExists ("", "")可以成功返回“1”,但是类名不全的时候比如说类名是“Notepad”,用WinExists ("", "")返回“0”,只用类名的一部分不成功。
Opt("WinTitleMatchMode", 2)这里设置成2也不管用,怎么办?

rogerabc 发表于 2014-1-17 14:32:08

我说个例子吧.你就明白你这么定位窗口就是个错.
就拿广告说吧. 它能模拟IE类 或者 IME类. 让你无从下手 去杀了那些窗口.既然他们都没个定性.你为何纠结在这个类名定义上呢? 那个称呼只是给人很好的阅读分辨窗口特征的好意.但是实际上窗口的类名 可以是随机的.

rogerabc 发表于 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 & ' y:' & $x0p & ' w:' & $x0p & ' h:' & $x0p & @CRLF & _
                                        @CRLF & '鼠标坐标窗口>> 进程名=' & $x1n & ' |||PID=' & $x1d & ' |||句柄=' & $x1 & ' |||类名=' & $x1c & ' |||窗名=' & $x1t & ' |||尺寸=x:' & $x1p & ' y:' & $x1p & ' w:' & $x1p & ' h:' & $x1p, _
                                        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 Then
                                                For $i = 1 To $x2a
                                                        Local $x = ControlGetPos($x2a[$i], "", '')
;~                                                         If $x2a[$i] = 'Internet Explorer_Server' Then
;~                                                                 ControlHide($x2a[$i], '', '')
;~                                                                 Sleep(1000)
;~                                                                 _WinAPI_PostMessage($x2a[$i], 0x0010, 0, 0)
;~                                                         EndIf
                                                        If $x2list Then
                                                                If $x2a[$i] = $x1 Then
                                                                        $x2list &= @CRLF& $x2a[$i] &' || &'] ||x:'& $x &' y:'& $x &' w:'& $x &' h:'& $x & '      <<-- 鼠标坐标子窗 '&$x1
                                                                Else
                                                                        $x2list &= @CRLF& $x2a[$i] &' || &'] ||x:'& $x &' y:'& $x &' w:'& $x &' h:'& $x
                                                                EndIf
                                                        Else
                                                                If $x2a[$i] = $x1 Then
                                                                        $x2list = '=========枚举[句柄: '&$x2&']父窗下的子窗=========' &@CRLF& $x2a[$i] &' || &'] ||x:'& $x &' y:'& $x &' w:'& $x &' h:'& $x & '      <<-- 鼠标坐标子窗 '&$x1
                                                                Else
                                                                        $x2list = '=========枚举[句柄: '&$x2&']父窗下的子窗=========' &@CRLF& $x2a[$i] &' || &'] ||x:'& $x &' y:'& $x &' w:'& $x &' h:'& $x
                                                                EndIf
                                                        EndIf
                                                Next
                                        EndIf
                                EndIf
                                If IsArray($x0p) And IsArray($x1p) And IsArray($x2p) Then
                                        ToolTip('激活前台窗口>> 进程名=' & $x0n & ' |||PID=' & $x0d & ' |||句柄=' & $x0 & ' |||类名=' & $x0c & ' |||窗名=' & $x0t & ' |||尺寸=x:' & $x0p & ' y:' & $x0p & ' w:' & $x0p & ' h:' & $x0p & @CRLF & _
                                        @CRLF & '鼠标坐标父窗>> 进程名=' & $x2n & ' |||PID=' & $x2d & ' |||句柄=' & $x2 & ' |||类名=' & $x2c & ' |||窗名=' & $x2t & ' |||尺寸=x:' & $x2p & ' y:' & $x2p & ' w:' & $x2p & ' h:' & $x2p & _
                                        @CRLF & '鼠标坐标窗口>> 进程名=' & $x1n & ' |||PID=' & $x1d & ' |||句柄=' & $x1 & ' |||类名=' & $x1c & ' |||窗名=' & $x1t & ' |||尺寸=x:' & $x1p & ' y:' & $x1p & ' w:' & $x1p & ' h:' & $x1p & @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

rogerabc 发表于 2014-1-17 14:41:48

送个代码给你 试试. 会对你有一定帮助

sunkiss 发表于 2014-1-17 14:43:00

本帖最后由 sunkiss 于 2014-1-17 14:44 编辑

回复 2# rogerabc

但是这个窗口没有别的信息,只能通过大小和类名可以,大小我试了可以,但是类名不行。类名前缀一样,只有后面不一样,别的信息没有啊~!句柄每次都换,怎么获得这个窗口啊?就算是错的。我也是想,问问大家,因为我自己不会啊~!主要是学习一下。

rogerabc 发表于 2014-1-17 14:46:25

我那代码有点BUG. 懒得修复了. 我想不影响啥的
作用就是给人容易分析窗口

rogerabc 发表于 2014-1-17 14:48:55

反正是窗口都有特征.主副 尺寸 窗口里的控件,只有完全搞懂 才能找到它.把它给控制了.

凌菡 发表于 2014-1-17 14:53:56

最近也遇到这样的问题,很苦恼

sunkiss 发表于 2014-1-17 15:28:26

谢谢了,回家消化消化。

joyran 发表于 2014-1-18 08:21:18

这个很复杂啊!办法要多才给力

kevinch 发表于 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("", "")



例如: 关闭当前活动窗口

WinClose("", "")



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

WinWaitActive("", "")



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

WinList("")

复制了一点帮助文件的内容
页: [1]
查看完整版本: 请教个关于窗口的类名的问题~!