Как отметил @sehe, не существует надежного способа обнаружения элементов управления извне, и можно сказать, что некоторые элементы управления ActiveX не имеют / не имеют окон без своих собственных HWND
s.
Однако, если выХорошо, чтобы обнаружить хотя бы некоторые элементы управления, вы можете найти те, которые размещены в популярном классе ATL CAxHostWindow
.Этот хост будет отвечать на определенные сообщения окна, позволяющие вам получить интерфейс хоста и управления:
WM_ATLGETHOST
получает вас IUnknown
управляющего хоста (сайта) WM_ATLGETCONTROL
получает IUnknown
самого элемента управления
Оба идентификатора сообщения могут быть получены с помощью RegisterWindowMessage
API:
const UINT WM_ATLGETHOST = RegisterWindowMessage(_T("WM_ATLGETHOST"));
const UINT WM_ATLGETCONTROL = RegisterWindowMessage(_T("WM_ATLGETCONTROL"));
Имея на руках элементы управления IUnknown
, на которых можно перейтис обнаружением интерфейсов и запросом свойств IDispatch
, IProvideClassInfo
и других интерфейсов.Однако вам необходимо сделать его контекстом процесса, в котором размещается элемент управления, что усложняет перечисление: вам нужно внедрить свой код в процесс, например, с помощью ловушки.