Usuário com melhor resposta
Iniciar aplicação sem abrir forms

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
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- Sugerido como Resposta AndreAlvesLimaModerator sexta-feira, 17 de dezembro de 2010 12:16
- Marcado como Resposta AndreAlvesLimaModerator quinta-feira, 13 de janeiro de 2011 11:38
-
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)- Sugerido como Resposta AndreAlvesLimaModerator sexta-feira, 17 de dezembro de 2010 12:16
- Marcado como Resposta AndreAlvesLimaModerator quinta-feira, 13 de janeiro de 2011 11:38
-
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)- Marcado como Resposta AndreAlvesLimaModerator quinta-feira, 13 de janeiro de 2011 11:38
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- Sugerido como Resposta AndreAlvesLimaModerator sexta-feira, 17 de dezembro de 2010 12:16
- Marcado como Resposta AndreAlvesLimaModerator quinta-feira, 13 de janeiro de 2011 11:38
-
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)- Sugerido como Resposta AndreAlvesLimaModerator sexta-feira, 17 de dezembro de 2010 12:16
- Marcado como Resposta AndreAlvesLimaModerator quinta-feira, 13 de janeiro de 2011 11:38
-
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.
-
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)- Marcado como Resposta AndreAlvesLimaModerator quinta-feira, 13 de janeiro de 2011 11:38