jiataifeng 发表于 2008-5-16 00:49:52

进程PID to 窗口标题

如何从进程的PID找到对应窗口的标题?




后附:以解决,但不保证特殊情况出现。

[ 本帖最后由 jiataifeng 于 2008-5-16 19:43 编辑 ]

himself 发表于 2008-5-16 01:08:14

先用EnumWindows函数枚举所有的窗口,得到句柄,再GetWindowThreadProcessId,得到的pid再与进程的PID对比一下,就可以通过GetWindowText得到窗口标题了

马甲 发表于 2008-5-16 02:09:10

原帖由 himself 于 2008-5-16 01:08 发表 http://www.autoitx.com/images/common/back.gif
先用EnumWindows函数枚举所有的窗口,得到句柄,再GetWindowThreadProcessId,得到的pid再与进程的PID对比一下,就可以通过GetWindowText得到窗口标题了


什么语言,怎么不像是AU3呀

jiataifeng 发表于 2008-5-16 05:47:15

高人给个实例吧

jiataifeng 发表于 2008-5-16 06:03:53

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呢?
有没有简单一点地方法呢

jiataifeng 发表于 2008-5-16 06:42:27

我弄好了,但是不是很满意。请高手再优化一下。



#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 编辑 ]

ollydbg 发表于 2008-5-16 10:26:18

碰巧路过,学习一下,顶你一下。

asdf 发表于 2008-5-16 19:18:56

从pid得到句柄后直接WinGetTitle就ok了……

jiataifeng 发表于 2008-5-16 19:20:48

楼上的,你说的不可以的。
一个PID返回的句柄很多。也包括控件的句柄。

asdf 发表于 2008-5-16 19:45:28

嗯,说的也是……

[ 本帖最后由 asdf 于 2008-5-16 19:48 编辑 ]

jiataifeng 发表于 2008-5-16 19:49:10

那不就是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不是参数吗,怎么返回值好像赋给它了一样。

asdf 发表于 2008-5-16 19:57:25

#include <Process.au3>
Sleep(2000) > ProcessWait(_ProcessGetName ( $iPID ))

另一句不知你说什么= =|||

asdf 发表于 2008-5-16 20:05:34

哦,看看帮助就明白了!_WinAPI_GetWindowThreadProcessId($hWnd, ByRef $iPID)
既然是by ref,当然可以修改(赋值)啦!:face (32):

asdf 发表于 2008-5-16 20:11:58

这就要说形参实参,按值传递(by val)和按地址传递(by ref,即,指针)了,按值传递的是使用数据的副本(形参)进行运算,按地址传递使用实参的地址(指针指向的内存地址)进行运算,所以,按值传递不能修改实参的值,按地址传递则可以!

jiataifeng 发表于 2008-5-16 20:15:21

你再往下看啊,特别注意其中的 $iProcessID
If not StringCompare($iProcessID,$pid)   then
页: [1] 2
查看完整版本: 进程PID to 窗口标题