перечисление дочерних окон - PullRequest
1 голос
/ 30 января 2011

Пару недель назад кто-то здесь помог мне написать класс, который перечисляет все основные окна.

Сегодня я попытался изменить этот класс, чтобы перечислить все дочерние окна определенного родительского окна.

Вот файл заголовка:

#include "TChar.h"
#include "string.h"
#include "windows.h"
#include "Winuser.h"
#include <string>
#include <vector>

using namespace std;

typedef std::basic_string<TCHAR> tstring;                   //define   basic_string<TCHAR> as a member of the std namespace 
                                                        //and at the same time use typedef to define the synonym tstring for it

class Handles {

public:
    struct child_data 
    {
        tstring caption;
        HWND handle;
    };


private:
    std::vector<child_data> stuff;                      //define a vector of objecttype "child_data" (the struct defined above) named stuff

    BOOL add_window(HWND hwnd) 
    {
        TCHAR String[200] = {0};
        if (!hwnd)
            return TRUE;                                // Not a window, return TRUE to Enumwindows in order to get the next handle
        if (!::IsWindowVisible(hwnd))
            return TRUE;                                // Not visible, return TRUE to Enumwindows in order to get the next handle 
        LRESULT result = SendMessageW(hwnd, WM_GETTEXT, sizeof(String), (LPARAM)String);        //result stores the number of characters copied from the window
        if (!result)
            return TRUE;                                // No window title, return TRUE to Enumwindows in order to get the next handle
        child_data data;                                // define an object of type child_data called data
        data.handle = hwnd;                             //copy the handle to the data.handle member

        for(int i = 0; i < result; i++)                 //copy each character to data.caption by using push_back
            data.caption.push_back(String[i]);

        stuff.push_back(data);                          //Put the whole data (with its members data.caption and data.handel) struct in the vector "stuff" using pushback
        return TRUE;
    }



    static BOOL CALLBACK EnumChildWindows(HWND hwnd, LPARAM lParam)
    {
        Handles* ptr = reinterpret_cast<Handles*>(lParam);
        return ptr->add_window(hwnd);
    }

public:
    Handles& enum_windows() 
    {
        stuff.clear();                                  //clean up
        if(!EnumWindows(EnumChildWindows, reinterpret_cast<LPARAM>(this))) 
        {
            // Error! Call GetLastError();
        }
        return *this;
    }

    std::vector<child_data>& get_results() 
    {
        return stuff;
    }
};

Я вызываю функцию следующим образом:

 std::vector<Handles::child_data> windows = Handles().enum_windows().get_results(); //Enumerate all visible windows and store handle and caption in "windows"

Проблема в следующем:

Я не совсем уверенкак передать дескриптор родительского окна в функцию обратного вызова в заголовке.Такое чувство, что я перепробовал все, но у меня всегда возникают ошибки такого рода: переменная hwnd не объявлена ​​в ....

Проблема в том, что я не понимаю класс на 100%.То, что я выяснил, прокомментировано.

Спасибо за любую помощь!

1 Ответ

2 голосов
/ 30 января 2011

Вместо вызова EnumWindows, который перечисляет все окна верхнего уровня на экране, вы можете вызвать EnumChildWindows, чтобы перечислить дочерние окна данного родительского окна.Для этого вы можете добавить перегрузку enum_windows к вашему Handles классу:

Handles& enum_windows(HWND hParentWnd) 
{
    stuff.clear();                                  //clean up
    EnumChildWindows(hParentWnd, Handles_WndEnumProc, reinterpret_cast<LPARAM>(this));
    return *this;
}

EnumChildWindows - это недопустимое имя для WNDENUMPROC.Я предлагаю переименовать его в нечто более уникальное, например Handles_WndEnumProc.

...