Pergunta

Eu criei um serviço que exibem uma espécie de tela de abertura na área de trabalho de um usuário específico e somente quando o usuário está logado (usuário quiosque).

Essa tela inicial, uma vez introduzido um código válido, dirá que, para o serviço eo serviço vai para dormir por uma quantidade x de tempo (dependendo do código).

A tela simplesmente sai. Agora, quando o serviço acorda vê que o splash não está mais lá e assim por iniciá-lo.

Isso tudo está funcionando, o único problema é que o aplicativo lançado não tem foco, ou seja, se eu estou trabalhando no bloco de notas e o tempo está acima, a tela inicial é exibida (tela cheia embora) por trás do bloco de notas.

Eu só precisa se preocupar com o Windows Vista, estou codificação em Python usando extensões win32 mas acredito que este problema reside na CreateProcessAsUser quando chamado a partir da conta do sistema local.


Update:

O 'problema' é na verdade uma sobre limitação da finalidade para evitar 'irritante' aplicações como o meu de roubar foco.

Você pode alterar o comportamento por configuração: win32gui.SystemParametersInfo (win32con.SPI_SETFOREGROUNDLOCKTIMEOUT, 0, 0) o que equivale na definição temporariamente o valor do Registro: HKEY_CURRENT_USER \ Control Panel \ Desktop \ ForegroundLockTimeout Isso deve ser feito como o próprio utilizador, por isso ou construí-lo no aplicativo que você está lançando ou construir um auxiliar de lançamento para o aplicativo que você deseja iniciar.

No entanto, um aplicativo pode querer evitar que começá-lo do foco roubado usando alguns chamam de API que não me lembro agora.

A provavelmente boa solução seria encontrar todos os identificadores de janela actualmente desse usuário e, em seguida, usar cada uma dessas alças para usar win32gui.ShowWindow (punho, comando) para minimizá-lo.

Embora para esse problema específico definindo a configuração locktimeout era suficiente.

Se alguém perguntar como eu consegui lançar um aplicativo para uma área de trabalho de um serviço, aqui é um link para o código .

Foi útil?

Solução 2

Por várias razões muito legitimadas, a Microsoft prefere não ver um serviço de lançar um aplicativo e roubar o foco, no entanto, achamos o seguinte trabalho em torno de ainda conseguir o que eu quero.

O original intenção é ter um quiosque como a aplicação prejudicado por um código de acesso, como tela de abertura, que ao entrar um código de 8 caracteres fecha a tela inicial para um período de tempo como no código de passagem definido. Originalmente, a aplicação real de uso foi iniciado pela pasta autostart.

No entanto agora eu reescrevi que é lançado do meu serviço, desta forma eu posso ocultar o aplicativo com o lançamento de um aplicativo de ajuda do serviço que apenas esconde o programa e lançamentos a tela inicial, ao sair a tela inicial do programa é voltou ao estado anterior.

Outras dicas

Você já tentou lançar mais processos do que o seu próprio a partir do serviço para ver se ele recebe foco? Como o bloco de notas e ver se ele rouba o foco do seu navegador? Se assim for, talvez, seu programa que podem ter de volta o foco quando é iniciado.

I outra forma beilive é o atributo wShowWindow do STARTUPINFO struct os pontos lpStartupInfo a que deve controlá-lo. Você também precisa STARTF_USESHOWWINDOW em dwFlags para usar nShowWindow. Os valores devem ser SW_SHOW eu penso, eles são coletados para a função ShowWindow se você quiser tentar outra.

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