回 帖 发 新 帖 刷新版面

主题:有关进程PID、窗口句柄的几个问题

如何实现下面的要求:

1、已知Pid,要求获取进程名?
2、已知Pid,要求获取完整路径?
3、已知窗口句柄,要求获取该窗口所属的Pid?
4、已知窗口句柄,要求获取窗口标题?
5、要怎样才能结束标题里包含指定字符串的窗口?

菜鸟与高手,不管谁都好,会的就告诉偶!
逐一解决,只要告诉我思路和必要的函数还有这些函数的功能就可以了!~

回复列表 (共1个回复)

沙发

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

我来回复

您尚未登录,请登录后再回复。点此登录或注册