application GUI donné naissance à partir d'un service LocalSystem (via CreateProcessAsUser) n'a pas le focus

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

Question

J'ai créé un service qui affiche une sorte d'écran de démarrage sur le bureau d'un utilisateur spécifique et uniquement lorsque l'utilisateur est connecté (utilisateur kiosque).

Cet écran de démarrage, une fois entré un code valide, dira que le service et le service va dormir pour un montant x de temps (en fonction du code).

L'écran d'accueil se ferme tout simplement. Maintenant, lorsque le service se réveille, il voit que le démarrage est pas commencer plus longtemps et donc vers le haut.

Ce que tout fonctionne, le seul problème est que l'application lancée n'a pas le focus, à savoir si je travaille dans le bloc-notes et le temps est écoulé, l'écran de démarrage est affiché (plein écran bien) derrière le bloc-notes.

Je ne à vous soucier de Windows Vista, je suis codage en Python en utilisant les extensions win32 mais je crois que ce problème réside dans CreateProcessAsUser lorsqu'il est appelé à partir du compte LocalSystem.


Mise à jour:

Le « problème » est en fait une sur la limitation des finalités pour empêcher des applications « irritants » comme la mienne de voler le focus.

Vous pouvez modifier le comportement en définissant: win32gui.SystemParametersInfo (win32con.SPI_SETFOREGROUNDLOCKTIMEOUT, 0, 0) ce qui équivaut à la mise temporairement la valeur de Registre: HKEY_CURRENT_USER \ Control Panel \ Desktop \ ForegroundLockTimeout Cela doit être fait que l'utilisateur lui-même, donc soit construire dans l'application que vous lancez ou construire une aide de lancement pour l'application que vous voulez lancer.

Cependant, une application peut vouloir empêcher l'obtenir Concentrons volée en utilisant un certain appel API que je ne me souviens pas en ce moment.

Une bonne solution serait sans doute de trouver toutes les poignées de fenêtre actuellement de cet utilisateur, puis utiliser chacune de ces poignées pour utiliser win32gui.ShowWindow (poignée, commande) pour le minimiser.

Bien que ce problème particulier définissant le paramètre locktimeout était suffisant.

Si quelqu'un se demande comment j'ai réussi à lancer une application sur un ordinateur de bureau d'un service, voici une lien vers code.

Était-ce utile?

La solution 2

Pour diverses raisons très légitimés, Microsoft verrait plutôt pas un service de lancer une application et voler le focus, mais je trouve les travaux suivants autour d'accomplir encore ce que je veux.

L'original l'intention est d'avoir un kiosque comme l'application entravée par un code d'accès comme écran de démarrage, qui, lors de la saisie d'un code de 8 caractères ferme l'écran de démarrage pour une période de temps comme dans le code de passe défini. A l'origine de l'application réelle à l'utilisation a été lancée par le dossier de démarrage automatique.

Cependant, je maintenant récrire qu'il est lancé à partir de mon service, de cette façon, je peux cacher l'application en lançant une application d'aide du service qui cache tout le programme et lance l'écran de démarrage, à la sortie de l'écran de démarrage du programme est retour à l'état précédent.

Autres conseils

Avez-vous essayé de lancer un autre processus que votre propre du service pour voir si elle obtient le focus? Comme le bloc-notes et voir si elle vole focus de votre navigateur? Si oui peut-être son programme qui peut reprendre le focus au démarrage.

Je beilive sinon il est l'attribut wShowWindow du STARTUPINFO struct points à lpStartupInfo qui devrait le contrôler. Vous devez également STARTF_USESHOWWINDOW à dwFlags utiliser nShowWindow. Les valeurs doivent être SW_SHOW je pense, ils sont répertoriés pour la fonction ShowWindow si vous voulez essayer d'autres.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top