Pergunta

Existem muitas soluções para restringir um aplicativo de execução duas vezes. Pesquisando por nome do processo, usando um mutex nomeado etc. Mas todos esses métodos não funcionam se quiser restringir meu aplicativo à sessão do shell.

Um usuário pode ter mais do que sessão de login e shell no Windows (certo?)? Se isso for verdade, eu quero poder executar uma instância do meu aplicativo em todas as sessões do shell, mas permita apenas uma.

Existe uma maneira de obter um identificador de shell que possa ser colocado no nome do Mutex?

Foi útil?

Solução

Você pode criar mutexes locais (somente sessão) ou global (sistema inteiro). Ver http://msdn.microsoft.com/en-us/library/system.threading.mutex.aspx para mais informações. Procure global e local.

Outras dicas

O identificador de shell que você deseja usar é o nome de usuário. Isso está disponível como Environment::UserName ou GetUserName()

Você pode ir do ID do processo do processo atual para um ID da sessão do WTS, acho que isso fará o que você precisa. ProcessidtosessionId

Você deve estar ciente de que uma sessão de serviços de terminal pode ser desconectada de uma área de trabalho e depois conectada por outra, para que o 'shell' possa realmente mudar, mas o ID da sessão deve permanecer o mesmo.

Se você deseja restringi -lo a uma instância por sessão de login, mesmo que a mesma conta de usuário tenha várias sessões de login em execução ao mesmo tempo (servidor/servidor de terminal), você pode usar o identificador de GetShellWindow Para verificar se já existe uma instância em execução para este desktop.

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