找回密码
 加入
搜索
查看: 12654|回复: 16

[GUI管理] [已解决]如何获取窗口的Style

 火.. [复制链接]
发表于 2010-11-5 17:26:59 | 显示全部楼层 |阅读模式
本帖最后由 yhxhappy 于 2010-11-8 18:58 编辑



小弟想识别上图的窗口,如果识别到就点“仍然继续”的按钮,为了适用于多语言系统,所以不能用标题和文本的方式识别。

想了很久,觉得用 CLASS:#32770,再加上窗口的 Style,应该可以排除大部分窗口
使用AU3INFO工具可以显示窗口的Style,但是我找了AU3的帮助,没有 获取窗口Style信息的 函数,所以特来求教。

如果各位有更好的方法,请告诉我!谢谢!

补充说一下:
我试过对比PID,那个窗口的PID和我所安装的驱动时 RUN(……)返回PID不一样。所以通过对比PID这个好像也行不通。
那个窗口的进程名是msiexec.exe,但我不确定安装别的驱动弹出同样的窗口时进程名是不是一样,因为只有一款驱动没通过WHQL验证,所以没法验证。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2010-11-5 18:37:03 | 显示全部楼层
为了适用于多语言系统,所以不能用标题和文本的方式识别。


嗯,就是这样,终于有人想通了。
User32.GetWindowLong可以获取窗口风格,或者直接调用现有的_WinAPI_GetWindowLong。
发表于 2010-11-5 20:04:08 | 显示全部楼层
为了适应多语言系统,我认为还是先找到系统的语言版本,再使用case的好。
发表于 2010-11-5 20:38:02 | 显示全部楼层
P版精通API,用P版的API UDF应该可以解决!
发表于 2010-11-6 11:40:34 | 显示全部楼层
回复 4# hzxymkb

那H版精通什么,说说,以后有问题好向你请教
 楼主| 发表于 2010-11-6 12:59:16 | 显示全部楼层
本帖最后由 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][1] <> "Notepad" Then ContinueLoop
                MsgBox(0, $aWindows[$i][0], WinGetTitle($aWindows[$i][0]) & @CRLF & _WinAPI_GetWindowLong($aWindows[$i][0], -16))
        Next
EndFunc
3、0x14CF0000 这种类型的字符是什么格式的呢,二进制吗?

上面的问题有些笨,见笑了!
 楼主| 发表于 2010-11-6 13:02:03 | 显示全部楼层
回复 3# xianhou


    之前我也想这样来的,但 中文 和英文还好,碰到更多的语言的OS就麻烦了,一个一个试太麻烦了
发表于 2010-11-6 13:09:57 | 显示全部楼层
$GWL_STYLE = 窗口样式
$GWL_EXSTYLE = 扩展窗口样式
_WinAPI_EnumWindows() 返回的是十进制整数,需要十六进制值可以在前面加 '0x' & Hex(_WinAPI_EnumWindows())
发表于 2010-11-6 13:29:07 | 显示全部楼层
回复 7# yhxhappy


    难道你想写一个全球通用版?

仅用窗口式样来判断窗口太随意了。
 楼主| 发表于 2010-11-6 13:42:11 | 显示全部楼层
本帖最后由 yhxhappy 于 2010-11-6 13:50 编辑

回复 9# xianhou


呵,全球通用版 那是最终目标啦

单用窗口CLASS 和窗口风格来判断确实不够保险,我还考虑加上扩展风格,和窗口尺寸来判断,应该能万无一失了。但我担心用户使用了别的主题,窗口尺寸会不会变呢。那一位知道这个问题的话告诉我一下。

如果使用标题和文本的话,中英文我觉得倒容易,但那天碰到繁体中文,西班牙文等等,就要亲自拿该语言的系统来装,并取标题和文本,很麻烦。
而且目前我还不知道什么在脚本里面 打出繁体中文来呢
 楼主| 发表于 2010-11-6 14:00:06 | 显示全部楼层
回复 8# afan


感谢AFAN

已经可以取得和 AU3INFO一样格式 的内容了。

但在我这里直接像这样填 $iIndex 的不行:_WinAPI_GetWindowLong(窗口句柄, $GWL_STYLE)
提示:Variable used without being declared.

帮助里面写 需要 Constants.au3 预定义常量
不懂意思。也懒得研究了,直接照MSDN里面写的也行

-20  扩展窗口样式
-16  窗口样式
发表于 2010-11-6 14:05:10 | 显示全部楼层
回复 10# yhxhappy


1    改变主题有可能会改变窗口的边框的大小,也就改变了整个窗口的大小。

2  难道不做市场调查,就想开发产品?如果连对方的语言都看不懂,还想到哪里推广产品?
发表于 2010-11-7 13:11:23 | 显示全部楼层
可以获取客户区大小,那个不受边框的影响吧
发表于 2011-3-31 19:55:16 | 显示全部楼层
还是没看懂,到底怎么判断这种窗口是否存在啊?
 楼主| 发表于 2011-4-1 15:48:05 | 显示全部楼层
以下是从我的代码中截出来的一段
        $aWindows = _WinAPI_EnumWindows()        
        For $i = 1 To UBound($aWindows) - 1
                $Style = _WinAPI_GetWindowLong($aWindows[$i][0], -16)
                $ExStyle = _WinAPI_GetWindowLong($aWindows[$i][0], -20)
                
                Switch @OSVersion
                        Case "WIN_2000", "WIN_XP", "WIN_2003"
                                If $aWindows[$i][1] = "#32770" And $Style = 0x94C008C4 And $ExStyle = 0x00010101 Then        ;未通过 WHQL 徽标验证时弹出的 警告窗口
                                        WinActivate($aWindows[$i][0])
                                        Send("!{c}")
                                EndIf
                                If $aWindows[$i][1] = "#32770" And $Style = 0x94C000C4 And $ExStyle = 0x00010101 Then        ;找到新硬件 窗口
                                        WinClose($aWindows[$i][0])
                                EndIf
                        ;Case "WIN_2008"
                        ;Case "WIN_2008R2"
                        ;Case "WIN_VISTA"
                        ;Case "WIN_7"
                        ;        If $aWindows[$i][1] = "Notepad" And $Style = 0x14CF0000 And $ExStyle = 0x000100C8 Then
                        ;                WinActivate($aWindows[$i][0])
                        ;                Send("!{F4}")
                        ;        EndIf
                EndSwitch
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-12-26 22:42 , Processed in 0.115391 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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