Пример #1
0
//EnumWindows handler
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lparam)
{
    try
    {
        CMWDiscovery* mwd = reinterpret_cast<CMWDiscovery*>(lparam);
        IAccessiblePtr pAccessibleObject;
        HRESULT hr  = ::AccessibleObjectFromWindow( hwnd, OBJID_WINDOW, __uuidof(IAccessible), (void**)&pAccessibleObject );

        if( hr == S_OK )
        {
            if( pAccessibleObject )
            {
                _bstr_t bsName;
                VARIANT varChild;
                varChild.vt = VT_I4;
                varChild.lVal = CHILDID_SELF;
                if (SUCCEEDED(pAccessibleObject->get_accName(varChild, bsName.GetAddress())))
                {
                    CStdStringW name = bsName;
                    CStdString::size_type iFind = name.rfind(mwd->m_name);
                    if(iFind != CStdString::npos )
                    {
                        mwd->m_hwnd = hwnd;
                        return false;
                    }
                }
            }
        }
    }
    catch(...)
    {   //don't want this to stop the handler
        LOG_WS_ERROR(_T("Exception during EnumWindows"));
    }
    return true;
}