 VB.NET 
- Usando a classe System.Diagnostic.Process
VB.NET 
- Usando a classe System.Diagnostic.Process
 
Para acompanhar este artigo você precisa saber o que é um processo. O que é um 
processo ?
Indo direto ao que interessa um processo é simplesmente uma aplicação que esta rodando no seu computador.
Pois bem , agora que você já sabe o que é um processo (os puristas que me desculpem...) , voltemos ao assunto do artigo. Neste artigo eu vou falar sobre a classe Process do namespace System.Diagnostic. Ela pode ser usada para iniciar e parar processos , controlar e monitorar aplicações.
Usando a classe Process você pode obter informações sobre processos e aplicações , pode também usá-la para criar uma instância de uma aplicação ou parar um processo que esta sendo executado. A grosso modo poderíamos dizer que a classe Process é a sucessora do comando Shell do VB6 (lembra dele ?)
Nota: Uma thread (linha de execução) é a unidade básica com a qual o sistema operacional aloca o tempo de processos. Uma thread pode executar qualquer parte do código do processo , incluindo partes que estão sendo atualmente executadas por outra thread.
Obtendo informação do processo atual
Quais informações podemos obter através da classe Process ? A seguir temos uma tabela com a relação dos principais membros da classe Process: (para uma relação completa das propriedades e métodos consulte a documentação)
| BasePriority | Obtêm a base prioritária do processo associado. | 
| Container | Obtêm a IContainer que contém o componente | 
| EnableRaisingEvents | Obtêm ou define se o evento Exited será disparado quando o processo terminar. | 
| ExitCode | Obtêm um valor para o processo associado quando o mesmo é encerrado. | 
| ExitTime | Obtêm a hora que o processo associado encerrou. | 
| Handle | Retorna o handle do processo associado nativo. | 
| HandleCount | Obtêm o número de handles abertos pelo processo. | 
| HasExited | Obtêm um valor indicando se o processo associado terminou. | 
| Id | Obtêm o identificador único para o processo associado. | 
| MachineName | Obtêm o nome do computador no qual o processo associado esta rodando. | 
| MainModule | Obtêm o módulo principal do processo associado. | 
| MainWindowHandle | Obtêm o handle da janela para a janela principal do processo associado. | 
| MainWindowTitle | Obtêm o titulo da janela principal do processo. | 
| ProcessName | Obtêm o nome do processo. | 
| Responding | Obtêm um valor indicando se a interface do usuário do processo esta respondendo | 
| Site | Obtêm ou define o ISite do componente. | 
| StartTime | Obtêm a hora que o processo associado foi iniciado. | 
| Threads | Obtêm o conjunto de threads que estão rodando no processo associado. | 
| TotalProcessorTime | Obtêm a tempo total de processamento para este processo. | 
| UserProcessorTime | Obtêm o tempo de processamento este processo. | 
| VirtualMemrySize | Obtêm o tamanho da memória virtual do processo. | 
| WorkingSet | Obtêm a memória física associada ao processo atual. | 
Agora vamos ver um exemplo prático onde iremos obter algumas informações do processo na máquina local.
Crie um novo projeto do tipo 
Console Application e insira o código conforme abaixo:
 
| Imports System.Diagnostics Module Module1 Sub Main() Dim proc As Process = Process.GetCurrentProcess         Console.WriteLine("Identificador do processo : " & proc.Id.ToString)        Console.WriteLine("Nome do Processo: " & proc.ProcessName)        Console.WriteLine("Handle do processo: " & proc.Handle.ToString)        Console.WriteLine("Titulo da janela principal do processo : " & proc.MainWindowTitle)        Console.WriteLine("Informação da base prioritária : " & proc.BasePriority)        Console.WriteLine("Número de handles abertos pelo processo : " & proc.HandleCount.ToString)        Console.WriteLine("A interface do usuário esta respondendo ? " & proc.Responding.ToString)Console.ReadLine() End Sub End Module 
 | 
No código acima estou usando o processo atual - GetCurrentProcess - para retornar uma referência para o componente processo das aplicações. O Método GetCurrentProcess é shared (estático) por isto não foi preciso criar uma instância da classe Process. Após obter uma referência para o processo atual estou usando algumas das propriedades da classe para obter informações. O resultado obtido é o seguinte :

Obtendo uma lista dos processos atuais
É uma tarefa simples obter uma relação dos processos rodando no seu sistema. Para isto vamos usar o método estático (shared) GetProcess() ; ele retorna uma Array dos componentes do processo. O código abaixo mostra como fazer isto:
| Imports System.Diagnostics Module Module1 Sub Main() Dim proc As Process For Each proc In Process.GetProcesses             Console.WriteLine("Processo # " & proc.ProcessName)Next Console.ReadLine() End Sub End Module 
 | 
O resultado obtido na minha máquina local é :

Iniciando um processo
Vou mostrar agora como iniciar um processo. Para fazer isto vou usar o método estático Start da classe Process. No código abaixo vou iniciar o programa NotePad.exe de três formas diferentes:
| Imports System.Diagnostics Module Module1 Sub Main()         Process.Start("notepad.exe")        Process.Start("notepad.exe", "c:\teste\clientes.txt")        Process.Start("c:\teste\clientes.txt")End Sub End Module | 
No código temos :
1- Process.Start("notepad.exe") - inicia uma instância do programa Notepad.exe
2- Process.Start("notepad.exe", "c:\teste\clientes.txt") - inicia uma instância do programa Notepad.exe e abre o arquivo clientes.txt
3- Process.Start("c:\teste\clientes.txt") - inicia uma instância do programa que estiver registrado para abrir arquivos com a extensão txt.
Embora o esquema acima funcione você não tem muito controle sobre os processos. Para isto devemos criar uma instância da classe Process e usar o objeto StartInfo. Ele representa um conjunto de parâmetros usados para iniciar um processo. A única propriedade obrigatória que devemos informar é a propriedade FileName ela indica o nome do processo que queremos iniciar.
A vantagem em usar este objeto é que podemos realizar o tratamento de erros se o arquivo não estiver registrado e podemos saber quando o processo foi encerrado Vejamos como fica o código para iniciar o NotePad.exe :
| Imports System.Diagnostics Module Module1 Sub Main() Dim proc As New Process() proc.StartInfo.FileName = "Notepad.exe" proc.StartInfo.Arguments = "c:\teste.clientes.txt" proc.Start() End Sub End Module | 
Perceba que primeiro criamos uma instância da classe Process e a seguir definimos o nome do processo que vamos iniciar indicando um argumento pertinente e finalmente iniciamos o processo.
Usando eventos para descobrir quando um processo terminou
A classe Process expõe dois eventos : Disposed : é herdado de Component e Exited : que ocorre quando o processo termina.
Para tratar os eventos primeiro temos que criar um manipulador de eventos que irá ser executado quando o processo terminar. No nosso manipulador vamos escrever as propriedades ExitCode e ExitTime na janela de saída indicando que o processo terminou. O código é o seguinte:
| Imports System.Diagnostics Module Module1 Sub Main() Dim proc As New Process() proc.StartInfo.FileName = "Notepad.exe" proc.StartInfo.Arguments = "c:\teste\clientes.txt" proc.EnableRaisingEvents = True AddHandler proc.Exited, AddressOf processoTerminou proc.Start() Console.ReadLine() End Sub Private Sub processoTerminou(ByVal sender As Object, ByVal e As EventArgs) Dim proc As Process = CType(sender, Process)         Console.WriteLine("Saiu " & proc.ExitCode)        Console.WriteLine("Terminou as : " & proc.ExitTime.ToString)Console.ReadLine() End Sub End Module 
 | 
Após criar o manipulador de eventos - processoTerminou() - para sabermos quando o evento foi disparado temos que incluir duas linhas de código antes de iniciar o processo. Devemos definir EnableRaisingEvents como True afim de permitir que evento dispare e precisamos incluir também o tratamento do evento Exited relacionando-o com a rotina - processoTerminou() - que criamos.
O resultado após encerrar o aplicativo será:

Se porventura ocorrer um erro devido ao aplicativo indicado não estar registrado no sistema , a classe Process fornece a janela padrão de erro. Para permitir esta funcionalidade você deve definir a propriedade ErrorDialog como True :
proc.StartInfo.ErrorDialog = True
Por hoje é só. Até o próximo artigo VB.NET
| Veja os 
    Destaques e novidades do SUPER DVD Visual Basic 
(sempre atualizado) : clique e confira ! Quer migrar para o VB .NET ? 
 Quer aprender C# ?? 
 | 
             Gostou ?
  Compartilhe no Facebook
Compartilhe no Facebook
  
 Compartilhe no Twitter
 
Compartilhe no Twitter
 
Referências: