Je suis nouveau sur WINAPI et j'ai compris comment envoyer un message à un autre programme. Cependant, le programme que j'utilise, j'aimerais pouvoir lui faire cliquer sur un bouton spécifique. D'après ce que j'ai appris en consultant Spy++, les poignées des fenêtres changent pour les programmes à chaque fois qu'ils sont rechargés, de même que les poignées de leurs contrôles. L'ID du contrôle reste le même. Après deux jours à essayer de comprendre, je suis ici.
En utilisant SendMessageA, si je spécifie la poignée actuelle visible par Spy++ et que j'utilise cela et que j'exécute le code, cela fonctionne bien et clique sur le bouton de mon application externe. J'essaie d'utiliser GetDlgItem car j'ai lu que je peux obtenir la poignée du contrôle (fenêtre enfant) en l'utilisant. Cependant, je fais quelque chose de mal car quoi que je fasse, cela renvoie 0 ou 'null'.
Comment puis-je faire en sorte que GetDlgItem renvoie la poignée du contrôle enfant afin que je puisse l'utiliser pour envoyer un message pour cliquer sur ce contrôle dans l'application externe ?
Merci pour votre aide et vos conseils à l'avance.
[DllImport("User32.dll")]
static extern bool SetForegroundWindow(IntPtr hWnd);
Process[] myProcess = Process.GetProcessesByName("nom du programme ici");
[DllImport("user32.dll", CharSet = CharSet.Auto)]
static extern int SendMessageA(IntPtr hwnd, int wMsg, int wParam, uint lParam);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr GetDlgItem(int hwnd, int childID);
public const int WM_LBUTTONDOWN = 0x0201;
public const int WM_LBUTTONUP = 0x0202;
public void SendClick()
{
IntPtr hwnd = myProcess[0].MainWindowHandle;
SetForegroundWindow(hwnd);
int intCID = 1389;
IntPtr ptrTest = GetDlgItem(hwnd, intCID);
SendKeys.SendWait(" ");
Thread.Sleep(1000);
SendKeys.SendWait("texte varié à envoyer ici");
Thread.Sleep(1000);
SendKeys.SendWait("{ENTER}");
Thread.Sleep(1000);
SendMessageA(ptrTest, WM_LBUTTONDOWN, WM_LBUTTONDOWN, 0);
}