1

Тема: VBScript: получение списка процессов через API с DynamicWrapperX

Пример выводит список запущенных процессов в системе.
Потребуется библиотека DynamicWrapperX.

Set DX = CreateObject("DynamicWrapperX")

TH32CS_SNAPPROCESS = 2
MAX_PATH = 260

' Смещения членов структуры PROCESSENTRY32:
dwSize = 0
cntUsage = 4
th32ProcessID = 8
th32DefaultHeapID = 12
th32ModuleID = 16
cntThreads = 20
th32ParentProcessID = 24
pcPriClassBase = 28
dwFlags = 32
szExeFile = 36    ' Здесь буфер для имени процесса, длиной MAX_PATH.

Size = 9 * 4 + MAX_PATH ' Размер структуры в байтах.
Struct = DX.Space(Size / 2, "") ' Здесь размер надо задавать в двухбайтных символах,
                                ' поэтому деление на 2. Пустая строка обнуляет структуру.
DX.NumPut Size, Struct, dwSize, "u" ' Пишем размер структуры в её начало.

DX.Register "kernel32", "CreateToolhelp32Snapshot", "i=uu", "r=h"
DX.Register "kernel32", "Process32First",           "i=hp", "r=l"
DX.Register "kernel32", "Process32Next",            "i=hp", "r=l"
DX.Register "kernel32", "CloseHandle",              "i=h",  "r=l"

hSnap = DX.CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)

DX.Process32First hSnap, Struct ' Первый процесс.

pExeName = DX.StrPtr(Struct) + szExeFile ' Адрес строки с именем exe-файла процесса.

List = DX.StrGet(pExeName, "s") ' Читаем имя в список.
n = 1 ' Счётчик процессов.

While DX.Process32Next(hSnap, Struct)
  List = List & vbCrLf & DX.StrGet(pExeName, "s")
  n = n + 1
Wend

DX.CloseHandle hSnap

WScript.Echo "Всего процессов: " & n & vbCrLf & vbCrLf & List

Автор примера - YMP.

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

2

Re: VBScript: получение списка процессов через API с DynamicWrapperX

Почти то же самое, но с выводом в Блокнот.

Set DX = CreateObject("DynamicWrapperX")
Set WSShell = CreateObject("WScript.Shell")

TH32CS_SNAPPROCESS = 2
MAX_PATH = 260
WM_SETTEXT = 12

' Смещения членов структуры PROCESSENTRY32:
dwSize = 0                ' Размер данной структуры.
cntUsage = 4              ' Больше не используется.
th32ProcessID = 8         ' Идентификатор процесса (PID).
th32DefaultHeapID = 12    ' Больше не используется.
th32ModuleID = 16         ' Больше не используется.
cntThreads = 20           ' Количество потоков в процессе.
th32ParentProcessID = 24  ' PID родительского процесса.
pcPriClassBase = 28       ' Базовый приоритет потоков процесса.
dwFlags = 32              ' Больше не используется.
szExeFile = 36    ' Здесь буфер для имени exe-файла процесса, длиной MAX_PATH.

Size = 9 * 4 + MAX_PATH ' Размер структуры в байтах.

Struct = DX.Space(Size / 2, "") ' Фактически здесь создаётся юникодовская
                                ' строка, поэтому размер надо задавать в двухбайтных
                                ' символах, отсюда деление на 2. Пустая строка
                                ' во втором параметре заполняет структуру нулями.

DX.NumPut Size, Struct, dwSize, "u" ' Пишем размер структуры в её начало.

DX.Register "kernel32", "CreateToolhelp32Snapshot", "i=uu",   "r=h"
DX.Register "kernel32", "Process32First",           "i=hp",   "r=l"
DX.Register "kernel32", "Process32Next",            "i=hp",   "r=l"
DX.Register "kernel32", "CloseHandle",              "i=h",    "r=l"
DX.Register "user32",   "FindWindowW",              "i=ww",   "r=h"
DX.Register "user32",   "FindWindowExW",            "i=hhwl", "r=h"
DX.Register "user32",   "SendMessageW",             "i=huuw", "r=l"

hSnap = DX.CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)

DX.Process32First hSnap, Struct ' Первый процесс.

pExeName = DX.StrPtr(Struct) + szExeFile ' Адрес строки с именем exe-файла процесса.

List = "PID"       & vbTab &_
       "Потоки"    & vbTab &_
       "Имя файла" & vbCrLf

List = List & vbCrLf &_
       DX.NumGet(Struct, th32ProcessID, "u") & vbTab &_
       DX.NumGet(Struct, cntThreads, "u")    & vbTab &_
       DX.StrGet(pExeName, "s")
n = 1 ' Счётчик процессов.

While DX.Process32Next(hSnap, Struct)
  List = List & vbCrLf &_
         DX.NumGet(Struct, th32ProcessID, "u") & vbTab &_
         DX.NumGet(Struct, cntThreads, "u")    & vbTab &_
         DX.StrGet(pExeName, "s")
  n = n + 1
Wend

DX.CloseHandle hSnap

List = "Всего процессов: " & n & vbCrLf & vbCrLf & List


' ============= Вывод данных в окно Блокнота ==============

WSShell.Run "Notepad.exe"

hNotepad = 0

While hNotepad = 0
  WScript.Sleep 300
  hNotepad = DX.FindWindowW("Notepad", "Безымянный - Блокнот")
Wend

hEdit = DX.FindWindowExW(hNotepad, 0, "Edit", 0)

DX.SendMessageW hEdit, WM_SETTEXT, 0, List

Автор примера - YMP.

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

3

Re: VBScript: получение списка процессов через API с DynamicWrapperX

Вариант предыдущего с использованием GlobalAlloc.

Set DX = CreateObject("DynamicWrapperX")
Set WSShell = CreateObject("WScript.Shell")

TH32CS_SNAPPROCESS = 2
MAX_PATH = 260
WM_SETTEXT = 12
GPTR = 64

' Смещения членов структуры PROCESSENTRY32:
dwSize = 0                ' Размер данной структуры.
cntUsage = 4              ' Больше не используется.
th32ProcessID = 8         ' Идентификатор процесса (PID).
th32DefaultHeapID = 12    ' Больше не используется.
th32ModuleID = 16         ' Больше не используется.
cntThreads = 20           ' Количество потоков в процессе.
th32ParentProcessID = 24  ' PID родительского процесса.
pcPriClassBase = 28       ' Базовый приоритет потоков процесса.
dwFlags = 32              ' Больше не используется.
szExeFile = 36    ' Здесь буфер для имени exe-файла процесса, длиной MAX_PATH.

DX.Register "kernel32", "CreateToolhelp32Snapshot", "i=uu",   "r=h"
DX.Register "kernel32", "Process32First",           "i=hp",   "r=l"
DX.Register "kernel32", "Process32Next",            "i=hp",   "r=l"
DX.Register "kernel32", "CloseHandle",              "i=h",    "r=l"
DX.Register "user32",   "FindWindowW",              "i=ww",   "r=h"
DX.Register "user32",   "FindWindowExW",            "i=hhwl", "r=h"
DX.Register "user32",   "SendMessageW",             "i=huuw", "r=l"
DX.Register "kernel32", "GlobalAlloc",              "i=uu",   "r=p"
DX.Register "kernel32", "GlobalFree",               "i=p",    "r=p"

Size = 9 * 4 + MAX_PATH ' Размер структуры в байтах.
pStruct = DX.GlobalAlloc(GPTR, Size) ' Запрос памяти под структуру, получаем
                                     ' указатель на неё.
DX.NumPut Size, pStruct, dwSize, "u" ' Пишем размер структуры в её начало.

hSnap = DX.CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)

DX.Process32First hSnap, pStruct ' Первый процесс.

pExeName = pStruct + szExeFile ' Адрес строки с именем exe-файла процесса.

List = "PID"       & vbTab &_
       "Потоки"    & vbTab &_
       "Имя файла" & vbCrLf

List = List & vbCrLf &_
       DX.NumGet(pStruct, th32ProcessID, "u") & vbTab &_
       DX.NumGet(pStruct, cntThreads, "u")    & vbTab &_
       DX.StrGet(pExeName, "s")
n = 1 ' Счётчик процессов.

While DX.Process32Next(hSnap, pStruct)
  List = List & vbCrLf &_
         DX.NumGet(pStruct, th32ProcessID, "u") & vbTab &_
         DX.NumGet(pStruct, cntThreads, "u")    & vbTab &_
         DX.StrGet(pExeName, "s")
  n = n + 1
Wend

DX.CloseHandle hSnap  ' Освобождение хэндла.
DX.GlobalFree pStruct ' Освобождение памяти.

List = "Всего процессов: " & n & vbCrLf & vbCrLf & List


' ============= Вывод данных в окно Блокнота ==============

WSShell.Run "Notepad.exe"

hNotepad = 0

While hNotepad = 0
  WScript.Sleep 300
  hNotepad = DX.FindWindowW("Notepad", "Безымянный - Блокнот")
Wend

hEdit = DX.FindWindowExW(hNotepad, 0, "Edit", 0)

DX.SendMessageW hEdit, WM_SETTEXT, 0, List

Автор примера - YMP.

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.