Windows Management Instrumentation. Опрос свойств, методов и описателей. Разработка компонента WMIControl, страница 5

Этот класс поддерживает событие EventArrived типа EventArrivedEventHandler. Вы помните, что тип события совпадает с типом его делегатов. Мы добавим своего делегата в список делегатов события, а наблюдатель уведомит наше приложение при возникновении события. При этом он запустит функцию обратного вызова, которую мы назвали OnArrived. Ее адрес необходимо указать при создании делегата типа EventArrivedEventHandler. Метод OnArrived считается заданием делегата.

Кроме наблюдателя, пример демонстрирует структуру (шаблон строения) приложения, носящий имя: Observer-Subscriber (Наблюдатель-Подписчик). В нашем случае класс Program выполняет роль Наблюдателя за событиями, а класс Receiver — роль подписчика, или  приемника событий. Приемником иногда называют объект системы, которому отводится роль подписчика на события (элемента реагирующего на них). Именно в приемнике размещено задание делегата (функция OnArrived). Совсем необязательно использовать структуру из двух классов. В качестве приемника (задания делегата) вы можете использовать метод класса Program и обойтись без класса Receiver.

class Program

{

static void Main()

{

ManagementClass c = new ManagementClass (@"Win32_Process");

foreach (ManagementObject mo in c.GetInstances())

Console.WriteLine (mo["Caption"].ToString());

ManagementEventWatcher watcher = new ManagementEventWatcher (new WqlEventQuery(

"Select * from __InstanceCreationEvent within 1 " +

@"where TargetInstance ISA 'Win32_Process'"));

Receiver r = new Receiver();

watcher.EventArrived += new EventArrivedEventHandler (r.OnArrived);

watcher.Start();    // Start watching for events

System.Threading.Thread.Sleep (180000); // Wait for 3 minutes

watcher.Stop();

Console.WriteLine ("Done watching for events");

}

}

public class Receiver

{

public void OnArrived (object sender, EventArrivedEventArgs e)

{

Console.WriteLine ("Process started = " +

((ManagementBaseObject)e.NewEvent["TargetInstance"])["Caption"]);

}

}

Запустив приложение, воспользуйтесь клавишной комбинацией LWin+R. Клавиша LWinлевая Windows (расположена слева внизу, с изображением Windows Logo). В диалоге Run, который появится в результате использования комбинации, запустите несколько процессов, пути к которым прописаны в переменных окружения системы, например: cmd, calc, notepad, mmc, regedit и т.д. При этом в окне нашего приложения (в конце списка процессов, запущенных системой) будут появляться новые строки. Например:

System Idle Process

System

devenv.exe

// . . . , и т. д.

Process started  = mmc.exe

Process started  = regedit.exe

Process started  = WinRAR.exe

Done watching for events

Через 3 минуты наблюдатель выключится (см. вызов метода Stop) и приложение завершится, но в течение этих трех минут наблюдатель оповещает нас обо всех процессах, которые стартовали в системе.

Выводы

¨  Классы WMI (Win32_Process, Win32_LogicalDisk, Win32_NetworkAdapter, и т. д.) соответствуют различным таблицам базы данных WMI. Каждая строка таблицы соответствует объекту класса WMI. Метод GetInstances возвращает коллекцию всех объектов типа ManagementObject. Например:

ManagementClass c = new ManagementClass ("Win32_LogicalDisk");

ManagementObjectCollection col = c.GetInstances();

foreach (ManagementObject mo in col)

Console.WriteLine (mo["Name"]);

¨  Результатом этого запроса будет все множество дисковых накопителей. Каждый объект (ManagementObject) коллекции соответствует определенной строке таблицы и описывает определенный дисковый накопитель.

¨  С помощью класса ManagementObjectSearcher мы можем отобрать некоторое подмножество объектов, удовлетворяющих критерию отбора (условию where WQL-запроса). Например:

ManagementObjectSearcher searcher = new ManagementObjectSearcher (

"Select * from Win32_LogicalDisk Where Size>40000000000");

ManagementObjectCollection col = searcher.Get ();

foreach (ManagementObject mo in col)