Como usar o Visual Basic .NET ou Visual Basic 2005 para fechar o outro aplicativo

Traduções deste artigo Traduções deste artigo
ID do artigo: 305602 - Exibir os produtos aos quais esse artigo se aplica.
Expandir tudo | Recolher tudo

Neste artigo

Sumário

Este artigo descreve como fechar um aplicativo de dentro de um aplicativo. Ela também descreve como fechar uma instância específica de outro aplicativo, como o bloco de notas, se mais de uma instância do aplicativo estiver sendo executado.

Discussão sobre a lógica de programação

Declarar variáveis

Diversas variáveis precisam ser definidos. Como essas variáveis são usadas em vários métodos, eles devem ser definidos fora de qualquer procedimento para que eles permaneçam no escopo. A variável proc mantém uma referência a um objeto de processo individual, e processos é uma matriz que contém os objetos de processo que são retornados pelo método GetProcessByName :
Private proc As Process
Private processes() As Process
Private procName As String = "notepad"
				

Obter uma lista de instâncias do aplicativo

O código a seguir consiste em uma função (chamada buildList no exemplo) que é chamada sempre que uma nova instância do bloco de notas é criada. Este exemplo armazena as informações do processo em um controle ListView ; o código para preencher o controle ListView é incluído somente para consistência com exemplo completo. A parte mais importante desse código é a chamada para o método GetProcessByName da classe Process . Esse método retorna uma matriz de objetos de processo , que pode ser iterado sobre usando um para ... cada bloquear, da seguinte maneira:
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
				

Fechar uma instância específica de um aplicativo

Quando estiverem executando várias instâncias de um aplicativo e que deseja fechar uma instância, você deve diferenciar entre esses processos. O exemplo a seguir usa a propriedade ID do objeto de processo para informar os processos separados. A propriedade ID e a propriedade MainWindowTitle (outra propriedade do objeto de processo ) são armazenados no controle ListView . O código obtém o item que está atualmente selecionado no controle ListView , obtém uma referência para o processo usando o método GetProcessById da classe Process e fecha esse processo, chamando o método CloseMainWindow , da seguinte maneira:
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
				

Feche todas as instâncias de um aplicativo

Fechar todas as instâncias de um aplicativo específico é relativamente simples. Você pode percorrer a matriz é retornada pelo método GetProcessByName e chamada de método CloseMainWindow em cada objeto de processo, da seguinte maneira:
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
				

Etapas para criar o exemplo

  1. Inicie um novo aplicativo do Visual Basic Windows no Visual Studio .NET ou no Visual Studio 2005.
  2. Clique no formulário padrão, Form1.vb, com o botão direito e selecione View Code .
  3. Substitua o código que está na janela de código com o seguinte:
    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
    					
    Observação você deve alterar o código no Visual Basic 2005. Por padrão, o Visual Basic cria dois arquivos para o projeto quando você cria um Windows Forms projeto. Se o formulário é denominado Form1, os dois arquivos que representam o formulário são chamados de Form1.vb e Form1.Designer.vb. Escreva o código no arquivo Form1.vb. O Windows Forms Designer escreve o código no arquivo Form1.Designer.vb. O Windows Forms Designer usa a palavra-chave partial para dividir a implementação de Form1 em dois arquivos separados. Esse comportamento impede que o código gerado pelo designer sendo intercaladas com seu código.

    Para obter mais informações sobre os novos aprimoramentos linguagem Visual Basic 2005, visite o seguinte site da Web Microsoft Developer Network (MSDN):
    http://msdn.microsoft.com/en-us/library/ms379584(VS.80).aspx
    Para obter mais informações sobre classes parciais e o Windows Forms Designer, visite o seguinte site da MSDN:
    http://msdn2.microsoft.com/en-us/library/ms171843.aspx
    Observação É recomendável que você Recolher região que é rotulado como Windows Form Designer gerado código .
  4. Execute o aplicativo.
  5. Clique em Iniciar Bloco de notas uma ou mais vezes.
  6. Clique em uma instância do bloco de notas na janela do controle ListView e selecione um Processo fechar . Isso fecha a instância específica do bloco de notas que você selecionou. Você também pode selecionar Fechar todos os processos para fechar todas as instâncias em execução do bloco de notas.

Anotações

Este exemplo usa a propriedade ID da classe Process para diferenciar entre instâncias do aplicativo. A propriedade ID é um bom candidato para esta tarefa porque todos os processam identificações exclusivas. O mesmo é true da propriedade WindowHandle , para que você também possa usar a propriedade WindowHandle de um objeto de processo para diferenciar entre instâncias do aplicativo.

Outras propriedades também podem ser usadas, embora sejam menos adequados para a tarefa. Por exemplo, se você não saber a identificação do processo de um processo específico ou ter o identificador da janela principal, você pode utilizar a propriedade MainWindowTitle para ajudar a identificar a instância correta. A propriedade MainWindowTitle não pode ser exclusiva, mas ele pode ajudar a isolar o aplicativo desejado.

O exemplo neste artigo usa um Windows aplicativo e utiliza o método CloseMainWindow para fechar o aplicativo. CloseMainWindow não funciona com um aplicativo não-Windows. Se o aplicativo que você está tentando fechar não tiver uma janela (por exemplo, um aplicativo de console), você deve usar o método kill para fechar o aplicativo.

REFERÊNCIAS

Para obter mais informações, consulte o seguinte Microsoft Developer site Network (MSDN):
Classe de processo
http://msdn.microsoft.com/en-us/library/system.diagnostics.process(VS.71).aspx

Propriedades

ID do artigo: 305602 - Última revisão: quinta-feira, 29 de março de 2007 - Revisão: 2.7
A informação contida neste artigo aplica-se a:
  • Microsoft Visual Basic 2005
  • Microsoft Visual Basic .NET 2003 Standard Edition
  • Microsoft Visual Basic .NET 2002 Standard Edition
Palavras-chave: 
kbmt kbvs2005swept kbvs2005applies kbhowtomaster KB305602 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 305602

Submeter comentários

 

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