Y a-t-il un outil pour envoyer (MIMIC) un message Windows comme 'wm_endsession' à un service Windows? p>
ou p>
Comment puis-je envoyer un message Windows à un processus à l'aide de C #? P>
(Je ne sais que c #) p>
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é. P>
7 Réponses :
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. p>
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. P>
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 . p>
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. p>
Edit2: Ou si vous souhaitez arrêter le service, vous devez utiliser l'API Win32 ControlService passant dans Service_Control_stop Code>
0x00000001 CODE>. P>
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.
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. Je ne sais pas comment vous connectez tout cela à Windows Services puisque Windows Services n'a pas de fenêtres. P>
Appelez simplement postmessage () code> avec la valeur du HWND et le message que vous souhaitez envoyer.
Pour trouver le HWND, vous pouvez utiliser SPY ++. P>
Je recommanderais d'importer et de définir ce qui suit: puis envoyez via 0x1 ou 0x0 représentant true ou false comme le message WPARAM. P> donc dans votre code Utilisera: p> où handletosendto est la poignée de la fenêtre de la fenêtre que vous souhaitez envoyer le message à. p> Modifier B > Quelle plus d'informations sur peuvent être trouvées dans cette question. p> ou peut-être i> 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. P> p>
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: p>
p>
Les services doivent être contrôlés à l'aide de Classe ServiceController p>
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. P> blockQuote>
Vous pouvez l'utiliser pour démarrer, arrêter et communiquer avec des services en utilisant cette classe. P>
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. P>
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 em> 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? P>
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. P>
J'ai l'impression que les dépendances n'aident pas à arrêter ... mais je ne suis pas sûr de cela.
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. P>
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 ... p>
xxx pré> blockQuote>
Découvrez les réponses à Comment simuler l'arrêt Windows lors du débogage? a> p>
Services ont un « événement » appelé OnShutdown ils peuvent souscrire, il pourrait être le problème est dans ce code. Si le code est .net, vous pouvez sous-classe afin que vous pouvez appeler la méthode protégée OnShutdown à déboguer. Mais le problème pourrait aussi être comme suggéré par d'autres que le service attend les ressources soient disponibles qui ne sont pas parce qu'ils ont déjà été fermés. P>
En outre, si le service a été écrit en .net 2.0 note que la commande Stop () n'est pas appelée automatiquement sur un service lorsque le poste de travail est à l'arrêt! Ceci est très surprenant et était fixe dans .net 3.5 , mais si vous utilisez .net 2.0 vous devez appeler Stop () vous au sein OnShutdown (). p>
Je pense qu'il appartient à Stackoverflow.com