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
Const MAX_PATH As Integer = 260
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 * MAX_PATH
End Type
Private Declare Function CreateToolhelp32Snapshot Lib "Kernel32" (ByVal lFlags As Long, ByVal lProcessID As Long) As Long
Private Declare Function Process32First Lib "Kernel32" (ByVal hSnapShot As Long, uProcess As PROCESSENTRY32) As Long
Private Declare Function Process32Next Lib "Kernel32" (ByVal hSnapShot As Long, uProcess As PROCESSENTRY32) As Long
Private Declare Sub CloseHandle Lib "Kernel32" (ByVal hPass As Long)
Sub Main()
Dim hSnapShot As Long, retResult As Long
Dim uProcess As PROCESSENTRY32
Dim strCurProc As String, strFindProc As String, intNumProc As Integer
hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0&)
uProcess.dwSize = Len(uProcess)
retResult = Process32First(hSnapShot, uProcess)
strFindProc = "calc.exe"
Do While retResult
strCurProc = Left$(uProcess.szExeFile, IIf(InStr(1, uProcess.szExeFile, Chr$(0)) > 0, InStr(1, uProcess.szExeFile, Chr$(0)) - 1, 0))
If StrComp(strFindProc, strCurProc, vbTextCompare) = 0 Then
intNumProc = intNumProc + 1
End If
retResult = Process32Next(hSnapShot, uProcess)
Loop
CloseHandle hSnapShot
MsgBox "Кол-во экземпляров искомого процесса: " & intNumProc
End Sub
Слежка за процессом.
Возможно ли в VB организовать слежку за процессом, т.е. запушен процесс или нет.
Код:
Вариант с использованием WMI:
Код:
Sub Main()
Dim strCompName As String, strFindProc As String
Dim objWMI As Object, objCollection As Object
strCompName = "."
strFindProc = "calc.exe"
Set objWMI = GetObject("winmgmts:\\" & strCompName & "\root\cimv2")
Set objCollection = objWMI.ExecQuery("Select Name from Win32_Process Where Name = '" & strFindProc & "'")
MsgBox "Кол-во экземпляров искомого процесса: " & objCollection.Count
End Sub
Dim strCompName As String, strFindProc As String
Dim objWMI As Object, objCollection As Object
strCompName = "."
strFindProc = "calc.exe"
Set objWMI = GetObject("winmgmts:\\" & strCompName & "\root\cimv2")
Set objCollection = objWMI.ExecQuery("Select Name from Win32_Process Where Name = '" & strFindProc & "'")
MsgBox "Кол-во экземпляров искомого процесса: " & objCollection.Count
End Sub
Примечания.
1. Значение "." переменной strCompName означает, что проверка выполняется на локальном компьютере. При необходимости можно задать DNS-имя удалённого компьютера (для успешной работы нужны права локального администратора контролируемой станции).
2. WMI-вариант работает медленнее, чем API-вариант.
В WMI Свойство Count я как понял возвращает количество запущеных прцессов с таким именем, а нету случаем свойства возвращающее количество памяти используемое процессом?
Цитата: rostov-ilya
... а нету случаем свойства возвращающее количество памяти используемое процессом?
Вот пример:
Код:
Sub Main()
Dim strCompName As String, strFindProc As String
Dim objWMI As Object, objCollection As Object, objItem As Object
strCompName = "."
strFindProc = "calc.exe"
Set objWMI = GetObject("winmgmts:\\" & strCompName & "\root\cimv2")
Set objCollection = objWMI.ExecQuery("Select * from Win32_Process Where Name = '" & strFindProc & "'")
If objCollection.Count > 0 Then
MsgBox "Кол-во экземпляров искомого процесса: " & objCollection.Count
For Each objItem In objCollection
MsgBox "Процесс с идентификатором " & objItem.ProcessID & " занимает в ОЗУ примерно " & objItem.WorkingSetSize & " байт(а)."
Next objItem
Else
MsgBox "Ни одного экземпляра искомого процесса не найдено."
End If
End Sub
Dim strCompName As String, strFindProc As String
Dim objWMI As Object, objCollection As Object, objItem As Object
strCompName = "."
strFindProc = "calc.exe"
Set objWMI = GetObject("winmgmts:\\" & strCompName & "\root\cimv2")
Set objCollection = objWMI.ExecQuery("Select * from Win32_Process Where Name = '" & strFindProc & "'")
If objCollection.Count > 0 Then
MsgBox "Кол-во экземпляров искомого процесса: " & objCollection.Count
For Each objItem In objCollection
MsgBox "Процесс с идентификатором " & objItem.ProcessID & " занимает в ОЗУ примерно " & objItem.WorkingSetSize & " байт(а)."
Next objItem
Else
MsgBox "Ни одного экземпляра искомого процесса не найдено."
End If
End Sub
Примечания.
1. Значение, возвращаемое свойством WorkingSetSize, обычно отличается от того, что показывает диспетчер задач на 1-5%.
2. Обратите внимание на то, что в запросе objWMI.ExecQuery("Select ... изменилось значение фильтра выборки (было - [color=blue]Name[/color], стало - [color=blue]*[/color], т.е. запрашиваются все имеющиеся данные об объекте, а не только имя).