找回密码
 加入
搜索
查看: 7486|回复: 21

进程PID to 窗口标题

[复制链接]
发表于 2008-5-16 00:49:52 | 显示全部楼层 |阅读模式
如何从进程的PID找到对应窗口的标题?




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

[ 本帖最后由 jiataifeng 于 2008-5-16 19:43 编辑 ]
发表于 2008-5-16 01:08:14 | 显示全部楼层
先用EnumWindows函数枚举所有的窗口,得到句柄,再GetWindowThreadProcessId,得到的pid再与进程的PID对比一下,就可以通过GetWindowText得到窗口标题了
发表于 2008-5-16 02:09:10 | 显示全部楼层
原帖由 himself 于 2008-5-16 01:08 发表
先用EnumWindows函数枚举所有的窗口,得到句柄,再GetWindowThreadProcessId,得到的pid再与进程的PID对比一下,就可以通过GetWindowText得到窗口标题了



什么语言,怎么不像是AU3呀
 楼主| 发表于 2008-5-16 05:47:15 | 显示全部楼层
高人给个实例吧
 楼主| 发表于 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呢?
有没有简单一点地方法呢
 楼主| 发表于 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[0][0]
        if $wlis[$i][0]<> "" AND IsVisible($wlis[$i][1]) then
_WinAPI_GetWindowThreadProcessId($wlis[$i][1], $iProcessID) ;这里$iProcessID不是参数吗,怎么返回值好像赋给它了一样。

If not StringCompare($iProcessID,$pid)   then
MsgBox(0,"t",$wlis[$i][0])
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 编辑 ]
发表于 2008-5-16 10:26:18 | 显示全部楼层
碰巧路过,学习一下,顶你一下。
发表于 2008-5-16 19:18:56 | 显示全部楼层
从pid得到句柄后直接WinGetTitle就ok了……
 楼主| 发表于 2008-5-16 19:20:48 | 显示全部楼层
楼上的,你说的不可以的。
一个PID返回的句柄很多。也包括控件的句柄。
发表于 2008-5-16 19:45:28 | 显示全部楼层
嗯,说的也是……

[ 本帖最后由 asdf 于 2008-5-16 19:48 编辑 ]
 楼主| 发表于 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[0][0]
        if $wlis[$i][0]<> "" AND IsVisible($wlis[$i][1]) then
_WinAPI_GetWindowThreadProcessId($wlis[$i][1], $iProcessID) ;b.这里$iProcessID不是参数吗,怎么返回值好像赋给它了一样。
发表于 2008-5-16 19:57:25 | 显示全部楼层
#include <Process.au3>
Sleep(2000) > ProcessWait(_ProcessGetName ( $iPID ))

另一句不知你说什么= =|||
发表于 2008-5-16 20:05:34 | 显示全部楼层
哦,看看帮助就明白了!_WinAPI_GetWindowThreadProcessId($hWnd, ByRef $iPID)
既然是by ref,当然可以修改(赋值)啦!
发表于 2008-5-16 20:11:58 | 显示全部楼层
这就要说形参实参,按值传递(by val)和按地址传递(by ref,即,指针)了,按值传递的是使用数据的副本(形参)进行运算,按地址传递使用实参的地址(指针指向的内存地址)进行运算,所以,按值传递不能修改实参的值,按地址传递则可以!
 楼主| 发表于 2008-5-16 20:15:21 | 显示全部楼层
你再往下看啊,特别注意其中的 $iProcessID
If not StringCompare($iProcessID,$pid)   then
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-10-2 01:32 , Processed in 0.078472 second(s), 19 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表