afan 发表于 2010-3-11 12:58:15

回复afan


    OMG,神奇了,整个安装过程,存在两个标题,第一次的时候成功获取了,但是第二次返回的是" ...
haorui658 发表于 2010-3-11 12:51 http://www.autoitx.com/images/common/back.gif


    呵呵,确实很神奇……
它的实际标题是?
有没有适当加点延时?(默认为10ms)

haorui658 发表于 2010-3-11 13:06:59

我加的默认参数,10ms应该够了 窗口标题是PDA Phone ROM Update Utility 3.27.4.3

afan 发表于 2010-3-11 13:16:53

本帖最后由 afan 于 2010-3-11 13:22 编辑

回复 17# haorui658


    那你试试加到 100? 500? 1000? 分别看看结果嘛
如果都无法获取正确的标题,那肯定是程序做了手脚,从那句 Should not see me 也可以瞧出点端倪……
那就改用获取句柄的形式……
我现在有事,晚上再来看看,你先慢慢试,多反馈些信息,有助解决问题

haorui658 发表于 2010-3-11 21:10:04

本帖最后由 haorui658 于 2010-3-11 21:16 编辑

回复 18# afan


    恩 各种延时结果都是一样的,都是"should not see me",能不能通过pid获得句柄呢,肯定不能去用title再去获取句柄,要不然第二步的时候肯定不对,我知道AHK可以直接用pid作参数,但是AU3应该怎么判断呢?

haorui658 发表于 2010-3-11 22:43:01

找到获取句柄的方法了,试验中

haorui658 发表于 2010-3-12 09:07:23

Func Pid2Handle($pid)
    $all = winlist()
    For $i=1 To $all
          If WinGetProcess($all[$i])=$pid Then
                  Return $all[$i]
                  ExitLoop
          EndIf
    Next
EndFunc奉上pid获得句柄的函数,我的问题还没有解决,第二次获得程序句柄和AU3 info中不一致,应该是程序做了手脚

afan 发表于 2010-3-12 12:51:52

回复 21# haorui658


    你这样获取到的不一定是你要的窗口句柄,因为你获取到一个属于某个pid的句柄就立即返回了,而单个pid的句柄不一定只有一个,有些有很多个。

afan 发表于 2010-3-12 14:02:09

本帖最后由 afan 于 2010-3-12 16:38 编辑

以下3个修改函数你可以试试~Func Pid2Handle($pid) ;这个是返回一个2维数组,句柄对应标题,你看看某个pid有多少个句柄...
        Local $all = WinList(), $i, $x = 0, $pidHandle
        For $i = 1 To $all
                If WinGetProcess($all[$i]) = $pid Then
                        ReDim $pidHandle[$x + 1]
                        $pidHandle[$x] = $all[$i]
                        $pidHandle[$x] = $all[$i]
                        $x += 1
                EndIf
        Next
        Return $pidHandle
EndFunc   ;==>Pid2Handle

Func _Pid2Handle($pid) ;这个仅返回一个可见窗口的句柄
        Local $all = WinList(), $i
        For $i = 1 To $all
                If WinGetProcess($all[$i]) = $pid And BitAND(WinGetState($all[$i]), 2) Then Return $all[$i]
        Next
EndFunc   ;==>_Pid2Handle

Func __Pid2Handle($pid) ;这个是返回所有可见窗口的2维数组,句柄对应标题
        Local $all = WinList(), $i, $x = 0, $pidHandle
        For $i = 1 To $all
                If WinGetProcess($all[$i]) = $pid And BitAND(WinGetState($all[$i]), 2) Then
                        ReDim $pidHandle[$x + 1]
                        $pidHandle[$x] = $all[$i]
                        $pidHandle[$x] = $all[$i]
                        $x += 1
                EndIf
        Next
        Return $pidHandle
EndFunc   ;==>__Pid2Handle

haorui658 发表于 2010-3-12 23:07:26

回复 23# afan


    太纠结了,上面的代码也是不行的,但是我剖析了一下程序,程序其实是一个自解压程序,解压后运行了另一个程序,也就是两个程序,自然pid不一样,那个程序的名字是固定的,所以只要用进程名获取相应的标题就好了,afan大大有相应的例子吗?我觉得这回的思路应该对了

afan 发表于 2010-3-13 00:00:17

回复afan


    太纠结了,上面的代码也是不行的,但是我剖析了一下程序,程序其实是一个自解压程序,解压 ...
haorui658 发表于 2010-3-12 23:07 http://www.autoitx.com/images/common/back.gif


    晕死,第一步就走错了……
ProcessList()

haorui658 发表于 2010-3-13 00:57:46

回复 25# afan


    恩,确实,只对au3了解还不行,还得找对方法,这个弯路也学到不少东西,明天尝试一下,估计这回没有问题了

haorui658 发表于 2010-3-13 01:07:02

回复 25# afan


    趁着兴奋劲儿,试了一下,成功获取到title了,谢谢afan大大,很稳定,很好用.安心睡啦

afan 发表于 2010-3-13 01:11:55

回复 27# haorui658


    真替你高兴…… :face (33):

llztt 发表于 2010-3-13 07:25:25

afan 是个好男人,OYE

xwlzx 发表于 2010-3-16 08:16:37

高手,热心!令人兴奋!
页: 1 [2] 3
查看完整版本: 为什么这么多窗口的类都是#32770?感谢afan[已解决]