怎么样枚举正在运行的应用软件的路径呢?
不能包括操作系统的进程程序。
怎么样区分操作系统与用户运行的程序呢?

解决方案 »

  1.   

    用CreateToolhelp32Snapshot,Process32First,Process32Next来枚举所有进程,判断应用程序的话,一般,应用程序的PROCESSENTRY32结构中的th32ParentProcessID成员会是explorer.exe的进程id
      

  2.   

    To: supergreenbean
    有具体的代码吗?
      

  3.   

    http://community.csdn.net/Expert/topic/2680/2680530.xml?temp=.6444361
      

  4.   

    参考:Public Function GetActiveProcess() As Long
        Dim hToolhelpSnapshot As Long
        Dim tProcess As PROCESSENTRY32
        Dim r As Long, i As Integer
        hToolhelpSnapshot = CreateToolhelpSnapshot(TH32CS_SNAPPROCESS, 0&)
        If hToolhelpSnapshot = 0 Then
            GetActiveProcess = 0
            Exit Function
        End If
        With tProcess
            .dwSize = Len(tProcess)
            r = ProcessFirst(hToolhelpSnapshot, tProcess)
            ReDim Preserve ListOfActiveProcess(20)
            Do While r
                i = i + 1
                If i Mod 20 = 0 Then ReDim Preserve ListOfActiveProcess(i + 20)
                ListOfActiveProcess(i) = tProcess
                r = ProcessNext(hToolhelpSnapshot, tProcess)
            Loop
        End With
        GetActiveProcess = i
        Call CloseHandle(hToolhelpSnapshot)
    End Function
      

  5.   

    似乎记得9x内核可以,NT内核不行……
      

  6.   

    Option ExplicitPublic Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hWnd As Long, lpdwProcessId As Long) As Long
    Public Declare Function CloseHandle Lib "Kernel32.dll" (ByVal Handle As Long) As Long
    Public Declare Function OpenProcess Lib "Kernel32.dll" (ByVal dwDesiredAccessas As Long, ByVal bInheritHandle As Long, ByVal dwProcId As Long) As Long
    Public Declare Function GetModuleFileNameExA Lib "psapi.dll" (ByVal hProcess As Long, ByVal hModule As Long, ByVal ModuleName As String, ByVal nSize As Long) As Long
    Public Declare Function EnumProcessModules Lib "psapi.dll" (ByVal hProcess As Long, ByRef lphModule As Long, ByVal cb As Long, ByRef cbNeeded As Long) As Long
    Public 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 * 260
    End Type
     
    Public Const PROCESS_QUERY_INFORMATION = 1024
    Public Const PROCESS_VM_READ = 16
    Public Const MAX_PATH = 260
    Public Const STANDARD_RIGHTS_REQUIRED = &HF0000
    Public Const SYNCHRONIZE = &H100000
    Public Const PROCESS_ALL_ACCESS = &H1F0FFF
    Public Const TH32CS_SNAPPROCESS = &H2&
    Public Const hNull = 0
     
    Public Function GetPath(ByVal hWnd As Long) As String
        Dim hProcess As Long
        Dim ProcID As Long
        Dim mModules(1 To 200) As Long
        Dim cbNeed As Long
        Dim ModuleName As String
        Dim nSize As Long
        Dim lRet As Long    GetWindowThreadProcessId hWnd, ProcID
        hProcess = OpenProcess(PROCESS_QUERY_INFORMATION Or PROCESS_VM_READ, 0, ProcID)
        lRet = EnumProcessModules(hProcess, mModules(1), 200, cbNeed)
        If lRet <> 0 Then
            ModuleName = Space(MAX_PATH)
            nSize = 500
            lRet = GetModuleFileNameExA(hProcess, mModules(1), ModuleName, nSize)
            GetPath = Left(ModuleName, lRet)
        End If
        lRet = CloseHandle(hProcess)
    End Function
    '调用如下:
    'Text1.Text=GetPath(hWnd)<hWnd>是你要查的句柄
      

  7.   

    Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long
    Option ExplicitPublic Declare Function Process32First Lib "kernel32" (ByVal hSnapshot As Long, lppe As PROCESSENTRY32) As Long
    Public Declare Function Process32Next Lib "kernel32" (ByVal hSnapshot As Long, lppe As PROCESSENTRY32) As Long
    Public Declare Function CloseHandle Lib "Kernel32.dll" (ByVal Handle As Long) As Long
    Public Declare Function OpenProcess Lib "Kernel32.dll" (ByVal dwDesiredAccessas As Long, ByVal bInheritHandle As Long, ByVal dwProcId As Long) As Long
    Public Declare Function EnumProcesses Lib "psapi.dll" (ByRef lpidProcess As Long, ByVal cb As Long, ByRef cbNeeded As Long) As Long
    Public Declare Function GetModuleFileNameExA Lib "psapi.dll" (ByVal hProcess As Long, ByVal hModule As Long, ByVal ModuleName As String, ByVal nSize As Long) As Long
    Public Declare Function EnumProcessModules Lib "psapi.dll" (ByVal hProcess As Long, ByRef lphModule As Long, ByVal cb As Long, ByRef cbNeeded As Long) As Long
    Public Declare Function CreateToolhelp32Snapshot Lib "kernel32" (ByVal dwFlags As Long, ByVal th32ProcessID As Long) As Long
    Public Type PROCESSENTRY32
       dwSize As Long
       cntUsage As Long
       th32ProcessID As Long           ' This process
       th32DefaultHeapID As Long
       th32ModuleID As Long            ' Associated exe
       cntThreads As Long
       th32ParentProcessID As Long     ' This process's parent process
       pcPriClassBase As Long          ' Base priority of process threads
       dwFlags As Long
       szExeFile As String * 260       ' MAX_PATH
    End TypePublic Const PROCESS_QUERY_INFORMATION = 1024
    Public Const PROCESS_VM_READ = 16
    Public Const MAX_PATH = 260
    Public Const STANDARD_RIGHTS_REQUIRED = &HF0000
    Public Const SYNCHRONIZE = &H100000
    'STANDARD_RIGHTS_REQUIRED Or SYNCHRONIZE Or &HFFF
    Public Const PROCESS_ALL_ACCESS = &H1F0FFF
    Public Const TH32CS_SNAPPROCESS = &H2&
    Public Const hNull = 0public function GetPath(byval hWnd as long,byval OutPath as string)as long
        On Error Resume Next
        
           Dim cb As Long
           Dim cbNeeded As Long
           Dim NumElements As Long
           Dim ProcessIDs() As Long
           Dim cbNeeded2 As Long
           Dim NumElements2 As Long
           Dim Modules(1 To 200) As Long
           Dim lRet As Long
           Dim ModuleName As String
           Dim nSize As Long
           Dim hProcess As Long
           Dim i As Long
           cb = 8
           cbNeeded = 96
           Do While cb <= cbNeeded
              cb = cb * 2
              ReDim ProcessIDs(cb / 4) As Long
              lRet = EnumProcesses(ProcessIDs(1), cb, cbNeeded)
           Loop
           NumElements = cbNeeded / 4
        
           For i = 1 To NumElements
                hProcess = OpenProcess(PROCESS_QUERY_INFORMATION Or PROCESS_VM_READ, 0, ProcessIDs(i))
                    
                    If hProcess <> 0 Then
                        lRet = EnumProcessModules(hProcess, Modules(1), 200, cbNeeded2)
                        If lRet <> 0 Then
                            ModuleName = Space(MAX_PATH)
                            nSize = 500
                            lRet = GetModuleFileNameExA(hProcess, Modules(1), ModuleName, nSize)
    获                      debug.print Left(ModuleName, lRet)
                            If CLng(hProcess) = CLng(ProcID) Then‘ProcID是你说的HWND的进程
                                OutPath = Left(ModuleName, lRet)
                            Else
                                OutPath = ""
                            End If
                        End If
                    End If
                lRet = CloseHandle(hProcess)
            Next
    end function