主题:有关进程PID、窗口句柄的几个问题
xjh22700
[专家分:320] 发布于 2009-02-01 16:19:00
如何实现下面的要求:
1、已知Pid,要求获取进程名?
2、已知Pid,要求获取完整路径?
3、已知窗口句柄,要求获取该窗口所属的Pid?
4、已知窗口句柄,要求获取窗口标题?
5、要怎样才能结束标题里包含指定字符串的窗口?
菜鸟与高手,不管谁都好,会的就告诉偶!
逐一解决,只要告诉我思路和必要的函数还有这些函数的功能就可以了!~
回复列表 (共1个回复)
沙发
一江秋水 [专家分:9680] 发布于 2009-02-02 08:21:00
1、2、解答如下:
要使用好几个API函数,将取的的数据填入ListView1控件:
hSnapshot = CreateToolhelpSnapshot(15, 0) '获得进程“快照”的句柄
Proc.dwsize = Len(Proc)
lPid = ProcessFirst(hSnapshot, Proc) '获取第一个进程的PROCESSENTRY32结构信息
Do While lPid <> 0
Set mItem = ListView1.ListItems.Add
PathStr = Trim(Left(Proc.szExeFile, InStr(Proc.szExeFile, Chr(0)) - 1))
With mItem
.Text = PathStr '进程名
.SubItems(2) = Proc.th32ProcessID '进程ID
.SubItems(3) = Proc.th32ParentProcessID '父ID
.SubItems(4) = Proc.cntThreads '线程数
.SubItems(5) = Proc.pcPriClassBase '优先级
GetPath Proc.th32ProcessID, PathStr
.SubItems(1) = PathStr '执行程序路径
End With
Proc.szExeFile = String(260, Chr(0))
lPid = ProcessNext(hSnapshot, Proc) '循环获取下一个进程的PROCESSENTRY32结构信息
Loop
CloseHandle hSnapshot '关闭进程“快照”句柄
Private Sub GetPath(pID As Long, pST As String) '获取执行程序路径
pST = ""
If pID = 0 Then Exit Sub
Dim lRet As Long
Dim Mode As MODULEENTRY32
lRet = CreateToolhelpSnapshot(8, pID) '根据进程ID获取模块快照句柄
If lRet > 0 Then
Mode.dwsize = Len(Mode)
If Module32First(lRet, Mode) Then
pST = Left(Mode.szExePath, InStr(Mode.szExePath, Chr(0)) - 1)
If InStr(pST, ":") > 2 Then pST = Mid(pST, InStr(pST, ":") - 1) '文件路径
End If
CloseHandle lRet '关闭模块快照句柄
End If
End Sub
代码中的PROCESSENTRY32结构如下:
Private Type PROCESSENTRY32
dwsize As Long
cntUsage As Long '进程的引用计数
th32ProcessID As Long '进程ID
th32DefaultHeapID As Long '进程默认堆栈ID
th32ModuleID As Long '进程模块ID
cntThreads As Long '线程数量
th32ParentProcessID As Long '父过程ID
pcPriClassBase As Long '线程基本优先级
dwFlags As Long '标识
szExeFile As String * 260 '可执行文件名
End Type
我来回复