2009-05-06 8 views
1

J'ai ce problème. J'ai un gestionnaire à la mainWindow d'une certaine application, et je veux simuler une pression de touche sur cette application ...Comment obtenir la ChildWindow active d'une application?

J'utilise des appels d'api de sendMessage/postMessage pour faire ceci. La raison pour laquelle je n'utilise pas la fonction .Net SendKeys ou le keybd_event de l'API win32, c'est qu'ils simulent la pression sur une touche au niveau global. Dans mon cas, j'ai peut-être réduit l'application et je veux toujours que la touche soit simulée.

Le problème avec sendMessage et postMessage est que vous devez passer le gestionnaire de la fenêtre exacte où vous voulez que la touche soit pressée. Par exemple, dans le bloc-notes, si j'envoie la clé à la mainWindow, rien ne se passe, je dois envoyer la clé à la fenêtre enfant qui consiste essentiellement en la toile blanche où vous pouvez écrire. Avec msPaint par exemple, si un utilisateur crée un nouveau document et ouvre une zone de texte dans ce dessin, et que je veux y simuler une pression de touche, je dois obtenir la fenêtre enfant de la fenêtre enfant de la fenêtre principale pour que cela fonctionne .

J'ai donc trouvé un moyen qui semblait fonctionner pour toutes les situations, en gros, j'ai utilisé getWindow avec le paramètre GW_CHILD, pour obtenir la fenêtre enfant avec la valeur z la plus élevée. Ensuite, je le fais à nouveau pour la fenêtre enfant et continue à le faire jusqu'à ce qu'un certain childWindow n'a plus childWindows ..

Et il a semblé fonctionner et j'étais très heureux!

Cependant ... J'ai trouvé des cas où cela ne fonctionne pas. Firefox est l'un d'entre eux. Firefox a la mainWindow, puis a un childWindow qui est à peu près le même que la mainWindow et puis il a une autre childWindow qui est la zone du site Web, à savoir, la zone sous la barre d'adresse et les menus. Si je suis sur www.google.com par exemple, et que je veux simuler une pression de touche dans la boîte de recherche ciblée, cela fonctionne, parce que l'obtention de la fenêtre enfant de la fenêtre enfant me donne la bonne fenêtre enfant. Cependant, si l'utilisateur clique sur la barre d'adresse par exemple, rien ne change dans le fonctionnement de getWindow. Il finira toujours par obtenir la fenêtre enfant qui est sous la barre d'adresse, ne rien faire, au lieu de simuler la pression sur la barre d'adresse.

Le fait est que je n'ai pas trouvé un moyen d'obtenir la fenêtre enfant active d'une certaine application. Je peux seulement utiliser la méthode GetWindow pour obtenir la fenêtre enfant d'une certaine fenêtre et le faire jusqu'à ce que je trouve une fenêtre enfant sans childs. Cependant, comme vous l'avez vu dans le cas de Firefox, la fenêtre active est en réalité le parent de la fenêtre enfant que je reçois à la fin.

J'ai essayé d'autres appels api comme getTopWindow mais je n'avais pas de chance ..

Tout le monde peut mettre un peu de lumière sur cette question? Merci!

Répondre

0

Si l'application ne respecte pas les règles de fenêtrage de Windows, vous aurez besoin d'une exception.

Dans Mozilla, il est comme ça (IIRC):

  • Il y a cette fenêtre « dieu » de la classe MozillaUIWindowClass et avec la - chaîne dans son texte de la fenêtre « Mozilla Firefox ».
  • Si vous connaissez la position de la barre d'adresse, vous pouvez utiliser la fonction suivante:

et lui fournir les HWND de la fenêtre « dieu » et la position de la barre d'adresse.

HWND ChildWindowFromPoint(HWND, POINT); 

Il y a probablement une meilleure solution, je suis venu avec ceci puisque j'ai dû automatiser la souris, qui est basée sur la position.

Pour plus d'informations, vous pourriez avoir besoin de consulter le logiciel sources ou passer toute la journée dans Spy +. :>

0

Vous pouvez utiliser GetGUIThreadInfo pour obtenir des informations sur l'interface utilisateur d'un processus particulier.

Si vous avez la fenêtre principale, vous pouvez appeler le GetWindowThreadProcessId pour obtenir l'ID du fil de processus. Ensuite, vous pouvez appeler GetGUIThreadInfo pour obtenir des informations sur les fenêtres actives/focalisées, etc.

Je dois également préciser que certaines applications n'ont qu'une seule fenêtre et que toutes ses commandes sont sans fenêtre (comme Windows Live Messenger).

Questions connexes