Как я могу перечислить все процессы, запущенные в Windows? - PullRequest
24 голосов
/ 15 марта 2009

Я хотел бы найти способ перебрать все активные процессы и выполнить диагностические проверки на них (использование памяти, время процессора и т. Д.), Что-то вроде менеджера задач.

Проблема разбита на две части:

  1. Поиск всех процессов
  2. Поиск атрибутов диагностики о них

Я не уверен даже, в каком пространстве имен искать это. Любая помощь / советы / ссылки благодарны.

Ответы [ 7 ]

68 голосов
/ 15 марта 2009

Поиск всех процессов

Вы можете сделать это через класс Process

using System.Diagnostics;
...
var allProcesses = Process.GetProcesses();

Диагностика хода

Можете ли вы дать нам больше информации здесь? Непонятно, что ты хочешь делать.

Класс Process предоставляет немного информации, хотя она может вам помочь. Можно запросить этот класс для

  • Все темы
  • Ручка главного окна
  • Все загруженные модули
  • Различная диагностическая информация о памяти (постраничная, виртуальная, рабочая и т. Д.)
  • Основная информация о процессе (идентификатор, имя, расположение диска)

EDIT

ОП упомянул, что они хотят получить информацию о памяти и процессоре. Эти свойства легко доступны в классе Process (возвращаемом GetProcesses ()). Ниже приведена страница MSDN, в которой перечислены все поддерживаемые свойства. Доступны различные ресурсы памяти и процессора, которые подойдут для ваших нужд.

http://msdn.microsoft.com/en-us/library/system.diagnostics.process.aspx

Код:

Добавьте эту строку в ваш список использования:

using System.Diagnostics;

Теперь вы можете получить список процессов с помощью метода Process.GetProcesses (), как показано в этом примере:

Process[] processlist = Process.GetProcesses();

foreach (Process theprocess in processlist)
{
    Console.WriteLine("Process: {0} ID: {1}", theprocess.ProcessName, theprocess.Id);
}
7 голосов
/ 15 марта 2009

На самом деле найти все процессы довольно просто:

using System.Diagnostics;

Process[] processes = Process.GetProcesses();

foreach (Process process in processes)
{
    // Get whatever attribute for process.
}
4 голосов
/ 15 марта 2009

JaredPar уже указал класс Process, поэтому я просто добавлю, что вы должны знать, что класс делает снимок информации о процессе при создании экземпляра. Это не живой вид. Чтобы обновить его, вы должны вызвать Refresh() в инстансе.

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

И, наконец, если вы позвоните Process.GetProcesses(), вы также получите псевдопроцессы "бездействие" и "система". IIRC у них есть конкретные идентификаторы процессов, так что вы можете легко отфильтровать их.

0 голосов
/ 22 сентября 2018

Вот как я предпочитаю обращаться к процессам:

static void Main(string[] args)
{
    Process.GetProcesses().ToList().ForEach(p =>
    {
        Console.WriteLine(
            p.ProcessName + " p.Threads.Count=" + p.Threads.Count + " Id=" + p.Id);
    });

    Console.ReadKey();
}
0 голосов
/ 22 сентября 2015
using System.Diagnostics;

class Program
{
   static void Main()
   {   
      Process[] processlist = Process.GetProcesses();`          
   }
}

здесь массив процессов содержит все количество процессов, присутствующих в нем.

0 голосов
/ 16 марта 2009

Ну, вы можете сделать это в powershell

1. Поиск всех процессов

get-Process 

2. Нахождение диагностических атрибутов о них

get-Process | where-object { $_.Handles -gt 200 }

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

Подробнее о о том, как обрабатывать процессы с помощью powershell, см. Здесь

0 голосов
/ 15 марта 2009

Какую операционную систему вы используете? Я так понял из твоего тэга C #, что это windows?

Если это так, проверьте WMI, особенно класс Win32_Process. Вот ссылка на MSDN: http://msdn.microsoft.com/en-us/library/aa394372(VS.85).aspx

А также пара сценариев использования (например, получение списка процессов): http://msdn.microsoft.com/en-us/library/aa394599(VS.85).aspx

...