Dim my As PROCESSENTRY32 Dim l As Long If opnProgram.Value = True Then ' µ±Ñ¡Ôñ³ÌÐòʱ... Dim l1 As Long List2.Clear l = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0) If l Then my.dwSize = 1060 If (Process32First(l, my)) Then ' ±éÀúµÚÒ»¸ö½ø³Ì Do List2.AddItem (Trim(my.szExeFile)) Loop Until (Process32Next(l, my) < 1) ' ±éÀúËùÓнø³ÌÖ±µ½·µ»ØֵΪFalse End If l1 = CloseHandle(l) End If ElseIf opnModule.Value = True Then ' µ±Ñ¡ÔñÄ£¿éʱ... Dim mm As MODULEENTRY32 Dim lm As Long List2.Clear l = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0) If l > 0 Then my.dwSize = Len(my) If Process32First(l, my) Then Do lm = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, my.th32ProcessID) ' »ñµÃ½ø³ÌµÄ±êʶ·û If lm > 0 Then mm.dwSize = Len(mm) If Module32First(lm, mm) Then Do If my.th32ProcessID = mm.th32ProcessID Then List2.AddItem Trim(mm.szExePath) + " " + Str$(mm.modBaseSize) End If Loop Until (Module32Next(lm, mm) < 1) End If CloseHandle (lm) End If Loop Until (Process32Next(l, my) < 1) End If CloseHandle (l) End If ElseIf opnWindow.Value = True Then ' µ±Ñ¡Ôñ´°¿Úʱ List2.Clear l = EnumWindows(AddressOf EnumWindowsProc, 0) ' ±éÀúËùÓеĴ°¿Ú End If
在win9x可以,在win2000/xp下使用psapi.dll
'这个程序演示怎样获得当前运行的所有窗口、模块、程序的列表 Public Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long Public Const WM_CLOSE = &H10 Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long'该函数是EnumWindows的回调函数,EnumWindows函数将遍历的窗口句柄传递到hwnd参数中 Function EnumWindowsProc(ByVal hwnd As Long, ByVal lParam As Long) As Long Dim astr As String * 256 Dim l As Long
l = GetWindowText(hwnd, astr, Len(astr)) '得到窗口的标题 If InStr(astr, " ") > 1 Then If InStr(1, astr, "Microsoft Internet Explorer", vbTextCompare) <> 0 Then Form1.List1.AddItem astr
End If End If EnumWindowsProc = True End Function Private Sub CWindow_Click() Dim l As Long, hwnd As Long
List1.Clear '遍历所有的窗口 l = EnumWindows(AddressOf EnumWindowsProc, 0)
Private Declare Function EnumProcesses Lib "psapi.dll" _ (ByRef lpidProcess As Long, ByVal cb As Long, ByRef cbNeeded As Long) As Long Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hWnd As Long, ByVal lpString As String, ByVal cch As Long) As LongPrivate Declare Function EnumProcessModules Lib "psapi.dll" _ (ByVal hProcess As Long, ByRef lphModule As Long, ByVal cb As Long, ByRef cbNeeded As Long) As LongPrivate Declare Function GetModuleFileNameExA Lib "psapi.dll" _ (ByVal hProcess As Long, ByVal hModule As Long, ByVal ModuleName As String, ByVal nSize As Long) As LongPrivate Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, _ ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As LongPrivate Declare Function CreateRemoteThread Lib "kernel32" _ (ByVal hProcess As Long, lpThreadAttributes As Long, _ ByVal dwStackSize As Long, lpStartAddress As Long, lpParameter As Long, _ ByVal dwCreationFlags As Long, lpThreadId As Long) As LongPrivate Declare Function CreateThread Lib "kernel32" _ (lpThreadAttributes As Any, _ ByVal dwStackSize As Long, lpStartAddress As Long, _ lpParameter As Any, ByVal dwCreationFlags As Long, lpThreadId As Long) As LongPrivate Declare Function GetProcAddress Lib "kernel32" _ (ByVal hModule As Long, ByVal lpProcName As String) As Long Private Declare Function GetModuleHandle Lib "kernel32" Alias "GetModuleHandleA" _ (ByVal lpModuleName As String) As LongPrivate Declare Function WriteProcessMemory Lib "kernel32" _ (ByVal hProcess As Long, lpBaseAddress As Any, lpBuffer As Any, _ ByVal nSize As Long, lpNumberOfBytesWritten As Long) As LongConst PROCESS_QUERY_INFORMATION = &H400 Const PROCESS_VM_READ = &H10 Private Const PROCESS_ALL_ACCESS As Long = &H1F0FFF Private IWillPH As Long Private XX Dim threaid2 As Long 'Private Const PROCESS_ALL_ACCESS As Long = &H1F0FFFPrivate Sub Command2_Click() 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 255) 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 List1.Clear '取得所有的进程数,并设置缓冲区的大小 Do While cb <= cbNeeded cb = cb * 2 ReDim Preserve ProcessIDs((cb / 4)) As Long lRet = EnumProcesses(ProcessIDs(1), cb, cbNeeded) Loop NumElements = cbNeeded / 4 '取得进程数 For i = 1 To NumElements '取得一个进程的句柄 '使用OpenProcess函数打开句柄,其中的两个常量在winnt.h中可以找到相应的声明。 hproess = 0 hProcess = OpenProcess(PROCESS_QUERY_INFORMATION Or PROCESS_VM_READ, 0, ProcessIDs(i))'如果句柄有效,则 If hProcess <> 0 Then lRet = EnumProcessModules(hProcess, Modules(1), 255, cbNeeded2)'如果模式有效,则取得它得文件名 If lRet <> 0 Then '按照我刚才说的,给他一个最大的空间! ModuleName = Space(255) nSize = 255 lRet = GetModuleFileNameExA(hProcess, Modules(1), ModuleName, 255) List1.AddItem hProcess & " " & ModuleName End If End If Next '最后一步,别忘记关闭句柄 lRet = CloseHandle(hProcess) End Sub
Dim l As Long
If opnProgram.Value = True Then ' µ±Ñ¡Ôñ³ÌÐòʱ...
Dim l1 As Long
List2.Clear
l = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)
If l Then
my.dwSize = 1060
If (Process32First(l, my)) Then ' ±éÀúµÚÒ»¸ö½ø³Ì
Do
List2.AddItem (Trim(my.szExeFile))
Loop Until (Process32Next(l, my) < 1) ' ±éÀúËùÓнø³ÌÖ±µ½·µ»ØֵΪFalse
End If
l1 = CloseHandle(l)
End If
ElseIf opnModule.Value = True Then ' µ±Ñ¡ÔñÄ£¿éʱ...
Dim mm As MODULEENTRY32
Dim lm As Long
List2.Clear
l = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)
If l > 0 Then
my.dwSize = Len(my)
If Process32First(l, my) Then
Do
lm = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, my.th32ProcessID) ' »ñµÃ½ø³ÌµÄ±êʶ·û
If lm > 0 Then
mm.dwSize = Len(mm)
If Module32First(lm, mm) Then
Do
If my.th32ProcessID = mm.th32ProcessID Then
List2.AddItem Trim(mm.szExePath) + " " + Str$(mm.modBaseSize)
End If
Loop Until (Module32Next(lm, mm) < 1)
End If
CloseHandle (lm)
End If
Loop Until (Process32Next(l, my) < 1)
End If
CloseHandle (l)
End If
ElseIf opnWindow.Value = True Then ' µ±Ñ¡Ôñ´°¿Úʱ
List2.Clear
l = EnumWindows(AddressOf EnumWindowsProc, 0) ' ±éÀúËùÓеĴ°¿Ú
End If
Public Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Public Const WM_CLOSE = &H10
Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long'该函数是EnumWindows的回调函数,EnumWindows函数将遍历的窗口句柄传递到hwnd参数中
Function EnumWindowsProc(ByVal hwnd As Long, ByVal lParam As Long) As Long
Dim astr As String * 256
Dim l As Long
l = GetWindowText(hwnd, astr, Len(astr)) '得到窗口的标题
If InStr(astr, " ") > 1 Then
If InStr(1, astr, "Microsoft Internet Explorer", vbTextCompare) <> 0 Then
Form1.List1.AddItem astr
End If
End If
EnumWindowsProc = True
End Function
Private Sub CWindow_Click()
Dim l As Long, hwnd As Long
List1.Clear
'遍历所有的窗口
l = EnumWindows(AddressOf EnumWindowsProc, 0)
End Sub
为什么我只能看到打开的浏览器标题,而例如打开一个幻灯片应用程序或QQ等等,都看不到标题呢?
请您赐教!
在线等待!
获得的中文进程为乱码?
(ByRef lpidProcess As Long, ByVal cb As Long, ByRef cbNeeded As Long) As Long
Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hWnd As Long, ByVal lpString As String, ByVal cch As Long) As LongPrivate Declare Function EnumProcessModules Lib "psapi.dll" _
(ByVal hProcess As Long, ByRef lphModule As Long, ByVal cb As Long, ByRef cbNeeded As Long) As LongPrivate Declare Function GetModuleFileNameExA Lib "psapi.dll" _
(ByVal hProcess As Long, ByVal hModule As Long, ByVal ModuleName As String, ByVal nSize As Long) As LongPrivate Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, _
ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As LongPrivate Declare Function CreateRemoteThread Lib "kernel32" _
(ByVal hProcess As Long, lpThreadAttributes As Long, _
ByVal dwStackSize As Long, lpStartAddress As Long, lpParameter As Long, _
ByVal dwCreationFlags As Long, lpThreadId As Long) As LongPrivate Declare Function CreateThread Lib "kernel32" _
(lpThreadAttributes As Any, _
ByVal dwStackSize As Long, lpStartAddress As Long, _
lpParameter As Any, ByVal dwCreationFlags As Long, lpThreadId As Long) As LongPrivate Declare Function GetProcAddress Lib "kernel32" _
(ByVal hModule As Long, ByVal lpProcName As String) As Long
Private Declare Function GetModuleHandle Lib "kernel32" Alias "GetModuleHandleA" _
(ByVal lpModuleName As String) As LongPrivate Declare Function WriteProcessMemory Lib "kernel32" _
(ByVal hProcess As Long, lpBaseAddress As Any, lpBuffer As Any, _
ByVal nSize As Long, lpNumberOfBytesWritten As Long) As LongConst PROCESS_QUERY_INFORMATION = &H400
Const PROCESS_VM_READ = &H10
Private Const PROCESS_ALL_ACCESS As Long = &H1F0FFF
Private IWillPH As Long
Private XX
Dim threaid2 As Long
'Private Const PROCESS_ALL_ACCESS As Long = &H1F0FFFPrivate Sub Command2_Click()
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 255) 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
List1.Clear
'取得所有的进程数,并设置缓冲区的大小
Do While cb <= cbNeeded
cb = cb * 2
ReDim Preserve ProcessIDs((cb / 4)) As Long
lRet = EnumProcesses(ProcessIDs(1), cb, cbNeeded)
Loop
NumElements = cbNeeded / 4
'取得进程数
For i = 1 To NumElements
'取得一个进程的句柄
'使用OpenProcess函数打开句柄,其中的两个常量在winnt.h中可以找到相应的声明。
hproess = 0
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION Or PROCESS_VM_READ, 0, ProcessIDs(i))'如果句柄有效,则
If hProcess <> 0 Then
lRet = EnumProcessModules(hProcess, Modules(1), 255, cbNeeded2)'如果模式有效,则取得它得文件名
If lRet <> 0 Then
'按照我刚才说的,给他一个最大的空间!
ModuleName = Space(255)
nSize = 255
lRet = GetModuleFileNameExA(hProcess, Modules(1), ModuleName, 255)
List1.AddItem hProcess & " " & ModuleName
End If
End If
Next
'最后一步,别忘记关闭句柄
lRet = CloseHandle(hProcess)
End Sub