none
Iniciar aplicação sem abrir forms RRS feed

  • Pergunta

  • Olá pessoal!

    Preciso fazer um projeto de monitoramento de serviços do windows, para isso achei várias referências na internet de como fazer isso e a que eu utilizarei implementa a classe ServiceController e se utiliza de um NotifyIcon como uma interface ao usuário, dando controle do serviço pelo Systray.

    Eu já cheguei a utilizar o NotifyIcon numa aplicação Windows Form, mas para um serviço do windows a grande maioria das referências que eu encontrei aconselha a ser criado uma nova aplicação para monitorar os serviços que eu desejar. É neste ponto que mora o meu problema: até onde eu entendi, devo fazer uma aplicação Windows Form, mas eu não quero abrir nenhum form ao iniciá-la, só quero instanciar meu icone no Systray e, aí sim através dele, monitorar o serviço, abrir janelas ou seja lá o que for.

    Alguém aí sabe se numa aplicação Windows Form existe a possibilidade de, ao iniciá-la, não abrir nenhum form? Ou eu devo criar algum outro tipo de Aplicação?

    Segue o link com um modelo do que eu quero fazer:

     

    http://social.msdn.microsoft.com/forums/pt-br/504/thread/14FC91C1-6A0D-4105-B89C-A53F98325D14

    quinta-feira, 16 de dezembro de 2010 15:18

Respostas

  • Filipe,

    No arquivo Program.cs (se estiver utilizando C#) você tem o comportamento que a sua aplicação Windows Forms vai ter ao ser iniciada... O padrão é que essa classe Program tenha a última linha do método main abrindo um Form... Se você não quiser esse comportamento é só editar essa parte do código, removendo a parte em que um form é instanciado e exibido e colocando o código que desejar (no seu caso, a criação do seu NotifyIcon e demais ações que desejar)...


    André Alves de Lima
    Visite o meu site: http://www.andrealveslima.com.br
    Me siga no Twitter: @andrealveslima
    quinta-feira, 16 de dezembro de 2010 22:17
    Moderador
  • Filipe,

    Complementando o que o André disse, o ideal é você inicializar a sua aplicação usando um ApplicationContext, assim você não precisa fazer o controle de loop enquanto a sua aplicação estiver em execução.

    Usando o ApplicationContext, ao invés de passar um Form para o método Application.Run, você passa uma classe herdada de ApplicationContext e pode fazer todo o tratamento da execução da sua aplicação sem um form.

    Veja:

    http://msdn.microsoft.com/en-us/library/system.windows.forms.applicationcontext.aspx

    at.,


    Rogério de Resende Ohashi | Ohashi.NET (.NET, Security, C#, WinForms, WCF, Workflow, Azure, Windows Phone, Mono)
    sexta-feira, 17 de dezembro de 2010 12:14
    Moderador
  • Filipe,

    Não tem erro, veja um exemplo:

     static class Program
     {
      /// <summary>
      /// The main entry point for the application.
      /// </summary>
      [STAThread]
      static void Main()
      {
       Application.EnableVisualStyles();
       Application.SetCompatibleTextRenderingDefault(false);
       Application.Run(new MyAppContext());
      }
     }
    
     public class MyAppContext : ApplicationContext
     {
      public MyAppContext()
      {
       // cria o form principal...
       Form1 mainForm = new Form1();
      }
     }
    

    Neste caso ele simplesmente instancia o seu form com o notify icon, sem mostra-lo.

    Lembrando que para terminar a aplicação, você deverá fazer uma chamada ao método Application.Exit()

    at.,


    Rogério de Resende Ohashi | Ohashi.NET (.NET, Security, C#, WinForms, WCF, Workflow, Azure, Windows Phone, Mono)
    sexta-feira, 17 de dezembro de 2010 19:03
    Moderador

Todas as Respostas

  • Filipe,

    No arquivo Program.cs (se estiver utilizando C#) você tem o comportamento que a sua aplicação Windows Forms vai ter ao ser iniciada... O padrão é que essa classe Program tenha a última linha do método main abrindo um Form... Se você não quiser esse comportamento é só editar essa parte do código, removendo a parte em que um form é instanciado e exibido e colocando o código que desejar (no seu caso, a criação do seu NotifyIcon e demais ações que desejar)...


    André Alves de Lima
    Visite o meu site: http://www.andrealveslima.com.br
    Me siga no Twitter: @andrealveslima
    quinta-feira, 16 de dezembro de 2010 22:17
    Moderador
  • Filipe,

    Complementando o que o André disse, o ideal é você inicializar a sua aplicação usando um ApplicationContext, assim você não precisa fazer o controle de loop enquanto a sua aplicação estiver em execução.

    Usando o ApplicationContext, ao invés de passar um Form para o método Application.Run, você passa uma classe herdada de ApplicationContext e pode fazer todo o tratamento da execução da sua aplicação sem um form.

    Veja:

    http://msdn.microsoft.com/en-us/library/system.windows.forms.applicationcontext.aspx

    at.,


    Rogério de Resende Ohashi | Ohashi.NET (.NET, Security, C#, WinForms, WCF, Workflow, Azure, Windows Phone, Mono)
    sexta-feira, 17 de dezembro de 2010 12:14
    Moderador
  • Então galera, fiz funcionar o icone.

    André, não consegui me safar da instancia do Form pois a classe para o NotifyIcon extende a classe Form, mas consegui implementando este metodo:

    protected override void OnLoad(EventArgs e)
            {
                Visible = false;
                ShowInTaskbar = false;

                base.OnLoad(e);
            }

     

    Rogério, não entendi muito bem como funciona a ApplicationContext, tentei trabalhar com ela mas comigo não funcionou, assim como com Application.Run(), com ambas o icone simplesmente não aparece no Systray sei lá por que, mas debugando o projeto windows form o icone aparece, assim como qnd iniciado pelo executável da pasta bin, mas aí outro problema me apareceu agora, cujo estou tentando resolver: Quando eu tento manipular o serviço pelo icone chamando seus eventos ele dispara uma exception de acesso negado. To garimpando aqui pra tentar descobrir.

    Obrigado pela força.

    sexta-feira, 17 de dezembro de 2010 18:48
  • Filipe,

    Não tem erro, veja um exemplo:

     static class Program
     {
      /// <summary>
      /// The main entry point for the application.
      /// </summary>
      [STAThread]
      static void Main()
      {
       Application.EnableVisualStyles();
       Application.SetCompatibleTextRenderingDefault(false);
       Application.Run(new MyAppContext());
      }
     }
    
     public class MyAppContext : ApplicationContext
     {
      public MyAppContext()
      {
       // cria o form principal...
       Form1 mainForm = new Form1();
      }
     }
    

    Neste caso ele simplesmente instancia o seu form com o notify icon, sem mostra-lo.

    Lembrando que para terminar a aplicação, você deverá fazer uma chamada ao método Application.Exit()

    at.,


    Rogério de Resende Ohashi | Ohashi.NET (.NET, Security, C#, WinForms, WCF, Workflow, Azure, Windows Phone, Mono)
    sexta-feira, 17 de dezembro de 2010 19:03
    Moderador