大家都知道,
i=shell("command",1")
这一语句可以启动command,并且i的值是它的PID。
那么,我的问题是,如果我启动了"command",或其他程序,只知道名称,但我如何获得它的PID?是用那个函数?
如例子,获得"command"的PID方法如何?请给出例子。      多谢多谢!!!!!!!!!

解决方案 »

  1.   

    1.可以用FindWindow 找出你要查的窗口句柄
    whnd = FindWindow(vbNullString, "Form1")  '获取窗口句柄
    2. 获取该窗口的进程id
    GetWindowThreadProcessId whnd, pid        '获取进程id
    3.获取该进程句柄
    phnd = OpenProcess(&H10000, False, pid)   '获取进程句柄,
      

  2.   

    不行。这是一个没有窗体的程序。假设有一个窗体,标题为Frm,这个工程名为Pro,生成可执行文件为Exe。
    我的要求是:根据Pro得到他的PID。
      

  3.   

    就像我在使用的Win2000 Server ,他的进程管理器中列出的就是工程名,后面跟着PID,然后有CPU时间,占用内存等。
      

  4.   


    BOOL CreateProcess(    LPCTSTR lpApplicationName, // pointer to name of executable module 
        LPTSTR lpCommandLine, // pointer to command line string
        LPSECURITY_ATTRIBUTES lpProcessAttributes, // pointer to process security attributes 
        LPSECURITY_ATTRIBUTES lpThreadAttributes, // pointer to thread security attributes 
        BOOL bInheritHandles, // handle inheritance flag 
        DWORD dwCreationFlags, // creation flags 
        LPVOID lpEnvironment, // pointer to new environment block 
        LPCTSTR lpCurrentDirectory, // pointer to current directory name 
        LPSTARTUPINFO lpStartupInfo, // pointer to STARTUPINFO 
        LPPROCESS_INFORMATION lpProcessInformation  // pointer to PROCESS_INFORMATION  
       )
    来代替shell命令启动程序
    他是一个功能很强的API函数,能得到你所启动的进程的所有信息,包括他的线程的信息。
    你自己仔细去研究一下吧。
      

  5.   

    枚举系统进程,取等每个进程的exename后和你要的exe.name比较
      

  6.   

    ToolHelp SDK:
    CreateToolhelp32Snapshot,Process32First,Process32Next
      

  7.   

    to  boywang(大力水手) 
    就是他!!!
    请说详细点好么??
      

  8.   

    to fullor2000(兽子) 喔,忘了说,那个程序并不是我的程序启动的。否则,我不使用API,只用Shell就能达到目的了。
      

  9.   

    to sakurako(我演的是我)进程名?就是工程名?对头!正是本人的问题(好头痛啊!)
      楼上boywang(大力水手)的意思好像说枚举进程可以实现。
      

  10.   

    楼主应该是2000吧。
    比较常 用的方法还是用: bu_wen(不文) ( )
      

  11.   

    是的。我是用的2000server。怎么实现?多谢……
      

  12.   

    bu_wen(不文) 的方法只能对付一半程序。用它关闭VFP6.0试试?也关不了VB6.0嘛。
      

  13.   

    http://expert.csdn.net/Expert/topic/1964/1964215.xml?temp=.4582025
    接上贴源代码:
    Private Function StrZToStr(s As String) As String
        StrZToStr = Left$(s, Len(s) - 1)
    End FunctionPublic Function GetElement(ByVal strList As String, ByVal strDelimiter As String, ByVal lngNumColumns As Long, ByVal lngRow As Long, ByVal lngColumn As Long) As String    Dim lngCounter As Long    ' Append delimiter text to the end of the list as a terminator.
        strList = strList & strDelimiter    ' Calculate the offset for the item required based on the number of columns the list
        ' 'strList' has i.e. 'lngNumColumns' and from which row the element is to be
        ' selected i.e. 'lngRow'.
        lngColumn = IIf(lngRow = 0, lngColumn, (lngRow * lngNumColumns) + lngColumn)    ' Search for the 'lngColumn' item from the list 'strList'.
        For lngCounter = 0 To lngColumn - 1        ' Remove each item from the list.
            strList = Mid$(strList, InStr(strList, strDelimiter) + Len(strDelimiter), Len(strList))        ' If list becomes empty before 'lngColumn' is found then just
            ' return an empty string.
            If Len(strList) = 0 Then
                GetElement = ""
                Exit Function
            End If    Next lngCounter    ' Return the sought list element.
        GetElement = Left$(strList, InStr(strList, strDelimiter) - 1)End FunctionPublic Function GetNumElements(ByVal strList As String, ByVal strDelimiter As String) As Integer    Dim intElementCount As Integer    ' If no elements in the list 'strList' then just return 0.
        If Len(strList) = 0 Then
            GetNumElements = 0
            Exit Function
        End If    ' Append delimiter text to the end of the list as a terminator.
        strList = strList & strDelimiter    ' Count the number of elements in 'strlist'
        While InStr(strList, strDelimiter) > 0
            intElementCount = intElementCount + 1
            strList = Mid$(strList, InStr(strList, strDelimiter) + 1, Len(strList))
        Wend    ' Return the number of elements in 'strList'.
        GetNumElements = intElementCountEnd Function
      

  14.   

    '这是我编的一个完整的程序,你应该用得上
    '窗体中有一个ListBox,三个Command。
    'Command1 枚举本地进程
    'Command2 杀掉在ListBox中选中的进程
    'Command3 退出
    Option Explicit
    Dim ProcessID() As Long                                          ' 按list1中的进程顺序存储所有进程ID'---------- API类型声明   -----------
    Private Type PROCESSENTRY32                 '进程
        dwsize As Long
        cntusage As Long
        th32ProcessID As Long
        th32DefaultHeapID As Long
        th32ModuleID As Long
        cntThreads As Long
        th32ParentProcessID As Long
        pcPriClassBase As Long
        dwFlags As Long
        szExeFile As String * 1024
    End TypePrivate Type MODULEENTRY32                  '模块
        dwsize As Long
        th32ModuleID As Long
        th32ProcessID As Long
        GlblcntUsage As Long
        ProccntUsage As Long
        modBaseAddr As Byte
        modBaseSize As Long
        hModule As Long
        szModule As String * 256
        szExePath As String * 1024
    End TypePrivate Type THREADENTRY32                  '线程
        dwsize As Long
        cntusage As Long
        th32threadID As Long
        th32OwnerProcessID As Long
        tpBasePri As Long
        tpDeltaPri As Long
        dwFlags As Long
    End Type
    '----------------------------------------- API声明 -------------------------------------------------------
    Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
    Private Declare Function CreateToolhelp32Snapshot Lib "kernel32" (ByVal dwFlags As Long, ByVal th32ProcessID As Long) As Long
    Private Declare Function Module32First Lib "kernel32" (ByVal hSnapshot As Long, lppe As MODULEENTRY32) As Long
    Private Declare Function Module32Next Lib "kernel32" (ByVal hSnapshot As Long, lppe As MODULEENTRY32) As Long
    Private Declare Function Process32First Lib "kernel32" (ByVal hSnapshot As Long, lppe As PROCESSENTRY32) As Long
    Private Declare Function Process32Next Lib "kernel32" (ByVal hSnapshot As Long, lppe As PROCESSENTRY32) As Long
    Private Declare Function Thread32First Lib "kernel32" (ByVal hSnapshot As Long, lppe As THREADENTRY32) As Long
    Private Declare Function Thread32Next Lib "kernel32" (ByVal hSnapshot As Long, lppe As THREADENTRY32) As Long
    Private Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long
    Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
    Private Declare Function GetCurrentProcessId Lib "kernel32" () As Long'---------------------------------------- API常数声明 ------------------------------------------------------
    Private Const TH32CS_SNAPHEAPLIST = &H1
    Private Const TH32CS_SNAPPROCESS = &H2
    Private Const TH32CS_SNAPTHREAD = &H4
    Private Const TH32CS_SNAPMODULE = &H8
    Private Const TH32CS_SNAPALL = (TH32CS_SNAPHEAPLIST Or TH32CS_SNAPPROCESS Or TH32CS_SNAPTHREAD Or TH32CS_SNAPMODULE)
    Private Const TH32CS_INHERIT = &H80000000
    Private Const PROCESS_TERMINATE = &H1&Private Sub Command1_Click()
    Dim Process As PROCESSENTRY32
    Dim ProcSnap As Long
    Dim cntProcess As Long
    cntProcess = 0
    List1.Clear
    ProcSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)
    If ProcSnap Then
        Process.dwsize = 1060                                        ' 通常用法
        Process32First ProcSnap, Process
        Do Until Process32Next(ProcSnap, Process) < 1                ' 遍历所有进程直到返回值为False
            List1.AddItem Trim(Process.szExeFile)
            cntProcess = cntProcess + 1
        Loop
    End If
    ReDim ProcessID(cntProcess) As Long
    Dim i As Long
    i = 0
    Process32First ProcSnap, Process
    Do Until Process32Next(ProcSnap, Process) < 1                    ' 遍历所有进程直到返回值为False
        ProcessID(i) = Process.th32ProcessID
        i = i + 1
    Loop
    CloseHandle (ProcSnap)
    End SubPrivate Sub Command2_Click()
    Dim c As Integer
    If List1.ListIndex < 0 Then
        MsgBox "请选择进程!", vbOKOnly + vbInformation, "提示"
    Else
        Dim hProcess As Long
        hProcess = OpenProcess(PROCESS_TERMINATE, False, ProcessID(List1.ListIndex))
        If hProcess Then TerminateProcess hProcess, 0
        c = List1.ListCount
        While List1.ListCount = c
            Command1_Click
        Wend
    End If
    End SubPrivate Sub Command3_Click()
    Unload Me
    End Sub
      

  15.   

    补充:第一个帖子
    http://expert.csdn.net/Expert/topic/1964/1964215.xml?temp=.4582025
    中的获取所有进程名最前面还必须添加一下声明:Const TH32CS_SNAPHEAPLIST = &H1
    Const TH32CS_SNAPPROCESS = &H2
    Const TH32CS_SNAPTHREAD = &H4
    Const TH32CS_SNAPMODULE = &H8
    Const TH32CS_SNAPALL = (TH32CS_SNAPHEAPLIST Or TH32CS_SNAPPROCESS Or TH32CS_SNAPTHREAD Or TH32CS_SNAPMODULE)
    Const TH32CS_INHERIT = &H80000000