GUI aplicativo gerado de um serviço LocalSystem (via CreateProcessAsUser) não tem foco
-
21-08-2019 - |
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 .
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.