La fenêtre de recherche avec un texte spécifique pour un Processus
Je vais essayer de trouver si une fenêtre spécifique a été ouvert par un Processus. Ce processus génère plusieurs windows, et j'ai besoin de vérifier tous les.
Je n'ai pas de mal à trouver le processus, avec
foreach (Process p in Process.GetProcesses())
{
if (p.MainModule.FileName.ToLower().EndsWith("foo.exe"))
FindChildWindowWithText(p); //do work
le problème est de savoir quoi faire ensuite. Je ne peux pas utiliser le Processus' MainWindowText
, parce qu'il change avec n'importe quelle fenêtre est activée.
Puis j'ai essayé d'utiliser la fonction de Windows EnumChildWindows
et GetWindowText
, mais je ne suis pas sûr si je suis de passage une bonne poignée de EnumChildWindows. Le EnumChildWindows
fonctionne comme prévu lorsqu'il est passé MainWindowHandle, mais bien sûr, le MainWindowHandle changements avec la fenêtre active. J'ai donc passé Process.Handle
, mais je reçois différentes poignées et des résultats différents lors de la commutation de l'application windows. (Je comprends que EnumChildWindows retourne gère non seulement windows, mais contrôles.net de parler, pas de problème si je pouvais obtenir la légende de la fenêtre trop)
Peut-être que je fais mal et j'ai besoin d'une approche différente, encore une fois, mon problème est aussi simple que de trouver une fenêtre de texte qui correspond spécifique de l'expression régulière. Alors je serais probablement besoin d'une fonction qui énumère toutes les fenêtres, qui sont visibles dans la barre des tâches.
Grâce
OriginalL'auteur Axarydax | 2010-04-27
Vous devez vous connecter pour publier un commentaire.
Une fois que vous avez le Processus, vous pouvez énumérer toutes les Fenêtres dans le processus et de tester si l'un d'entre eux correspondent à la fenêtre, vous êtes à la recherche pour.
Vous aurez besoin de P/Invoke déclarations
Le suivant est un exemple d'un couple de fonctions qui peuvent être utilisés pour trouver le windows dans un processus spécifique, j'ai compris de votre question que vous avez le Processus, le problème est l'énumération de windows.
Vous pouvez appeler le FindWindowInProcess fonction pour trouver une fenêtre de titre se termine par "ABC" comme un exemple.
Bien sûr, vous pouvez remplacer s => s.EndsWith("ABC") avec une expression qui saura répondre à vos critères de recherche de la fenêtre, il pourrait être une regex etc.
Ici est une version de FindThreadWindow qui vérifiera également le premier niveau de l'enfant de windows. Vous pourriez aller plus loin et d'en faire une fonction récursive si votre windows est en profondeur dans la hiérarchie.
Dans FindChildWindow ... ne pourrait-il pas être hChildWnd au lieu de hWnd après avoir vérifié le résultat de compareTitle?
OriginalL'auteur Chris Taylor
Plutôt que d'énumérer les processus et la recherche de la fenêtre, je voudrais énumérer les fenêtres (à l'aide de EnumWindows) et le processus (à l'aide de GetGuiThreadInfo).
OriginalL'auteur Eric Brown
Près similaires (ou est-il exactement le même?) question accepté de répondre à qui vous pouvez vous référer à: .NET (C#): Pour enfant de windows lorsque vous avez seulement une poignée de processus ou PID?
OriginalL'auteur Amry