A maneira correta de fazer isso é ter o aplicativo executado como um serviço ou como outro usuário e, em seguida, enviar janelas para a área de trabalho (infantil) do usuário. Consulte o MSDN página sobre serviços interativos ; embora os serviços não possam mais ser executados de forma interativa, eles ainda podem interagir indiretamente com os usuários, incluindo os usuários que estão sendo executados em contas diferentes. A função WTSSendMessage
pode ser usada para mostre uma caixa de mensagem em uma sessão atualmente conectada, ou seu processo pode usar CreateProcessAsUser
(se tiver acesso) para criar um processo na sessão do usuário com o qual possa interagir (embora o processo pai ainda possa criar arquivos de log que não podem ser excluídos pelo usuário, etc.).
EDIT: Um processo não precisa estar sendo executado como um serviço para usar essas funções. Eles são úteis para serviços, mas também para qualquer outro processo que seja executado (não interativamente) como outro usuário.