请教个关于窗口的类名的问题~!
使用WinExists ("", "")可以成功返回“1”,但是类名不全的时候比如说类名是“Notepad”,用WinExists ("", "")返回“0”,只用类名的一部分不成功。Opt("WinTitleMatchMode", 2)这里设置成2也不管用,怎么办? 我说个例子吧.你就明白你这么定位窗口就是个错.
就拿广告说吧. 它能模拟IE类 或者 IME类. 让你无从下手 去杀了那些窗口.既然他们都没个定性.你为何纠结在这个类名定义上呢? 那个称呼只是给人很好的阅读分辨窗口特征的好意.但是实际上窗口的类名 可以是随机的. #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
送个代码给你 试试. 会对你有一定帮助 本帖最后由 sunkiss 于 2014-1-17 14:44 编辑
回复 2# rogerabc
但是这个窗口没有别的信息,只能通过大小和类名可以,大小我试了可以,但是类名不行。类名前缀一样,只有后面不一样,别的信息没有啊~!句柄每次都换,怎么获得这个窗口啊?就算是错的。我也是想,问问大家,因为我自己不会啊~!主要是学习一下。 我那代码有点BUG. 懒得修复了. 我想不影响啥的
作用就是给人容易分析窗口 反正是窗口都有特征.主副 尺寸 窗口里的控件,只有完全搞懂 才能找到它.把它给控制了. 最近也遇到这样的问题,很苦恼 谢谢了,回家消化消化。 这个很复杂啊!办法要多才给力 高级窗口描述
在此模式下,一些特殊的字符串可用来代替窗口标题参数,这样我们就可以使用下面的 属性 来识别一个窗口:
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]