Управление процессами 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;
}

Объяснение кода листинга программы

  1. Включаем необходимые заголовочные файлы: , , ,
  2. Добавляем Psapi.lib в TARGETLIBS и компилируем с -DPSAPI_VERSION=1
  3. Определяем функцию PrintProcessNameAndID, которая принимает DWORD processID
  4. Создаем локальную переменную TCHAR szProcessName[MAX_PATH] и инициализируем ее как TEXT(<unknown>)
  5. Получаем дескриптор процесса с помощью OpenProcess с флагами PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, processID
  6. Если дескриптор процесса получен, то продолжаем выполнение, иначе выводим сообщение об ошибке и завершаем работу функции
  7. Получаем список модулей процесса с помощью EnumProcessModules, передавая в функцию hProcess и переменную hMod, которая будет хранить дескрипторы модулей
  8. Получаем имя модуля с помощью GetModuleBaseName, передавая в функцию hProcess, hMod, szProcessName, sizeof(szProcessName)/sizeof(TCHAR)
  9. Выводим имя процесса и его идентификатор с помощью _tprintf, передавая TEXT(%s  (PID: %u)\n), szProcessName, processID
  10. Закрываем дескриптор процесса с помощью CloseHandle
  11. В функции main, получаем список процессов с помощью EnumProcesses, передавая aProcesses, sizeof(aProcesses), &cbNeeded
  12. Рассчитываем количество процессов, которые вернул EnumProcesses, разделив cbNeeded на размер DWORD
  13. Проходимся по списку процессов и для каждого процесса, у которого aProcesses[i] != 0, вызываем функцию PrintProcessNameAndID
  14. Завершаем работу программы с помощью return 0

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 4.2 из 5