/*
 * Copyright 2012 Jacek Caban for CodeWeavers
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
 */

#define DO_NO_IMPORTS
import "uiautomationcore.idl";

cpp_quote( "#ifndef _INC_UIAUTOMATIONCOREAPI" )

enum TreeScope {
    TreeScope_Element     = 0x01,
    TreeScope_Children    = 0x02,
    TreeScope_Descendants = 0x04,
    TreeScope_Parent      = 0x08,
    TreeScope_Ancestors   = 0x10,
    TreeScope_SubTree     = TreeScope_Element | TreeScope_Children | TreeScope_Descendants,
};

enum PropertyConditionFlags {
    PropertyConditionFlags_None       = 0x00,
    PropertyConditionFlags_IgnoreCase = 0x01,
};

enum AutomationElementMode {
    AutomationElementMode_None = 0x00,
    AutomationElementMode_Full = 0x01,
};

enum TreeTraversalOptions {
    TreeTraversalOptions_Default          = 0x00,
    TreeTraversalOptions_PostOrder        = 0x01,
    TreeTraversalOptions_LastToFirstOrder = 0x02,
};

enum ConnectionRecoveryBehaviorOptions {
    ConnectionRecoveryBehaviorOptions_Disabled = 0x00,
    ConnectionRecoveryBehaviorOptions_Enabled  = 0x01,
};

enum CoalesceEventsOptions {
    CoalesceEventsOptions_Disabled = 0x00,
    CoalesceEventsOptions_Enabled  = 0x01,
};

cpp_quote( "#endif" )

struct ExtendedProperty
{
    BSTR PropertyName;
    BSTR PropertyValue;
};

typedef void * UIA_HWND;

[
    uuid(944de083-8fb8-45cf-bcb7-c477acb2f897),
    lcid(0),
    id(2),
    version(1.0)
]
library UIAutomationClient {
    importlib ("stdole2.tlb");

    /* FIXME: Uncomment when properly supported in widl
    [dllname("<no entry points>")]
    module UIA_PatternIds
    {
    */
        const long UIA_InvokePatternId         = 10000;
        const long UIA_SelectionPatternId      = 10001;
        const long UIA_ValuePatternId          = 10002;
        const long UIA_RangeValuePatternId     = 10003;
        const long UIA_ScrollPatternId         = 10004;
        const long UIA_ExpandCollapsePatternId = 10005;
        const long UIA_GridPatternId           = 10006;
        const long UIA_GridItemPatternId       = 10007;
        const long UIA_MultipleViewPatternId   = 10008;
        const long UIA_WindowPatternId         = 10009;
        const long UIA_SelectionItemPatternId  = 10010;
        const long UIA_DockPatternId           = 10011;
        const long UIA_TablePatternId          = 10012;
        const long UIA_TableItemPatternId      = 10013;
        const long UIA_TextPatternId           = 10014;
        const long UIA_TogglePatternId         = 10015;
        const long UIA_TransformPatternId      = 10016;
        const long UIA_ScrollItemPatternId     = 10017;
        const long UIA_LegacyIAccessiblePatternId = 10018;
        const long UIA_ItemContainerPatternId     = 10019;
        const long UIA_VirtualizedItemPatternId   = 10020;
        const long UIA_SynchronizedInputPatternId = 10021;
        const long UIA_ObjectModelPatternId = 10022;
        const long UIA_AnnotationPatternId  = 10023;
        const long UIA_TextPattern2Id       = 10024;
        const long UIA_StylesPatternId      = 10025;
        const long UIA_SpreadsheetPatternId = 10026;
        const long UIA_SpreadsheetItemPatternId  = 10027;
        const long UIA_TransformPattern2Id       = 10028;
        const long UIA_TextChildPatternId        = 10029;
        const long UIA_DragPatternId             = 10030;
        const long UIA_DropTargetPatternId       = 10031;
        const long UIA_TextEditPatternId         = 10032;
        const long UIA_CustomNavigationPatternId = 10033;
    /*
    }
    */

    /* FIXME: Uncomment when properly supported in widl
    [dllname("<no entry points>")]
    module UIA_EventIds
    {
    */
        const long UIA_ToolTipOpenedEventId = 20000;
        const long UIA_ToolTipClosedEventId = 20001;
        const long UIA_StructureChangedEventId = 20002;
        const long UIA_MenuOpenedEventId = 20003;
        const long UIA_AutomationPropertyChangedEventId = 20004;
        const long UIA_AutomationFocusChangedEventId = 20005;
        const long UIA_AsyncContentLoadedEventId = 20006;
        const long UIA_MenuClosedEventId = 20007;
        const long UIA_LayoutInvalidatedEventId = 20008;
        const long UIA_Invoke_InvokedEventId = 20009;
        const long UIA_SelectionItem_ElementAddedToSelectionEventId = 20010;
        const long UIA_SelectionItem_ElementRemovedFromSelectionEventId = 20011;
        const long UIA_SelectionItem_ElementSelectedEventId= 20012;
        const long UIA_Selection_InvalidatedEventId = 20013;
        const long UIA_Text_TextSelectionChangedEventId = 20014;
        const long UIA_Text_TextChangedEventId = 20015;
        const long UIA_Window_WindowOpenedEventId = 20016;
        const long UIA_Window_WindowClosedEventId = 20017;
        const long UIA_MenuModeStartEventId = 20018;
        const long UIA_MenuModeEndEventId = 20019;
        const long UIA_InputReachedTargetEventId = 20020;
        const long UIA_InputReachedOtherElementEventId = 20021;
        const long UIA_InputDiscardedEventId = 20022;
        const long UIA_SystemAlertEventId = 20023;
        const long UIA_LiveRegionChangedEventId = 20024;
        const long UIA_HostedFragmentRootsInvalidatedEventId = 20025;
        const long UIA_Drag_DragStartEventId = 20026;
        const long UIA_Drag_DragCancelEventId = 20027;
        const long UIA_Drag_DragCompleteEventId = 20028;
        const long UIA_DropTarget_DragEnterEventId = 20029;
        const long UIA_DropTarget_DragLeaveEventId = 20030;
        const long UIA_DropTarget_DroppedEventId = 20031;
        const long UIA_TextEdit_TextChangedEventId = 20032;
        const long UIA_TextEdit_ConversionTargetChangedEventId = 20033;
        const long UIA_ChangesEventId = 20034;
        const long UIA_NotificationEventId = 20035;
    /*
    };
    */

    /* FIXME: Uncomment when properly supported in widl
    [dllname("<no entry points>")]
    module UIA_PropertyIds
    {
    */
        const long UIA_RuntimeIdPropertyId              = 30000;
        const long UIA_BoundingRectanglePropertyId      = 30001;
        const long UIA_ProcessIdPropertyId              = 30002;
        const long UIA_ControlTypePropertyId            = 30003;
        const long UIA_LocalizedControlTypePropertyId   = 30004;
        const long UIA_NamePropertyId                   = 30005;
        const long UIA_AcceleratorKeyPropertyId         = 30006;
        const long UIA_AccessKeyPropertyId              = 30007;
        const long UIA_HasKeyboardFocusPropertyId       = 30008;
        const long UIA_IsKeyboardFocusablePropertyId    = 30009;
        const long UIA_IsEnabledPropertyId              = 30010;
        const long UIA_AutomationIdPropertyId           = 30011;
        const long UIA_ClassNamePropertyId              = 30012;
        const long UIA_HelpTextPropertyId               = 30013;
        const long UIA_ClickablePointPropertyId         = 30014;
        const long UIA_CulturePropertyId                = 30015;
        const long UIA_IsControlElementPropertyId       = 30016;
        const long UIA_IsContentElementPropertyId       = 30017;
        const long UIA_LabeledByPropertyId              = 30018;
        const long UIA_IsPasswordPropertyId             = 30019;
        const long UIA_NativeWindowHandlePropertyId     = 30020;
        const long UIA_ItemTypePropertyId               = 30021;
        const long UIA_IsOffscreenPropertyId            = 30022;
        const long UIA_OrientationPropertyId            = 30023;
        const long UIA_FrameworkIdPropertyId            = 30024;
        const long UIA_IsRequiredForFormPropertyId      = 30025;
        const long UIA_ItemStatusPropertyId             = 30026;
        const long UIA_IsDockPatternAvailablePropertyId = 30027;
        const long UIA_IsExpandCollapsePatternAvailablePropertyId = 30028;
        const long UIA_IsGridItemPatternAvailablePropertyId       = 30029;
        const long UIA_IsGridPatternAvailablePropertyId           = 30030;
        const long UIA_IsInvokePatternAvailablePropertyId         = 30031;
        const long UIA_IsMultipleViewPatternAvailablePropertyId   = 30032;
        const long UIA_IsRangeValuePatternAvailablePropertyId     = 30033;
        const long UIA_IsScrollPatternAvailablePropertyId         = 30034;
        const long UIA_IsScrollItemPatternAvailablePropertyId     = 30035;
        const long UIA_IsSelectionItemPatternAvailablePropertyId  = 30036;
        const long UIA_IsSelectionPatternAvailablePropertyId      = 30037;
        const long UIA_IsTablePatternAvailablePropertyId          = 30038;
        const long UIA_IsTableItemPatternAvailablePropertyId      = 30039;
        const long UIA_IsTextPatternAvailablePropertyId           = 30040;
        const long UIA_IsTogglePatternAvailablePropertyId         = 30041;
        const long UIA_IsTransformPatternAvailablePropertyId      = 30042;
        const long UIA_IsValuePatternAvailablePropertyId          = 30043;
        const long UIA_IsWindowPatternAvailablePropertyId         = 30044;
        const long UIA_ValueValuePropertyId             = 30045;
        const long UIA_ValueIsReadOnlyPropertyId        = 30046;
        const long UIA_RangeValueValuePropertyId        = 30047;
        const long UIA_RangeValueIsReadOnlyPropertyId   = 30048;
        const long UIA_RangeValueMinimumPropertyId      = 30049;
        const long UIA_RangeValueMaximumPropertyId      = 30050;
        const long UIA_RangeValueLargeChangePropertyId  = 30051;
        const long UIA_RangeValueSmallChangePropertyId  = 30052;
        const long UIA_ScrollHorizontalScrollPercentPropertyId    = 30053;
        const long UIA_ScrollHorizontalViewSizePropertyId         = 30054;
        const long UIA_ScrollVerticalScrollPercentPropertyId      = 30055;
        const long UIA_ScrollVerticalViewSizePropertyId           = 30056;
        const long UIA_ScrollHorizontallyScrollablePropertyId     = 30057;
        const long UIA_ScrollVerticallyScrollablePropertyId       = 30058;
        const long UIA_SelectionSelectionPropertyId               = 30059;
        const long UIA_SelectionCanSelectMultiplePropertyId       = 30060;
        const long UIA_SelectionIsSelectionRequiredPropertyId     = 30061;
        const long UIA_GridRowCountPropertyId           = 30062;
        const long UIA_GridColumnCountPropertyId        = 30063;
        const long UIA_GridItemRowPropertyId            = 30064;
        const long UIA_GridItemColumnPropertyId         = 30065;
        const long UIA_GridItemRowSpanPropertyId        = 30066;
        const long UIA_GridItemColumnSpanPropertyId     = 30067;
        const long UIA_GridItemContainingGridPropertyId = 30068;
        const long UIA_DockDockPositionPropertyId       = 30069;
        const long UIA_ExpandCollapseExpandCollapseStatePropertyId = 30070;
        const long UIA_MultipleViewCurrentViewPropertyId           = 30071;
        const long UIA_MultipleViewSupportedViewsPropertyId        = 30072;
        const long UIA_WindowCanMaximizePropertyId                 = 30073;
        const long UIA_WindowCanMinimizePropertyId                 = 30074;
        const long UIA_WindowWindowVisualStatePropertyId           = 30075;
        const long UIA_WindowWindowInteractionStatePropertyId      = 30076;
        const long UIA_WindowIsModalPropertyId                     = 30077;
        const long UIA_WindowIsTopmostPropertyId                   = 30078;
        const long UIA_SelectionItemIsSelectedPropertyId           = 30079;
        const long UIA_SelectionItemSelectionContainerPropertyId   = 30080;
        const long UIA_TableRowHeadersPropertyId                   = 30081;
        const long UIA_TableColumnHeadersPropertyId                = 30082;
        const long UIA_TableRowOrColumnMajorPropertyId             = 30083;
        const long UIA_TableItemRowHeaderItemsPropertyId           = 30084;
        const long UIA_TableItemColumnHeaderItemsPropertyId        = 30085;
        const long UIA_ToggleToggleStatePropertyId                 = 30086;
        const long UIA_TransformCanMovePropertyId                  = 30087;
        const long UIA_TransformCanResizePropertyId                = 30088;
        const long UIA_TransformCanRotatePropertyId                = 30089;
        const long UIA_IsLegacyIAccessiblePatternAvailablePropertyId  = 30090;
        const long UIA_LegacyIAccessibleChildIdPropertyId          = 30091;
        const long UIA_LegacyIAccessibleNamePropertyId             = 30092;
        const long UIA_LegacyIAccessibleValuePropertyId            = 30093;
        const long UIA_LegacyIAccessibleDescriptionPropertyId      = 30094;
        const long UIA_LegacyIAccessibleRolePropertyId             = 30095;
        const long UIA_LegacyIAccessibleStatePropertyId            = 30096;
        const long UIA_LegacyIAccessibleHelpPropertyId             = 30097;
        const long UIA_LegacyIAccessibleKeyboardShortcutPropertyId = 30098;
        const long UIA_LegacyIAccessibleSelectionPropertyId        = 30099;
        const long UIA_LegacyIAccessibleDefaultActionPropertyId    = 30100;
        const long UIA_AriaRolePropertyId                          = 30101;
        const long UIA_AriaPropertiesPropertyId                    = 30102;
        const long UIA_IsDataValidForFormPropertyId                = 30103;
        const long UIA_ControllerForPropertyId                     = 30104;
        const long UIA_DescribedByPropertyId                       = 30105;
        const long UIA_FlowsToPropertyId                           = 30106;
        const long UIA_ProviderDescriptionPropertyId               = 30107;
        const long UIA_IsItemContainerPatternAvailablePropertyId   = 30108;
        const long UIA_IsVirtualizedItemPatternAvailablePropertyId = 30109;
        const long UIA_IsSynchronizedInputPatternAvailablePropertyId  = 30110;
        const long UIA_OptimizeForVisualContentPropertyId      = 30111;
        const long UIA_IsObjectModelPatternAvailablePropertyId = 30112;
        const long UIA_AnnotationAnnotationTypeIdPropertyId    = 30113;
        const long UIA_AnnotationAnnotationTypeNamePropertyId  = 30114;
        const long UIA_AnnotationAuthorPropertyId              = 30115;
        const long UIA_AnnotationDateTimePropertyId            = 30116;
        const long UIA_AnnotationTargetPropertyId              = 30117;
        const long UIA_IsAnnotationPatternAvailablePropertyId  = 30118;
        const long UIA_IsTextPattern2AvailablePropertyId       = 30119;
        const long UIA_StylesStyleIdPropertyId                 = 30120;
        const long UIA_StylesStyleNamePropertyId               = 30121;
        const long UIA_StylesFillColorPropertyId               = 30122;
        const long UIA_StylesFillPatternStylePropertyId        = 30123;
        const long UIA_StylesShapePropertyId                   = 30124;
        const long UIA_StylesFillPatternColorPropertyId        = 30125;
        const long UIA_StylesExtendedPropertiesPropertyId      = 30126;
        const long UIA_IsStylesPatternAvailablePropertyId      = 30127;
        const long UIA_IsSpreadsheetPatternAvailablePropertyId     = 30128;
        const long UIA_SpreadsheetItemFormulaPropertyId            = 30129;
        const long UIA_SpreadsheetItemAnnotationObjectsPropertyId  = 30130;
        const long UIA_SpreadsheetItemAnnotationTypesPropertyId    = 30131;
        const long UIA_IsSpreadsheetItemPatternAvailablePropertyId = 30132;
        const long UIA_Transform2CanZoomPropertyId                 = 30133;
        const long UIA_IsTransformPattern2AvailablePropertyId      = 30134;
        const long UIA_LiveSettingPropertyId                       = 30135;
        const long UIA_IsTextChildPatternAvailablePropertyId       = 30136;
        const long UIA_IsDragPatternAvailablePropertyId            = 30137;
        const long UIA_DragIsGrabbedPropertyId                     = 30138;
        const long UIA_DragDropEffectPropertyId                    = 30139;
        const long UIA_DragDropEffectsPropertyId                   = 30140;
        const long UIA_IsDropTargetPatternAvailablePropertyId      = 30141;
        const long UIA_DropTargetDropTargetEffectPropertyId        = 30142;
        const long UIA_DropTargetDropTargetEffectsPropertyId       = 30143;
        const long UIA_DragGrabbedItemsPropertyId                  = 30144;
        const long UIA_Transform2ZoomLevelPropertyId               = 30145;
        const long UIA_Transform2ZoomMinimumPropertyId             = 30146;
        const long UIA_Transform2ZoomMaximumPropertyId             = 30147;
        const long UIA_FlowsFromPropertyId                         = 30148;
        const long UIA_IsTextEditPatternAvailablePropertyId        = 30149;
        const long UIA_IsPeripheralPropertyId                      = 30150;
        const long UIA_IsCustomNavigationPatternAvailablePropertyId = 30151;
        const long UIA_PositionInSetPropertyId         = 30152;
        const long UIA_SizeOfSetPropertyId             = 30153;
        const long UIA_LevelPropertyId                 = 30154;
        const long UIA_AnnotationTypesPropertyId       = 30155;
        const long UIA_AnnotationObjectsPropertyId     = 30156;
        const long UIA_LandmarkTypePropertyId          = 30157;
        const long UIA_LocalizedLandmarkTypePropertyId = 30158;
        const long UIA_FullDescriptionPropertyId       = 30159;
        const long UIA_FillColorPropertyId             = 30160;
        const long UIA_OutlineColorPropertyId          = 30161;
        const long UIA_FillTypePropertyId              = 30162;
        const long UIA_VisualEffectsPropertyId         = 30163;
        const long UIA_OutlineThicknessPropertyId      = 30164;
        const long UIA_CenterPointPropertyId           = 30165;
        const long UIA_RotationPropertyId              = 30166;
        const long UIA_SizePropertyId                  = 30167;
        const long UIA_IsSelectionPattern2AvailablePropertyId  = 30168;
        const long UIA_Selection2FirstSelectedItemPropertyId   = 30169;
        const long UIA_Selection2LastSelectedItemPropertyId    = 30170;
        const long UIA_Selection2CurrentSelectedItemPropertyId = 30171;
        const long UIA_Selection2ItemCountPropertyId           = 30172;
        const long UIA_HeadingLevelPropertyId                  = 30173;
        const long UIA_IsDialogPropertyId                      = 30174;
    /*
    }
    */
    /* FIXME: Uncomment when properly supported in widl
    [dllname("<no entry points>")]
    module UIA_ControlTypeIds
    {
    */
        const long UIA_ButtonControlTypeId = 50000;
        const long UIA_CalendarControlTypeId = 50001;
        const long UIA_CheckBoxControlTypeId = 50002;
        const long UIA_ComboBoxControlTypeId = 50003;
        const long UIA_EditControlTypeId = 50004;
        const long UIA_HyperlinkControlTypeId = 50005;
        const long UIA_ImageControlTypeId = 50006;
        const long UIA_ListItemControlTypeId = 50007;
        const long UIA_ListControlTypeId = 50008;
        const long UIA_MenuControlTypeId = 50009;
        const long UIA_MenuBarControlTypeId = 50010;
        const long UIA_MenuItemControlTypeId = 50011;
        const long UIA_ProgressBarControlTypeId = 50012;
        const long UIA_RadioButtonControlTypeId = 50013;
        const long UIA_ScrollBarControlTypeId = 50014;
        const long UIA_SliderControlTypeId = 50015;
        const long UIA_SpinnerControlTypeId = 50016;
        const long UIA_StatusBarControlTypeId = 50017;
        const long UIA_TabControlTypeId = 50018;
        const long UIA_TabItemControlTypeId = 50019;
        const long UIA_TextControlTypeId = 50020;
        const long UIA_ToolBarControlTypeId = 50021;
        const long UIA_ToolTipControlTypeId = 50022;
        const long UIA_TreeControlTypeId = 50023;
        const long UIA_TreeItemControlTypeId = 50024;
        const long UIA_CustomControlTypeId = 50025;
        const long UIA_GroupControlTypeId = 50026;
        const long UIA_ThumbControlTypeId = 50027;
        const long UIA_DataGridControlTypeId = 50028;
        const long UIA_DataItemControlTypeId = 50029;
        const long UIA_DocumentControlTypeId = 50030;
        const long UIA_SplitButtonControlTypeId = 50031;
        const long UIA_WindowControlTypeId = 50032;
        const long UIA_PaneControlTypeId = 50033;
        const long UIA_HeaderControlTypeId = 50034;
        const long UIA_HeaderItemControlTypeId = 50035;
        const long UIA_TableControlTypeId = 50036;
        const long UIA_TitleBarControlTypeId = 50037;
        const long UIA_SeparatorControlTypeId = 50038;
        const long UIA_SemanticZoomControlTypeId = 50039;
        const long UIA_AppBarControlTypeId = 50040;
    /*
    };
    */

    interface IUIAutomationElement;
    interface IUIAutomationElementArray;

    [
        object,
        uuid(352ffba8-0973-437c-a61f-f64cafd81df9),
        pointer_default(unique)
    ]
    interface IUIAutomationCondition : IUnknown
    {
    }

    [
        object,
        uuid(1b4e1f2e-75eb-4d0b-8952-5a69988e2307),
        pointer_default(unique)
    ]
    interface IUIAutomationBoolCondition : IUIAutomationCondition
    {
        [propget] HRESULT BooleanValue([out, retval] BOOL *boolVal);
    }

    [
        object,
        uuid(99ebf2cb-5578-4267-9ad4-afd6ea77e94b),
        pointer_default(unique)
    ]
    interface IUIAutomationPropertyCondition : IUIAutomationCondition
    {
        [propget] HRESULT PropertyId([out, retval] PROPERTYID *propertyId);
        [propget] HRESULT PropertyValue([out, retval] VARIANT *propertyValue);
        [propget] HRESULT PropertyConditionFlags([out, retval] enum PropertyConditionFlags *flags);
    }

    [
        object,
        uuid(a7d0af36-b912-45fe-9855-091ddc174aec),
        pointer_default(unique)
    ]
    interface IUIAutomationAndCondition : IUIAutomationCondition
    {
        [propget] HRESULT ChildCount([out, retval] int *childCount);

        HRESULT GetChildrenAsNativeArray(
                [out, size_is( ,*childArrayCount)] IUIAutomationCondition ***childArray,
                [out] int *childArrayCount);

        HRESULT GetChildren([out, retval] SAFEARRAY(IUIAutomationCondition) *childArray);
    }

    [
        object,
        uuid(8753f032-3db1-47b5-a1fc-6e34a266c712),
        pointer_default(unique)
    ]
    interface IUIAutomationOrCondition : IUIAutomationCondition
    {
        [propget] HRESULT ChildCount([out, retval] int *childCount);

        HRESULT GetChildrenAsNativeArray(
                [out, size_is( ,*childArrayCount)] IUIAutomationCondition ***childArray,
                [out] int *childArrayCount);

        HRESULT GetChildren([out, retval] SAFEARRAY(IUIAutomationCondition) *childArray);
    }

    [
        object,
        uuid(f528b657-847b-498c-8896-d52b565407a1),
        pointer_default(unique)
    ]
    interface IUIAutomationNotCondition : IUIAutomationCondition
    {
        HRESULT GetChild([out, retval] IUIAutomationCondition **condition);
    }

    [
        object,
        uuid(b32a92b5-bc25-4078-9c08-d7ee95c48e03),
        pointer_default(unique)
    ]
    interface IUIAutomationCacheRequest : IUnknown
    {
        HRESULT AddProperty([in] PROPERTYID propertyId);
        HRESULT AddPattern([in] PATTERNID patternId);
        HRESULT Clone([out, retval] IUIAutomationCacheRequest **clonedRequest);

        [propget] HRESULT TreeScope([out, retval] enum TreeScope *scope);
        [propput] HRESULT TreeScope([in] enum TreeScope scope);
        [propget] HRESULT TreeFilter([out, retval] IUIAutomationCondition **filter);
        [propput] HRESULT TreeFilter([in] IUIAutomationCondition *filter);
        [propget] HRESULT AutomationElementMode([out, retval] enum AutomationElementMode *mode);
        [propput] HRESULT AutomationElementMode([in] enum AutomationElementMode mode);
    }

    [
        object,
        uuid(4042c624-389c-4afc-a630-9df854a541fc),
        pointer_default(unique)
    ]
    interface IUIAutomationTreeWalker : IUnknown
    {
        HRESULT GetParentElement(
                [in] IUIAutomationElement *element,
                [out, retval] IUIAutomationElement **parent);
        HRESULT GetFirstChildElement(
                [in] IUIAutomationElement *element,
                [out, retval] IUIAutomationElement **first);
        HRESULT GetLastChildElement(
                [in] IUIAutomationElement *element,
                [out, retval] IUIAutomationElement **last);
        HRESULT GetNextSiblingElement(
                [in] IUIAutomationElement *element,
                [out, retval] IUIAutomationElement **next);
        HRESULT GetPreviousSiblingElement(
                [in] IUIAutomationElement *element,
                [out, retval] IUIAutomationElement **previous);
        HRESULT NormalizeElement(
                [in] IUIAutomationElement *element,
                [out, retval] IUIAutomationElement **normalized);

        HRESULT GetParentElementBuildCache(
                [in] IUIAutomationElement *element,
                [in] IUIAutomationCacheRequest *cacheRequest,
                [out, retval] IUIAutomationElement **parent);
        HRESULT GetFirstChildElementBuildCache(
                [in] IUIAutomationElement *element,
                [in] IUIAutomationCacheRequest *cacheRequest,
                [out, retval] IUIAutomationElement **first);
        HRESULT GetLastChildElementBuildCache(
                [in] IUIAutomationElement *element,
                [in] IUIAutomationCacheRequest *cacheRequest,
                [out, retval] IUIAutomationElement **last);
        HRESULT GetNextSiblingElementBuildCache(
                [in] IUIAutomationElement *element,
                [in] IUIAutomationCacheRequest *cacheRequest,
                [out, retval] IUIAutomationElement **next);
        HRESULT GetPreviousSiblingElementBuildCache(
                [in] IUIAutomationElement *element,
                [in] IUIAutomationCacheRequest *cacheRequest,
                [out, retval] IUIAutomationElement **previous);
        HRESULT NormalizeElementBuildCache(
                [in] IUIAutomationElement *element,
                [in] IUIAutomationCacheRequest *cacheRequest,
                [out, retval] IUIAutomationElement **normalized);

        [propget] HRESULT Condition([out, retval] IUIAutomationCondition **condition);
    }

    [
        object,
        uuid(146c3c17-f12e-4e22-8c27-f894b9b79c69),
        pointer_default(unique),
        oleautomation
    ]
    interface IUIAutomationEventHandler : IUnknown
    {
        HRESULT HandleAutomationEvent(
                [in] IUIAutomationElement *sender,
                [in] EVENTID eventId);
    }

    [
        object,
        uuid(40cd37d4-c756-4b0c-8c6f-bddfeeb13b50),
        pointer_default(unique),
        oleautomation
    ]
    interface IUIAutomationPropertyChangedEventHandler : IUnknown
    {
        HRESULT HandlePropertyChangedEvent(
                [in] IUIAutomationElement *sender,
                [in] PROPERTYID propertyId,
                [in] VARIANT newValue);
    }

    [
        object,
        uuid(e81d1b4e-11c5-42f8-9754-e7036c79f054),
        pointer_default(unique),
        oleautomation
    ]
    interface IUIAutomationStructureChangedEventHandler : IUnknown
    {
        HRESULT HandleStructureChangedEvent(
                [in] IUIAutomationElement *sender,
                [in] enum StructureChangeType changeType,
                [in] SAFEARRAY(int) runtimeId);
    }

    [
        object,
        uuid(c270f6b5-5c69-4290-9745-7a7f97169468),
        pointer_default(unique),
        oleautomation
    ]
    interface IUIAutomationFocusChangedEventHandler : IUnknown
    {
        HRESULT HandleFocusChangedEvent([in] IUIAutomationElement *sender);
    }

    [
        object,
        uuid(92faa680-e704-4156-931a-e32d5bb38f3f),
        pointer_default(unique),
        oleautomation
    ]
    interface IUIAutomationTextEditTextChangedEventHandler : IUnknown
    {
        HRESULT HandleTextEditTextChangedEvent(
                [in] IUIAutomationElement *sender,
                [in] enum TextEditChangeType textEditChangeType,
                [in] SAFEARRAY(BSTR) eventStrings);
    }

    [
        object,
        uuid(58edca55-2c3e-4980-b1b9-56c17f27a2a0),
        pointer_default(unique),
        oleautomation
    ]
    interface IUIAutomationChangesEventHandler : IUnknown
    {
        HRESULT HandleChangesEvent(
                [in] IUIAutomationElement *sender,
                [in, size_is(changesCount)] struct UiaChangeInfo *uiaChanges,
                [in] int changesCount);
    }

    [
        object,
        uuid(c7cb2637-e6c2-4d0c-85de-4948c02175c7),
        pointer_default(unique),
        oleautomation
    ]
    interface IUIAutomationNotificationEventHandler : IUnknown
    {
        HRESULT HandleNotificationEvent(
                [in] IUIAutomationElement *sender,
                enum NotificationKind notificationKind,
                enum NotificationProcessing notificationProcessing,
                [in] BSTR displayString,
                [in] BSTR activityId);
    }

    [
        object,
        uuid(fb377fbe-8ea6-46d5-9c73-6499642d3059),
        pointer_default(unique)
    ]
    interface IUIAutomationInvokePattern : IUnknown
    {
        HRESULT Invoke();
    }

    [
        object,
        uuid(fde5ef97-1464-48f6-90bf-43d0948e86ec),
        pointer_default(unique)
    ]
    interface IUIAutomationDockPattern : IUnknown
    {
        HRESULT SetDockPosition([in] enum DockPosition dockPos);
        [propget] HRESULT CurrentDockPosition([out, retval] enum DockPosition *retVal);
        [propget] HRESULT CachedDockPosition([out, retval] enum DockPosition *retVal);
    }

    [
        object,
        uuid(619be086-1f4e-4ee4-bafa-210128738730),
        pointer_default(unique)
    ]
    interface IUIAutomationExpandCollapsePattern : IUnknown
    {
        HRESULT Expand();
        HRESULT Collapse();
        [propget] HRESULT CurrentExpandCollapseState([out, retval] enum ExpandCollapseState *retVal);
        [propget] HRESULT CachedExpandCollapseState([out, retval] enum ExpandCollapseState *retVal);
    }

    [
        object,
        uuid(414c3cdc-856b-4f5b-8538-3131c6302550),
        pointer_default(unique)
    ]
    interface IUIAutomationGridPattern : IUnknown
    {
        HRESULT GetItem(
                [in] int row,
                [in] int column,
                [out, retval] IUIAutomationElement **element);

        [propget] HRESULT CurrentRowCount([out, retval] int *retVal);
        [propget] HRESULT CurrentColumnCount([out, retval] int *retVal);
        [propget] HRESULT CachedRowCount([out, retval] int *retVal);
        [propget] HRESULT CachedColumnCount([out, retval] int *retVal);
    }

    [
        object,
        uuid(78f8ef57-66c3-4e09-bd7c-e79b2004894d),
        pointer_default(unique)
    ]
    interface IUIAutomationGridItemPattern : IUnknown
    {
        [propget] HRESULT CurrentContainingGrid([out, retval] IUIAutomationElement **retVal);
        [propget] HRESULT CurrentRow([out, retval] int *retVal);
        [propget] HRESULT CurrentColumn([out, retval] int *retVal);
        [propget] HRESULT CurrentRowSpan([out, retval] int *retVal);
        [propget] HRESULT CurrentColumnSpan([out, retval] int *retVal);
        [propget] HRESULT CachedContainingGrid([out, retval] IUIAutomationElement **retVal);
        [propget] HRESULT CachedRow([out, retval] int *retVal);
        [propget] HRESULT CachedColumn([out, retval] int *retVal);
        [propget] HRESULT CachedRowSpan([out, retval] int *retVal);
        [propget] HRESULT CachedColumnSpan([out, retval] int *retVal);
    }

    [
        object,
        uuid(8d253c91-1dc5-4bb5-b18f-ade16fa495e8),
        pointer_default(unique)
    ]
    interface IUIAutomationMultipleViewPattern : IUnknown
    {
        HRESULT GetViewName(
                [in] int view,
                [out, retval] BSTR *name);

        HRESULT SetCurrentView([in] int view);

        [propget] HRESULT CurrentCurrentView([out, retval] int *retVal);
        HRESULT GetCurrentSupportedViews([out, retval] SAFEARRAY(int) *retVal);

        [propget] HRESULT CachedCurrentView([out, retval] int *retVal);
        HRESULT GetCachedSupportedViews([out, retval] SAFEARRAY(int) *retVal);
    }

    [
        object,
        uuid(71c284b3-c14d-4d14-981e-19751b0d756d),
        pointer_default(unique)
    ]
    interface IUIAutomationObjectModelPattern : IUnknown
    {
        HRESULT GetUnderlyingObjectModel([out, retval] IUnknown **retVal);
    }

    [
        object,
        uuid(59213f4f-7346-49e5-b120-80555987a148),
        pointer_default(unique)
    ]
    interface IUIAutomationRangeValuePattern : IUnknown
    {
        HRESULT SetValue([in] double val);

        [propget] HRESULT CurrentValue([out, retval] double *retVal);
        [propget] HRESULT CurrentIsReadOnly([out, retval] BOOL *retVal);
        [propget] HRESULT CurrentMaximum([out, retval] double *retVal);
        [propget] HRESULT CurrentMinimum([out, retval] double *retVal);
        [propget] HRESULT CurrentLargeChange([out, retval] double *retVal);
        [propget] HRESULT CurrentSmallChange([out, retval] double *retVal);

        [propget] HRESULT CachedValue([out, retval] double *retVal);
        [propget] HRESULT CachedIsReadOnly([out, retval] BOOL *retVal);
        [propget] HRESULT CachedMaximum([out, retval] double *retVal);
        [propget] HRESULT CachedMinimum([out, retval] double *retVal);
        [propget] HRESULT CachedLargeChange([out, retval] double *retVal);
        [propget] HRESULT CachedSmallChange([out, retval] double *retVal);
    }

    [
        object,
        uuid(88f4d42a-e881-459d-a77c-73bbbb7e02dc),
        pointer_default(unique)
    ]
    interface IUIAutomationScrollPattern : IUnknown
    {
        HRESULT Scroll(
                [in] enum ScrollAmount horizontalAmount,
                [in] enum ScrollAmount verticalAmount);
        HRESULT SetScrollPercent(
                [in] double horizontalPercent,
                [in] double verticalPercent);

        [propget] HRESULT CurrentHorizontalScrollPercent([out, retval] double *retVal);
        [propget] HRESULT CurrentVerticalScrollPercent([out, retval] double *retVal);
        [propget] HRESULT CurrentHorizontalViewSize([out, retval] double *retVal);
        [propget] HRESULT CurrentVerticalViewSize([out, retval] double *retVal);
        [propget] HRESULT CurrentHorizontallyScrollable([out, retval] BOOL *retVal);
        [propget] HRESULT CurrentVerticallyScrollable([out, retval] BOOL *retVal);

        [propget] HRESULT CachedHorizontalScrollPercent([out, retval] double *retVal);
        [propget] HRESULT CachedVerticalScrollPercent([out, retval] double *retVal);
        [propget] HRESULT CachedHorizontalViewSize([out, retval] double *retVal);
        [propget] HRESULT CachedVerticalViewSize([out, retval] double *retVal);
        [propget] HRESULT CachedHorizontallyScrollable([out, retval] BOOL *retVal);
        [propget] HRESULT CachedVerticallyScrollable([out, retval] BOOL *retVal);
    }

    [
        object,
        uuid(b488300f-d015-4f19-9c29-bb595e3645ef),
        pointer_default(unique)
    ]
    interface IUIAutomationScrollItemPattern : IUnknown
    {
        HRESULT ScrollIntoView();
    }

    [
        object,
        uuid(5ed5202e-b2ac-47a6-b638-4b0bf140d78e),
        pointer_default(unique)
    ]
    interface IUIAutomationSelectionPattern : IUnknown
    {
        HRESULT GetCurrentSelection([out, retval] IUIAutomationElementArray **retVal);
        [propget] HRESULT CurrentCanSelectMultiple([out, retval] BOOL *retVal);
        [propget] HRESULT CurrentIsSelectionRequired([out, retval] BOOL *retVal);

        HRESULT GetCachedSelection([out, retval] IUIAutomationElementArray **retVal);
        [propget] HRESULT CachedCanSelectMultiple([out, retval] BOOL *retVal);
        [propget] HRESULT CachedIsSelectionRequired([out, retval] BOOL *retVal);
    }

    [
        object,
        uuid(a8efa66a-0fda-421a-9194-38021f3578ea),
        pointer_default(unique)
    ]
    interface IUIAutomationSelectionItemPattern : IUnknown
    {
        HRESULT Select();
        HRESULT AddToSelection();
        HRESULT RemoveFromSelection();

        [propget] HRESULT CurrentIsSelected([out, retval] BOOL *retVal);
        [propget] HRESULT CurrentSelectionContainer([out, retval] IUIAutomationElement **retVal);

        [propget] HRESULT CachedIsSelected([out, retval] BOOL *retVal);
        [propget] HRESULT CachedSelectionContainer([out, retval] IUIAutomationElement **retVal);
    }

    [
        object,
        uuid(2233be0b-afb7-448b-9fda-3b378aa5eae1),
        pointer_default(unique)
    ]
    interface IUIAutomationSynchronizedInputPattern : IUnknown
    {
        HRESULT StartListening([in] enum SynchronizedInputType inputType);
        HRESULT Cancel();
    }

    [
        object,
        uuid(620e691c-ea96-4710-a850-754b24ce2417),
        pointer_default(unique)
    ]
    interface IUIAutomationTablePattern : IUnknown
    {
        HRESULT GetCurrentRowHeaders([out, retval] IUIAutomationElementArray **retVal);
        HRESULT GetCurrentColumnHeaders([out, retval] IUIAutomationElementArray **retVal);
        [propget] HRESULT CurrentRowOrColumnMajor([out, retval] enum RowOrColumnMajor *retVal);

        HRESULT GetCachedRowHeaders([out, retval] IUIAutomationElementArray **retVal);
        HRESULT GetCachedColumnHeaders([out, retval] IUIAutomationElementArray **retVal);
        [propget] HRESULT CachedRowOrColumnMajor([out, retval] enum RowOrColumnMajor *retVal);
    }

    [
        object,
        uuid(0b964eb3-ef2e-4464-9c79-61d61737a27e),
        pointer_default(unique)
    ]
    interface IUIAutomationTableItemPattern : IUnknown
    {
        HRESULT GetCurrentRowHeaderItems([out, retval] IUIAutomationElementArray **retVal);
        HRESULT GetCurrentColumnHeaderItems([out, retval] IUIAutomationElementArray **retVal);

        HRESULT GetCachedRowHeaderItems([out, retval] IUIAutomationElementArray **retVal);
        HRESULT GetCachedColumnHeaderItems([out, retval] IUIAutomationElementArray **retVal);
    }

    [
        object,
        uuid(94cf8058-9b8d-4ab9-8bfd-4cd0a33c8c70),
        pointer_default(unique)
    ]
    interface IUIAutomationTogglePattern : IUnknown
    {
        HRESULT Toggle();

        [propget] HRESULT CurrentToggleState([out, retval] enum ToggleState *retVal);
        [propget] HRESULT CachedToggleState([out, retval] enum ToggleState *retVal);
    }

    [
        object,
        uuid(a9b55844-a55d-4ef0-926d-569c16ff89bb),
        pointer_default(unique)
    ]
    interface IUIAutomationTransformPattern : IUnknown
    {
        HRESULT Move(
                [in] double x,
                [in] double y);
        HRESULT Resize(
                [in] double width,
                [in] double height);
        HRESULT Rotate([in] double degrees);

        [propget] HRESULT CurrentCanMove([out, retval] BOOL *retVal);
        [propget] HRESULT CurrentCanResize([out, retval] BOOL *retVal);
        [propget] HRESULT CurrentCanRotate([out, retval] BOOL *retVal);

        [propget] HRESULT CachedCanMove([out, retval] BOOL *retVal);
        [propget] HRESULT CachedCanResize([out, retval] BOOL *retVal);
        [propget] HRESULT CachedCanRotate([out, retval] BOOL *retVal);
    }

    [
        object,
        uuid(a94cd8b1-0844-4cd6-9d2d-640537ab39e9),
        pointer_default(unique)
    ]
    interface IUIAutomationValuePattern : IUnknown
    {
        HRESULT SetValue([in] BSTR val);

        [propget] HRESULT CurrentValue([out, retval] BSTR *retVal);
        [propget] HRESULT CurrentIsReadOnly([out, retval] BOOL *retVal);
        [propget] HRESULT CachedValue([out, retval] BSTR *retVal);
        [propget] HRESULT CachedIsReadOnly([out, retval] BOOL *retVal);
    }

    [
        object,
        uuid(0faef453-9208-43ef-bbb2-3b485177864f),
        pointer_default(unique)
    ]
    interface IUIAutomationWindowPattern : IUnknown
    {
        HRESULT Close();

        HRESULT WaitForInputIdle(
                [in] int milliseconds,
                [out, retval] BOOL *success);
        HRESULT SetWindowVisualState([in] enum WindowVisualState state);

        [propget] HRESULT CurrentCanMaximize([out, retval] BOOL *retVal);
        [propget] HRESULT CurrentCanMinimize([out, retval] BOOL *retVal);
        [propget] HRESULT CurrentIsModal([out, retval] BOOL *retVal);
        [propget] HRESULT CurrentIsTopmost([out, retval] BOOL *retVal);
        [propget] HRESULT CurrentWindowVisualState([out, retval] enum WindowVisualState *retVal);
        [propget] HRESULT CurrentWindowInteractionState([out, retval] enum WindowInteractionState *retVal);
        [propget] HRESULT CachedCanMaximize([out, retval] BOOL *retVal);
        [propget] HRESULT CachedCanMinimize([out, retval] BOOL *retVal);
        [propget] HRESULT CachedIsModal([out, retval] BOOL *retVal);
        [propget] HRESULT CachedIsTopmost([out, retval] BOOL *retVal);
        [propget] HRESULT CachedWindowVisualState([out, retval] enum WindowVisualState *retVal);
        [propget] HRESULT CachedWindowInteractionState([out, retval] enum WindowInteractionState *retVal);
    }

    [
        object,
        uuid(a543cc6a-f4ae-494b-8239-c814481187a8),
        pointer_default(unique)
    ]
    interface IUIAutomationTextRange : IUnknown
    {
        HRESULT Clone([out, retval] IUIAutomationTextRange **clonedRange);
        HRESULT Compare(
                [in] IUIAutomationTextRange *range,
                [out, retval] BOOL *areSame);
        HRESULT CompareEndpoints(
                [in] enum TextPatternRangeEndpoint srcEndPoint,
                [in] IUIAutomationTextRange *range,
                [in] enum TextPatternRangeEndpoint targetEndPoint,
                [out, retval] int *compValue);

        HRESULT ExpandToEnclosingUnit([in] enum TextUnit textUnit);

        HRESULT FindAttribute(
                [in] TEXTATTRIBUTEID attr,
                [in] VARIANT val,
                [in] BOOL backward,
                [out, retval] IUIAutomationTextRange **found);
        HRESULT FindText(
                [in] BSTR text,
                [in] BOOL backward,
                [in] BOOL ignoreCase,
                [out, retval] IUIAutomationTextRange **found);

        HRESULT GetAttributeValue(
                [in] TEXTATTRIBUTEID attr,
                [out, retval] VARIANT *value);
        HRESULT GetBoundingRectangles([out, retval] SAFEARRAY(double) *boundingRects);
        HRESULT GetEnclosingElement([out, retval] IUIAutomationElement **enclosingElement);
        HRESULT GetText(
                [in] int maxLength,
                [out, retval] BSTR *text);

        HRESULT Move(
                [in] enum TextUnit unit,
                [in] int count,
                [out, retval] int *moved);
        HRESULT MoveEndpointByUnit(
                [in] enum TextPatternRangeEndpoint endpoint,
                [in] enum TextUnit unit,
                [in] int count,
                [out, retval] int *moved);
        HRESULT MoveEndpointByRange(
                [in] enum TextPatternRangeEndpoint srcEndPoint,
                [in] IUIAutomationTextRange *range,
                [in] enum TextPatternRangeEndpoint targetEndPoint);

        HRESULT Select();
        HRESULT AddToSelection();
        HRESULT RemoveFromSelection( );
        HRESULT ScrollIntoView([in] BOOL alignToTop);

        HRESULT GetChildren([out, retval] IUIAutomationElementArray **children);
    }

    [
        object,
        uuid(bb9b40e0-5e04-46bd-9be0-4b601b9afad4),
        pointer_default(unique)
    ]
    interface IUIAutomationTextRange2 : IUIAutomationTextRange
    {
        HRESULT ShowContextMenu();
    }

    [
        object,
        uuid(ce4ae76a-e717-4c98-81ea-47371d028eb6),
        pointer_default(unique)
    ]
    interface IUIAutomationTextRangeArray : IUnknown
    {
        [propget] HRESULT Length([out, retval] int *length);
        HRESULT GetElement(
                [in] int index,
                [out, retval] IUIAutomationTextRange **element);
    }

    [
        object,
        uuid(32eba289-3583-42c9-9c59-3b6d9a1e9b6a),
        pointer_default(unique)
    ]
    interface IUIAutomationTextPattern : IUnknown
    {
        HRESULT RangeFromPoint(
                [in] POINT pt,
                [out, retval] IUIAutomationTextRange **range);
        HRESULT RangeFromChild(
                [in] IUIAutomationElement *child,
                [out, retval] IUIAutomationTextRange **range);

        HRESULT GetSelection([out, retval] IUIAutomationTextRangeArray **ranges);
        HRESULT GetVisibleRanges([out, retval] IUIAutomationTextRangeArray **ranges);
        [propget] HRESULT DocumentRange([out, retval] IUIAutomationTextRange **range);
        [propget] HRESULT SupportedTextSelection([out, retval] enum SupportedTextSelection *supportedTextSelection);

    }

    [
        object,
        uuid(506a921a-fcc9-409f-b23b-37eb74106872),
        pointer_default(unique)
    ]
    interface IUIAutomationTextPattern2 : IUIAutomationTextPattern
    {
        HRESULT RangeFromAnnotation(
                [in] IUIAutomationElement *annotation,
                [out, retval] IUIAutomationTextRange **range);

        HRESULT GetCaretRange(
                [out] BOOL *isActive,
                [out, retval] IUIAutomationTextRange **range);
    }

    [
        object,
        uuid(17e21576-996c-4870-99d9-bff323380c06),
        pointer_default(unique)
    ]
    interface IUIAutomationTextEditPattern : IUIAutomationTextPattern
    {
        HRESULT GetActiveComposition([out, retval] IUIAutomationTextRange **range);
        HRESULT GetConversionTarget([out, retval] IUIAutomationTextRange **range);
    }

    [
        object,
        uuid(01ea217a-1766-47ed-a6cc-acf492854b1f),
        pointer_default(unique)
    ]
    interface IUIAutomationCustomNavigationPattern : IUnknown
    {
        HRESULT Navigate(
                [in] enum NavigateDirection direction,
                [out, retval] IUIAutomationElement **pRetVal);
    }

    [
        object,
        uuid(f97933b0-8dae-4496-8997-5ba015fe0d82),
        pointer_default(unique),
        oleautomation
    ]
    interface IUIAutomationActiveTextPositionChangedEventHandler : IUnknown
    {
        HRESULT HandleActiveTextPositionChangedEvent(
                [in] IUIAutomationElement *sender,
                [in] IUIAutomationTextRange *range);
    }

    [
        object,
        uuid(828055ad-355b-4435-86d5-3b51c14a9b1b),
        pointer_default(unique)
    ]
    interface IUIAutomationLegacyIAccessiblePattern: IUnknown
    {
        HRESULT Select(long flagsSelect);
        HRESULT DoDefaultAction();
        HRESULT SetValue(LPCWSTR szValue);

        [propget] HRESULT CurrentChildId([out, retval] int *pRetVal);
        [propget] HRESULT CurrentName([out, retval] BSTR *pszName);
        [propget] HRESULT CurrentValue([out, retval] BSTR *pszValue);
        [propget] HRESULT CurrentDescription([out, retval] BSTR *pszDescription);
        [propget] HRESULT CurrentRole([out, retval] DWORD *pdwRole);
        [propget] HRESULT CurrentState([out, retval] DWORD *pdwState);
        [propget] HRESULT CurrentHelp([out, retval] BSTR *pszHelp);
        [propget] HRESULT CurrentKeyboardShortcut([out, retval] BSTR *pszKeyboardShortcut);
        HRESULT GetCurrentSelection([out, retval] IUIAutomationElementArray **pvarSelectedChildren);
        [propget] HRESULT CurrentDefaultAction([out, retval] BSTR *pszDefaultAction);

        [propget] HRESULT CachedChildId([out, retval] int *pRetVal);
        [propget] HRESULT CachedName([out, retval] BSTR *pszName);
        [propget] HRESULT CachedValue([out, retval] BSTR *pszValue);
        [propget] HRESULT CachedDescription([out, retval] BSTR *pszDescription);
        [propget] HRESULT CachedRole([out, retval] DWORD *pdwRole);
        [propget] HRESULT CachedState([out, retval] DWORD *pdwState);
        [propget] HRESULT CachedHelp([out, retval] BSTR *pszHelp);
        [propget] HRESULT CachedKeyboardShortcut([out, retval] BSTR *pszKeyboardShortcut);
        HRESULT GetCachedSelection([out, retval] IUIAutomationElementArray **pvarSelectedChildren);
        [propget] HRESULT CachedDefaultAction([out, retval] BSTR *pszDefaultAction);

        HRESULT GetIAccessible([out, retval] IAccessible **ppAccessible);
    };

    [
        object,
        uuid(c690fdb2-27a8-423c-812d-429773c9084e),
        pointer_default(unique)
    ]
    interface IUIAutomationItemContainerPattern : IUnknown
    {
        HRESULT FindItemByProperty(
                [in] IUIAutomationElement *pStartAfter,
                [in] PROPERTYID propertyId,
                [in] VARIANT value,
                [out, retval] IUIAutomationElement **pFound);
    };

    [
        object,
        uuid(6ba3d7a6-04cf-4f11-8793-a8d1cde9969f),
        pointer_default(unique)
    ]
    interface IUIAutomationVirtualizedItemPattern : IUnknown
    {
        HRESULT Realize();
    };

    [
        object,
        uuid(9a175b21-339e-41b1-8e8b-623f6b681098),
        pointer_default(unique)
    ]
    interface IUIAutomationAnnotationPattern : IUnknown
    {
        [propget] HRESULT CurrentAnnotationTypeId([out, retval] int *retVal);
        [propget] HRESULT CurrentAnnotationTypeName([out, retval] BSTR *retVal);
        [propget] HRESULT CurrentAuthor( [out, retval] BSTR *retVal);
        [propget] HRESULT CurrentDateTime( [out, retval] BSTR *retVal);
        [propget] HRESULT CurrentTarget( [out, retval] IUIAutomationElement **retVal);

        [propget] HRESULT CachedAnnotationTypeId([out, retval] int *retVal);
        [propget] HRESULT CachedAnnotationTypeName([out, retval] BSTR *retVal);
        [propget] HRESULT CachedAuthor( [out, retval] BSTR *retVal);
        [propget] HRESULT CachedDateTime( [out, retval] BSTR *retVal);
        [propget] HRESULT CachedTarget( [out, retval] IUIAutomationElement **retVal);
    };

    [
        object,
        uuid(85b5f0a2-bd79-484a-ad2b-388c9838d5fb),
        pointer_default(unique)
    ]
    interface IUIAutomationStylesPattern : IUnknown
    {
        [propget] HRESULT CurrentStyleId([out, retval] int *retVal);
        [propget] HRESULT CurrentStyleName([out, retval] BSTR *retVal);
        [propget] HRESULT CurrentFillColor([out, retval] int *retVal);
        [propget] HRESULT CurrentFillPatternStyle([out, retval] BSTR *retVal);
        [propget] HRESULT CurrentShape([out, retval] BSTR *retVal);
        [propget] HRESULT CurrentFillPatternColor([out, retval] int *retVal);
        [propget] HRESULT CurrentExtendedProperties([out, retval] BSTR *retVal);
        HRESULT GetCurrentExtendedPropertiesAsArray(
                [out, size_is( ,*propertyCount)] struct ExtendedProperty **propertyArray,
                [out] int *propertyCount);

        [propget] HRESULT CachedStyleId([out, retval] int *retVal);
        [propget] HRESULT CachedStyleName([out, retval] BSTR *retVal);
        [propget] HRESULT CachedFillColor([out, retval] int *retVal);
        [propget] HRESULT CachedFillPatternStyle([out, retval] BSTR *retVal);
        [propget] HRESULT CachedShape([out, retval] BSTR *retVal);
        [propget] HRESULT CachedFillPatternColor([out, retval] int *retVal);
        [propget] HRESULT CachedExtendedProperties([out, retval] BSTR *retVal);
        HRESULT GetCachedExtendedPropertiesAsArray(
                [out, size_is( ,*propertyCount)] struct ExtendedProperty **propertyArray,
                [out] int *propertyCount);
    };

    [
        object,
        uuid(7517a7c8-faae-4de9-9f08-29b91e8595c1),
        pointer_default(unique)
    ]
    interface IUIAutomationSpreadsheetPattern : IUnknown
    {
        HRESULT GetItemByName(
                [in] BSTR name,
                [out, retval] IUIAutomationElement **element);
    };

    [
        object,
        uuid(7d4fb86c-8d34-40e1-8e83-62c15204e335),
        pointer_default(unique)
    ]
    interface IUIAutomationSpreadsheetItemPattern : IUnknown
    {
        [propget] HRESULT CurrentFormula([out, retval] BSTR *retVal);
        HRESULT GetCurrentAnnotationObjects([out, retval] IUIAutomationElementArray **retVal);
        HRESULT GetCurrentAnnotationTypes([out, retval] SAFEARRAY(int) *retVal);

        [propget] HRESULT CachedFormula([out, retval] BSTR *retVal);
        HRESULT GetCachedAnnotationObjects([out, retval] IUIAutomationElementArray **retVal);
        HRESULT GetCachedAnnotationTypes([out, retval] SAFEARRAY(int) *retVal);
    };

    [
        object,
        uuid(6d74d017-6ecb-4381-b38b-3c17a48ff1c2),
        pointer_default(unique)
    ]
    interface IUIAutomationTransformPattern2 : IUIAutomationTransformPattern
    {
        HRESULT Zoom([in] double zoomValue);
        HRESULT ZoomByUnit([in] enum ZoomUnit zoomUnit);

        [propget] HRESULT CurrentCanZoom([out, retval] BOOL *retVal);
        [propget] HRESULT CachedCanZoom([out, retval] BOOL *retVal);

        [propget] HRESULT CurrentZoomLevel([out, retval] double *retVal);
        [propget] HRESULT CachedZoomLevel([out, retval] double *retVal);

        [propget] HRESULT CurrentZoomMinimum([out, retval] double *retVal);
        [propget] HRESULT CachedZoomMinimum([out, retval] double *retVal);

        [propget] HRESULT CurrentZoomMaximum([out, retval] double *retVal);
        [propget] HRESULT CachedZoomMaximum([out, retval] double *retVal);
    }

    [
        object,
        uuid(6552b038-ae05-40c8-abfd-aa08352aab86),
        pointer_default(unique)
    ]
    interface IUIAutomationTextChildPattern : IUnknown
    {
        [propget] HRESULT TextContainer([out, retval] IUIAutomationElement **container);
        [propget] HRESULT TextRange([out, retval] IUIAutomationTextRange **range);
    }

    [
        object,
        uuid(1dc7b570-1f54-4bad-bcda-d36a722fb7bd),
        pointer_default(unique)
    ]
    interface IUIAutomationDragPattern : IUnknown
    {
        [propget] HRESULT CurrentIsGrabbed([out, retval] BOOL *retVal);
        [propget] HRESULT CachedIsGrabbed([out, retval] BOOL *retVal);

        [propget] HRESULT CurrentDropEffect([out, retval] BSTR *retVal);
        [propget] HRESULT CachedDropEffect([out, retval] BSTR *retVal);

        [propget] HRESULT CurrentDropEffects([out, retval] SAFEARRAY(BSTR) *retVal);
        [propget] HRESULT CachedDropEffects([out, retval] SAFEARRAY(BSTR) *retVal);

        HRESULT GetCurrentGrabbedItems([out, retval] IUIAutomationElementArray **retVal);
        HRESULT GetCachedGrabbedItems([out, retval] IUIAutomationElementArray **retVal);
    }

    [
        object,
        uuid(69a095f7-eee4-430e-a46b-fb73b1ae39a5),
        pointer_default(unique)
    ]
    interface IUIAutomationDropTargetPattern : IUnknown
    {
        [propget] HRESULT CurrentDropTargetEffect([out, retval] BSTR *retVal);
        [propget] HRESULT CachedDropTargetEffect([out, retval] BSTR *retVal);

        [propget] HRESULT CurrentDropTargetEffects([out, retval] SAFEARRAY(BSTR) *retVal);
        [propget] HRESULT CachedDropTargetEffects([out, retval] SAFEARRAY(BSTR) *retVal);
    }

    [
        object,
        uuid(d22108aa-8ac5-49a5-837b-37bbb3d7591e),
        pointer_default(unique)
    ]
    interface IUIAutomationElement : IUnknown
    {
        HRESULT SetFocus();
        HRESULT GetRuntimeId([out, retval] SAFEARRAY(int) *runtimeId);

        HRESULT FindFirst(
                [in] enum TreeScope scope,
                [in] IUIAutomationCondition *condition,
                [out, retval] IUIAutomationElement **found);
        HRESULT FindAll(
                [in] enum TreeScope scope,
                [in] IUIAutomationCondition *condition,
                [out, retval] IUIAutomationElementArray **found);

        HRESULT FindFirstBuildCache(
                [in] enum TreeScope scope,
                [in] IUIAutomationCondition *condition,
                [in] IUIAutomationCacheRequest *cacheRequest,
                [out, retval] IUIAutomationElement **found);
        HRESULT FindAllBuildCache(
                [in] enum TreeScope scope,
                [in] IUIAutomationCondition *condition,
                [in] IUIAutomationCacheRequest *cacheRequest,
                [out, retval] IUIAutomationElementArray **found);

        HRESULT BuildUpdatedCache(
                [in] IUIAutomationCacheRequest *cacheRequest,
                [out, retval] IUIAutomationElement **updatedElement);

        HRESULT GetCurrentPropertyValue(
                [in] PROPERTYID propertyId,
                [out, retval] VARIANT *retVal);
        HRESULT GetCurrentPropertyValueEx(
                [in] PROPERTYID propertyId,
                [in] BOOL ignoreDefaultValue,
                [out, retval] VARIANT *retVal);

        HRESULT GetCachedPropertyValue(
                [in] PROPERTYID propertyId,
                [out, retval] VARIANT *retVal);
        HRESULT GetCachedPropertyValueEx(
                [in] PROPERTYID propertyId,
                [in] BOOL ignoreDefaultValue,
                [out, retval] VARIANT *retVal);

        HRESULT GetCurrentPatternAs(
                [in] PATTERNID patternId,
                [in] REFIID riid,
                [out, iid_is(riid), retval] void **patternObject);
        HRESULT GetCachedPatternAs(
                [in] PATTERNID patternId,
                [in] REFIID riid,
                [out, iid_is(riid), retval] void **patternObject);

        HRESULT GetCurrentPattern(
                [in] PATTERNID patternId,
                [out, retval] IUnknown **patternObject);
        HRESULT GetCachedPattern(
                [in] PATTERNID patternId,
                [out, retval] IUnknown **patternObject);

        HRESULT GetCachedParent([out, retval] IUIAutomationElement **parent);
        HRESULT GetCachedChildren([out, retval] IUIAutomationElementArray **children);

        [propget] HRESULT CurrentProcessId([out, retval] int *retVal);
        [propget] HRESULT CurrentControlType([out, retval] CONTROLTYPEID *retVal);
        [propget] HRESULT CurrentLocalizedControlType([out, retval] BSTR *retVal);
        [propget] HRESULT CurrentName([out, retval] BSTR *retVal);
        [propget] HRESULT CurrentAcceleratorKey([out, retval] BSTR *retVal);
        [propget] HRESULT CurrentAccessKey([out, retval] BSTR *retVal);
        [propget] HRESULT CurrentHasKeyboardFocus([out, retval] BOOL *retVal);
        [propget] HRESULT CurrentIsKeyboardFocusable([out, retval] BOOL *retVal);
        [propget] HRESULT CurrentIsEnabled([out, retval] BOOL *retVal);
        [propget] HRESULT CurrentAutomationId([out, retval] BSTR *retVal);
        [propget] HRESULT CurrentClassName([out, retval] BSTR *retVal);
        [propget] HRESULT CurrentHelpText([out, retval] BSTR *retVal);
        [propget] HRESULT CurrentCulture([out, retval] int *retVal);
        [propget] HRESULT CurrentIsControlElement([out, retval] BOOL *retVal);
        [propget] HRESULT CurrentIsContentElement([out, retval] BOOL *retVal);
        [propget] HRESULT CurrentIsPassword([out, retval] BOOL *retVal);
        [propget] HRESULT CurrentNativeWindowHandle([out, retval] UIA_HWND *retVal);
        [propget] HRESULT CurrentItemType([out, retval] BSTR *retVal);
        [propget] HRESULT CurrentIsOffscreen([out, retval] BOOL *retVal);
        [propget] HRESULT CurrentOrientation([out, retval] enum OrientationType *retVal);
        [propget] HRESULT CurrentFrameworkId([out, retval] BSTR *retVal);
        [propget] HRESULT CurrentIsRequiredForForm([out, retval] BOOL *retVal);
        [propget] HRESULT CurrentItemStatus([out, retval] BSTR *retVal);
        [propget] HRESULT CurrentBoundingRectangle([out, retval] RECT *retVal);
        [propget] HRESULT CurrentLabeledBy([out, retval] IUIAutomationElement **retVal);
        [propget] HRESULT CurrentAriaRole([out, retval] BSTR *retVal);
        [propget] HRESULT CurrentAriaProperties([out, retval] BSTR *retVal);
        [propget] HRESULT CurrentIsDataValidForForm([out, retval] BOOL *retVal);
        [propget] HRESULT CurrentControllerFor([out, retval] IUIAutomationElementArray **retVal);
        [propget] HRESULT CurrentDescribedBy([out, retval] IUIAutomationElementArray **retVal);
        [propget] HRESULT CurrentFlowsTo([out, retval] IUIAutomationElementArray **retVal);
        [propget] HRESULT CurrentProviderDescription([out, retval] BSTR *retVal);

        [propget] HRESULT CachedProcessId([out, retval] int *retVal);
        [propget] HRESULT CachedControlType([out, retval] CONTROLTYPEID *retVal);
        [propget] HRESULT CachedLocalizedControlType([out, retval] BSTR *retVal);
        [propget] HRESULT CachedName([out, retval] BSTR *retVal);
        [propget] HRESULT CachedAcceleratorKey([out, retval] BSTR *retVal);
        [propget] HRESULT CachedAccessKey([out, retval] BSTR *retVal);
        [propget] HRESULT CachedHasKeyboardFocus([out, retval] BOOL *retVal);
        [propget] HRESULT CachedIsKeyboardFocusable([out, retval] BOOL *retVal);
        [propget] HRESULT CachedIsEnabled([out, retval] BOOL *retVal);
        [propget] HRESULT CachedAutomationId([out, retval] BSTR *retVal);
        [propget] HRESULT CachedClassName([out, retval] BSTR *retVal);
        [propget] HRESULT CachedHelpText([out, retval] BSTR *retVal);
        [propget] HRESULT CachedCulture([out, retval] int *retVal);
        [propget] HRESULT CachedIsControlElement([out, retval] BOOL *retVal);
        [propget] HRESULT CachedIsContentElement([out, retval] BOOL *retVal);
        [propget] HRESULT CachedIsPassword([out, retval] BOOL *retVal);
        [propget] HRESULT CachedNativeWindowHandle([out, retval] UIA_HWND *retVal);
        [propget] HRESULT CachedItemType([out, retval] BSTR *retVal);
        [propget] HRESULT CachedIsOffscreen([out, retval] BOOL *retVal);
        [propget] HRESULT CachedOrientation([out, retval] enum OrientationType *retVal);
        [propget] HRESULT CachedFrameworkId([out, retval] BSTR *retVal);
        [propget] HRESULT CachedIsRequiredForForm([out, retval] BOOL *retVal);
        [propget] HRESULT CachedItemStatus([out, retval] BSTR *retVal);
        [propget] HRESULT CachedBoundingRectangle([out, retval] RECT *retVal);
        [propget] HRESULT CachedLabeledBy([out, retval] IUIAutomationElement **retVal);
        [propget] HRESULT CachedAriaRole([out, retval] BSTR *retVal);
        [propget] HRESULT CachedAriaProperties([out, retval] BSTR *retVal);
        [propget] HRESULT CachedIsDataValidForForm([out, retval] BOOL *retVal);
        [propget] HRESULT CachedControllerFor([out, retval] IUIAutomationElementArray **retVal);
        [propget] HRESULT CachedDescribedBy([out, retval] IUIAutomationElementArray **retVal);
        [propget] HRESULT CachedFlowsTo([out, retval] IUIAutomationElementArray **retVal);
        [propget] HRESULT CachedProviderDescription([out, retval] BSTR *retVal);

        HRESULT GetClickablePoint(
                [out] POINT *clickable,
                [out, retval] BOOL *gotClickable);
    }

    [
        object,
        uuid(6749c683-f70d-4487-a698-5f79d55290d6),
        pointer_default(unique)
    ]
    interface IUIAutomationElement2 : IUIAutomationElement
    {
        [propget] HRESULT CurrentOptimizeForVisualContent([out, retval] BOOL *retVal);
        [propget] HRESULT CachedOptimizeForVisualContent([out, retval] BOOL *retVal);

        [propget] HRESULT CurrentLiveSetting([out, retval] enum LiveSetting *retVal);
        [propget] HRESULT CachedLiveSetting([out, retval] enum LiveSetting *retVal);

        [propget] HRESULT CurrentFlowsFrom([out, retval] IUIAutomationElementArray **retVal);
        [propget] HRESULT CachedFlowsFrom([out, retval] IUIAutomationElementArray **retVal);
    }

    [
        object,
        uuid(8471df34-aee0-4a01-a7de-7db9af12c296),
        pointer_default(unique)
    ]
    interface IUIAutomationElement3 : IUIAutomationElement2
    {
        HRESULT ShowContextMenu();

        [propget] HRESULT CurrentIsPeripheral([out, retval] BOOL *retVal);
        [propget] HRESULT CachedIsPeripheral([out, retval] BOOL *retVal);
    }

    [
        object,
        uuid(3b6e233c-52fb-4063-a4c9-77c075c2a06b),
        pointer_default(unique)
    ]
    interface IUIAutomationElement4 : IUIAutomationElement3
    {
        [propget] HRESULT CurrentPositionInSet([out, retval] int *retVal);
        [propget] HRESULT CurrentSizeOfSet([out, retval] int *retVal);
        [propget] HRESULT CurrentLevel([out, retval] int *retVal);
        [propget] HRESULT CurrentAnnotationTypes([out, retval] SAFEARRAY(int) *retVal);
        [propget] HRESULT CurrentAnnotationObjects([out, retval] IUIAutomationElementArray **retVal);

        [propget] HRESULT CachedPositionInSet([out, retval] int *retVal);
        [propget] HRESULT CachedSizeOfSet([out, retval] int *retVal);
        [propget] HRESULT CachedLevel([out, retval] int *retVal);
        [propget] HRESULT CachedAnnotationTypes([out, retval] SAFEARRAY(int) *retVal);
        [propget] HRESULT CachedAnnotationObjects([out, retval] IUIAutomationElementArray **retVal);
    }

    [
        object,
        uuid(98141c1d-0d0e-4175-bbe2-6bff455842a7),
        pointer_default(unique)
    ]
    interface IUIAutomationElement5 : IUIAutomationElement4
    {
        [propget] HRESULT CurrentLandmarkType([out, retval] LANDMARKTYPEID *retVal);
        [propget] HRESULT CurrentLocalizedLandmarkType([out, retval] BSTR *retVal);

        [propget] HRESULT CachedLandmarkType([out, retval] LANDMARKTYPEID *retVal);
        [propget] HRESULT CachedLocalizedLandmarkType([out, retval] BSTR *retVal);
    }

    [
        object,
        uuid(4780d450-8bca-4977-afa5-a4a517f555e3),
        pointer_default(unique)
    ]
    interface IUIAutomationElement6 : IUIAutomationElement5
    {
        [propget] HRESULT CurrentFullDescription([out, retval] BSTR *retVal);
        [propget] HRESULT CachedFullDescription([out, retval] BSTR *retVal);
    }

    [
        object,
        uuid(204e8572-cfc3-4c11-b0c8-7da7420750b7),
        pointer_default(unique)
    ]
    interface IUIAutomationElement7 : IUIAutomationElement6
    {
        HRESULT FindFirstWithOptions(
                [in] enum TreeScope scope,
                [in] IUIAutomationCondition *condition,
                [in] enum TreeTraversalOptions traversalOptions,
                [in] IUIAutomationElement *root,
                [out, retval] IUIAutomationElement **found);
        HRESULT FindAllWithOptions(
                [in] enum TreeScope scope,
                [in] IUIAutomationCondition *condition,
                [in] enum TreeTraversalOptions traversalOptions,
                [in] IUIAutomationElement *root,
                [out, retval] IUIAutomationElementArray **found);

        HRESULT FindFirstWithOptionsBuildCache(
                [in] enum TreeScope scope,
                [in] IUIAutomationCondition *condition,
                [in] IUIAutomationCacheRequest *cacheRequest,
                [in] enum TreeTraversalOptions traversalOptions,
                [in] IUIAutomationElement *root,
                [out, retval] IUIAutomationElement **found);
        HRESULT FindAllWithOptionsBuildCache(
                [in] enum TreeScope scope,
                [in] IUIAutomationCondition *condition,
                [in] IUIAutomationCacheRequest *cacheRequest,
                [in] enum TreeTraversalOptions traversalOptions,
                [in] IUIAutomationElement *root,
                [out, retval] IUIAutomationElementArray **found);

        HRESULT GetCurrentMetadataValue(
                [in] int targetId,
                [in] METADATAID metadataId,
                [out, retval] VARIANT *returnVal);
    }

    [
        object,
        uuid(8c60217d-5411-4cde-bcc0-1ceda223830c),
        pointer_default(unique)
    ]
    interface IUIAutomationElement8 : IUIAutomationElement7
    {
        [propget] HRESULT CurrentHeadingLevel([out, retval] HEADINGLEVELID *retVal);
        [propget] HRESULT CachedHeadingLevel([out, retval] HEADINGLEVELID *retVal);
    }

    [
        object,
        uuid(39325fac-039d-440e-a3a3-5eb81a5cecc3),
        pointer_default(unique)
    ]
    interface IUIAutomationElement9 : IUIAutomationElement8
    {
        [propget] HRESULT CurrentIsDialog([out, retval] BOOL *retVal);
        [propget] HRESULT CachedIsDialog([out, retval] BOOL *retVal);
    }

    [
        object,
        uuid(14314595-b4bc-4055-95f2-58f2e42c9855),
        pointer_default(unique)
    ]
    interface IUIAutomationElementArray : IUnknown
    {
        [propget] HRESULT Length([out, retval] int *length);

        HRESULT GetElement(
                [in] int index,
                [out, retval] IUIAutomationElement **element);
    }

    [
        object,
        uuid(85b94ecd-849d-42b6-b94d-d6db23fdf5a4),
        pointer_default(unique)
    ]
    interface IUIAutomationProxyFactory : IUnknown
    {
        HRESULT CreateProvider(
                [in] UIA_HWND hwnd,
                [in] LONG idObject,
                [in] LONG idChild,
                [out, retval] IRawElementProviderSimple **provider);

        [propget] HRESULT ProxyFactoryId([out, retval] BSTR *factoryId);
    }

    [
        object,
        uuid(d50e472e-b64b-490c-bca1-d30696f9f289),
        pointer_default(unique)
    ]
    interface IUIAutomationProxyFactoryEntry : IUnknown
    {
        [propget] HRESULT ProxyFactory([out, retval] IUIAutomationProxyFactory **factory);

        [propget] HRESULT ClassName([out, retval] BSTR *className);
        [propget] HRESULT ImageName([out, retval] BSTR *imageName);
        [propget] HRESULT AllowSubstringMatch([out, retval] BOOL *allowSubstringMatch);
        [propget] HRESULT CanCheckBaseClass([out, retval] BOOL *canCheckBaseClass);
        [propget] HRESULT NeedsAdviseEvents([out, retval] BOOL *adviseEvents);

        [propput] HRESULT ClassName([in] LPCWSTR className);
        [propput] HRESULT ImageName([in] LPCWSTR imageName);
        [propput] HRESULT AllowSubstringMatch([in] BOOL allowSubstringMatch);
        [propput] HRESULT CanCheckBaseClass([in] BOOL canCheckBaseClass);
        [propput] HRESULT NeedsAdviseEvents([in] BOOL adviseEvents);

        HRESULT SetWinEventsForAutomationEvent(
                [in] EVENTID eventId,
                [in] PROPERTYID propertyId,
                [in] SAFEARRAY(UINT) winEvents);
        HRESULT GetWinEventsForAutomationEvent(
                [in] EVENTID eventId,
                [in] PROPERTYID propertyId,
                [out, retval] SAFEARRAY(UINT) *winEvents);
    }

    [
        object,
        uuid(09e31e18-872d-4873-93d1-1e541ec133fd),
        pointer_default(unique)
    ]
    interface IUIAutomationProxyFactoryMapping : IUnknown
    {
        [propget] HRESULT Count([out, retval] UINT *count);

        HRESULT GetTable([out, retval] SAFEARRAY(IUIAutomationProxyFactoryEntry) *table);
        HRESULT GetEntry(
                [in] UINT index,
                [out, retval] IUIAutomationProxyFactoryEntry **entry);

        HRESULT SetTable([in] SAFEARRAY(IUIAutomationProxyFactoryEntry) factoryList);
        HRESULT InsertEntries(
                [in] UINT before,
                [in] SAFEARRAY(IUIAutomationProxyFactoryEntry) factoryList);
        HRESULT InsertEntry(
                [in] UINT before,
                [in] IUIAutomationProxyFactoryEntry *factory);

        HRESULT RemoveEntry([in] UINT index);
        HRESULT ClearTable();
        HRESULT RestoreDefaultTable();
    }

    [
        object,
        uuid(c9ee12f2-c13b-4408-997c-639914377f4e),
        pointer_default(unique)
    ]
    interface IUIAutomationEventHandlerGroup : IUnknown
    {
        HRESULT AddActiveTextPositionChangedEventHandler(
                [in] enum TreeScope scope,
                [in] IUIAutomationCacheRequest *cacheRequest,
                [in] IUIAutomationActiveTextPositionChangedEventHandler *handler);
        HRESULT AddAutomationEventHandler(
                [in] EVENTID eventId,
                [in] enum TreeScope scope,
                [in] IUIAutomationCacheRequest *cacheRequest,
                [in] IUIAutomationEventHandler *handler);
        HRESULT AddChangesEventHandler(
                [in] enum TreeScope scope,
                [in, size_is(changesCount)] int *changeTypes,
                [in] int changesCount,
                [in] IUIAutomationCacheRequest *cacheRequest,
                [in] IUIAutomationChangesEventHandler *handler);
        HRESULT AddNotificationEventHandler(
                [in] enum TreeScope scope,
                [in] IUIAutomationCacheRequest *cacheRequest,
                [in] IUIAutomationNotificationEventHandler *handler);
        HRESULT AddPropertyChangedEventHandler(
                [in] enum TreeScope scope,
                [in] IUIAutomationCacheRequest *cacheRequest,
                [in] IUIAutomationPropertyChangedEventHandler *handler,
                [in, size_is(propertyCount)] PROPERTYID *propertyArray,
                [in] int propertyCount);
        HRESULT AddStructureChangedEventHandler(
                [in] enum TreeScope scope,
                [in] IUIAutomationCacheRequest *cacheRequest,
                [in] IUIAutomationStructureChangedEventHandler *handler);
        HRESULT AddTextEditTextChangedEventHandler(
                [in] enum TreeScope scope,
                [in] enum TextEditChangeType textEditChangeType,
                [in] IUIAutomationCacheRequest *cacheRequest,
                [in] IUIAutomationTextEditTextChangedEventHandler *handler);
    }

    [
        object,
        uuid(30cbe57d-d9d0-452a-ab13-7ac5ac4825ee),
        pointer_default(unique)
    ]
    interface IUIAutomation : IUnknown
    {
        HRESULT CompareElements(
                [in] IUIAutomationElement *el1,
                [in] IUIAutomationElement *el2,
                [out, retval] BOOL *areSame);
        HRESULT CompareRuntimeIds(
                [in] SAFEARRAY(int) runtimeId1,
                [in] SAFEARRAY(int) runtimeId2,
                [out, retval] BOOL *areSame);

        HRESULT GetRootElement([out, retval] IUIAutomationElement **root);
        HRESULT ElementFromHandle(
                [in] UIA_HWND hwnd,
                [out, retval] IUIAutomationElement **element);
        HRESULT ElementFromPoint(
                [in] POINT pt,
                [out, retval] IUIAutomationElement **element);
        HRESULT GetFocusedElement([out, retval] IUIAutomationElement **element);

        HRESULT GetRootElementBuildCache(
                [in] IUIAutomationCacheRequest *cacheRequest,
                [out, retval] IUIAutomationElement **root);
        HRESULT ElementFromHandleBuildCache(
                [in] UIA_HWND hwnd,
                [in] IUIAutomationCacheRequest *cacheRequest,
                [out, retval] IUIAutomationElement **element);
        HRESULT ElementFromPointBuildCache(
                [in] POINT pt,
                [in] IUIAutomationCacheRequest *cacheRequest,
                [out, retval] IUIAutomationElement **element);
        HRESULT GetFocusedElementBuildCache(
                [in] IUIAutomationCacheRequest *cacheRequest,
                [out, retval] IUIAutomationElement **element);

        HRESULT CreateTreeWalker(
                [in] IUIAutomationCondition *pCondition,
                [out, retval] IUIAutomationTreeWalker **walker);

        [propget] HRESULT ControlViewWalker([out, retval] IUIAutomationTreeWalker **walker);
        [propget] HRESULT ContentViewWalker([out, retval] IUIAutomationTreeWalker **walker);
        [propget] HRESULT RawViewWalker([out, retval] IUIAutomationTreeWalker **walker);

        [propget] HRESULT RawViewCondition([out, retval] IUIAutomationCondition **condition);
        [propget] HRESULT ControlViewCondition([out, retval] IUIAutomationCondition **condition);
        [propget] HRESULT ContentViewCondition([out, retval] IUIAutomationCondition **condition);

        HRESULT CreateCacheRequest([out, retval] IUIAutomationCacheRequest **cacheRequest);

        HRESULT CreateTrueCondition([out, retval] IUIAutomationCondition **newCondition);
        HRESULT CreateFalseCondition([out, retval] IUIAutomationCondition **newCondition);
        HRESULT CreatePropertyCondition(
                [in] PROPERTYID propertyId,
                [in] VARIANT value,
                [out, retval] IUIAutomationCondition **newCondition);
        HRESULT CreatePropertyConditionEx(
                [in] PROPERTYID propertyId,
                [in] VARIANT value,
                [in] enum PropertyConditionFlags flags,
                [out, retval] IUIAutomationCondition **newCondition);

        HRESULT CreateAndCondition(
                [in] IUIAutomationCondition *condition1,
                [in] IUIAutomationCondition *condition2,
                [out, retval] IUIAutomationCondition **newCondition);
        HRESULT CreateAndConditionFromArray(
                [in] SAFEARRAY(IUIAutomationCondition) conditions,
                [out, retval] IUIAutomationCondition **newCondition);
        HRESULT CreateAndConditionFromNativeArray(
                [in, size_is(conditionCount)] IUIAutomationCondition **conditions,
                [in] int conditionCount,
                [out, retval] IUIAutomationCondition **newCondition);

        HRESULT CreateOrCondition(
                [in] IUIAutomationCondition *condition1,
                [in] IUIAutomationCondition *condition2,
                [out, retval] IUIAutomationCondition **newCondition);
        HRESULT CreateOrConditionFromArray(
                [in] SAFEARRAY(IUIAutomationCondition) conditions,
                [out, retval] IUIAutomationCondition **newCondition);
        HRESULT CreateOrConditionFromNativeArray(
                [in, size_is(conditionCount)] IUIAutomationCondition **conditions,
                [in] int conditionCount,
                [out, retval] IUIAutomationCondition **newCondition);

        HRESULT CreateNotCondition(
                [in] IUIAutomationCondition *condition,
                [out, retval] IUIAutomationCondition **newCondition);

        HRESULT AddAutomationEventHandler(
                [in] EVENTID eventId,
                [in] IUIAutomationElement *element,
                [in] enum TreeScope scope,
                [in] IUIAutomationCacheRequest *cacheRequest,
                [in] IUIAutomationEventHandler *handler);
        HRESULT RemoveAutomationEventHandler(
                [in] EVENTID eventId,
                [in] IUIAutomationElement *element,
                [in] IUIAutomationEventHandler *handler);

        HRESULT AddPropertyChangedEventHandlerNativeArray(
                [in] IUIAutomationElement *element,
                [in] enum TreeScope scope,
                [in] IUIAutomationCacheRequest *cacheRequest,
                [in] IUIAutomationPropertyChangedEventHandler *handler,
                [in, size_is(propertyCount)] PROPERTYID *propertyArray,
                [in] int propertyCount);
        HRESULT AddPropertyChangedEventHandler(
                [in] IUIAutomationElement *element,
                [in] enum TreeScope scope,
                [in] IUIAutomationCacheRequest *cacheRequest,
                [in] IUIAutomationPropertyChangedEventHandler *handler,
                [in] SAFEARRAY(PROPERTYID) propertyArray);
        HRESULT RemovePropertyChangedEventHandler(
                [in] IUIAutomationElement *element,
                [in] IUIAutomationPropertyChangedEventHandler *handler);

        HRESULT AddStructureChangedEventHandler(
                [in] IUIAutomationElement *element,
                [in] enum TreeScope scope,
                [in] IUIAutomationCacheRequest *cacheRequest,
                [in] IUIAutomationStructureChangedEventHandler *handler);
        HRESULT RemoveStructureChangedEventHandler(
                [in] IUIAutomationElement *element,
                [in] IUIAutomationStructureChangedEventHandler *handler);

        HRESULT AddFocusChangedEventHandler(
                [in] IUIAutomationCacheRequest *cacheRequest,
                [in] IUIAutomationFocusChangedEventHandler *handler);
        HRESULT RemoveFocusChangedEventHandler([in] IUIAutomationFocusChangedEventHandler *handler);

        HRESULT RemoveAllEventHandlers();

        HRESULT IntNativeArrayToSafeArray(
                [in, size_is(arrayCount)] int *array,
                [in] int arrayCount,
                [out, retval] SAFEARRAY(int) *safeArray);
        HRESULT IntSafeArrayToNativeArray(
                [in] SAFEARRAY(int) intArray,
                [out, size_is( ,*arrayCount)] int **array,
                [out, retval] int *arrayCount);

        HRESULT RectToVariant(
                [in] RECT rc,
                [out, retval] VARIANT *var);
        HRESULT VariantToRect(
                [in] VARIANT var,
                [out, retval] RECT *rc);
        HRESULT SafeArrayToRectNativeArray(
                [in] SAFEARRAY(double) rects,
                [out, size_is( ,*rectArrayCount)] RECT **rectArray,
                [out, retval] int *rectArrayCount);

        HRESULT CreateProxyFactoryEntry(
                [in] IUIAutomationProxyFactory *factory,
                [out, retval] IUIAutomationProxyFactoryEntry **factoryEntry);
        [propget] HRESULT ProxyFactoryMapping([out, retval] IUIAutomationProxyFactoryMapping **factoryMapping);

        HRESULT GetPropertyProgrammaticName(
                [in] PROPERTYID property,
                [out, retval] BSTR *name);
        HRESULT GetPatternProgrammaticName(
                [in] PATTERNID pattern,
                [out, retval] BSTR *name);

        HRESULT PollForPotentialSupportedPatterns(
                [in] IUIAutomationElement *pElement,
                [out] SAFEARRAY(int) *patternIds,
                [out] SAFEARRAY(BSTR) *patternNames);
        HRESULT PollForPotentialSupportedProperties(
                [in] IUIAutomationElement *pElement,
                [out] SAFEARRAY(int) *propertyIds,
                [out] SAFEARRAY(BSTR) *propertyNames);

        HRESULT CheckNotSupported(
                [in] VARIANT value,
                [out, retval] BOOL *isNotSupported);

        [propget] HRESULT ReservedNotSupportedValue([out, retval] IUnknown **notSupportedValue);
        [propget] HRESULT ReservedMixedAttributeValue([out, retval] IUnknown **mixedAttributeValue);

        HRESULT ElementFromIAccessible(
                [in] IAccessible *accessible,
                [in] int childId,
                [out, retval] IUIAutomationElement **element);
        HRESULT ElementFromIAccessibleBuildCache(
                [in] IAccessible *accessible,
                [in] int childId,
                [in] IUIAutomationCacheRequest *cacheRequest,
                [out, retval] IUIAutomationElement **element);
    }

    [
        object,
        uuid(34723aff-0c9d-49d0-9896-7ab52df8cd8a),
        pointer_default(unique)
    ]
    interface IUIAutomation2 : IUIAutomation
    {
        [propget] HRESULT AutoSetFocus([out, retval] BOOL *autoSetFocus);
        [propput] HRESULT AutoSetFocus([in] BOOL autoSetFocus);

        [propget] HRESULT ConnectionTimeout([out, retval] DWORD *timeout);
        [propput] HRESULT ConnectionTimeout([in] DWORD timeout);

        [propget] HRESULT TransactionTimeout([out, retval] DWORD *timeout);
        [propput] HRESULT TransactionTimeout([in] DWORD timeout);
    }

    [
        object,
        uuid(73d768da-9b51-4b89-936e-c209290973e7),
        pointer_default(unique)
    ]
    interface IUIAutomation3 : IUIAutomation2
    {
        HRESULT AddTextEditTextChangedEventHandler(
                [in] IUIAutomationElement *element,
                [in] enum TreeScope scope,
                [in] enum TextEditChangeType textEditChangeType,
                [in] IUIAutomationCacheRequest *cacheRequest,
                [in] IUIAutomationTextEditTextChangedEventHandler *handler);
        HRESULT RemoveTextEditTextChangedEventHandler(
                [in] IUIAutomationElement *element,
                [in] IUIAutomationTextEditTextChangedEventHandler *handler);
    }

    [
        object,
        uuid(1189c02a-05f8-4319-8e21-e817e3db2860),
        pointer_default(unique)
    ]
    interface IUIAutomation4 : IUIAutomation3
    {
        HRESULT AddChangesEventHandler(
                [in] IUIAutomationElement *element,
                [in] enum TreeScope scope,
                [in, size_is(changesCount)] int *changeTypes,
                [in] int changesCount,
                [in] IUIAutomationCacheRequest *pCacheRequest,
                [in] IUIAutomationChangesEventHandler *handler);
        HRESULT RemoveChangesEventHandler(
                [in] IUIAutomationElement *element,
                [in] IUIAutomationChangesEventHandler *handler);
    }

    [
        object,
        uuid(25f700c8-d816-4057-a9dc-3cbdee77e256),
        pointer_default(unique)
    ]
    interface IUIAutomation5 : IUIAutomation4
    {
        HRESULT AddNotificationEventHandler(
                [in] IUIAutomationElement *element,
                [in] enum TreeScope scope,
                [in] IUIAutomationCacheRequest *cacheRequest,
                [in] IUIAutomationNotificationEventHandler *handler);
        HRESULT RemoveNotificationEventHandler(
                [in] IUIAutomationElement *element,
                [in] IUIAutomationNotificationEventHandler *handler);
    }

    [
        object,
        uuid(aae072da-29e3-413d-87a7-192dbf81ed10),
        pointer_default(unique)
    ]
    interface IUIAutomation6 : IUIAutomation5
    {
        HRESULT CreateEventHandlerGroup([out] IUIAutomationEventHandlerGroup **handlerGroup);
        HRESULT AddEventHandlerGroup(
                [in] IUIAutomationElement *element,
                [in] IUIAutomationEventHandlerGroup *handlerGroup);
        HRESULT RemoveEventHandlerGroup(
                [in] IUIAutomationElement *element,
                [in] IUIAutomationEventHandlerGroup *handlerGroup);

        [propget] HRESULT ConnectionRecoveryBehavior(
                          [out, retval] enum ConnectionRecoveryBehaviorOptions *connectionRecoveryBehaviorOptions);
        [propput] HRESULT ConnectionRecoveryBehavior(
                          [in] enum ConnectionRecoveryBehaviorOptions connectionRecoveryBehaviorOptions);

        [propget] HRESULT CoalesceEvents([out, retval] enum CoalesceEventsOptions *coalesceEventsOptions);
        [propput] HRESULT CoalesceEvents([in] enum CoalesceEventsOptions coalesceEventsOptions);

        HRESULT AddActiveTextPositionChangedEventHandler(
                [in] IUIAutomationElement *element,
                [in] enum TreeScope scope,
                [in] IUIAutomationCacheRequest *cacheRequest,
                [in] IUIAutomationActiveTextPositionChangedEventHandler *handler);
        HRESULT RemoveActiveTextPositionChangedEventHandler(
                [in] IUIAutomationElement *element,
                [in] IUIAutomationActiveTextPositionChangedEventHandler *handler);
    }

    [
        uuid(ff48dba4-60ef-4201-aa87-54103eef594e),
        version(1.0),
        threading(both)
    ]
    coclass CUIAutomation
    {
        [default] interface IUIAutomation;
    }

    [
        uuid(e22ad333-b25f-460c-83d0-0581107395c9),
        version(1.0),
        threading(both)
    ]
    coclass CUIAutomation8
    {
        [default] interface IUIAutomation2;
        interface IUIAutomation3;
        interface IUIAutomation4;
        interface IUIAutomation5;
        interface IUIAutomation6;
    }
}
