Windows Management Instrumentation. События в WMI. Библиотека классов MyWMI. Особенности работы с большим деревом, страница 21

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

3.  Переведите файл в режим дизайна и задайте размеры его окна равными примерно (700; 480).

4.  В Toolbox найдите ImageList и положите на форму. Задайте ему имя (свойство Name) treeImages.

5.  Добавьте TreeView и задайте ему свойства: Name=tree, Dock=Left, Size=572;480, ImageList = treeImages.

6.  Положите элемент типа Splitter. Cвойства: Name = splitter, Location = 572; 0, Dock = Left.

7.  Добавьте кнопку (Button). Cвойства: Name = bRefresh, Text = Refresh, FlatStyle = Flat, Location = 596; 28.

8.  Добавьте GroupBox. Cвойства: Name = grMachine, Text = Machine, Location = 588; 64, Size = 92; 80.

9.  Положите два элемента типа RadioButton. Cвойства: Name = rdCurrent и rdRemote, Text = Current и Remote, Checked = True и False, TabStop = True и False, Location = (12; 20) и (12; 44).

10.  Добавьте 3 элемента типа Label. Cвойства: Name = label1, label2 и label3, Text = IP or Machine Name, UserID: и Password:, AutoSize = True, Location = (596; 208), (596; 264) и (596; 328), Visible = False.

11.  Три элемента типа TextBox. Cвойства: Name = textName, textUserID и textPass, Text = пусто Location = (592; 224), (592; 280) и (592; 344) Size = 84; 20, Visible = False.

12.  Введите обработку события. Выделите rdCurrent, нажмите кнопку Events, найдите событие CheckedChanged и совершите по этой строке двойной щелчок.

13.  Совершите двойной щелчок по кнопке bRefresh для того, чтобы студия ввела обработчик ее нажатия.

14.  В окне Solution Explorer выделите узел Library и в его контекстном меню выберите команду Rebuild.

Пока вы не забыли про обработчик уведомляющего события CheckedChanged введите его коды. Логика такова: видимость 3-х последних меток (Label) и окон редактирования должна зависеть от состояния переключателя Current-Remote. Если он в состоянии Remote, то нам следует предоставить пользователю возможность ввести: IP-адрес (или имя) удаленной машины, идентификатор пользователя и его пароль. Без этих данных мы не сможем (с помощью классов WMI) получить информацию об удаленной машине.

private void rdCurrent_CheckedChanged (object sender, EventArgs e)

{

      // Создайте массив ссылок на 6 элементов управления

  foreach (Для каждого элемента c из массива ссылок)

    c.Visible = логическое выражение, зависящее от состояния переключателя

}

Вероятно, вы еще помните про вспомогательную функцию UpdateStatusBar, которая была в предыдущем компоненте. Ее цель — генерировать событие типа UpdateStatus для того, чтобы клиентское приложение могло вывести в строку состояния посылаемое нами сообщение. Новый компонент также должен иметь возможность оповещать клиентское приложение о задержках, связанных с поиском информации. Поэтому введите в класс SysInfoControl событие и делегатный тип StatusHandler.

public event StatusHandler UpdateStatus; // Возбуждаемое нами событие "Изменения состояния",

public delegate void StatusHandler (string msg); // Делегат события "Изменения состояния"

Добавьте также функцию UpdateStatusBar, она должна иметь точно такой же вид, как и в первом компоненте. Для обновления информации о системе предусмотрена кнопка Refresh. Логика обработки ее нажатия достаточно проста. Вот она.

private void bRefresh_Click(object sender, System.EventArgs e)

{

  UpdateStatusBar(Color.WhiteSmoke, "Refreshing Computer Information...");

  FillTree();

}

Основная логика получения системной информации спрятана в методе FillTree. Перед тем, как начать опрос системы, используя язык WQL и возможности класса ManagementObjectSearcher, следует обеспечить доступ к информации конкретного (локального или удаленного) компьютера. Как вы помните, доступ к WMI-классам обеспечивает класс ManagementScope. Конструируя объект этого класса, мы должны знать имя или IP-адрес исследуемого компьютера. К этому имени надо пристыковать пространство имен root\cimv2. Полученная таким образом текстовая строка, используется как адрес пространства имен, где обитает нужный нам класс WMI. Далее алгоритм прозрачен, он повторяется столько раз, сколько классов WMI мы решили задействовать при опросе базы данных.