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 녹두장군

댓글을 달아 주세요

  1. tt 2018.09.26 11:17  댓글주소  수정/삭제  댓글쓰기

    현재 비주얼 스튜디오 2015 c# 콘솔앱으로 돌렸는데요
    맨위에 using System.Windows.Forms; 요 부분에 문제 생겼다고 뜨고
    전체적으로 오류 뜨는데 c# 콘솔앱이 아니라 다른 것으로 소스 돌리신건가요?

  2. tt 2018.10.10 22:41  댓글주소  수정/삭제  댓글쓰기

    아하 윈도우 폼으로 실행 하는 것이였군요
    요즘 들어 블로그 자주 보는데요
    그 실행을 하다가 19번째 줄 InitializeComponent(); 부분이 현재 컨텍스트에 없다고 오류뜨고
    27번째줄에 label2.Text = Convert.ToString(pros.Length);부분은 label12도 없다고 뜨고
    44번째줄 lstProcess.Items.Add(listViewItem);에 lstProcess 도 현재 컨텍스트에 없고
    요렇게 3가지 오류가 뜨는데요

    이걸 어떻게 수정을 해야 할까요?

  3. tt 2018.12.06 19:23  댓글주소  수정/삭제  댓글쓰기

    휴 c# 폼 배워가는 중인데
    이거 디자인 부분만 어떻게 하는지 알수 있을까요?
    소스보고 뭘 만드는지는 알겠는데
    디자인에서 자세한 설정을 모르겠어요 ㅠㅠ