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

catch (Exception e) { MessageBox.Show(e.Message); }

}

//====== Конец блока, который должен повторяться для каждого класса WMI

// Продолжайте в том же духе

}

Повторяйте блок команд, но изменяйте суть запросов (классы WMI). Приведем примерный перечень: Win32_Processor, Win32_LogicalMemoryConfiguration, Win32_LogicalDisk, Win32_VideoController, Win32_OperatingSystem, Win32_TimeZone, Win32_Bios, Win32_NetworkConnection. Не забывайте изменять индексы иконок, которые вы должны вставить в ImageList, соответствующий нашему дереву. В заключение приведу вспомогательную функцию, которая может понадобиться для повышения читабельности.

string KiloToMegaBytes (object o)

{

return string.Format ("{0:f1}  Mb", Int64.Parse(o.ToString()) / 1024.0);

}

Мне захотелось создать такую функцию, чтобы многократно не повторять одни и те же преобразования. Кроме того, я использовал выражения вида:

string size = string.Format ("{0:f1}  Mb",

(int.Parse (mo["TotalPhysicalMemory"].ToString())) / (1024.0 * 1024.0));

При решении задачи напрашивается обобщающий прием вида:

foreach (PropertyData data in mo.Properties)

nodes.Add (new TreeNode (data.Name + ": " + mo[data.Name], 2, 3));

и он очень полезен с познавательной точки зрения (обязательно исследуйте его), но с практической точки зрения он создает массу ненужных строк, забивающих эфир (jamming the air).

Разработка элемента ProcessControl

using System;

using System.Collections;

using System.Management;

using System.Windows.Forms;

namespace Library

{

public partial class ProcessControl : UserControl

{

#region Data

string sMachine;

ConnectionOptions co;

ProcessListComparer listComparer;

ManagementEventWatcher watcherCreate, watcherDelete;

bool removing;

public event Action<string> UpdateLog;

#endregion

#region Init

public ProcessControl()

{

InitializeComponent();

Load += new EventHandler(ProcessesControl_Load);

watcherCreate = new ManagementEventWatcher(

@"Select * from __InstanceCreationEvent within 1

where TargetInstance ISA 'Win32_Process'");

watcherDelete = new ManagementEventWatcher(

@"Select * from  __InstanceDeletionEvent within 1

where TargetInstance ISA 'Win32_Process'");

}

void ProcessesControl_Load(object sender, EventArgs e)

{

GetSysInfo();

SetProcessList();

FillProcesses();

ShowProperty(// Ваш код);

combo.Items.AddRange(new object[] {

"hh.exe", "notepad.exe", "regedit.exe", "calc.exe", "mmc.exe"});

watcherCreate.EventArrived += // Ваш код

watcherDelete.EventArrived += // Ваш код

Disposed += // Ваш код

combo.SelectedIndexChanged += // Ваш код

listView.ItemChecked += // Ваш код

listView.ColumnClick += // Ваш код

listView.ItemSelectionChanged += // Ваш код

btnRefresh.Click += // Ваш код

rbCurrent.CheckedChanged += // Ваш код

watcherCreate.Start();

watcherDelete.Start();

}

#endregion

#region Methods

void AddItem(ListViewItem item)

{

listView.BeginUpdate();

listView.ItemCheck -= // Ваш код

item.Checked = true;

listView.Items.Add(item);

OnUpdateLog(// Ваш код);

listView.ItemCheck += // Ваш код

listView.EndUpdate();

}

void RemoveList(string id)

{

foreach (// Элемента списка listView)

{

if (// Если PID == id)

{

OnUpdateLog("Process " + item.SubItems[1].Text + " num : "

+ item.SubItems[2].Text + " terminated");

item.Remove();

break;

}

}

}

void StopProcess(int id)

{

ManagementObjectSearcher searcher = // Ваш код

if (searcher.Get().Count != 0)

{

foreach (ManagementObject mo in searcher.Get())

mo.InvokeMethod("Terminate", null);

}

}

void ShowProperty(string s)

{

string q = "Select * from  Win32_Process where ProcessId = " + s;

ManagementObjectSearcher searcher = new ManagementObjectSearcher(q);

foreach (ManagementObject mo in searcher.Get())

prop.SelectedObject = new Processes(mo);

}

void SetProcessList()

{

listView.Columns.Add("№  ", 50, HorizontalAlignment.Left);

listView.Columns.Add("Process", 120, HorizontalAlignment.Left);

listView.Columns.Add("ID", 80, HorizontalAlignment.Left);