HRESULT hr = AccessibleObjectFromWindow(hw, OBJID_WINDOW, IID_IAccessible, (void**)&pIA);
if (!SUCCEEDED(hr))
return -1;
Я думаю, что проблема здесь - замените OBJID_WINDOW на OBJID_CLIENT, и это, кажется, работает.(У меня нет зарегистрированной typelib, но я могу QS для IID_IAccessible и интерфейса IUnknown, и, похоже, он работает. Кроме того, обязательно также CoInitialize ().)
IAccessible имеет интересную иерархию:каждый HWND имеет как часть «окна», так и часть «клиент».Это частично связано с тем, как Win32 работает внутри;Win32 HWND может иметь такие элементы, как заголовок заголовка, меню, полосы прокрутки и т. д., которые совместно используют один и тот же HWND - наряду с областью содержимого, называемой клиентской областью, где живет фактический управляющий контент.Чтобы эти элементы имели свое собственное представление, разработчики MSAA выбрали двухуровневую структуру, где OBJID_WINDOW представляет все окно, и у него есть дочерние элементы, которые затем представляют такие вещи, как полосы прокрутки, меню, заголовок и т. Д., Если ониприсутствует.
Часть окна, которая реализует доступность, однако, как правило, является клиентской частью, поэтому вам обычно нужно запросить OBJID_CLIENT, чтобы получить «реальный» IAccessible.