728x90
반응형
728x170
▶ MainForm.cs
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Management;
using System.Windows.Forms;
namespace TestProject
{
/// <summary>
/// 메인 폼
/// </summary>
public partial class MainForm : Form
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Field
////////////////////////////////////////////////////////////////////////////////////////// Private
#region Field
/// <summary>
/// 프로세스 카운트
/// </summary>
private int processCount;
/// <summary>
/// 쓰레드 카운트
/// </summary>
private int threadCount;
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
////////////////////////////////////////////////////////////////////////////////////////// Public
#region 생성자 - MainForm()
/// <summary>
/// 생성자
/// </summary>
public MainForm()
{
InitializeComponent();
this.loadButton.Click += loadButton_Click;
}
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Method
////////////////////////////////////////////////////////////////////////////////////////// Private
//////////////////////////////////////////////////////////////////////////////// Event
#region 로드하기 버튼 클릭시 처리하기 - loadButton_Click(sender, e)
/// <summary>
/// 로드하기 버튼 클릭시 처리하기
/// </summary>
/// <param name="sender">이벤트 발생자</param>
/// <param name="e">이벤트 인자</param>
private void loadButton_Click(object sender, EventArgs e)
{
this.treeView.Nodes.Clear();
Dictionary<int, ProcessInformation> dictionary = new Dictionary<int, ProcessInformation>();
foreach(Process process in Process.GetProcesses())
{
dictionary.Add(process.Id, new ProcessInformation(process));
}
ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT ProcessId, ParentProcessId FROM Win32_Process");
ManagementObjectCollection collection = searcher.Get();
foreach(ManagementBaseObject item in collection)
{
int childID = Convert.ToInt32(item["ProcessId" ]);
int parentID = Convert.ToInt32(item["ParentProcessId"]);
ProcessInformation childProcessInformation = null;
ProcessInformation parentProcessInformation = null;
if(dictionary.ContainsKey(childID))
{
childProcessInformation = dictionary[childID];
}
if(dictionary.ContainsKey(parentID))
{
parentProcessInformation = dictionary[parentID];
}
if((childProcessInformation != null) && (parentProcessInformation != null))
{
parentProcessInformation.ChildList.Add(childProcessInformation);
childProcessInformation.Parent = parentProcessInformation;
}
}
List<ProcessInformation> list = dictionary.Values.ToList();
list.Sort();
processCount = 0;
threadCount = 0;
foreach(ProcessInformation processInformation in list)
{
if(processInformation.Parent != null)
{
continue;
}
AddTreeViewNode(treeView.Nodes, processInformation);
}
this.countLabel.Text = $"프로세스 : {processCount}, 쓰레드 : {threadCount}";
}
#endregion
//////////////////////////////////////////////////////////////////////////////// Function
#region 트리뷰 노드 추가하기 - AddTreeViewNode(nodeCollection, processInformation)
/// <summary>
/// 트리뷰 노드 추가하기
/// </summary>
/// <param name="nodeCollection">노드 컬렉션</param>
/// <param name="processInformation">프로세스 정보</param>
private void AddTreeViewNode(TreeNodeCollection nodeCollection, ProcessInformation processInformation)
{
TreeNode processNode = nodeCollection.Add(processInformation.ToString());
processNode.Tag = processInformation;
processCount++;
if(processInformation.Process.Threads.Count > 0)
{
TreeNode threadNode = processNode.Nodes.Add("쓰레드");
foreach(ProcessThread thread in processInformation.Process.Threads)
{
threadNode.Nodes.Add(string.Format("쓰레드 {0}", thread.Id));
threadCount++;
}
}
processInformation.ChildList.Sort();
foreach(ProcessInformation childProcessInformation in processInformation.ChildList)
{
AddTreeViewNode(processNode.Nodes, childProcessInformation);
}
if(processInformation.ChildList.Count > 0)
{
processNode.Expand();
}
}
#endregion
}
}
728x90
반응형
그리드형(광고전용)
'C# > Common' 카테고리의 다른 글
[C#/COMMON] Regex 클래스 : IsMatch 정적 메소드를 사용해 IPV4 주소 검증하기 (0) | 2020.08.09 |
---|---|
[C#/COMMON] Regex 클래스 : IsMatch 정적 메소드를 사용해 메일 주소 검증하기 (0) | 2020.08.09 |
[C#/COMMON] Regex 클래스 : IsMatch 정적 메소드를 사용해 특수 문자 사용 여부 구하기 (0) | 2020.08.09 |
[C#/COMMON] 극 좌표 → 직교 좌표 변환하기 (0) | 2020.08.08 |
[C#/COMMON] 비트 단위 연산하기 (0) | 2020.08.06 |
[C#/COMMON] List<T> 클래스 : ForEach 메소드 사용하기 (0) | 2020.07.22 |
[C#/COMMON] 각도 정규화하기 (0) | 2020.07.18 |
[C#/COMMON] Math 클래스 : IEEE 754 실수 계산하기 (0) | 2020.07.17 |
[C#/COMMON] Math 클래스 : 실수 올림/반올림/내림하기 (0) | 2020.07.17 |
[C#/COMMON] ProcessStartInfo 클래스 : Verb 속성을 사용해 그림판에서 이미지 편집하기 (0) | 2020.07.07 |
댓글을 달아 주세요