2010-08-23 7 views
2

Je dois effectuer la vérification dans une méthode contenue dans une bibliothèque partagée référencée par une application Windows Forms et un service Windows. Lorsque nous faisons le check-in en mode console, je dois autoriser les boîtes de dialogue potentielles. Dans le cas du service Windows, je vais écrire des messages dans le journal des événements à la place.Est-il possible de détecter si le thread d'application principal s'exécute en tant que service Windows sans utiliser de directive de compilation?

J'ai trouvé plusieurs façons de le faire en utilisant des directives de compilation. Y a-t-il une méthode différente et plus élégante?

Merci

Répondre

3

Vous pouvez vérifier Environment.UserInteractive propriété qui renvoie false si votre application est en cours d'exécution en tant que service Windows.

+2

Va-t-il également afficher la valeur false lorsque l'option "Autoriser le service à interagir avec le bureau" est cochée? –

+0

@Pierre 303: 'Environment.UserInteractive' retournera' true' si "Autoriser le service à interagir avec le bureau" est cochée. –

+0

@Pierre 303. Comme l'a indiqué 0xA3, Environment.UserInteractive renvoie true si le service est défini sur "Autoriser le service à interagir avec le bureau". Si vous devez prendre en charge l'interaction avec le bureau tout en limitant l'affichage de vos journaux dans l'interface utilisateur, vous devriez probablement utiliser quelque chose dans le sens de la solution proposée par 0xA3. –

1

Oui, c'est. Lors de l'exécution, vous pouvez vérifier si le parent du processus est services.exe ou si le processus en cours est svchost.exe. Vous pouvez également interroger le gestionnaire de contrôle de service à l'aide de WinApi si votre service est démarré et si l'ID de processus actuel est égal à celui du service démarré.

Cette réponse a quelques exemples de code en C#:

How do we tell if a C++ application is launched as a Windows service?