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!