为什么这么多窗口的类都是#32770?感谢afan[已解决]
本帖最后由 haorui658 于 2010-3-13 01:09 编辑例如系统的属性对话框 就是#32770,我要控制一个多语言的软件(标题不一样,有N多种语言)也是#32770,但是一打开系统的属性对话框 或者其它的类为#32770的窗口,就不能控制了,大家有什么好的办法做到通一个程序通用吗? 没有人知道吗???伤心了 这个多语言的软件是你Run调用的吗 恩,是的,但是这有什么区别吗? 回复 3# afan
这个软件比较特别,运行后前几个界面是一个窗口,后面又是一个窗口,有多语言版本(包括简中,繁中,英文,德文),就是安装界面是多语言的,只有窗口类不变,按钮的控件ID不变 以前写过一个通过Run的Pid获取标题的函数,得找找…… 回复 6# afan
????pid还能获得窗口标题,好东西:face (36): 找到了,我再测试下 回复 8# afan
好的,谢谢啊,每次我的问题都是你解决的,太感谢了 本帖最后由 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 回复 10# afan
好东西,仔细研究下,再次感谢 回复 11# haorui658
别忘了反馈测试结果~ 呵呵 回复 12# afan
好的,一定反馈,我先试用几天,无论觉得好还是不好都会反馈的:) 回复 13# haorui658
目前使用正常否?
你的多语言软件是否解决了? 回复 14# afan
OMG,神奇了,整个安装过程,存在两个标题,第一次的时候成功获取了,但是第二次返回的是"Should not see me" ,我晕了