Управление процессами Windows - C (СИ)
Формулировка задачи:
Здрасти. Можете сказать на языке С можно написать программу, которая управляет процессами Windows? есть такая библиотека которая может отслеживать процессы которые работают в данное время?
Решение задачи: «Управление процессами Windows»
textual
Листинг программы
#include <windows.h> #include <stdio.h> #include <tchar.h> #include <psapi.h> // To ensure correct resolution of symbols, add Psapi.lib to TARGETLIBS // and compile with -DPSAPI_VERSION=1 void PrintProcessNameAndID( DWORD processID ) { TCHAR szProcessName[MAX_PATH] = TEXT("<unknown>"); // Get a handle to the process. HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, processID ); // Get the process name. if (NULL != hProcess ) { HMODULE hMod; DWORD cbNeeded; if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod), &cbNeeded) ) { GetModuleBaseName( hProcess, hMod, szProcessName, sizeof(szProcessName)/sizeof(TCHAR) ); } } // Print the process name and identifier. _tprintf( TEXT("%s (PID: %u)\n"), szProcessName, processID ); // Release the handle to the process. CloseHandle( hProcess ); } int main( void ) { // Get the list of process identifiers. DWORD aProcesses[1024], cbNeeded, cProcesses; unsigned int i; if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) ) { return 1; } // Calculate how many process identifiers were returned. cProcesses = cbNeeded / sizeof(DWORD); // Print the name and process identifier for each process. for ( i = 0; i < cProcesses; i++ ) { if( aProcesses[i] != 0 ) { PrintProcessNameAndID( aProcesses[i] ); } } return 0; }
Объяснение кода листинга программы
- Включаем необходимые заголовочные файлы:
, , , - Добавляем Psapi.lib в TARGETLIBS и компилируем с -DPSAPI_VERSION=1
- Определяем функцию PrintProcessNameAndID, которая принимает DWORD processID
- Создаем локальную переменную TCHAR szProcessName[MAX_PATH] и инициализируем ее как TEXT(
<unknown>
) - Получаем дескриптор процесса с помощью OpenProcess с флагами PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, processID
- Если дескриптор процесса получен, то продолжаем выполнение, иначе выводим сообщение об ошибке и завершаем работу функции
- Получаем список модулей процесса с помощью EnumProcessModules, передавая в функцию hProcess и переменную hMod, которая будет хранить дескрипторы модулей
- Получаем имя модуля с помощью GetModuleBaseName, передавая в функцию hProcess, hMod, szProcessName, sizeof(szProcessName)/sizeof(TCHAR)
- Выводим имя процесса и его идентификатор с помощью _tprintf, передавая TEXT(
%s (PID: %u)\n
), szProcessName, processID - Закрываем дескриптор процесса с помощью CloseHandle
- В функции main, получаем список процессов с помощью EnumProcesses, передавая aProcesses, sizeof(aProcesses), &cbNeeded
- Рассчитываем количество процессов, которые вернул EnumProcesses, разделив cbNeeded на размер DWORD
- Проходимся по списку процессов и для каждого процесса, у которого aProcesses[i] != 0, вызываем функцию PrintProcessNameAndID
- Завершаем работу программы с помощью return 0
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д