Почему некоторые элементы управления не имеют дескриптора окна?

Я хочу получить дескриптор окна некоторых элементов управления, чтобы сделать что-то с ним (требуется дескриптор). Элементы управления находятся в другом приложении.

Достаточно странно; Я обнаружил, что многие элементы управления не имеют дескриптора окна, как кнопки на панели инструментов (?) В проводнике Windows. Просто попробуйте получить ручку к кнопкам папки / поиска /(и т. Д.). Это просто дает мне 0.

Итак... первый вопрос: почему некоторые элементы управления не имеют дескриптора окна? Разве не все окна управления в их сердцах? (Просто говоря о стандартных элементах управления, как я и ожидал, в Windows Explorer, ничего не настраиваемых на панели и т. П.)

Что подводит меня ко второму вопросу: как с ними работать (например, с помощью EnableWindow), если вы не можете получить их дескриптор?

Большое спасибо за любые вклады!

РЕДАКТИРОВАТЬ (ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ):

Проводник Windows - только пример. У меня часто возникает проблема - и в другом приложении (которое мне действительно интересно, проприетарное). У меня есть "физические" элементы управления (так как я могу получить AutomationElement этих элементов управления), но у них нет дескриптора окна. Кроме того, я пытаюсь отправить сообщение (SendMessage), чтобы получить состояние кнопки, пытаюсь выяснить, нажата она или нет (это стандартная кнопка, которая, кажется, демонстрирует такое поведение только через это сообщение - по крайней мере, насколько Я также видел. Кроме того, нажатое состояние может длиться намного дольше на этой кнопке, чем вы ожидаете от стандартной кнопки, хотя кнопки проводника Windows показывают аналогичное поведение, действуя как кнопки-флажки, хотя они и являются (нажимными) кнопками.). SendMessage требует дескриптор окна.

Меняет ли панель инструментов каким-либо образом поведение своих дочерних элементов? Убирая их оконную ручку или что-то подобное? (Использование родительского дескриптора / идентификатора элемента управления для идентификации??) Но тогда как использовать функции на тех элементах управления, которые требуют дескриптор окна?

3 ответа

Решение

Если у них нет ручки, они не настоящие элементы управления, они просто нарисованы, чтобы выглядеть как элементы управления.

Но, конечно же, кнопки панели инструментов в проводнике Windows имеют дескрипторы окон, они являются частью панели инструментов. Используйте функции манипуляции панели инструментов для взаимодействия с ними, а не EnableWindow,

Или, что еще лучше, используйте документированные API для таких вещей, как поиск. Обратный инжиниринг Windows Explorer никогда не заканчивался хорошо ни для кого, особенно для бедной команды Windows Shell, обремененной годами взломов обратной совместимости для некоторых разработчиков, которые думали, что API-интерфейсы для всех остальных. Все, что вам удастся заставить работать, очень вероятно, сломается в следующей версии Windows.

Элементы управления, о которых вы говорите, используют класс ToolbarWindow32. Если вы хотите взаимодействовать с ними, вам нужно будет использовать API / сообщения управления панели инструментов. Например, для включения кнопок вы хотите использовать TB_ENABLEBUTTON.

Вы можете реализовать элементы управления самостоятельно, используя GDI, OpenGL или DirectX. Попробуйте Window Detective на Mozilla Firefox, и вы увидите, что есть только одно окно. Элементы управления в диалоговых окнах не являются окнами, известными Windows.

Другие вопросы по тегам