Pergunta

Eu tenho um # aplicação c que é executado como um serviço do Windows controlar conexões de soquete e outras coisas. Além disso, há outra aplicação Windows Forms para controlar e configurar este serviço (systray com início, parada, forma show com parâmetros de configuração).

Eu estou usando Remoting para fazer o IPC e que estava bem, mas agora eu quero mostrar algum tráfego real e outros relatórios e comunicação remota não vai atender minhas necessidades de desempenho. Então, eu quero combinar as duas aplicações em um.

Aqui está o problema:

Quando eu comecei a forma do serviço de janelas, nada aconteceu. Pesquisando por aí que eu descobri que eu tenho que clicar o botão direito no serviço, vá até Log on e marque a opção "Permitir serviço para interagir com área de trabalho". Desde que eu não quero perguntar a meus usuários para fazer isso, eu tenho algum código pesquisando novamente para definir esta opção no regedit do usuário durante o tempo de instalação. O problema é que, mesmo definir esta opção, ele não funciona. Eu tenho que abrir as opções Log On do serviço (que está marcada), desmarque e verifique novamente.

Então, como resolver isso? Como é a melhor maneira de ter um serviço do Windows com um controle systray no mesmo processo, disponível para qualquer usuário fazer logon em?

UPDATE: Obrigado pelos comentários até agora, rapazes. Concordo que é melhor usar IPC e eu sei que é ruim para misturar os serviços do Windows e interfaces de usuário. Mesmo assim, eu quero saber como fazer isso.

Foi útil?

Solução

processos separados

Dois que se comunicam usando seu tecnologia de escolha. Serviços com UI é um má idéia . Não vá por este caminho -. Você vai se arrepender

Eu tive resultados muito bons com comunicação de serviço através de uma conexão de soquete simples -. Documentar o seu protocolo de serviço bem, mantê-lo o mais simples possível, e ele vai ser mais fácil do que você pensa

Outras dicas

Na prática, você não deve par seu serviço com a interface de gerenciamento.

Eu concordo com Greg. Talvez você possa examinar um mecanismo IPC diferente. Talvez usar soquetes e seu próprio protocolo. Ou, se o seu aplicativo de controle de serviço só pode controlar o serviço na máquina local, você pode usar pipes nomeados (ainda mais rápido).

Aqui está uma maneira misturar Serviços e Formulários

http://www.codeproject.com/KB/system/SystemTrayIconInSvc.aspx

Eu descobri como fazer isso a partir este artigo (clique no link "Change" na tabela de Métodos).

string wmiPath = "Win32_Service.Name='" + SERVICE_NAME + "'";
using (ManagementObject service = new ManagementObject(wmiPath))
{
    object[] parameters = new object[11];
    parameters[5] = true;  // Enable desktop interaction
    service.InvokeMethod("Change", parameters);
}

Eu tenho a solução em algumas etapas, este é o plano

  1. não estamos indo para criar um projeto de serviço com aa janelas formar, em vez disso, vamos criar uma solução visual studio que contém um projeto de serviço do Windows, um janelas formam projeto e um projeto de instalação.

  2. A idéia é ter um banco de dados ou um arquivo ou qualquer coisa que você está confortável com o armazenamento de dados em que você iria armazenar os parâmetros de seu serviço de janelas sempre usa para executar. Assim, suas janelas de serviço e suas janelas formulário de candidatura deve ser capaz de modificar e recuperar dados a partir dele.

  3. Para a principal forma de Seu arrastar Windows Application e soltar um NotifyIcon no formulário, na página de Propriedades, procure e selecione uma imagem Ico (Você pode sreate um no visual studio, mas isso é outro assunto que puder entrar no google ou contacte-me) que irá exibir na bandeja do sistema quando você executar o aplicativo e o formulário principal está ativo ou mostrado, experimentá-lo, execute o aplicativo.

  4. Adicionar ambos como saídas no projeto de instalação da solução. Para adicionar um projeto para um projeto de instalação devem estar na mesma solução. Botão direito do mouse o projeto de instalação no Solution Explorer, add destaque e selecione saída do projeto, adicionar o serviço de janelas e as janelas formam saídas e você vai vê-los no explorador solução no âmbito do projecto de instalação.

  5. adicionando um serviço de janelas vai mais longe do que isso, mas que também é outro tópico google it

  6. Criar atalho para o aplicativo do Windows e adicioná-lo para a pasta de inicialização também é outro tópico google ou contacte-me.

    NOTA Programa seu formulário de tal forma que o botão Fechar não mostra eo formulário vai Me.visible = clicar falso e duas vezes no ícone na bandeja do sistema é a única maneira de definir me.visible = true.that maneira sempre que o computador é iniciado, o Windows formam aplicativo também é iniciado e visível é imediatamente definida como falsa, mas uma vez que tem um NotifyIcon com uma imagem de ícone, ele irá mostrar na bandeja do sistema e clicando duas vezes ele faz a forma visível para editar o configurações que você está armazenando para o serviço, o serviço também é iniciado automaticamente desde que você teria configurá-lo na criação do serviço no projeto de instalação. meu e-mail é iamjavademon@gmail.com para uma ilustração melhor usar capturas de tela e explicar na íntegra

É muito simples - a sua necessidade para criar uma thread para executar eventos de aplicativo. Como este (o código fonte para C ++ com CLR, mas o seu pode fazer isso em C #):

ref class RunWindow{
public:
    static void MakeWindow(Object^ data)
    {
        Application::EnableVisualStyles();
        Application::SetCompatibleTextRenderingDefault(false); 

        Application::Run(gcnew TMainForm());
    };
};

E criar segmento no principal

int main(array<System::String ^> ^args)
{
    bool bService = RunAsService(L"SimpleServiceWithIconInTrayAndWindow");

    if (bService)
    {

        System::Threading::Thread ^thread = gcnew System::Threading::Thread(gcnew ParameterizedThreadStart(RunWindow::MakeWindow));
        thread->Start();

        ServiceBase::Run(gcnew simpleWinService());
        Application::Exit();
    }
    else
    {
        Application::EnableVisualStyles();
        Application::SetCompatibleTextRenderingDefault(false); 

        // Create the main window and run it
        Application::Run(gcnew TMainForm());
    }

    return 0;
}

Os principais problemas com serviços interativos são:

  • Segurança -. Outro processo poderia enviá-lo mensagens através de sua bomba de mensagem, ganhando assim acesso a um SISTEMA / processo LOCAL

  • A incompletude -. Um serviço interativo nunca vê mensagens de shell, portanto, não pode interagir com ícones da área de notificação

Nós usamos regularmente conexões TCP e UDP para passar informações de serviços para outros exes, e, em alguns casos, MSMQ.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top