Como utilizar o Visual Basic .NET ou Visual Basic 2005 para fechar outra aplicação

Traduções de Artigos Traduções de Artigos
Artigo: 305602 - Ver produtos para os quais este artigo se aplica.
Expandir tudo | Reduzir tudo

Nesta página

Sumário

Este artigo descreve como fechar uma aplicação de dentro de uma aplicação. Também descreve como fechar uma instância específica de outra aplicação, tal como o bloco de notas, se tiver mais do que uma instância da aplicação.

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

Declarar variáveis

Diversas variáveis tem de ser definido. Uma vez que estas variáveis são utilizadas em vários métodos, deverão ser definidos fora de qualquer procedimento para que permaneçam no âmbito. A variável de proc contém uma referência a um objecto de processo individual e processos é uma matriz que contém os objectos de processo são devolvidos pelo método GetProcessByName :
Private proc As Process
Private processes() As Process
Private procName As String = "notepad"
				

Obter uma lista de instâncias de aplicações

O seguinte código inclui uma função (denominada buildList no exemplo) que é chamada sempre que é criada uma nova instância do bloco de notas. Este exemplo armazena as informações de processo num controlo ListView ; o código para preencher o controlo ListView está incluído apenas para consistência com o exemplo completa. A parte mais importante deste código é chamada ao método GetProcessByName da classe de processo . Este método devolve uma matriz de objectos do processo , que pode ser iterated sobre utilizando um para ... cada bloquear, da seguinte forma:
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 uma aplicação

Quando estiverem a executar várias instâncias de uma aplicação e pretender fechar uma instância, tem de distinguir entre os processos. O exemplo seguinte utiliza a propriedade ID do objecto de processo para indicar processos separados. A propriedade ID e a propriedade MainWindowTitle (outra propriedade do objecto de processo ) são armazenados no controlo ListView . O código obtém o item que está seleccionado no controlo ListView , obtém uma referência para o processo utilizando o método GetProcessById da classe processo e fecha esse processo chamando o método CloseMainWindow , da seguinte forma:
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 uma aplicação

Fechar todas as ocorrências de uma determinada aplicação é relativamente simples. Pode ajudá-lo a matriz que é devolvida pelo método GetProcessByName e chamada de método CloseMainWindow em cada objecto de processo, da seguinte forma:
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
				

Passos para criar o exemplo

  1. Inicie uma nova aplicação de Visual Basic Windows no Visual Studio .NET ou no Visual Studio 2005.
  2. Com o botão direito do rato no formulário predefinido, Form1.VB e seleccione o Código .
  3. Substituir o código 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
    					
    NOTA: tem de alterar o código do Visual Basic 2005. Por predefinição, o Visual Basic cria dois ficheiros para o projecto quando criar Windows Forms projecto. Se o formulário é o nome Form1, os dois ficheiros que representam o formulário são denominados Form1.VB e Form1.Designer.vb. Tem de escrever o código no ficheiro Form1.VB. O Windows Forms Designer escreve o código no ficheiro Form1.Designer.vb. O Windows Forms Designer utiliza a palavra-chave parcial para dividir a implementação do Form1 em dois ficheiros separados. Este comportamento impede que o código gerado pelo estruturador a ser intercalados com o código.

    Para obter mais informações sobre novos melhoramentos de idioma do Visual Basic 2005, visite o seguinte Web site da Microsoft Developer Network (MSDN):
    http://msdn.microsoft.com/en-us/library/ms379584(VS.80).aspx
    Para mais informações sobre classes parciais e o Windows Forms Designer, visite o seguinte site da Web MSDN:
    http://msdn2.microsoft.com/en-us/library/ms171843.aspx
    Nota É recomendável que fechar a área com o rótulo que criador de formulários Windows gerado código .
  4. Execute a aplicação.
  5. Clique em Iniciar o bloco de notas uma ou mais vezes.
  6. Faça clique sobre uma instância do bloco de notas na janela do controlo ListView e seleccione Processo Fechar . Este botão fecha a instância específica do bloco de notas que seleccionou. Pode também seleccionar Fechar todos os processos para fechar todas as instâncias em execução do bloco de notas.

Notas

Este exemplo utiliza a propriedade ID da classe processo para diferenciar entre instâncias da aplicação. A propriedade ID é um bom candidato para esta tarefa porque processam todos os IDs exclusivos. O mesmo acontece da propriedade WindowHandle , por isso também pode utilizar a propriedade WindowHandle de um objecto de processo para diferenciar entre instâncias da aplicação.

Também é podem utilizar outras propriedades, apesar de estes serem menos well-suited à tarefa. Por exemplo, se não souber o ID de processo de um processo específico ou ter o identificador da janela principal, pode utilizar a propriedade MainWindowTitle para ajudar a identificar a instância adequada. A propriedade MainWindowTitle poderá não ser exclusiva, mas pode ajudá-lo para isolar a aplicação pretendida.

O exemplo neste artigo utiliza um Windows aplicação e utiliza o método CloseMainWindow para fechar a aplicação. CloseMainWindow não funciona com uma aplicação não Windows. Se a aplicação que está a tentar fechar não tiver uma janela (por exemplo, uma aplicação de consola), tem de utilizar o método kill para fechar a aplicação.

REFERÊNCIAS

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

Propriedades

Artigo: 305602 - Última revisão: 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 revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes 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