프로그램 개발/C#

[wpf] c# 코드로 작업 끝내기

(ㅇㅅㅎ) 2021. 4. 14. 21:54
728x90
반응형

c# 코드로 [작업 관리자]에서 [작업 끝내기] 기능을 사용하면서 선택한 프로그램의 간단한 정보도 볼 수 있도록 만들어 보았습니다.

 

"PROCESS"에 작업을 끝낼 프로그램을 넣으시면 됩니다.
"PROCESS".CloseMainWindow();
"PROCESS".Refresh();
"PROCESS".Kill();

 

자세한 설명을 보고 싶으신 분은 "더보기"를 클릭해서 봐주시길 바랍니다.

더보기

UI 부분

xaml
<Grid>
    <StackPanel VerticalAlignment="Center" HorizontalAlignment="Center">
        <TextBlock Text="작업관리자" HorizontalAlignment="Center" FontSize="15"/>
        <StackPanel Orientation="Horizontal" >
            <ComboBox Name="process_CB" Width="100" Margin="10" SelectionChanged="ComboBox_SelectionChanged" DropDownOpened="ComboBox_DropDownOpened"/>
            <Button x:Name="close_B" Content="작업 끝내기" VerticalAlignment="Center" Click="Button_Click"/>
        </StackPanel>
        <TextBox x:Name="info_TB" IsReadOnly="True" Height="130" AcceptsReturn="True"/>
    </StackPanel>
</Grid>

 

사용한 UI 이벤트는 다음과 같습니다.

ComboBox
DropDownOpened ComboBox를 클릭하여 목록이 펼쳐질 때 현재 실행 중인 프로그램들이 ComboBox의 Item이 됩니다.
SelectionChanged ComboBox의 Item이 바뀔 때 새롭게 선택된 프로그램의 정보를 TextBox에 나타냅니다. 
Button
Click 버튼을 클릭하게 되면 ComboBox에 선택된 프로그램의 작업을 끝냅니다.

코드 부분

1. ComboBox에 현재 실행 중인 프로그램 추가하기

 1) 변수로 프로세스 배열을 만들어줍니다.

 2) 만든 변수에 Process.GetProcesses()를 사용하여 현재 사용 중인 모든 프로그램들을 담아줍니다.

 3) ComboBox의 Item들을 삭제합니다.

    ComboBox의 Item들을 삭제하지 않으면 ComboBox 안에 Item들이 계속하여 추가됩니다.

 4) ComboBoxItem을 생성하여 ComboBox에 Item을 추가합니다. 

   ① 숨겨진 프로세스, 즉 작업 표시줄에 표시되지 않는 프로세스의 경우 MainWindowHandle값이 0이 됩니다. 또한 이것은 알림 영역에서 아이콘으로 표시되는 프로세스일 수도 있습니다.

      이번 프로젝트에서는 나타내지 않도록 설정했지만, 나타내셔도 무관합니다.

   ② Tag의 값은 index값을 넣어주고 Content의 값은 프로세스의 이름 생성합니다.

   ③ ComboBoxItem을 ComboBox에 추가합니다.

 

2. ComboBox를 누를 때(DropDown이 열릴 때)마다 GetAllProcessName() 사용하기

 

3. ComboBox의 Item이 선택되면 TextBox에 간단한 정보가 표현하기

 1) 선택된 Item을 담은 ComboBoxItem을 생성합니다.

 2) Item이 있다면 TextBox에 정보를 표현합니다. 표현하기 전 Clear()를 사용하여 TextBox에 있는 문자열들을 삭제합니다.

 

4. [작업 끝내기] Button을 클릭하면 프로그램 작업 끝내도록 설정하기

 1) 선택된 Item을 담은 ComboBoxItem을 생성합니다.

 2) Item이 있다면 Item의 Tag 속 index를 사용하여 프로그램을 종료합니다.

CloseMainWindow() 사용자 인터페이스가 있는 프로세스를 닫습니다.
true/false 값을 리턴하는데 주창이 없을 경우 false를 반환합니다.
Refresh() 프로세스 구성 요소 내에 캐시되어 있는 연결된 프로세스 정보를 모두 삭제합니다.
Kill() 연결된 프로세스를 즉시 중지합니다.

    더 많은 설명은 아래 사이트를 확인해주시길 바랍니다.

docs.microsoft.com/ko-kr/dotnet/api/system.diagnostics.process?view=net-5.0

 

Process 클래스 (System.Diagnostics)

로컬 및 원격 프로세스에 대한 액세스를 제공하고 로컬 시스템 프로세스를 시작하고 중지할 수 있습니다.Provides access to local and remote processes and enables you to start and stop local system processes.

docs.microsoft.com

 3) TextBox와 ComboBox의 Item들을 삭제합니다.

 

전체 코드

c#
    public partial class MainWindow : Window
    {
        #region 변수 정의
        private Process[] processes;
        #endregion
 
        public MainWindow()
        {
            InitializeComponent();
        }
 
        #region UI EVENT
 
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            Button b = sender as Button;
            if(b == close_B)
            {
                ComboBoxItem cbi = (ComboBoxItem)process_CB.SelectedItem;
                if(cbi != null)
                {
                    processes[int.Parse(cbi.Tag.ToString())].CloseMainWindow();
                    processes[int.Parse(cbi.Tag.ToString())].Refresh();
                    processes[int.Parse(cbi.Tag.ToString())].Kill();
                    info_TB.Clear();
                    process_CB.Items.Clear();
                }
            }
        }
 
        private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            ComboBoxItem cbi = (ComboBoxItem)(sender as ComboBox).SelectedItem;
 
            if (cbi != null)
            {
                info_TB.Clear();
 
                Process Info = processes[int.Parse(cbi.Tag.ToString())];
                info_TB.AppendText("Process : " + Info.ProcessName + Environment.NewLine);
                info_TB.AppendText("시작시간 : " + Info.StartTime + Environment.NewLine);
                info_TB.AppendText("프로세스 PID : " + Info.Id + Environment.NewLine);
                info_TB.AppendText("메모리 : " + Info.VirtualMemorySize + Environment.NewLine);
            }
        }
 
        private void ComboBox_DropDownOpened(object sender, EventArgs e)
        {
            GetAllProcessName();
        }
        #endregion
 
        private void GetAllProcessName()
        {
            processes = Process.GetProcesses();
            process_CB.Items.Clear();
            int idx = -1;
            foreach (Process process in processes)
            {
                idx++;
                if (process.MainWindowHandle == IntPtr.Zero)
                {
                    continue;
                }
                ComboBoxItem cbi = new ComboBoxItem()
                {
                    Tag = idx.ToString(),
                    Content = process.ProcessName
                };
                process_CB.Items.Add(cbi);
            }
        }
 
 
    }
 
 

 

반응형