Visual Basic.NET 또는 Visual Basic 2005를 사용 하 여 다른 응용 프로그램을 종료 하는 방법

이 문서의 Microsoft Visual C++.NET 버전을 참조 하십시오.
307395 .
이 문서의 Microsoft Visual C#.NET 버전을 참조 하십시오.
305603 .
이 문서의 Microsoft Visual Basic 6.0 버전을 참조 하십시오.
176391 .


이 작업에서는


요약

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

프로그래밍 논리의 설명

변수를 선언 합니다.

여러 변수를 정의 해야 합니다. 이러한 변수는 여러 방법으로 사용 하기 때문에 정의 해야 모든 프로시저의 외부 범위에 남아 있게 됩니다. 프로시저 변수에 개별 프로세스 개체에 대 한 참조 및 프로세스 는 프로세스를 포함 하는 배열 GetProcessByName 메서드를 통해 반환 되는 개체입니다.
Private proc As ProcessPrivate processes() As Process
Private procName As String = "notepad"

응용 프로그램 인스턴스 목록 얻기

다음 코드는 메모장의 새로운 인스턴스를 만들 때마다 호출 되는 함수 ( buildList 샘플에서 이라고 함)으로 구성 됩니다. ListView 컨트롤에 있는 프로세스 정보를 저장 하는이 샘플 ListView 컨트롤을 채우는 코드를 전체 샘플을 사용 하 여 일관성을 위해서만 포함 됩니다. 이 코드의 가장 중요 한 부분이입니다 Process 클래스의 GetProcessByName 메서드를 호출 합니다. 이 메서드를 사용 하 여 반복 될 수 있는 프로세스 개체의 배열을 반환... 블록 다음과 같습니다.
Dim itemAdd As ListViewItemListView1.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 속성을 사용 합니다. ListView 컨트롤의 Id 속성과 MainWindowTitle 속성 ( Process 개체의 다른 속성)가 저장 됩니다. 얻은 항목을 ListView 컨트롤에 현재 선택 된 프로세스 클래스의 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

응용 프로그램의 모든 인스턴스를 닫습니다.

특정 응용 프로그램의 모든 인스턴스를 닫는 작업은 비교적 쉽습니다. 다음과 같이 각 프로세스 개체의 CloseMainWindow 메서드를 호출 하 고 GetProcessByName 메서드를 통해 반환 되는 배열을 탐색할 수 있습니다.
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 2005 또는 Visual Studio.NET에서 새 Visual Basic Windows 응용 프로그램을 시작 합니다.
  2. 구역은 Form1.vb를 마우스 오른쪽 단추로 클릭 하 고 코드 보기를선택 합니다.
  3. 다음 코드 창에 있는 코드를 바꿉니다.
    Option Strict OnOption 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

    참고: Visual Basic 2005의 코드를 변경 해야 합니다. 기본적으로 Visual Basic Windows Forms 프로젝트를 만들면 프로젝트에 대 한 두 개의 파일을 만듭니다. Form1 폼의 이름이 인 Form1.Designer.vb와 Form1.vb 폼을 표시 하는 두 파일 이름이 지정 됩니다. Form1.vb 파일에 코드를 작성 합니다. Windows Forms 디자이너에서 Form1.Designer.vb 파일에 코드를 작성합니다. Windows Forms 디자이너 partial 키워드를 사용 하 여 Form1 구현을 두 개의 별도 파일로 분할. 디자이너에서 생성 한 코드를 코드와 섞이지 되지 않습니다.

    새로운 Visual Basic 2005 언어 기능에 대 한 자세한 내용은 다음 Microsoft Developer Network (MSDN) 웹 사이트를 방문 하십시오.Partial 클래스와 Windows Forms 디자이너에 대 한 자세한 내용은 다음 MSDN 웹 사이트를 방문 하십시오.참고: Windows Form 디자이너에서 생성 한 코드라는 영역을 축소 하는 것이 좋습니다.
  4. 응용 프로그램을 실행 합니다.
  5. 메모장 시작 한 번 이상 클릭 합니다.
  6. ListView 컨트롤 창에서 메모장을 클릭 하 고 닫기 프로세스를 선택 합니다. 이렇게 하면 선택한 메모장의 특정 인스턴스를 닫습니다. 메모장의 실행 중인 인스턴스를 모두 닫습니다 닫기 모든 프로세스 선택할 수 있습니다.

참고

이 샘플 응용 프로그램의 인스턴스를 구분 하기 위해 Process 클래스 Id 속성을 사용 합니다. Id 속성 모든 프로세스 Id는 고유 하므로이 작업에 대 한 좋은 후보를입니다. 응용 프로그램의 인스턴스를 구분 하기 위해 WindowHandle 속성 프로세스 개체도 사용할 수 있도록 WindowHandle 속성의 마찬가지입니다.


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

이 문서의 예제에에서는 Windows 응용 프로그램을 사용 하 여 응용 프로그램을 닫으려면 CloseMainWindow 메서드를 사용 하며 CloseMainWindow 비 Windows 응용 프로그램과 함께 작동 하지 않습니다. 종료 하려고 하는 응용 프로그램 창 (예: 콘솔 응용 프로그램)이 없는 경우 응용 프로그램을 닫으려면 Kill 메서드를 사용 해야 합니다.

참조

자세한 내용은 다음 Microsoft Developer Network (MSDN) 웹 사이트를 참조 하십시오.
속성

문서 ID: 305602 - 마지막 검토: 2017. 2. 6. - 수정: 2

피드백