Je essaie d'automatiser une séquence d'entrées utilisateur vers une application compilée en C# en utilisant l'API Win32. Je n'ai aucun code source pour l'application que je essaie de contrôler et elle fonctionne pendant que je essaie de la contrôler. Dans mon code, j'ai un seul bouton qui, une fois cliqué, doit effectuer une séquence de 3 entrées vers l'application que je essaie de contrôler :
- Sélectionner un élément dans un treeview
- Appuyer sur un bouton
- Appuyer sur un autre bouton
Le fonctionnement est que le bouton dans l'étape 2 effectue une action en fonction de l'élément sélectionné dans le treeview à l'étape 1. Je parviens à faire fonctionner les clics sur les boutons en envoyant simplement un message, mais je ne parviens pas à comprendre comment sélectionner l'élément TreeView désiré. Le TreeView est statique, donc les éléments et la mise en page ne changeront jamais. Il a la mise en page suivante :
-élémentsA
-élémentsB
--élémentB1
-élémentsC
Où l'élémentB1 est l'élément qui doit être sélectionné pour que les clics sur les boutons dans les étapes 2 et 3 fonctionnent. Par défaut, les élémentsB sont repliés, donc je dois probablement les développer avant de pouvoir sélectionner l'élémentB1 ? Voici mon code. Je vous remercie vraiment de toute aide !!
//Trouver Window API
[DllImport("User32.dll")]
public static extern Int32 FindWindow(String lpClassName, String lpWindowName);
//Trouver WindowEx API
[DllImport("user32.dll", SetLastError = true)]
public static extern IntPtr FindWindowEx(IntPtr parentHandle, IntPtr childAfter, string className, string windowTitle);
//Envoyer un message API
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern int SendMessage(int hWnd, int msg, int wParam, IntPtr lParam);
private const int BN_CLICKED = 245;
//Méthode appelée par un clique de bouton
public static void Start()
{
int hwnd = 0;
int prod = 0;
IntPtr hwndChild = IntPtr.Zero;
IntPtr treeChild = IntPtr.Zero;
IntPtr prodChild = IntPtr.Zero;
hwnd = FindWindow(null, "Application");
if (hwnd > 0)
{
//Obtenir la poignée pour le TreeView, C'EST ICI QUE JE SUIS BLOQUÉ!!
treeChild = FindWindowEx((IntPtr)hwnd, IntPtr.Zero, "AfxMDIFrame80", null);
treeChild = FindWindowEx((IntPtr)treeChild, IntPtr.Zero, "AfxMDIFrame80", null);
treeChild = FindWindowEx((IntPtr)treeChild, IntPtr.Zero, "SysTreeView32", null);
//Besoin d'ajouter du code pour sélectionner l'élément dans le TreeView ???
//Cliquer sur le premier bouton
hwndChild = FindWindowEx((IntPtr)hwnd, IntPtr.Zero, "AfxMDIFrame80", null);
hwndChild = FindWindowEx((IntPtr)hwndChild, IntPtr.Zero, "AfxMDIFrame80", null);
hwndChild = FindWindowEx((IntPtr)hwndChild, IntPtr.Zero, "#32770", null);
IntPtr scanBtn = FindWindowEx((IntPtr)hwndChild, IntPtr.Zero, "Button", "&Scan");
SendMessage((int)scanBtn, BN_CLICKED, 0, IntPtr.Zero);
//Cliquer sur le deuxième bouton
prod = FindWindow("#32770", "Product: WPC");
prodChild = FindWindowEx((IntPtr)prod, IntPtr.Zero, "Button", "&Collect");
SendMessage((int)prodChild, BN_CLICKED, 0, IntPtr.Zero);
}
}//FIN Démarrer
Hans,
Pouvez-vous me donner un exemple de comment je pourrais faire ça ? Le problème que j'ai vraiment est de trouver la poignée pour l'élément treeview que je veux sélectionner. Si j'utilise Spy++ pour trouver la poignée actuelle et la coder en dur dans ma méthode, cela fonctionne bien, comme ceci :
SendMessage((int)treeChild, TV_SELECTITEM, TVGN_CARET, (IntPtr)0x092DCB30);
Si j'utilise SendMessage et envoie TVGN_ROOT à la poignée du TreeView, renverra-t-il un IntPtr avec la poignée de l'élément à sélectionner dans le treeview, ou comment cela fonctionne-t-il ? J'expérimente également avec AutoIt, mais j'espérais conserver tout mon code dans une seule application.