[已解决]如何获取窗口的Style
本帖最后由 yhxhappy 于 2010-11-8 18:58 编辑小弟想识别上图的窗口,如果识别到就点“仍然继续”的按钮,为了适用于多语言系统,所以不能用标题和文本的方式识别。
想了很久,觉得用 CLASS:#32770,再加上窗口的 Style,应该可以排除大部分窗口
使用AU3INFO工具可以显示窗口的Style,但是我找了AU3的帮助,没有 获取窗口Style信息的 函数,所以特来求教。
如果各位有更好的方法,请告诉我!谢谢!
补充说一下:
我试过对比PID,那个窗口的PID和我所安装的驱动时 RUN(……)返回PID不一样。所以通过对比PID这个好像也行不通。
那个窗口的进程名是msiexec.exe,但我不确定安装别的驱动弹出同样的窗口时进程名是不是一样,因为只有一款驱动没通过WHQL验证,所以没法验证。 为了适用于多语言系统,所以不能用标题和文本的方式识别。
嗯,就是这样,终于有人想通了。
User32.GetWindowLong可以获取窗口风格,或者直接调用现有的_WinAPI_GetWindowLong。 为了适应多语言系统,我认为还是先找到系统的语言版本,再使用case的好。 P版精通API,用P版的API UDF应该可以解决! 回复 4# hzxymkb
那H版精通什么,说说,以后有问题好向你请教 本帖最后由 yhxhappy 于 2010-11-6 13:04 编辑
回复 2# pusofalse
谢谢P版指点,我现在有3个问题:
1、我看了 GetWindowLong 的帮助,_WinAPI_GetWindowLong($hWnd, $iIndex) 不明白 $iIndex 填什么,转到 MSDN 看帮助,写道:
GWL_EXSTYLE
-20
Retrieves the extended window styles.
GWL_STYLE
-16
Retrieves the window styles.
假如我想取窗口styles,是不是可以这样写呢:_WinAPI_GetWindowLong($hWnd, -16)
2、假设我第一个问题成立,我试着读取 记事本 窗口的styles,返回值是一串数字 349110272,AU3INFO显示styles是0x14CF0000,这两者之间有什么关系吗?我想取得跟AU3INFO一样的格式,方便而且更直观一些。#include <WinAPI.au3>
_Main()
Func _Main()
$aWindows = _WinAPI_EnumWindows()
For $i = 1 To UBound($aWindows) - 1
If $aWindows[$i] <> "Notepad" Then ContinueLoop
MsgBox(0, $aWindows[$i], WinGetTitle($aWindows[$i]) & @CRLF & _WinAPI_GetWindowLong($aWindows[$i], -16))
Next
EndFunc3、0x14CF0000 这种类型的字符是什么格式的呢,二进制吗?
上面的问题有些笨,见笑了! 回复 3# xianhou
之前我也想这样来的,但 中文 和英文还好,碰到更多的语言的OS就麻烦了,一个一个试太麻烦了 $GWL_STYLE = 窗口样式
$GWL_EXSTYLE = 扩展窗口样式
_WinAPI_EnumWindows() 返回的是十进制整数,需要十六进制值可以在前面加 '0x' & Hex(_WinAPI_EnumWindows()) 回复 7# yhxhappy
难道你想写一个全球通用版?
仅用窗口式样来判断窗口太随意了。 本帖最后由 yhxhappy 于 2010-11-6 13:50 编辑
回复 9# xianhou
呵,全球通用版 那是最终目标啦
单用窗口CLASS 和窗口风格来判断确实不够保险,我还考虑加上扩展风格,和窗口尺寸来判断,应该能万无一失了。但我担心用户使用了别的主题,窗口尺寸会不会变呢。那一位知道这个问题的话告诉我一下。
如果使用标题和文本的话,中英文我觉得倒容易,但那天碰到繁体中文,西班牙文等等,就要亲自拿该语言的系统来装,并取标题和文本,很麻烦。
而且目前我还不知道什么在脚本里面 打出繁体中文来呢 回复 8# afan
感谢AFAN
已经可以取得和 AU3INFO一样格式 的内容了。
但在我这里直接像这样填 $iIndex 的不行:_WinAPI_GetWindowLong(窗口句柄, $GWL_STYLE)
提示:Variable used without being declared.
帮助里面写 需要 Constants.au3 预定义常量
不懂意思。也懒得研究了,直接照MSDN里面写的也行
-20扩展窗口样式
-16窗口样式 回复 10# yhxhappy
1 改变主题有可能会改变窗口的边框的大小,也就改变了整个窗口的大小。
2难道不做市场调查,就想开发产品?如果连对方的语言都看不懂,还想到哪里推广产品? 可以获取客户区大小,那个不受边框的影响吧 还是没看懂,到底怎么判断这种窗口是否存在啊? 以下是从我的代码中截出来的一段 $aWindows = _WinAPI_EnumWindows()
For $i = 1 To UBound($aWindows) - 1
$Style = _WinAPI_GetWindowLong($aWindows[$i], -16)
$ExStyle = _WinAPI_GetWindowLong($aWindows[$i], -20)
Switch @OSVersion
Case "WIN_2000", "WIN_XP", "WIN_2003"
If $aWindows[$i] = "#32770" And $Style = 0x94C008C4 And $ExStyle = 0x00010101 Then ;未通过 WHQL 徽标验证时弹出的 警告窗口
WinActivate($aWindows[$i])
Send("!{c}")
EndIf
If $aWindows[$i] = "#32770" And $Style = 0x94C000C4 And $ExStyle = 0x00010101 Then ;找到新硬件 窗口
WinClose($aWindows[$i])
EndIf
;Case "WIN_2008"
;Case "WIN_2008R2"
;Case "WIN_VISTA"
;Case "WIN_7"
; If $aWindows[$i] = "Notepad" And $Style = 0x14CF0000 And $ExStyle = 0x000100C8 Then
; WinActivate($aWindows[$i])
; Send("!{F4}")
; EndIf
EndSwitch
页:
[1]
2