4 votes

Comment obtenez-vous une fenêtre enfant en utilisant son ID de contrôle ?

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);
    }

2voto

Marco Points 1083

Je pense que vous devez utiliser l'API Win32 pour trouver la fenêtre de l'application "réceptrice", puis trouver une fenêtre enfant de cette poignée. C'est quelque chose que j'ai trouvé en cherchant sur l'API Win32 FindWindow

http://www.c-sharpcorner.com/UploadFile/shrijeetnair/win32api12062005005528AM/win32api.aspx

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X