Envoyer un message windows à un Service Windows
Est-il un outil pour envoyer (imiter) un message de windows comme "WM_ENDSESSION" pour un service windows?
OU
Comment puis-je envoyer un message de windows à un processus à l'aide de C#?
(Je ne connais que le C#)
EDIT: But: Fondamentalement, je n'ai pour déboguer un service windows pour corriger un bug qui se produit uniquement sur le système de fermeture.
Je pense qu'il appartient à stackoverflow.com
Aucune chance avec ça?
Aucune chance avec ça?
OriginalL'auteur devnull | 2009-08-05
Vous devez vous connecter pour publier un commentaire.
En général, les services n'ont pas de windows (sans parler de la pompe de message) pour recevoir un message de windows.
Si le bug n'a vraiment se produire seulement à l'arrêt (en opposition à l'arrêt du service), il peut être le cas que quelque chose dépend d'une ressource qui s'en va, qui n'est pas géré correctement (dans ce cas, la correction de bug pourrait être pour configurer le service correctement les dépendances). Avez-vous essayé d'utiliser les outils de débogage à distance à joindre au processus avant l'arrêt?
Il vaut la peine de déterminer si vous pouvez obtenir le problème sans s'arrêter, peut-être quand il suffit de l'arrêt du service avec le Gestionnaire de Contrôle de Service (pas besoin de le faire par programmation, comme c'est un débogage scénario), dans ce cas, vous pouvez point d'arrêt OnStop() dans votre service (je suppose que C#) et de regarder ce qui se passe.
OriginalL'auteur Rowland Shaw
Services devraient être contrôlé à l'aide de ServiceController classe
Vous pouvez l'utiliser pour démarrer, arrêter et communiquer avec les services.
OriginalL'auteur Diaa Sami
Découvrez les réponses à Comment simuler l'arrêt de windows pendant le débogage?
Services ont un "événement" appelé OnShutdown ils peuvent s'abonner à l', de sorte qu'il pourrait être le problème, c'est que le code. Si le code est .net, vous pouvez sous-classe de sorte que vous pouvez appeler le protégé OnShutdown méthode de débogage. Mais le problème pourrait aussi être comme suggéré par d'autres que le service s'attend à des ressources disponibles qui ne sont pas parce qu'ils ont déjà été fermés.
Aussi, si le service a été écrit .net 2.0 a noter que le Stop() la commande n'est pas appelé automatiquement sur un service lorsque la station de travail est en cours d'arrêt! C'est très surprenant et était fixe dans .net 3.5, mais si vous êtes en utilisant .net 2.0, vous devez appeler Stop() vous-même à l'intérieur de OnShutdown().
OriginalL'auteur Rory
Si vous avez le hwnd de la fenêtre, vous pouvez envoyer des messages. La seule limitation est que vous ne pouvez pas envoyer des messages qui contiennent des pointeurs comme paramètre de texte de la fenêtre.
Appelez simplement
PostMessage()
avec la valeur de la hwnd et le message que vous voulez envoyer.Afin de trouver le hwnd vous pouvez utiliser spy++.
Je ne suis pas sûr de savoir comment vous connecter tout cela pour les services windows depuis windows services n'ont pas de fenêtres.
OriginalL'auteur shoosh
Je recommanderais de l'Importation et de définir les éléments suivants:
Ensuite l'envoyer par 0x0 0x1 ou représentant vrai ou faux que les wParam message.
Donc, dans votre code, vous allez utiliser:
Où HandleToSendTo est le Handle de Fenêtre de la fenêtre que vous voulez envoyer le message.
Modifier
Pour obtenir le handle windows si vous ne le connaissez pas, je suis en supposant que vous saurez que c'est le titre ou le nom. Si oui, vous pouvez utiliser ceci:
Qui de plus amples renseignements au sujet de peut être trouvé dans cette question.
Ou peut-être
Je ne sais pas si c'est un analogue de la poignée, j'en doute, mais quelqu'un pourrait me permettre de savoir si c'est possible, mais vous pouvez obtenir un handle de Processus, ce qui signifie que vous pourriez obtenir le processus à l'aide de Processus.GetProcessesByName("MyAppName");, bien que ne comptez pas sur ce que je ne pense pas qu'il va obtenir la poignée que vous êtes après. Juste une suggestion.
OriginalL'auteur ThePower
Je ne pense pas qu'il y est un outil pour envoyer arbitraire des messages parce que chaque message peut avoir des LPARAM et WPARAM valeurs.
Mais l'outil le plus utile environnant les messages de windows est spy++. Spy++ est inclus avec Visual Studio et il vous permet de voir quels sont les messages envoyés, la fenêtre de hiérarchie, et plus encore.
Vous pouvez envoyer des messages via C# avec le SendMessage de l'API Win32. Vous pouvez obtenir le handle de fenêtre, il demande à l'aide d'un API Win32, comme FindWindow ou FindWindowEx.
Modifier (pour correspondre à la question de la modifier): les Services sont arrêtés par windows automatiquement lors de l'arrêt. Donc, pour corriger un bug, ça sonne comme vous avez besoin de modifier le code du service lui-même à se fermer correctement.
Edit2: Ou si vous voulez arrêter le service, vous devez utiliser l'API Win32 ControlService passant
SERVICE_CONTROL_STOP
0x00000001
.Le service devrait avoir une fenêtre dans la première place ou la file d'attente de messages pour pouvoir envoyer des messages. Et selon Vista paramètres que vous ne pouvez pas être en mesure d'envoyer le message de toute façon à un service qui s'exécute dans une session différente. Si vous avez le contrôle du service d'une meilleure option serait de tuyaux.
OriginalL'auteur Brian R. Bondy
En fait, cette méthode de travail...vous avez juste besoin d'accéder à la " MainWindowHandle la propriété de l'objet de processus. Par Exemple...
OriginalL'auteur CM.