haorui658 发表于 2010-3-10 12:17:31

为什么这么多窗口的类都是#32770?感谢afan[已解决]

本帖最后由 haorui658 于 2010-3-13 01:09 编辑

例如系统的属性对话框 就是#32770,我要控制一个多语言的软件(标题不一样,有N多种语言)也是#32770,但是一打开系统的属性对话框 或者其它的类为#32770的窗口,就不能控制了,大家有什么好的办法做到通一个程序通用吗?

haorui658 发表于 2010-3-10 20:33:51

没有人知道吗???伤心了

afan 发表于 2010-3-10 21:17:45

这个多语言的软件是你Run调用的吗

haorui658 发表于 2010-3-10 22:59:41

恩,是的,但是这有什么区别吗?

haorui658 发表于 2010-3-10 23:03:58

回复 3# afan

这个软件比较特别,运行后前几个界面是一个窗口,后面又是一个窗口,有多语言版本(包括简中,繁中,英文,德文),就是安装界面是多语言的,只有窗口类不变,按钮的控件ID不变

afan 发表于 2010-3-10 23:13:14

以前写过一个通过Run的Pid获取标题的函数,得找找……

haorui658 发表于 2010-3-10 23:30:15

回复 6# afan


    ????pid还能获得窗口标题,好东西:face (36):

afan 发表于 2010-3-10 23:47:42

找到了,我再测试下

haorui658 发表于 2010-3-10 23:51:55

回复 8# afan


    好的,谢谢啊,每次我的问题都是你解决的,太感谢了

afan 发表于 2010-3-10 23:55:56

本帖最后由 afan 于 2010-3-11 00:01 编辑

回复 9# haorui658


    不用客气~~
说明下两个可选参数:
$Delay : 这个是指延时n毫秒后再获取,因为某些软件启动时标题会改变,当然一般不会改变
$timeout : 这个是指超过n毫秒仍未获取到则直接返回,当然获取到了会立即返回,所以设大些没问题$pid = Run('Notepad.exe') ;例子1
MsgBox(0, @error, Pid2title($pid))
ProcessClose($pid)

$pid = Run(@ProgramFilesDir & '\Internet Explorer\IEXPLORE.EXE') ;例子2
MsgBox(0, @error, Pid2title($pid, 100))
ProcessClose($pid)

Func Pid2title($pid, $Delay = 10, $timeout = 10000)
        ;Afan提示:$pid即通过Run()返回的进程标识符,$Delay[可选]延时时间,$timeout[可选]超时时间。
        Local $begin = TimerInit(), $Info, $Runout, $title
        Do
                If ProcessExists($pid) <> 0 Then ExitLoop
        Until TimerDiff($begin) >= $timeout
        Sleep($Delay)
        If ProcessExists($pid) = 0 Then Return SetError(1, 0, 0)
        Do
                $Runout = Run('TASKLIST /V /FI "PID eq ' & $pid & '" /FO LIST', '', 0, 2)
                If @error Then Return SetError(2, 0, 0)
                Do
                        Sleep(1)
                        $Info &= StdoutRead($Runout)
                Until @error
                $title = StringRegExp($Info, '\n窗口标题\s+:\s*(.*)\r', 3)
                If Not @error Then
                        If $title <> '暂缺' Then ;
                                Return $title
                        Else
                                Sleep(100)
                                $Info = ''
                        EndIf
                EndIf
        Until TimerDiff($begin) >= $timeout
        Return SetError(3, 0, 0)
EndFunc   ;==>Pid2title

haorui658 发表于 2010-3-11 00:01:14

回复 10# afan


    好东西,仔细研究下,再次感谢

afan 发表于 2010-3-11 00:06:10

回复 11# haorui658


    别忘了反馈测试结果~ 呵呵

haorui658 发表于 2010-3-11 00:26:09

回复 12# afan


    好的,一定反馈,我先试用几天,无论觉得好还是不好都会反馈的:)

afan 发表于 2010-3-11 00:29:56

回复 13# haorui658


    目前使用正常否?
你的多语言软件是否解决了?

haorui658 发表于 2010-3-11 12:51:55

回复 14# afan


    OMG,神奇了,整个安装过程,存在两个标题,第一次的时候成功获取了,但是第二次返回的是"Should not see me" ,我晕了
页: [1] 2 3
查看完整版本: 为什么这么多窗口的类都是#32770?感谢afan[已解决]