Windows Management Instrumentation - инфраструктура управления операционной системой, страница 3

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

Кроме наблюдателя, пример демонстрирует такую архитектурную деталь как приемник событий. Приемником называется объект системы, которому отводится роль подписчика на события, или элемента реагирующего на события. В приемнике (классе Receiver) размещено задание делегата (функция ArrivedHandler).

class Test

{

static void Main()

{

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

  foreach (ManagementObject proc in mc.GetInstances())

    Console.WriteLine(proc["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.ArrivedHandler);

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 ArrivedHandler (object sender, EventArrivedEventArgs e)

{

  Console.WriteLine("Process started = " +

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

}

}

Запустив это приложение, воспользуйтесь клавишной комбинацией LWin+R. Клавиша LWin — "Левая Windows" расположена слева внизу (с изображением Windows Logo). В диалоге Run (он появится в результате нажатия комбинации) запустите несколько процессов, пути к которым прописаны в переменных окружения системы, например: cmd, 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) и приложение завершится, но в течение этих трех минут наблюдатель оповещает нас обо всех процессах, которые стартовали в системе.

Библиотека классов MyWMI

В этом разделе мы разработаем библиотеку классов, которая позволит производить мониторинг системы и управлять некоторыми ее параметрами с помощью классов из пространства имен System.Management. Параллельно, мы разработаем Windows-приложение, которое будет пользоваться возможностями классов нашей библиотеки и предоставит пользователю удобный интерфейс для осуществления мониторинга и управления системой. Приложение будет иметь примерно такой вид:

Создайте общий какркас всего решения (solution), для этого:

1.  В меню File4New выберите команду Blank solution.

2.  В появившемся окне диалога New Project, в окне Project Type раскройте узел дерева под именем Visual Studio Solution. В окне Templates выбор единственный — Blank solution.

3.  В окне Name введите имя решения MyWMI.

4.  В окне Location задайте местоположение новой папки с файлами решения (solution) и нажмите OK.

Вставьте в пустое рабочее пространство (solution) два проекта (Class Library и Windows Application):

5.  В контекстном меню текущего решения выберите команду Add4New Project.

6.  В окне диалога выберите тип проекта Visual C# Projects4Class Library, задайте имя Library и убедитесь, что папка проекта попадает внутрь папки решения.

7.  Сразу добавьте в решение второй проект. Для этого в контекстном меню текущего решения (будьте внимательны: решения, а не проекта) выберите команду Add4New Project.

8.  В окне диалога выберите тип проекта Windows Application, задайте имя Client и убедитесь, что папка проекта попадет внутрь папки решения.

9.  Заметьте, что активным является первый проект (Library). Если это не так, то с помощью меню правой кнопки добейтесь, чтобы это было так, дав команду: Set as SturtUp Project.

10.  В окне Solution Explorer выделите имя проекта Library и в его контекстном меню выберите команду Add4Add New Item.

11.  В диалоге Add New Item выберите тип проекта User Control, задайте имя ExplorerControl.cs и нажмите кнопку Open.

12.  В окне Solution Explorer выделите имя файла Class1.cs и нажмите Delete для того, чтобы удалить этот файл из проекта.

13.  В окне Solution Explorer выделите узел References (проекта Library) и в его контекстном меню выберите команду Add Reference.

14.  В диалоге Add Reference (на вкладке .NET) найдите библиотеку System.Management и нажмите кнопки Select и OK.

15.  Внесите изменения в начальную заготовку класса (файл ExplorerControl.cs) так, как показано ниже, но оставьте нетронутым традиционный код Windows приложения — методы Dispose и InitializeComponent.

using System;

using System.Drawing;

using System.Collections;

using System.ComponentModel;

using System.Windows.Forms;

using System.IO;

using System.Management;

using System.Runtime.InteropServices;

namespace Library

{

public class ExplorerControl : UserControl

{

  private Container components = null;

  public ExplorerControl()

  {

     InitializeComponent();

  }

      // Здесь следует традиционный код (методы Dispose и InitializeComponent). Оставьте его.

}

}

Сейчас важно понять, что мы разрабатываем проект Library. Он создаст DLL, которая будет экспортировать 4 класса, производных от UserControl. Они будут обслуживать 4 вкладки Windows-приложения Client, которое вы видите на рисунке выше. Класс ExplorerControl пока пуст, но мы добавим в него элементы управления и он станет обслуживать первый блок из тех 4-х вкладок, которые присутствуют в приложении Client.

1.  Переведите текущий файл (класс ExplorerControl) в режим дизайна и задайте размеры его окна равными примерно (776; 480).