2009-10-28 4 views
0

Je cherche à montrer une forme d'un service sur Vista (en utilisant WinForms .NET)Services Vista: Peut afficher un formulaire sur un bureau invisible?

Il est évident que la forme ne serait pas montrer à l'utilisateur de la console, que les services sont isolés dans la session 0.

Cependant l'expérience est de voir s'il est possible de "montrer" une forme invisible et d'obtenir un handle de fenêtre & boucle de message

J'ai essayé mais quand j'émets form.Show(), seul l'événement formulaire.Load ne déclenche pas .Shown ou .FormClosing

Y at-il un moyen de capturer windo ws messages de cette manière comme une application utilisateur serait?

Je n'ai pas essayé de rendre le service 'interactif' car je ne souhaite pas interagir avec l'utilisateur connecté.

Répondre

0

Oui, vous pouvez afficher un formulaire sur le bureau d'un service. Il ne sera pas montré à un utilisateur connecté, en fait dans Vista et les systèmes d'exploitation ultérieurs vous ne pouvez pas le montrer à un utilisateur même si vous définissez le service sur 'interactif'. Comme le bureau n'est pas interactif, les messages Windows reçus par le formulaire seront légèrement différents, mais la grande majorité des événements devraient être déclenchés de la même manière dans un service que sur un bureau interactif (j'ai juste fait un test rapide et obtenu le formulaire charger, afficher, activer et fermer les événements). Une chose à retenir est que pour afficher un formulaire, votre thread doit être un thread STA et une boucle de message doit être créée, en appelant ShowDialog ou Applicaton.Run. De même, rappelez-vous que toute interaction externe avec le formulaire doit être marshalée dans le thread approprié en utilisant Invoke ou BeginInvoke sur l'instance de formulaire.

Ceci est certainement très faisable mais n'est vraiment pas recommandé du tout. Vous devez absolument être sûr que le formulaire et tous les composants qu'il contient n'affichent aucune interface utilisateur inattendue, telle qu'une boîte de message, en aucune circonstance. La seule fois où cette méthode peut vraiment être justifiée est lorsque vous travaillez avec un héritage de qualité douteuse ou un outil tiers qui nécessite la création d'un handle pour fonctionner correctement.

+0

Un grand merci. Comment avez-vous commencé le formulaire dans votre test? J'ai essayé ShowDialog() mais j'ai obtenu >> 'System.InvalidOperationException' L'affichage d'une boîte de dialogue modale ou d'un formulaire lorsque l'application n'est pas en cours d'exécution en mode UserInteractive n'est pas une opération valide. Spécifiez le style ServiceNotification ou DefaultDesktopOnly pour afficher une notification d'une application de service. << Je veux afficher cette fenêtre (cachée) et obtenir des messages pour tenter de gérer WM_QUERYENDSESSION dans le service lorsque le système est en cours d'arrêt - dans une tentative d'annuler shutdown en conjonction avec ShutdownBlockReasonCreate –

+0

J'ai utilisé Application.Run dans mon test et cela fonctionne bien. ShowDialog avait l'habitude de fonctionner correctement mais apparemment ils ont ajouté une vérification dans le framework 2.0 pour l'interdire. Personnellement, je pense qu'annuler la fermeture d'un service n'est pas une très bonne idée, mais si vous voulez vraiment faire cela, cela devrait fonctionner. Appelez simplement Application.Run (myFormInstance) au lieu de myFormInstance.ShowDialog. –

Questions connexes