Почему FindWindow находит окно, которого нет у EnumChildWindows? - PullRequest
4 голосов
/ 01 марта 2012

Я ищу окно с именем класса "CLIPBRDWNDCLASS" (его можно найти в офисных приложениях и других приложениях).

Если я использую FindWindow или FindWindowEx, я нахожу первый HWND, который имеетэтот класс, но я хочу все окна с этим классом, поэтому я решил использовать рекурсивный EnumChildWindows, чтобы перечислить все окна и найти нужное окно:

//-------------------------------------------------------------------------------
BOOL CALLBACK enum_wnd_proc(HWND h, LPARAM lp)
{
    char cls[1024] = {0};
    ::GetClassNameA(h, cls, 1024);

    if(std::string(cls) == "CLIPBRDWNDCLASS")
    {
        // match!
    }

    ::EnumChildWindows(h, enum_wnd_proc, NULL);

    return TRUE;
}
//-------------------------------------------------------------------------------
int _tmain(int argc, _TCHAR* argv[])
{
    ::EnumWindows(enum_wnd_proc, NULL); 
    return 0;
}
//-------------------------------------------------------------------------------

Это то, чтоэто окно не возвращается через EnumWindows, только через FindWindow.

Кто-нибудь может сказать, почему оно не работает ???

Ответы [ 2 ]

7 голосов
/ 02 марта 2012

Причина, по которой EnumWindows не работает, заключается в том, что искомое окно является окном только для сообщений .

FindWindowEx может найти их в двух случаях:

  1. Если hwndParent и hwndChildAfter равны NULL.
  2. Если вы укажете «HWND_MESSAGE» в качестве родительского окна.

Этот код найдет все соответствующие окна для вас (измененная версия решения с здесь ):

HWND hWindow = FindWindowExA(HWND_MESSAGE, NULL, "CLIPBRDWNDCLASS", NULL);
while (hWindow )
{
    // Do something here with window...

    // Find next window
    hWindow = FindWindowExA(HWND_MESSAGE, hWindow , "CLIPBRDWNDCLASS", NULL);
}

Также обратите внимание, что в отличие от того, что написано в приведенной выше ссылке, GetParent() для окон только сообщений не возвращает HWND_MESSAGE (по крайней мере, не для моих тестов).

4 голосов
/ 10 марта 2013

Мой старый простой способ перечислить все окна только для сообщений:

EnumChildWindows (GetAncestor (FindWindowEx (HWND_MESSAGE, 0,0,0), GA_PARENT), addr EnumChildProc, 0)

// GetAncestor (FindWindowEx (HWND_MESSAGE, 0,0,0), GA_PARENT) = "GetMessageWindow" (класс "Message") *

// GetAncestor (FindWindowEx (HWND_DESKTOP, 0,0,0), GA_PARENT)= GetDesktopWindow (класс "# 32769")

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...