C# 시샵 프로세스 종료하는 방법

C# & MFC

C# 시샵 프로세스 종료하는 방법

 

환경: Visual Studio 2013

 

C# 에서는 Process 라는 내장 객체를 사용해서 외부 프로세스를 제어할 수 있습니다. 그러니까 윈도우에 떠 있는 현재 프로세스 정보와 특정 프로세스를 골라서 종료 시킬 수도 있습니다. 이번에 소개할 샘플은 Process 객체에서 모든 프로세스 정보를 알아 온 후 윈도우 폼에 추가합니다. 그리고 목록에서 원하는 프로세스를 종료시키는 샘플입니다.

 

완성된 화면은 아래와 같습니다. 현재 컴퓨터에서 실행되고 있는 모든 프로세스 정보를 가져온 후 리스트에 넣어 줍니다. 그리고 원하는 프로세스를 선택한 후 [프로세스 종료] 버튼을 누르면 됩니다.

 

C# 시샵 프로세스 종료하는 방법

 

먼저 프로세스 정보를 가져오는 소스는 아래와 같습니다. Process 객체의 GetPrecesses() 함수를  이용해서 모든 프로세스 정보를 가져옵니다. 가져온 프로세스 배열 정보를 직접 만든 WriteProcessInfo() 함수를 이용해 ListView 에 추가합니다. 그럼 위의 화면처럼 목록에 프로세스 정보가 나열이 됩니다.

 

Process[] pros = Process.GetProcesses();    //시스템의 모든 프로세스 정보 출력
label2.Text = Convert.ToString(pros.Length);

foreach (Process p in pros)
{
WriteProcessInfo(p);
}

private void WriteProcessInfo(Process processInfo)
{
    string[] row = { processInfo.ProcessName, Convert.ToString(processInfo.Id), Convert.ToString(processInfo.VirtualMemorySize64) };
    var listViewItem = new ListViewItem(row); 
    lstProcess.Items.Add(listViewItem);
}

 

이렇게 나열된 프로세스 목록에서 종료 하고 싶은 항목이 있다면 선택하고 바로 아래 [프로세스 종료] 버튼을 클릭합니다. 아래 소스는 [프로세스 종료] 버튼 이벤트 함수의 내용입니다. 내부에 보시면 먼저 SelectedItems.Count 로 리스트뷰에서 프로세스를 몇 개나 선택했는지 개수를 알아 옵니다. 선택한 것이 있다면 1, 2번째 열에 있는 프로세스 ID와 이름을 가져옵니다. 그리고 이름으로 Process.GetProcessesByName() 함수를 통해 현재 떠 있는 해당 프로세스 정보를 리턴 받습니다. 동일한 프로세스 이름으로 여러 개 있을 수 있기 때문에 배열로 받게 됩니다. 다음은 foreach 문을 이용해서 하나씩 꺼내 kill() 함수로 프로세스를 종료시킵니다.

private void btnProcessClose_Click(object sender, EventArgs e)
{
    if (lstProcess.SelectedItems.Count < 0)
    {
        string id = lstProcess.SelectedItems[0].SubItems[1].Text;
        string name = lstProcess.SelectedItems[0].SubItems[0].Text;
        Console.WriteLine("프로세스 PID : {0}", id);

        if (MessageBox.Show(name + " 종료하시겠습니까?", "입력 취소", MessageBoxButtons.YesNo) == DialogResult.Yes)
        {
            // 프로세스 종료 
            Process[] pros = Process.GetProcessesByName(name);    //시스템의 모든 프로세스 정보 출력
            foreach (Process p in pros)
            {
                p.Kill();    
            }
        }
    }
}

 

아래는 프로그램을 구현한 전체 소스입니다.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

using System.Diagnostics;

namespace GonAlarm
{
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }

        private void Form2_Load(object sender, EventArgs e)
        {
            try
            {
                Process[] pros = Process.GetProcesses();    //시스템의 모든 프로세스 정보 출력
                label2.Text = Convert.ToString(pros.Length);

                foreach (Process p in pros)
                {
                    WriteProcessInfo(p);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }

        private void WriteProcessInfo(Process processInfo)
        {
            string[] row = { processInfo.ProcessName, Convert.ToString(processInfo.Id), Convert.ToString(processInfo.VirtualMemorySize64) };
            var listViewItem = new ListViewItem(row); 
            lstProcess.Items.Add(listViewItem);
        }

        private void btnProcessClose_Click(object sender, EventArgs e)
        {
            if (lstProcess.SelectedItems.Count < 0)
            {
                string id = lstProcess.SelectedItems[0].SubItems[1].Text;
                string name = lstProcess.SelectedItems[0].SubItems[0].Text;
                Console.WriteLine("프로세스 PID : {0}", id);

                if (MessageBox.Show(name + " 종료하시겠습니까?", "입력 취소", MessageBoxButtons.YesNo) == DialogResult.Yes)
                {
                    // 프로세스 종료 
                    Process[] pros = Process.GetProcessesByName(name);    //시스템의 모든 프로세스 정보 출력
                    foreach (Process p in pros)
                    {
                        p.Kill();    
                    }
                }
            }
        }
    }
}
저작자 표시 비영리 변경 금지
신고
Posted by 녹두장군