Поиск hwnd отключенных / скрытых [элементов управления] - PullRequest
0 голосов
/ 10 ноября 2011

Я создаю программу для определения окон / элементов управления, на которую указывает мышь (очень похоже на spy ++), однако я столкнулся с проблемой:

Первоначально я использовал WindowFromPoint, чтобы найтиhWnd's элементов управления, но обнаружили, что отключенные / скрытые окна не отображаются.Каждый сайт говорит, что должен использовать ChildWindowFromPoint (или аналогичный winapi), однако они не находят элементы управления внутри окон.WindowFromPoint, все еще находя отключенные и скрытые окна?

Ответы [ 4 ]

3 голосов
/ 10 ноября 2011

ChildWindowFromPointEx с CWP_ALL (или CWP_SKIPTRANSPARENT, если вы хотите пропустить прозрачные окна) в цикле, пока он не вернет NULL, я полагаю, если вы ищете только окна.

Универсальных определений для элементов управления, как указал Ауссей Маршал, нет, элементы управления в Internet Explorer не являются оконными и не имеют ничего общего с элементами управления в других средах, таких как WPF или Java Foundation Classes.

Если вы пишете что-то вроде Spy ++, отметьте Внутренние компоненты Spy ++ .Если вам нужно автоматизировать другие программы, установите флажок Windows Automation API .

1 голос
/ 17 июля 2013

Это работает для меня в C ++:

HWND ChildFromPoint_recurse(HWND inHWND, POINT inPOINT)
{
    HWND lHWND = ChildWindowFromPointEx(inHWND,inPOINT,CWP_ALL);
    if (lHWND == 0) return inHWND;

    if (lHWND != inHWND)
    {
        POINT lPOINT = inPOINT;
        if (!ClientToScreen(inHWND,&lPOINT)) return lHWND;
        if (!ScreenToClient(lHWND,&lPOINT)) return lHWND;

        HWND lHWNDrecurse = ChildFromPoint_recurse(lHWND,lPOINT);
        if (lHWNDrecurse) lHWND = lHWNDrecurse;
    }

    return lHWND;
}
0 голосов
/ 15 ноября 2011

Если вам действительно нужны скрытые окна, ваш единственный реальный вариант - самостоятельно пройтись по дереву HWND; все ... FromPoint пропустить это прямо. (Обратите внимание, что скрытые окна могут иметь местоположения, которые в конечном итоге блокируют вас от доступа к видимым окнам «под ними» - так что вы можете подумать о том, действительно ли вы хотите получить доступ к скрытым окнам во всех случаях или только как запасной вариант, если нет другого подходящего видимого окна в точке.)

Используйте GetDesktopWindow (), чтобы начать с корня, и спуститься соответствующим образом; Пройдите через каждого потомка, посмотрите, в этом ли суть, и если да, пройдите по этой ветви и проигнорируйте других братьев и сестер.

Чтобы определить потомков HWND, вы можете использовать либо EnumWindows, либо использовать GetWindow () - но учтите, что GetWindow может дать вам непоследовательные результаты, если окна изменяют zorder во время их перечисления.

Тогда вам решать, как отфильтровать hwnds; если вам нужны только видимые окна, пропустите те, в которых не установлен бит WS_VISIBLE.

Проверка 'точки в этом HWND' сложнее: проверка точки в прямоугольнике окна является первым тестом; но вам также может потребоваться проверить, что он не отвечает HT_TRANSPARENT на WS_EX_TRANSPARENT - это то, что групповые блоки используют, чтобы позволить щелчкам «проходить» к своим братьям и сестрам, которые они содержат. (Вам также может потребоваться принять во внимание фасонные окна - они используют SetWindowRgn, чтобы придать им неправильную форму; в наши дни они довольно редки, когда многоуровневые окна выполняют одну и ту же работу.)

-

Кроме того, если вам не нужны невидимые окна, рассмотрите возможность использования одного из API доступа: они уже выполняют аналогичную работу с этим. Используйте AutomationElement.FromPoint, и вы можете получить элемент пользовательского интерфейса «в этот момент». Это замечательно, если вы действительно заботитесь об интерфейсе пользователя, а не о HWND; он вернет объект, представляющий элемент внутри списка, а не весь список HWND, который поможет вам HWND-ориентированный подход - но он не поможет вам со скрытыми окнами.

0 голосов
/ 10 ноября 2011

ВЫ не можете.Вы не можете получить то, к чему относится текстовое поле windows class tje в вашем веб-браузере.

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