none
[RESOLVIDO] Identificar programa em execução via código C# RRS feed

  • Pergunta

  • Bom dia...

    Sou iniciante em programação, estou criando um projeto e encontrei uma duvida de como identificar um processo .exe que esta sendo executado no S.O Windows.

    Para Ser mais especifico:

    Gostaria de detectar esse processo (Arquivo.exe) e enviar comando (this.Close(); ao fechar o (Arquivo.exe) .

    Abaixo segue codigo C# que fiz até o momento, e  as linhas em negrito são aonde esta apresentando o ERRO.

    using System;
    using System.IO;
    using System.Windows.Forms;
    using System.Diagnostics;
    using System.IO.Compression;
    using System.Threading;

    namespace zipFile
    {
        public partial class Form1 : Form
        {
            //string para extrair arquivos
            string ExtrairArquivosPara = @"C:\Windows\Temp\Meu_Arquivo";
            string CaminhoZip = @"C:\Windows\Temp\Meu_Arquivo\Arquivo.zip";

            public Form1()
            {
                InitializeComponent();

                //Deixar form Transparente

                TransparencyKey = (BackColor);
            }
            private void Form1_Paint(object sender, PaintEventArgs e)
            {


                //Criar Pasta no S.O
                DirectoryInfo raiz = new DirectoryInfo(@"C:\\Windows\\Temp");
                raiz.CreateSubdirectory("Meu_Arquivo");

                //Extrair arquivos da Pasta Resources
                byte[] myfile = Properties.Resources.CClear;
                File.WriteAllBytes("C:\\Windows\\Temp\\Meu_Arquivo\\Arquivo.zip", myfile);

                //extrair arquivos
                ZipFile.ExtractToDirectory(CaminhoZip, ExtrairArquivosPara);

                //Executar arquivos
                ProcessStartInfo pInfo = new ProcessStartInfo();
                pInfo.FileName = @"C:\\Windows\\Temp\\Meu_Arquivo\\Arquivo\\Arquivo.exe";
                Process p = Process.Start(pInfo);

                this.Hide();               

    {
                    if (!p.HasExited) //aqui a intenção seria de quando o processo (Arquivo.exe) for encerrado, ele feche  a Form1
                    this.Close();
            } 



            private void Form1_FormClosed(object sender, FormClosedEventArgs e)
            {
                //deletar pasta se ela existir
                Directory.Delete(@"C:\\Windows\\Temp\\Meu_Arquivo", true);
                Application.Exit();
                System.Environment.Exit(0);
            }
        }
    }


    • Editado 1v4n Lop35 segunda-feira, 20 de março de 2017 14:33
    quarta-feira, 15 de março de 2017 06:04

Respostas

  • Olá Ivan,

    Olhando o  seu código,  poderia ser assim (seguindo o que o Artur comentou também):

    Após chamar o Process.Start(pInfo);

    p.EnableRaisingEvents = true; p.Exited += new EventHandler(p_Exited);

    E adicione o método abaixo no seu form:

    void p_Exited(object sender, EventArgs e)
    {
      this.Close();
    }


    Fabio Rosa.

    quarta-feira, 15 de março de 2017 16:47

Todas as Respostas

  • Olá!

    Você pode identificar se um aplicativo / processo está rodando com o comando abaixo:

    Process[] pname = Process.GetProcessesByName("Arquivo.exe");
    if (pname.Length == 0)
      //Não está executando
    else
      //Está Executando

    Para monitorar quando o processo é fechado, é preciso criar um delegate:

    var p = pname[0];
    p.Exited += new EventHandler(p_Exited);
    
    
    void p_Exited(object sender, EventArgs e)
    {
        //Processo terminado. Aqui você faz a sua ação.
    }

    Att,



    Fabio Rosa.

    quarta-feira, 15 de março de 2017 10:24
  • Olá, Ivan.

    Utilize o retorno do Process.Start para criar um delegate, por exemplo:

    ...

    Process p = Process.Start(pInfo);
    p.EnableRaisingEvents = true;
    p.Exited += P_Exited;
    
    private static void P_Exited(object sender, EventArgs e)
    {
        Environment.Exit(0);
    }

    Para retornar o processo necessário, você pode usar o comando: Process.GetProcessById(p.Id) //Id (PID) do processo.

    Att, Artur.

    quarta-feira, 15 de março de 2017 12:41

  • Bom dia Fábio

    Desde já agradeço sua atenção...

    Como mencionei anteriormente sou iniciante, e para mim infelizmente não ficou muito claro, de como posso adicionar o exemplo que você forneceu, no código que deixei na descrição.

    Sendo Assim como ficaria seu exemplo no código descrito?     

    quarta-feira, 15 de março de 2017 12:52
  • Ola Artur 

    Boa Tarde,

    Como seria esse processo no código acima mencionado, estou a horas tentando varias possibilidades e não cheguei a nenhuma conclusão.

    Desde já peço perdão a todos mas como citei sou iniciante em programação.


    quarta-feira, 15 de março de 2017 15:07
  • Olá Ivan,

    Olhando o  seu código,  poderia ser assim (seguindo o que o Artur comentou também):

    Após chamar o Process.Start(pInfo);

    p.EnableRaisingEvents = true; p.Exited += new EventHandler(p_Exited);

    E adicione o método abaixo no seu form:

    void p_Exited(object sender, EventArgs e)
    {
      this.Close();
    }


    Fabio Rosa.

    quarta-feira, 15 de março de 2017 16:47