2010-10-11 32 views
1

J'ai besoin de voir le type de composant, c'est-à-dire le nom de la classe qui a été programmée, d'un contrôle cliqué dans un autre processus. J'ai besoin du type pour pouvoir réagir au contrôle cliqué puis effectuer des tâches d'automatisation. En ce moment je fais ce qui suit: 1. Je FindWindow() de Win32 pour trouver la poignée de fenêtre principale du processus. 2. Ensuite, j'obtiens l'appel EnumChildWindows(), également à partir de Win32, et récupère les handles de fenêtre de tous les enfants du handle de la fenêtre principale. 3. Maintenant, il devient difficile. Lorsque j'appelle GetClassName(), il renvoie WindowsForms10.STATIC.app [...] car les contrôles que j'essaie de lire sont personnalisés.Obtenir le type de composant de la classe .NET personnalisée à partir du handle de la fenêtre

Comment puis-je obtenir le type de contrôle cliqué à l'aide des poignées de fenêtre à partir de EnumChildWindows()? Est ce que j'essaye de faire même possible? J'ai cherché dans l'utilisation de SendMessage() de Win32 au processus mais il semble qu'il n'y ait aucun message défini par système qui pourrait aider.

Répondre

1

J'ai bien peur que ce ne soit pas possible. Une poignée fait simplement référence aux données internes de la fenêtre dont Windows a besoin. Il n'y a aucune information au-delà de celle disponible.

Vous pouvez obtenir le nom de classe, mais il n'est ni standardisé ni unique. La plupart des contrôles qui ne sont pas des contrôles de base-fonctionnalité comme les boutons, les listes, etc. sont dérivés d'un contrôle très primitif, à savoir "statique". Mais encore une fois, il n'y a aucune information sur le contrôle WinForms de haut niveau disponible. Cela conduit au fait que, même si vous connaissiez le type, vous ne pouvez pas simplement lancer le pointeur/handle, car il n'y a pas de données derrière lui.

Pouvez-vous répéter votre problème? Peut-être utiliser des appels de procédure à distance? Cela fonctionne-t-il sans les objets WinForms de haut niveau? Des choses comme cliquer, déplacer ou renommer fonctionnent avec l'API Win32.

+0

Merci beaucoup pour votre réponse rapide. J'ai lu beaucoup dans les API Win32 sans aucune chance. :(J'ai besoin de voir la classe de haut niveau pour pouvoir prédire ce que l'utilisateur essaie de faire.J'ai pas besoin d'interagir avec le contrôle.J'ai programmé un crochet pour lire la position de la souris dans l'application. Ce que je dois alors faire est de savoir quel type de composant a été cliqué.Compiler vers AutomationElement n'a pas aidé non plus, puisque les propriétés ne sont pas définies correctement.J'ai vu que ManagedSpyLib peut lire le type de composant, mais il n'a pas été compilé. NET 4.0 donc j'ai besoin de le programmer moi-même – prettyCode

+0

Si vous trouvez une réponse utile, vous pouvez cliquer sur la flèche du haut Si elle répond à votre question, veuillez cliquer sur la coche verte juste sous les flèches. – msteiger