进程PID to 窗口标题
如何从进程的PID找到对应窗口的标题?后附:以解决,但不保证特殊情况出现。
[ 本帖最后由 jiataifeng 于 2008-5-16 19:43 编辑 ] 先用EnumWindows函数枚举所有的窗口,得到句柄,再GetWindowThreadProcessId,得到的pid再与进程的PID对比一下,就可以通过GetWindowText得到窗口标题了 原帖由 himself 于 2008-5-16 01:08 发表 http://www.autoitx.com/images/common/back.gif
先用EnumWindows函数枚举所有的窗口,得到句柄,再GetWindowThreadProcessId,得到的pid再与进程的PID对比一下,就可以通过GetWindowText得到窗口标题了
什么语言,怎么不像是AU3呀 高人给个实例吧 1得到所有窗口句柄可以用winlist
2.关于GetWindowThreadProcessId 解释如下
; Name...........: _WinAPI_GetWindowThreadProcessId
; Description ...: Retrieves the identifier of the thread that created the specified window
; Syntax.........: _WinAPI_GetWindowThreadProcessId($hWnd, ByRef $iPID)
; Parameters ....: $hWnd - Window handle
; $iPID - Process ID of the specified window
; Return values .: Success - Thread ID of the specified window
; Author ........: Paul Campbell (PaulIA)
; Modified.......:
; Remarks .......:
; Related .......:
; Link ..........; @@MsdnLink@@ GetWindowThreadProcessId
; Example .......;
说明,该函数返回的是某 窗口某进程的线程ID。
如何得到所有窗口的PID呢?
有没有简单一点地方法呢 我弄好了,但是不是很满意。请高手再优化一下。
#include <winapi.au3>
Local$iProcessID
$pid=Run("a.exe");一个有窗口的测试程序
Sleep(2000) ;这里不满意。时间过大了浪费,过小吧窗口还没出现,winlist()无法捕捉到。希望winwait函数能用在这里
$wlis=WinList()
for $i=1 to $wlis
if $wlis[$i]<> "" AND IsVisible($wlis[$i]) then
_WinAPI_GetWindowThreadProcessId($wlis[$i], $iProcessID) ;这里$iProcessID不是参数吗,怎么返回值好像赋给它了一样。
If not StringCompare($iProcessID,$pid) then
MsgBox(0,"t",$wlis[$i])
EndIf
EndIf
Next
Func IsVisible($handle)
If BitAnd( WinGetState($handle), 2 ) Then
Return 1
Else
Return 0
EndIf
EndFunc
[ 本帖最后由 jiataifeng 于 2008-5-16 06:55 编辑 ] 碰巧路过,学习一下,顶你一下。 从pid得到句柄后直接WinGetTitle就ok了…… 楼上的,你说的不可以的。
一个PID返回的句柄很多。也包括控件的句柄。 嗯,说的也是……
[ 本帖最后由 asdf 于 2008-5-16 19:48 编辑 ] 那不就是6#我写的方法吗?
不过还有两个问题:
问题一:a
问题二:b
$pid=Run("a.exe");一个有窗口的测试程序
Sleep(2000) ;a.这里不满意。时间过大了浪费,过小吧窗口还没出现,winlist()无法捕捉到。希望winwait函数能用在这里
$wlis=WinList()
for $i=1 to $wlis
if $wlis[$i]<> "" AND IsVisible($wlis[$i]) then
_WinAPI_GetWindowThreadProcessId($wlis[$i], $iProcessID) ;b.这里$iProcessID不是参数吗,怎么返回值好像赋给它了一样。 #include <Process.au3>
Sleep(2000) > ProcessWait(_ProcessGetName ( $iPID ))
另一句不知你说什么= =||| 哦,看看帮助就明白了!_WinAPI_GetWindowThreadProcessId($hWnd, ByRef $iPID)
既然是by ref,当然可以修改(赋值)啦!:face (32): 这就要说形参实参,按值传递(by val)和按地址传递(by ref,即,指针)了,按值传递的是使用数据的副本(形参)进行运算,按地址传递使用实参的地址(指针指向的内存地址)进行运算,所以,按值传递不能修改实参的值,按地址传递则可以! 你再往下看啊,特别注意其中的 $iProcessID
If not StringCompare($iProcessID,$pid) then
页:
[1]
2