HOWTO: Visual Basic .NET을 사용하여 다른 응용 프로그램 닫기

기술 자료 번역 기술 자료 번역
기술 자료: 305602 - 이 문서가 적용되는 제품 보기.
이 문서는 이전에 다음 ID로 출판되었음: KR305602
모두 확대 | 모두 축소

이 페이지에서

요약

이 문서에서는 응용 프로그램 내에서 응용 프로그램을 닫는 방법을 설명합니다. 응용 프로그램에서 둘 이상의 인스턴스가 실행 중일 경우에 메모장 같은 다른 응용 프로그램의 특정 인스턴스를 닫는 방법도 설명합니다.

프로그래밍 논리의 설명

변수 선언

몇 가지 변수를 정의해야 합니다. 이러한 변수는 여러 메소드에서 사용되므로 범위 내에 남아 있게 프로시저 외부에서 정의해야 합니다. proc 변수에는 개별 프로세스 개체에 대한 참조가 저장되어 있으며 processesGetProcessByName 메서드에서 반환한 프로세스 개체를 보유하고 있는 배열을 나타냅니다.
Private proc As Process
Private processes() As Process
Private procName As String = "notepad"

응용 프로그램 인스턴스 목록 알아내기

다음 코드는 메모장의 새로운 인스턴스를 만들 때마다 호출되는 함수(이 예제에서는 buildList)를 포함하고 있습니다. 이 예제는 프로세스 정보를 ListView 컨트롤에 저장합니다. ListView 컨트롤에 포함되는 코드는 단지 전체 예제와 일관성을 유지하기 위해 포함됩니다. 이 코드에서 가장 중요한 부분은 Process 클래스의 GetProcessByName 메서드에 대한 호출입니다. 이 메서드는 Process 개체의 배열을 반환하며 이것은 For ... Each 블록을 사용하여 반복 적용할 수 있습니다.
Dim itemAdd As ListViewItem
ListView1.Items.Clear()

processes = Process.GetProcessesByName(procName)

For Each proc In processes
    itemAdd = ListView1.Items.Add(proc.MainWindowTitle)
    itemAdd.SubItems.Add(proc.Id.ToString)
Next

응용 프로그램의 특정 인스턴스 닫기

응용 프로그램 내에 여러 인스턴스가 실행 중인 상태에서 한 인스턴스를 닫으려면 프로세스를 구별할 수 있어야 합니다. 다음 예제에서는 Process 개체의 Id 속성을 사용하여 프로세스를 구별합니다. Process 개체의 IdMainWindowTitle 속성은 ListView 컨트롤에 저장되어 있습니다. 코드는 아래와 같이 ListView 컨트롤에서 현재 선택한 항목을 얻고, Process 클래스의 GetProcessById 메서드를 사용하여 프로세스에 대한 참조를 얻은 다음 CloseMainWindow 메서드를 호출하여 해당 프로세스를 닫습니다.
Try
    Dim procID As Integer = _  
     System.Convert.ToInt32(ListView1.SelectedItems(0).SubItems(1).Text)
    Dim tempProc As Process = Process.GetProcessById(procID)
    tempProc.CloseMainWindow()
    tempProc.WaitForExit()
    buildList()
Catch
    MessageBox.Show("Please select a process in the ListView before clicking this button." + _
      " Or the Process may have been closed by somebody.")
    buildList()
End Try

응용 프로그램의 모든 인스턴스 닫기

특정 응용 프로그램의 모든 인스턴스를 닫는 작업은 비교적 수월합니다. 아래와 같이 GetProcessByName 메서드에서 반환하는 배열을 처리하고 각 프로세스 개체에 대한 CloseMainWindow 메서드를 호출할 수 있습니다.
Try
  For Each proc In processes
    proc.CloseMainWindow()
    proc.WaitForExit()
  Next
  buildList()
Catch ex As System.NullReferenceException
  MessageBox.Show("No instances of Notepad running.")      
End Try

예제 작성 절차

  1. Visual Studio .NET에서 새로운 Visual Basic Windows 응용 프로그램을 시작합니다.
  2. 기본으로 생성된 Form1.vb를 마우스 오른쪽 단추로 누르고 코드 보기를 선택합니다.
  3. 코드 창에 있는 코드를 아래의 코드로 대체합니다.
    Option Strict On
    Option Explicit On 
    
    Public Class Form1
      Inherits System.Windows.Forms.Form
    
    #Region " Windows Form Designer generated code "
    
      Public Sub New()
        MyBase.New()
    
        'This call is required by the Windows Form Designer.
        InitializeComponent()
    
        'Add any initialization after the InitializeComponent() call.
    
      End Sub
    
      'Form overrides dispose to clean up the component list.
      Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
        If disposing Then
          If Not (components Is Nothing) Then
            components.Dispose()
          End If
        End If
        MyBase.Dispose(disposing)
      End Sub
      Friend WithEvents btnLaunch1 As System.Windows.Forms.Button
      Friend WithEvents ColumnHeader1 As System.Windows.Forms.ColumnHeader
      Friend WithEvents ColumnHeader2 As System.Windows.Forms.ColumnHeader
      Friend WithEvents ListView1 As System.Windows.Forms.ListView
      Friend WithEvents btnCloseAll As System.Windows.Forms.Button
      Friend WithEvents btnClose1 As System.Windows.Forms.Button
    
      'Required by the Windows Form Designer.
      Private components As System.ComponentModel.Container
    
      'NOTE: The following procedure is required by the Windows Form Designer
      'It can be modified by using the Windows Form Designer.  
      'Do not modify it by using the code editor.
      <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
        Me.btnClose1 = New System.Windows.Forms.Button()
        Me.ListView1 = New System.Windows.Forms.ListView()
        Me.ColumnHeader1 = New System.Windows.Forms.ColumnHeader()
        Me.ColumnHeader2 = New System.Windows.Forms.ColumnHeader()
        Me.btnCloseAll = New System.Windows.Forms.Button()
        Me.btnLaunch1 = New System.Windows.Forms.Button()
        Me.SuspendLayout()
        '
        'btnClose1
        '
        Me.btnClose1.Location = New System.Drawing.Point(160, 176)
        Me.btnClose1.Name = "btnClose1"
        Me.btnClose1.Size = New System.Drawing.Size(112, 32)
        Me.btnClose1.TabIndex = 4
        Me.btnClose1.Text = "Close Selected Process"
        '
        'ListView1
        '
        Me.ListView1.Columns.AddRange(New System.Windows.Forms.ColumnHeader() {Me.ColumnHeader1, Me.ColumnHeader2})
        Me.ListView1.Location = New System.Drawing.Point(22, 8)
        Me.ListView1.MultiSelect = False
        Me.ListView1.Name = "ListView1"
        Me.ListView1.Size = New System.Drawing.Size(250, 152)
        Me.ListView1.TabIndex = 7
        Me.ListView1.View = System.Windows.Forms.View.Details
        '
        'ColumnHeader1
        '
        Me.ColumnHeader1.Text = "Window Title"
        Me.ColumnHeader1.Width = 160
        '
        'ColumnHeader2
        '
        Me.ColumnHeader2.Text = "Process ID"
        Me.ColumnHeader2.Width = 85
        '
        'btnCloseAll
        '
        Me.btnCloseAll.Location = New System.Drawing.Point(160, 216)
        Me.btnCloseAll.Name = "btnCloseAll"
        Me.btnCloseAll.Size = New System.Drawing.Size(112, 32)
        Me.btnCloseAll.TabIndex = 3
        Me.btnCloseAll.Text = "Close All Processes"
        '
        'btnLaunch1
        '
        Me.btnLaunch1.Location = New System.Drawing.Point(32, 176)
        Me.btnLaunch1.Name = "btnLaunch1"
        Me.btnLaunch1.Size = New System.Drawing.Size(112, 72)
        Me.btnLaunch1.TabIndex = 1
        Me.btnLaunch1.Text = "Start Notepad"
        '
        'Form1
        '
        Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
        Me.ClientSize = New System.Drawing.Size(292, 266)
        Me.Controls.AddRange(New System.Windows.Forms.Control() {Me.ListView1, Me.btnClose1, Me.btnCloseAll, Me.btnLaunch1})
        Me.Name = "Form1"
        Me.Text = "Process Example"
        Me.ResumeLayout(False)
    
      End Sub
    
    #End Region
    
      Private procName As String = "notepad"
      Private proc As Process
      Private processes() As Process
      Private specialFolder As String = System.Environment.GetFolderPath(Environment.SpecialFolder.System)
    
      Private Sub buildList()
        'this sub populates the listview control with the instances of 'procName'
        'that are currently running.
        Dim itemAdd As ListViewItem
        ListView1.Items.Clear()
    
        processes = Process.GetProcessesByName(procName)
    
        For Each proc In processes
          itemAdd = ListView1.Items.Add(proc.MainWindowTitle)
          itemAdd.SubItems.Add(proc.Id.ToString)
        Next
    
      End Sub
    
    
      Private Sub btnLaunch1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnLaunch1.Click
        'Launch notepad and open the end user license agreement.
        Dim pInfo As New ProcessStartInfo()
        pInfo.FileName = specialFolder & "\eula.txt"
        pInfo.WindowStyle = ProcessWindowStyle.Minimized
        Dim p As Process = Process.Start(pInfo)
        p.WaitForInputIdle()
        buildList()
      End Sub
    
    
      Private Sub btnClose1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnClose1.Click
        'Close one of the instances of notepad based on the selected item in the ListView.
        'There are several ways to identify a process. For example,
        'you can use the mainwindowtitle, windowhandle, or processname, depending  
        'on your needs. The process ID is used here because there may be several
        'windows open with the same title.
        Try
          Dim procID As Integer = System.Convert.ToInt32(ListView1.SelectedItems(0).SubItems(1).Text)
          Dim tempProc As Process = Process.GetProcessById(procID)
          tempProc.CloseMainWindow()
          tempProc.WaitForExit()
          buildList()
        Catch
          MessageBox.Show("Please select a process in the ListView before clicking this button." + _
          " Or the Process may have been closed by somebody.")
          buildList()
        End Try
      End Sub
    
      Private Sub btnCloseAll_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCloseAll.Click
        'Walk the process array and close all processes.
        Try
          For Each proc In processes
            proc.CloseMainWindow()
            proc.WaitForExit()
          Next
          buildList()
        Catch ex As System.NullReferenceException
          MessageBox.Show("No instances of Notepad running.")      
        End Try
      End Sub
    
      Private Sub Form1_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles MyBase.Closing
        'Make sure that you do not leave any instances running.
        If Not (processes Is Nothing) Then
          If (processes.Length <> 0) Then
            Me.btnCloseAll_Click(Me, e)
          End If
        End If
      End Sub
    
    End Class
    참고 : Windows Form 디자이너에서 생성한 코드 영역을 축소하는 것이 좋습니다.
  4. : 응용 프로그램 실행합니다.
  5. : Start Notepad를 한 번 이상 누릅니다.
  6. : ListView 컨트롤 창에서 메모장 인스턴스를 누르고 Close Selected Process를 선택합니다. 이렇게 하면 선택한 메모장의 해당 인스턴스가 닫힙니다. Close All Processes를 선택하면 실행 중인 메모장의 인스턴스를 모두 닫을 수도 있습니다.

참고

이 예제에서는 Process 클래스의 Id 속성을 사용하여 응용 프로그램의 인스턴스를 구별합니다. 모든 프로세스 ID가 고유하기 때문에 프로세스를 구별하는 작업에 Id 속성을 사용하는 것이 적합합니다. WindowHandle 속성도 마찬가지이므로 Process 개체의 WindowHandle 속성을 사용하여 응용 프로그램의 인스턴스를 구별할 수 있습니다.

다른 속성도 사용되기는 하지만 인스턴스를 구별하는 작업에 그리 적합하지는 않습니다. 예를 들어, 특정 프로세스의 프로세스 ID를 모르거나 주 창의 핸들이 없는 경우 MainWindowTitle 속성을 사용하면 해당 인스턴스를 식별할 수 있습니다. MainWindowTitle 속성이 고유하지는 않지만 원하는 응용 프로그램을 구별하는데 도움을 줄 수는 있습니다.

이 문서에 나와 있는 예제에서는 Windows 응용 프로그램을 사용하고 CloseMainWindow 메서드를 사용하여 응용 프로그램을 닫습니다. CloseMainWindow는 Windows 응용 프로그램이 아닌 경우 작동하지 않습니다. 콘솔 응용 프로그램 같이 닫으려는 응용 프로그램에 창이 없을 경우 Kill 메서드를 사용하여 응용 프로그램을 닫을 수 있습니다.

참조

자세한 내용은 다음 Microsoft Developer Network(MSDN) 웹 사이트를 참조하십시오.
Process 클래스
http://msdn.microsoft.com/library/en-us/cpref/html/frlrfSystemDiagnosticsProcessClassTopic.asp

속성

기술 자료: 305602 - 마지막 검토: 2002년 2월 26일 화요일 - 수정: 1.0
본 문서의 정보는 다음의 제품에 적용됩니다.
  • Microsoft Visual Basic .NET 2002 Standard Edition
키워드:?
kbhowto kbhowtomaster KB305602

피드백 보내기

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com