Existem considerações especiais para um serviço do Windows enviar mensagens para o Windows do usuário?

StackOverflow https://stackoverflow.com/questions/615195

Pergunta

Eu tenho que escrever um aplicativo de serviço do Windows (sem GUI) que monitore um evento e, se ocorrer, enviará uma mensagem do Windows padrão para um aplicativo. O identificador do aplicativo será fornecido ao Serviço por uma DLL que é descarregada; portanto, uma mensagem do Windows é a maneira como desejamos usar.

A questão, porém, é se o serviço precisa fazer algo especial para usar o SendMessage no identificador da janela, já que pode estar em uma tela diferente ou algo no Vista. Isso é possível e, se sim, o que eu tenho que fazer, por favor?

Foi útil?

Solução

Isolamento de privilégios da interface do usuário (UIPI):

Microsoft Windows Vista e mais tarde. O envio de mensagens está sujeito ao isolamento de privilégios da interface do usuário (UIPI). O encadeamento de um processo pode enviar mensagens apenas para filas de mensagens de threads em processos de nível de integridade menor ou igual.

Fonte

Você pode ler sobre Isolamento de privilégios da interface do usuário (UIPI) aqui.

Para contornar isso, você pode definir o UiACESS como verdadeiro em seu arquivo de manifesto. Você também deve garantir que seu aplicativo seja assinado usando o Authenticode com um certificado de uma autoridade de assinatura como a Verisign. Isso pode ficar muito caro.


Isolamento da sessão 0:

Também acredito que você não pode chamar SendMessage nas sessões. Portanto, se você tiver um serviço em execução na sessão 0, precisará encontrar outro meio de se comunicar com o seu processo que estaria em execução em uma sessão> 0. Exemplo: via Pipe.

No Windows Vista, o Windows 2008 Server e posterior todos os serviços são executados na sessão 0, e em todos os aplicativos que você inicia na sessão> 0. Isso é chamado de isolamento da sessão 0. Aqui está um bom documento que tem Informações sobre o isolamento da sessão 0.

Se você não tiver acesso à fonte do programa para o qual deseja enviar mensagens, poderá contornar isso fazendo um aplicativo que se comunique com seu serviço e atua como proxy para transmitir a mensagem para o aplicativo em sua mesma sessão .


No geral:

Se você desenvolver seu aplicativo no pré-vista e funcionar bem. Existe um muito alto Chance, será quebrado no Vista.

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