C#

УЧЕБНЫЕ МАТЕРИАЛЫ ПО ПРОГРАММИРОВАНИЮ, КРЕКИНГУ, HTML, CSS, ОФИСНЫМ ПРИЛОЖЕНИЯМ

[Главная страница] [Контакты]

Программирование для Windows


Поиск других процессов, выполняющихся в данный момент

ЗАДАЧА
Получить информацию о выполняющихся в данный момент процессах.

РЕШЕНИЕ
Используйте методы GetProcesses или GetProcessesByName класса System.Diagnostics.Process.

ОБСУЖДЕНИЕ
Класс System.Diagnostics.Process представляет процесс Windows и включает множество свойств, подробно описанных в MSDN. Эта информация позволяет:

  • исследовать использование приложением памяти, потоков и ресурсов процессора;
  • определить момент запуска и время выполнения приложения;
  • извлечь информацию из исполняемого файла, использованного для запуска приложения.

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

Получить массив объектов Process, представляющих все выполняющиеся в данный момент процессы, позволяет метод Process.GetProcesses. Информацию о единственном процессе можно получить, вызвав метод Process.GetProcessesByName и передав в него имя процесса. Имя процесса обычно идентично имени исполняемого файла без расширения.

И метод GetProcesses, и метод GetProcessesByName имеют перегруженные версии, позволяющие указать имя компьютера. Эти версии можно использовать для получения информации о процессе, выполняющемся на другом компьютере.

Ниже приведен код простого консольного приложения, сообщающего кое-какую информацию о собственном процессе. Замечу, что это только небольшая часть всей информации, доступной благодаря классу Process.

using System;
using System.Diagnostics;

namespace ProcessInfoTest
{
    class Program
    {
        static void Main(string[] args)
        {
            Process Proc;

            Proc = Process.GetCurrentProcess();

            Console.WriteLine("Start time: " + Proc.StartTime);
            Console.WriteLine("Memory use: " + Proc.PagedMemorySize64);
            Console.WriteLine("Number of thread: " + Proc.Threads.Count);
            Console.WriteLine("Executable file: " + Proc.MainModule.FileName);
            Console.WriteLine("Responding: " + Proc.Responding);
            
            // Отображение имен модулей, загруженных данным процессом
            Console.WriteLine("Loaded modules:");
            foreach (ProcessModule ProcModule in Proc.Modules)
            {
                Console.WriteLine(" " + ProcModule.FileName);
            }
        }
    }
}

При первом доступе к свойству объекта Process вся информация извлекается и кэшируется. Для обновления данных, хранимых в объекте Process, вызовите метод Process.Refresh.

Вот другое приложение, получающее полный список процессов и отображающее их в элементе управления DataGrid, применяя связывание с данными:

private void Form1_Load(object sender, EventArgs e)
{
    dataGridView1.DataSource = Process.GetProcesses();
}

Вот сокращенный результат выполнения этого фрагмента:

1-4

При получении информации о привилегированном процессе возможна ошибка защиты. Вы можете перехватить се в своем коде при попытке доступа к свойству объекта Process. Однако, если вы выполняете связывание с данными для процесса с ограниченными правами, при переходе к соответствующей строке, когда элемент управления DataGrid попытается получить информацию для этого процесса, будет сгенерирована неперехватываемая ошибка.

Используемая литература:

  1. Занимательное программирование на Bisual Basic.NET: Климов А.П.
  2. Программирование для Microsoft Windows на C#: Чарльз Петцольд.
  3. РеРецепты программирования на Visual Basic.NET: Мэтью Макдональд.