9
votes

Envoyer le message Windows à un service Windows

Y a-t-il un outil pour envoyer (MIMIC) un message Windows comme 'wm_endsession' à un service Windows?

ou

Comment puis-je envoyer un message Windows à un processus à l'aide de C #?

(Je ne sais que c #)

Edit: Objectif: Fondamentalement, je dois déboguer un service Windows pour la correction d'un bogue qui se produit uniquement sur le système fermé.


1 commentaires

Je pense qu'il appartient à Stackoverflow.com


7 Réponses :


0
votes

Je ne pense pas qu'il y ait un outil pour envoyer des messages arbitraires parce que chaque message peut avoir des valeurs de LParam et WParam arbitraires.

Mais l'outil le plus utile entourant les messages Windows est Spy ++. Spy ++ est incluse avec Visual Studio et il vous aide à voir quels messages sont envoyés, hiérarchie de la fenêtre et plus.

Vous pouvez envoyer des messages via C # avec le SendMessage Win32 API. Vous pouvez obtenir la poignée de la fenêtre qu'il demande en utilisant une API Win32 comme FindWindow ou Findwindowex .

Edit (pour correspondre à la modification de la question): les services sont arrêtés automatiquement par Windows lors de l'arrêt. Donc, pour corriger votre bogue, il semble que vous devez modifier le code du service lui-même pour éteindre correctement.

Edit2: Ou si vous souhaitez arrêter le service, vous devez utiliser l'API Win32 ControlService passant dans Service_Control_stop 0x00000001 .


2 commentaires

Mais je dois envoyer un message à un processus qui fonctionne comme service Windows? Comment Trouvewindow travaille-t-il dans ce cas?


Le service devrait avoir une fenêtre dans la première place ou la file d'attente de messages pour pouvoir envoyer des messages informatiques. Et en fonction des paramètres Vista, vous ne pourrez peut-être pas envoyer le message à un service qui fonctionne dans une autre session. Si vous avez le contrôle du service une meilleure option serait des tuyaux.



2
votes

Si vous avez le HWND d'une fenêtre, vous pouvez envoyer des messages IT. La seule limitation est que vous ne pouvez pas envoyer de messages contenant des pointeurs comme le texte de la fenêtre de configuration.
Appelez simplement postmessage () avec la valeur du HWND et le message que vous souhaitez envoyer.
Pour trouver le HWND, vous pouvez utiliser SPY ++.

Je ne sais pas comment vous connectez tout cela à Windows Services puisque Windows Services n'a pas de fenêtres.


0 commentaires

1
votes

Je recommanderais d'importer et de définir ce qui suit: xxx

puis envoyez via 0x1 ou 0x0 représentant true ou false comme le message WPARAM.

donc dans votre code Utilisera: xxx

où handletosendto est la poignée de la fenêtre de la fenêtre que vous souhaitez envoyer le message à.

Modifier
Pour obtenir la poignée de Windows si vous ne le savez pas, je suppose que vous saurez que c'est le titre ou le nom. Si oui, vous pouvez utiliser ceci: xxx

Quelle plus d'informations sur peuvent être trouvées dans cette question.

ou peut-être

Je ne sais pas S'il s'agit d'une poignée similaire, j'en doute, mais quelqu'un pouvait me faire savoir si c'est le cas, mais vous pouvez obtenir un processus de processus, ce qui signifie que vous pouvez obtenir le processus à l'aide de processus.getProcessesbyname ("myappname"); Si je ne pense pas que cela aura la poignée que vous allez après. Juste une suggestion.


0 commentaires

12
votes

Les services doivent être contrôlés à l'aide de Classe ServiceController

représente un service Windows et vous permet de vous connecter à un service en cours d'exécution ou à arrêter, de le manipuler ou d'obtenir des informations à ce sujet.

Vous pouvez l'utiliser pour démarrer, arrêter et communiquer avec des services en utilisant cette classe.


0 commentaires

4
votes

En règle générale, les services n'ont pas de fenêtres (sans parler des pompes de message) pour recevoir un message Windows.

Si le bogue ne se produit vraiment que lors de l'arrêt (par opposition à l'arrêt du service), il peut être le cas que quelque chose dépend d'une ressource qui s'en va, ce qui n'est pas manipulé gracieusement (auquel cas Correction des bugs pourrait pour configurer les dépendances de service correctement). Avez-vous essayé d'utiliser les outils de débogage à distance pour attacher au processus avant l'arrêt?

On vaut la peine d'enquêter si vous pouvez obtenir le problème sans fermer, peut-être que lorsque vous arrêtez simplement le service avec le gestionnaire de contrôle de service (pas besoin de le faire par programme, car il s'agit d'un scénario de débogage), auquel cas Peut rupture d'arrêt tintop () dans votre service (je suppose que c #) et regardez ce qui se passe.


1 commentaires

J'ai l'impression que les dépendances n'aident pas à arrêter ... mais je ne suis pas sûr de cela.



0
votes

Je ne sais pas si c'est une poignée similaire, j'en doute, mais quelqu'un pourrait me laisser savoir si c'est le cas, mais vous pouvez obtenir une poignée de processus, ce qui signifie que vous pouvez obtenir le processus à l'aide de processus.getProcessesbyname (" Myappname "); althangiment ne comptez pas sur cela comme je ne pense pas que cela aura la poignée que vous allez après. Juste une suggestion.

En réalité, cette méthode fonctionnera ... Vous devez juste avoir besoin d'accéder à la propriété "MainWindowhandle" de l'objet de processus. Par exemple ... xxx


0 commentaires