Этот класс поддерживает событие 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) и приложение завершится, но в течение этих трех минут наблюдатель оповещает нас обо всех процессах, которые стартовали в системе.
В этом разделе мы разработаем библиотеку классов, которая позволит производить мониторинг системы и управлять некоторыми ее параметрами с помощью классов из пространства имен 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).
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.