none
Serviço do Windows para manter Programa aberto RRS feed

  • Pergunta

  • Boa tarde a todos...

    Recentemente comecei a programar em C# e estou tendo algumas dificuldades para criar um Serviço do Windows que funcione.

    Vou explicar: 
    Preciso criar um serviço que verifique a cada 10 segundos se um Programa está ou não sendo executado. Senão estiver, o próprio serviço irá abri-lo. Isso por que quero impedir que um usuário encerre o processo em execução desse programa.

    É aí que vem o problema:
    Consegui fazer esse serviço, mas acontece que quando ele abre esse programa que eu quero, o programa é executado em segundo plano, e não consigo utilizar as suas funções.

    Gostaria de saber se alguém pode me ajudar a solucionar esse problema.

    Desde já agradeço.

    segunda-feira, 8 de junho de 2015 16:02

Respostas

  • Você vai precisar usar um Sleep antes de chamar a bat devido a velocidade do programa

    Thread.Sleep(2000);
    //Namespaces necessarios
    using System.IO;
    using System.Threading;
    
    private void EscreveArquivo()
    {
    
          //Declaração do método StreamWriter passando o caminho e nome do arquivo que deve ser salvo
          StreamWriter writer = new StreamWriter(@"c:\suaBat.bat");
    
          //Escrevendo o Arquivo e pulando uma linha
          writer.WriteLine("linha1");
         //Escrevendo o Arquivo sem pular linha
    
          writer.Write("Linha2");
    
          writer.WriteLine();
          writer.WriteLine("Linha3");
    
          //Fechando o arquivo
          writer.Close();
    
         //Limpando a referencia dele da memória
         writer.Dispose();
        // Sleep para o programa não chamar a bat antes de ela ter cido criada 
         Thread.Sleep(2000);
         //Executando sua bat
         process.start(@"c:\suaBat.bat")
    }


    terça-feira, 9 de junho de 2015 18:16

Todas as Respostas

  • Como assim em segundo plano?

    Posta o código mais um print do problema.

    segunda-feira, 8 de junho de 2015 16:28
  • Esse é o código:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Diagnostics;
    using System.Linq;
    using System.ServiceProcess;
    using System.Text;
    using System.IO;
    using System.Threading;


    namespace dvmc
    {
        public partial class Service1 : ServiceBase
        {
            Timer timer1;

            public Service1()
            {
                InitializeComponent();
            }

            protected override void OnStart(string[] args)
            {
                timer1 = new Timer(new TimerCallback(timer1_Tick), null, 100, 5000);
            }

            protected override void OnStop()
            {
            }

            private void timer1_Tick(object sender)
            {
                Process.Start(@"C:\Arquivos de programas\Meu Programa\programa.exe");
            }
        }
    }



    Não estou conseguinte anexar um Print.

    Mas não existe erro de execução, o Programa abre mas não consigo usá-lo.

    Uma coisa que eu percebi, é que quando o meu Serviço abre o meu Programa, ele abre como usuário "SISTEMA" e não com o usuário local, por exemplo "PC-LUIZ"
    • Marcado como Resposta Lfgomes segunda-feira, 8 de junho de 2015 17:41
    • Não Marcado como Resposta Lfgomes terça-feira, 9 de junho de 2015 13:50
    segunda-feira, 8 de junho de 2015 17:41
  • Já tentou criar uma batch executando o seu programa para ver com qual usuário ele vai iniciar?
    segunda-feira, 8 de junho de 2015 19:19
  • Oi Helder...

    Você diz um Arquivo.bat ???

    Se sim ele inicia com o usuário que está logado. Até mesmo se eu executar direto no Programa ele inicia com o usuário logado.

    Meus primeiros testes foram usando arquivos Bat... mas aí descobriram onde eu deixava ele pra executar e estavam apagando o arquivo.

    Por isso passei a idéia para um Serviço do Windows... Pq assim eu posso protege-lo dos usuários...

    segunda-feira, 8 de junho de 2015 19:38
  • Lfgomes, boa tarde!

    Eu fiquei curioso de como solucionar isso, eu no momento nao tenho o Visual Studio instalado aqui.

    Fiz uma pesquisa e achei essa solução:


    http://weblogs.asp.net/avnerk/setting-windows-service-account-c-and-wmi

    Veja se é possivel aplicar ela.

    Caso não, pensei em outra solução:


    Você poderia escrever sua bat usando programação, salvar sua bat em um lugar especifico e logos depois o executa-la.


    private void EscreveArquivo()
    {
    
          //Declaração do método StreamWriter passando o caminho e nome do arquivo que deve ser salvo
          StreamWriter writer = new StreamWriter(@"c:\suaBat.bat");
    
          //Escrevendo o Arquivo e pulando uma linha
          writer.WriteLine("linha1");
         //Escrevendo o Arquivo sem pular linha
    
          writer.Write("Linha2");
    
          writer.WriteLine();
          writer.WriteLine("Linha3");
    
          //Fechando o arquivo
          writer.Close();
    
         //Limpando a referencia dele da memória
         writer.Dispose();
         process.start(@"c:\suaBat.bat")
    }



    é possiver executar a Batch sem aparecer nada na tela.

    terça-feira, 9 de junho de 2015 16:46
  • Obrigado pela ajuda Helder...

    A sua primeira sugestão eu fiquei um pouco confuso sem saber como aplicar ao meu projeto, como eu disse, estou só começando agora em C#.

    Vou testar fazer da segunda opção que você sugeriu, se der certo eu posto o resultado.

    Obrigado mais uma vez.

    terça-feira, 9 de junho de 2015 18:09
  • Você vai precisar usar um Sleep antes de chamar a bat devido a velocidade do programa

    Thread.Sleep(2000);
    //Namespaces necessarios
    using System.IO;
    using System.Threading;
    
    private void EscreveArquivo()
    {
    
          //Declaração do método StreamWriter passando o caminho e nome do arquivo que deve ser salvo
          StreamWriter writer = new StreamWriter(@"c:\suaBat.bat");
    
          //Escrevendo o Arquivo e pulando uma linha
          writer.WriteLine("linha1");
         //Escrevendo o Arquivo sem pular linha
    
          writer.Write("Linha2");
    
          writer.WriteLine();
          writer.WriteLine("Linha3");
    
          //Fechando o arquivo
          writer.Close();
    
         //Limpando a referencia dele da memória
         writer.Dispose();
        // Sleep para o programa não chamar a bat antes de ela ter cido criada 
         Thread.Sleep(2000);
         //Executando sua bat
         process.start(@"c:\suaBat.bat")
    }


    terça-feira, 9 de junho de 2015 18:16
  • Helder...

    você teria um skype que eu possa te adicionar para tirar algumas dúvidas e mandar os meus Prints ??

    terça-feira, 9 de junho de 2015 18:31