0
votes

Trouver une fenêtre enfant par classe

Je ne peux pas obtenir la poignée de champ "Modifier" lorsque vous sélectionnez une photo dans une application tierce.

Spy ++ montre tout correctement, mais Findwindow échoue. Je peux avoir la poignée de la fenêtre elle-même, le parent. Je suppose que je dois chercher des fenêtres enfants. Je peux obtenir des poignées avec getwindow mais mais ce n'est pas clair ce qu'ils sont. Le titre de la fenêtre est vide. FindWindowex ne fonctionne pas du tout, retourne 0. J'indiquez comme suit: xxx

 Entrez la description de l'image ici


5 commentaires

Vous recherchez probablement EnumchildWindows .


Si cette ligne non valide du code C # est censée représenter les paramètres à FINDWindowex , la classe est le troisième paramètre, pas le quatrième.


Findwindow - Récurs Une poignée à la fenêtre haut niveau .. Vous devez énumérer les enfants pour obtenir une fenêtre de niveau inférieure comme sur la capture d'écran.


@ 500-internalserverserror Ok, je sais, mais comment obtenir la poignée de l'enfant par classe?


Appelez GetClassName pour chaque manche renvoyée et comparez avec ce que vous recherchez. Notez qu'il y aura généralement plusieurs fenêtres enfants de la même classe.


3 Réponses :


-5
votes

Comme quelqu'un déjà supposé. Essayez la méthode EnumChildWindow. Voici un échantillon complet déjà sur Stackoverflow


0 commentaires

1
votes

Basé sur la capture d'écran que vous avez fournie et en utilisant uniquement les fonctions FINDWINDOW / EX (EX () CODE>, vous pouvez obtenir le HWND du contrôle d'édition comme ceci:

const int CBEM_GETEDITCONTROL = 1031;
IntPtr hwndDlg = FindWindow(null, "Choose an image");
IntPtr hwndCBEx = FindWindowEx(hwndDlg, IntPtr.Zero, "ComboBoxEx32", null);
IntPtr hwndEdit = SendMessage(hwndCBEx, CBEM_GETEDITCONTROL, 0, 0);


1 commentaires

Merci, la meilleure solution simple



0
votes

Si vous recherchez une fenêtre enfant d'un parent, vous devez utiliser EnumChildWindows. Ce qui suit est le code C ++ mais pourrait être facilement avoué: vous pouvez les déléguements de maréchal en tant que pointeurs de fonction pour le rappel.

std::vector<HWND> FindChildrenByClass(HWND parent, const std::string& target_class)
{
    struct EnumWndParam {
        std::vector<HWND> output;
        std::string target;
    } enum_param;

    enum_param.target = target_class;

    EnumChildWindows(
        parent,
        [](HWND wnd, LPARAM lparam) -> BOOL {
            auto param = reinterpret_cast<EnumWndParam*>(lparam);
            char class_name[512];
            GetClassName(wnd, class_name, 512);
            if (param->target == class_name)
                param->output.push_back(wnd);
            return TRUE;
        },
        reinterpret_cast<LPARAM>(&enum_param)
    );

    return enum_param.output;
}

int main()
{
    auto windows = FindChildrenByClass( reinterpret_cast<HWND>(0x0061024A), "Edit");
    for (auto wnd : windows) {
        std::cout << std::hex << wnd << std::endl;
    }
}


0 commentaires