/*** Autogenerated by WIDL 10.13 from include/windows.ui.windowmanagement.idl - Do not edit ***/

#ifdef _WIN32
#ifndef __REQUIRED_RPCNDR_H_VERSION__
#define __REQUIRED_RPCNDR_H_VERSION__ 475
#endif
#include <rpc.h>
#include <rpcndr.h>
#endif

#ifndef COM_NO_WINDOWS_H
#include <windows.h>
#include <ole2.h>
#endif

#ifndef __windows_ui_windowmanagement_h__
#define __windows_ui_windowmanagement_h__

/* Forward declarations */

#ifndef ____x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegion_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegion_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegion __x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegion;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegion ABI::Windows::UI::WindowManagement::IDisplayRegion
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace WindowManagement {
                interface IDisplayRegion;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironment_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironment_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironment __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironment;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironment ABI::Windows::UI::WindowManagement::IWindowingEnvironment
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace WindowManagement {
                interface IWindowingEnvironment;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentAddedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentAddedEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentAddedEventArgs __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentAddedEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentAddedEventArgs ABI::Windows::UI::WindowManagement::IWindowingEnvironmentAddedEventArgs
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace WindowManagement {
                interface IWindowingEnvironmentAddedEventArgs;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentChangedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentChangedEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentChangedEventArgs __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentChangedEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentChangedEventArgs ABI::Windows::UI::WindowManagement::IWindowingEnvironmentChangedEventArgs
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace WindowManagement {
                interface IWindowingEnvironmentChangedEventArgs;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentRemovedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentRemovedEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentRemovedEventArgs __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentRemovedEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentRemovedEventArgs ABI::Windows::UI::WindowManagement::IWindowingEnvironmentRemovedEventArgs
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace WindowManagement {
                interface IWindowingEnvironmentRemovedEventArgs;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentStatics __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentStatics ABI::Windows::UI::WindowManagement::IWindowingEnvironmentStatics
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace WindowManagement {
                interface IWindowingEnvironmentStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CWindowManagement_CDisplayRegion_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CWindowManagement_CDisplayRegion_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace WindowManagement {
                class DisplayRegion;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CWindowManagement_CDisplayRegion __x_ABI_CWindows_CUI_CWindowManagement_CDisplayRegion;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CWindowManagement_CDisplayRegion_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CWindowManagement_CWindowingEnvironment_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CWindowManagement_CWindowingEnvironment_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace WindowManagement {
                class WindowingEnvironment;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CWindowManagement_CWindowingEnvironment __x_ABI_CWindows_CUI_CWindowManagement_CWindowingEnvironment;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CWindowManagement_CWindowingEnvironment_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CWindowManagement_CWindowingEnvironmentAddedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CWindowManagement_CWindowingEnvironmentAddedEventArgs_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace WindowManagement {
                class WindowingEnvironmentAddedEventArgs;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CWindowManagement_CWindowingEnvironmentAddedEventArgs __x_ABI_CWindows_CUI_CWindowManagement_CWindowingEnvironmentAddedEventArgs;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CWindowManagement_CWindowingEnvironmentAddedEventArgs_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CWindowManagement_CWindowingEnvironmentChangedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CWindowManagement_CWindowingEnvironmentChangedEventArgs_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace WindowManagement {
                class WindowingEnvironmentChangedEventArgs;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CWindowManagement_CWindowingEnvironmentChangedEventArgs __x_ABI_CWindows_CUI_CWindowManagement_CWindowingEnvironmentChangedEventArgs;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CWindowManagement_CWindowingEnvironmentChangedEventArgs_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CWindowManagement_CWindowingEnvironmentRemovedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CWindowManagement_CWindowingEnvironmentRemovedEventArgs_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace WindowManagement {
                class WindowingEnvironmentRemovedEventArgs;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CWindowManagement_CWindowingEnvironmentRemovedEventArgs __x_ABI_CWindows_CUI_CWindowManagement_CWindowingEnvironmentRemovedEventArgs;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CWindowManagement_CWindowingEnvironmentRemovedEventArgs_FWD_DEFINED__ */

#ifndef ____FIIterable_1_Windows__CUI__CWindowManagement__CDisplayRegion_FWD_DEFINED__
#define ____FIIterable_1_Windows__CUI__CWindowManagement__CDisplayRegion_FWD_DEFINED__
typedef interface __FIIterable_1_Windows__CUI__CWindowManagement__CDisplayRegion __FIIterable_1_Windows__CUI__CWindowManagement__CDisplayRegion;
#ifdef __cplusplus
#define __FIIterable_1_Windows__CUI__CWindowManagement__CDisplayRegion ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::UI::WindowManagement::DisplayRegion* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterable_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_FWD_DEFINED__
#define ____FIIterable_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_FWD_DEFINED__
typedef interface __FIIterable_1_Windows__CUI__CWindowManagement__CWindowingEnvironment __FIIterable_1_Windows__CUI__CWindowManagement__CWindowingEnvironment;
#ifdef __cplusplus
#define __FIIterable_1_Windows__CUI__CWindowManagement__CWindowingEnvironment ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::UI::WindowManagement::WindowingEnvironment* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_Windows__CUI__CWindowManagement__CDisplayRegion_FWD_DEFINED__
#define ____FIIterator_1_Windows__CUI__CWindowManagement__CDisplayRegion_FWD_DEFINED__
typedef interface __FIIterator_1_Windows__CUI__CWindowManagement__CDisplayRegion __FIIterator_1_Windows__CUI__CWindowManagement__CDisplayRegion;
#ifdef __cplusplus
#define __FIIterator_1_Windows__CUI__CWindowManagement__CDisplayRegion ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::UI::WindowManagement::DisplayRegion* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_FWD_DEFINED__
#define ____FIIterator_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_FWD_DEFINED__
typedef interface __FIIterator_1_Windows__CUI__CWindowManagement__CWindowingEnvironment __FIIterator_1_Windows__CUI__CWindowManagement__CWindowingEnvironment;
#ifdef __cplusplus
#define __FIIterator_1_Windows__CUI__CWindowManagement__CWindowingEnvironment ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::UI::WindowManagement::WindowingEnvironment* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_Windows__CUI__CWindowManagement__CDisplayRegion_FWD_DEFINED__
#define ____FIVectorView_1_Windows__CUI__CWindowManagement__CDisplayRegion_FWD_DEFINED__
typedef interface __FIVectorView_1_Windows__CUI__CWindowManagement__CDisplayRegion __FIVectorView_1_Windows__CUI__CWindowManagement__CDisplayRegion;
#ifdef __cplusplus
#define __FIVectorView_1_Windows__CUI__CWindowManagement__CDisplayRegion ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::WindowManagement::DisplayRegion* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_FWD_DEFINED__
#define ____FIVectorView_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_FWD_DEFINED__
typedef interface __FIVectorView_1_Windows__CUI__CWindowManagement__CWindowingEnvironment __FIVectorView_1_Windows__CUI__CWindowManagement__CWindowingEnvironment;
#ifdef __cplusplus
#define __FIVectorView_1_Windows__CUI__CWindowManagement__CWindowingEnvironment ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::WindowManagement::WindowingEnvironment* >
#endif /* __cplusplus */
#endif

#ifndef ____FITypedEventHandler_2_Windows__CUI__CWindowManagement__CDisplayRegion_IInspectable_FWD_DEFINED__
#define ____FITypedEventHandler_2_Windows__CUI__CWindowManagement__CDisplayRegion_IInspectable_FWD_DEFINED__
typedef interface __FITypedEventHandler_2_Windows__CUI__CWindowManagement__CDisplayRegion_IInspectable __FITypedEventHandler_2_Windows__CUI__CWindowManagement__CDisplayRegion_IInspectable;
#ifdef __cplusplus
#define __FITypedEventHandler_2_Windows__CUI__CWindowManagement__CDisplayRegion_IInspectable ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::UI::WindowManagement::DisplayRegion*,IInspectable* >
#endif /* __cplusplus */
#endif

#ifndef ____FITypedEventHandler_2_Windows__CUI__CWindowManagement__CWindowingEnvironment_Windows__CUI__CWindowManagement__CWindowingEnvironmentChangedEventArgs_FWD_DEFINED__
#define ____FITypedEventHandler_2_Windows__CUI__CWindowManagement__CWindowingEnvironment_Windows__CUI__CWindowManagement__CWindowingEnvironmentChangedEventArgs_FWD_DEFINED__
typedef interface __FITypedEventHandler_2_Windows__CUI__CWindowManagement__CWindowingEnvironment_Windows__CUI__CWindowManagement__CWindowingEnvironmentChangedEventArgs __FITypedEventHandler_2_Windows__CUI__CWindowManagement__CWindowingEnvironment_Windows__CUI__CWindowManagement__CWindowingEnvironmentChangedEventArgs;
#ifdef __cplusplus
#define __FITypedEventHandler_2_Windows__CUI__CWindowManagement__CWindowingEnvironment_Windows__CUI__CWindowManagement__CWindowingEnvironmentChangedEventArgs ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::UI::WindowManagement::WindowingEnvironment*,ABI::Windows::UI::WindowManagement::WindowingEnvironmentChangedEventArgs* >
#endif /* __cplusplus */
#endif

/* Headers for imported files */

#include <inspectable.h>
#include <asyncinfo.h>
#include <eventtoken.h>
#include <windowscontracts.h>
#include <windows.foundation.h>
#include <windows.system.h>
#include <windows.ui.h>
#include <windows.ui.composition.h>

#ifdef __cplusplus
extern "C" {
#endif

#if !defined(WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION)
#define WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION 0xe0000
#endif // defined(WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION)

#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000
#ifndef ____x_ABI_CWindows_CUI_CWindowManagement_CWindowingEnvironmentKind_ENUM_DEFINED__
#define ____x_ABI_CWindows_CUI_CWindowManagement_CWindowingEnvironmentKind_ENUM_DEFINED__
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace WindowManagement {
                enum WindowingEnvironmentKind {
                    WindowingEnvironmentKind_Unknown = 0,
                    WindowingEnvironmentKind_Overlapped = 1,
                    WindowingEnvironmentKind_Tiled = 2
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CUI_CWindowManagement_CWindowingEnvironmentKind {
    WindowingEnvironmentKind_Unknown = 0,
    WindowingEnvironmentKind_Overlapped = 1,
    WindowingEnvironmentKind_Tiled = 2
};
#ifdef WIDL_using_Windows_UI_WindowManagement
#define WindowingEnvironmentKind __x_ABI_CWindows_CUI_CWindowManagement_CWindowingEnvironmentKind
#endif /* WIDL_using_Windows_UI_WindowManagement */
#endif

#endif /* ____x_ABI_CWindows_CUI_CWindowManagement_CWindowingEnvironmentKind_ENUM_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000 */
#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CUI_CWindowManagement_CWindowingEnvironmentKind __x_ABI_CWindows_CUI_CWindowManagement_CWindowingEnvironmentKind;
#endif /* __cplusplus */

#ifndef ____x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegion_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegion_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegion __x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegion;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegion ABI::Windows::UI::WindowManagement::IDisplayRegion
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace WindowManagement {
                interface IDisplayRegion;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironment_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironment_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironment __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironment;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironment ABI::Windows::UI::WindowManagement::IWindowingEnvironment
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace WindowManagement {
                interface IWindowingEnvironment;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentAddedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentAddedEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentAddedEventArgs __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentAddedEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentAddedEventArgs ABI::Windows::UI::WindowManagement::IWindowingEnvironmentAddedEventArgs
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace WindowManagement {
                interface IWindowingEnvironmentAddedEventArgs;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentChangedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentChangedEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentChangedEventArgs __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentChangedEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentChangedEventArgs ABI::Windows::UI::WindowManagement::IWindowingEnvironmentChangedEventArgs
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace WindowManagement {
                interface IWindowingEnvironmentChangedEventArgs;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentRemovedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentRemovedEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentRemovedEventArgs __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentRemovedEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentRemovedEventArgs ABI::Windows::UI::WindowManagement::IWindowingEnvironmentRemovedEventArgs
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace WindowManagement {
                interface IWindowingEnvironmentRemovedEventArgs;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentStatics __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentStatics ABI::Windows::UI::WindowManagement::IWindowingEnvironmentStatics
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace WindowManagement {
                interface IWindowingEnvironmentStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____FIIterable_1_Windows__CUI__CWindowManagement__CDisplayRegion_FWD_DEFINED__
#define ____FIIterable_1_Windows__CUI__CWindowManagement__CDisplayRegion_FWD_DEFINED__
typedef interface __FIIterable_1_Windows__CUI__CWindowManagement__CDisplayRegion __FIIterable_1_Windows__CUI__CWindowManagement__CDisplayRegion;
#ifdef __cplusplus
#define __FIIterable_1_Windows__CUI__CWindowManagement__CDisplayRegion ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::UI::WindowManagement::DisplayRegion* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterable_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_FWD_DEFINED__
#define ____FIIterable_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_FWD_DEFINED__
typedef interface __FIIterable_1_Windows__CUI__CWindowManagement__CWindowingEnvironment __FIIterable_1_Windows__CUI__CWindowManagement__CWindowingEnvironment;
#ifdef __cplusplus
#define __FIIterable_1_Windows__CUI__CWindowManagement__CWindowingEnvironment ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::UI::WindowManagement::WindowingEnvironment* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_Windows__CUI__CWindowManagement__CDisplayRegion_FWD_DEFINED__
#define ____FIIterator_1_Windows__CUI__CWindowManagement__CDisplayRegion_FWD_DEFINED__
typedef interface __FIIterator_1_Windows__CUI__CWindowManagement__CDisplayRegion __FIIterator_1_Windows__CUI__CWindowManagement__CDisplayRegion;
#ifdef __cplusplus
#define __FIIterator_1_Windows__CUI__CWindowManagement__CDisplayRegion ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::UI::WindowManagement::DisplayRegion* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_FWD_DEFINED__
#define ____FIIterator_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_FWD_DEFINED__
typedef interface __FIIterator_1_Windows__CUI__CWindowManagement__CWindowingEnvironment __FIIterator_1_Windows__CUI__CWindowManagement__CWindowingEnvironment;
#ifdef __cplusplus
#define __FIIterator_1_Windows__CUI__CWindowManagement__CWindowingEnvironment ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::UI::WindowManagement::WindowingEnvironment* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_Windows__CUI__CWindowManagement__CDisplayRegion_FWD_DEFINED__
#define ____FIVectorView_1_Windows__CUI__CWindowManagement__CDisplayRegion_FWD_DEFINED__
typedef interface __FIVectorView_1_Windows__CUI__CWindowManagement__CDisplayRegion __FIVectorView_1_Windows__CUI__CWindowManagement__CDisplayRegion;
#ifdef __cplusplus
#define __FIVectorView_1_Windows__CUI__CWindowManagement__CDisplayRegion ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::WindowManagement::DisplayRegion* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_FWD_DEFINED__
#define ____FIVectorView_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_FWD_DEFINED__
typedef interface __FIVectorView_1_Windows__CUI__CWindowManagement__CWindowingEnvironment __FIVectorView_1_Windows__CUI__CWindowManagement__CWindowingEnvironment;
#ifdef __cplusplus
#define __FIVectorView_1_Windows__CUI__CWindowManagement__CWindowingEnvironment ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::WindowManagement::WindowingEnvironment* >
#endif /* __cplusplus */
#endif

/*****************************************************************************
 * IDisplayRegion interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000
#ifndef ____x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegion_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegion_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegion, 0xdb50c3a2, 0x4094, 0x5f47, 0x8c,0xb1, 0xea,0x01,0xdd,0xaf,0xaa,0x94);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace WindowManagement {
                MIDL_INTERFACE("db50c3a2-4094-5f47-8cb1-ea01ddafaa94")
                IDisplayRegion : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_DisplayMonitorDeviceId(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_IsVisible(
                        boolean *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_WorkAreaOffset(
                        ABI::Windows::Foundation::Point *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_WorkAreaSize(
                        ABI::Windows::Foundation::Size *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_WindowingEnvironment(
                        ABI::Windows::UI::WindowManagement::IWindowingEnvironment **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE add_Changed(
                        ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::UI::WindowManagement::DisplayRegion*,IInspectable* > *handler,
                        EventRegistrationToken *token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE remove_Changed(
                        EventRegistrationToken token) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegion, 0xdb50c3a2, 0x4094, 0x5f47, 0x8c,0xb1, 0xea,0x01,0xdd,0xaf,0xaa,0x94)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegionVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegion *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegion *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegion *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegion *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegion *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegion *This,
        TrustLevel *trustLevel);

    /*** IDisplayRegion methods ***/
    HRESULT (STDMETHODCALLTYPE *get_DisplayMonitorDeviceId)(
        __x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegion *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_IsVisible)(
        __x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegion *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *get_WorkAreaOffset)(
        __x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegion *This,
        __x_ABI_CWindows_CFoundation_CPoint *value);

    HRESULT (STDMETHODCALLTYPE *get_WorkAreaSize)(
        __x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegion *This,
        __x_ABI_CWindows_CFoundation_CSize *value);

    HRESULT (STDMETHODCALLTYPE *get_WindowingEnvironment)(
        __x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegion *This,
        __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironment **value);

    HRESULT (STDMETHODCALLTYPE *add_Changed)(
        __x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegion *This,
        __FITypedEventHandler_2_Windows__CUI__CWindowManagement__CDisplayRegion_IInspectable *handler,
        EventRegistrationToken *token);

    HRESULT (STDMETHODCALLTYPE *remove_Changed)(
        __x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegion *This,
        EventRegistrationToken token);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegionVtbl;

interface __x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegion {
    CONST_VTBL __x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegion_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegion_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegion_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegion_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegion_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegion_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IDisplayRegion methods ***/
#define __x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegion_get_DisplayMonitorDeviceId(This,value) (This)->lpVtbl->get_DisplayMonitorDeviceId(This,value)
#define __x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegion_get_IsVisible(This,value) (This)->lpVtbl->get_IsVisible(This,value)
#define __x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegion_get_WorkAreaOffset(This,value) (This)->lpVtbl->get_WorkAreaOffset(This,value)
#define __x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegion_get_WorkAreaSize(This,value) (This)->lpVtbl->get_WorkAreaSize(This,value)
#define __x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegion_get_WindowingEnvironment(This,value) (This)->lpVtbl->get_WindowingEnvironment(This,value)
#define __x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegion_add_Changed(This,handler,token) (This)->lpVtbl->add_Changed(This,handler,token)
#define __x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegion_remove_Changed(This,token) (This)->lpVtbl->remove_Changed(This,token)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegion_QueryInterface(__x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegion* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegion_AddRef(__x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegion* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegion_Release(__x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegion* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegion_GetIids(__x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegion* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegion_GetRuntimeClassName(__x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegion* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegion_GetTrustLevel(__x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegion* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IDisplayRegion methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegion_get_DisplayMonitorDeviceId(__x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegion* This,HSTRING *value) {
    return This->lpVtbl->get_DisplayMonitorDeviceId(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegion_get_IsVisible(__x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegion* This,boolean *value) {
    return This->lpVtbl->get_IsVisible(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegion_get_WorkAreaOffset(__x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegion* This,__x_ABI_CWindows_CFoundation_CPoint *value) {
    return This->lpVtbl->get_WorkAreaOffset(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegion_get_WorkAreaSize(__x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegion* This,__x_ABI_CWindows_CFoundation_CSize *value) {
    return This->lpVtbl->get_WorkAreaSize(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegion_get_WindowingEnvironment(__x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegion* This,__x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironment **value) {
    return This->lpVtbl->get_WindowingEnvironment(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegion_add_Changed(__x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegion* This,__FITypedEventHandler_2_Windows__CUI__CWindowManagement__CDisplayRegion_IInspectable *handler,EventRegistrationToken *token) {
    return This->lpVtbl->add_Changed(This,handler,token);
}
static inline HRESULT __x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegion_remove_Changed(__x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegion* This,EventRegistrationToken token) {
    return This->lpVtbl->remove_Changed(This,token);
}
#endif
#ifdef WIDL_using_Windows_UI_WindowManagement
#define IID_IDisplayRegion IID___x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegion
#define IDisplayRegionVtbl __x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegionVtbl
#define IDisplayRegion __x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegion
#define IDisplayRegion_QueryInterface __x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegion_QueryInterface
#define IDisplayRegion_AddRef __x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegion_AddRef
#define IDisplayRegion_Release __x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegion_Release
#define IDisplayRegion_GetIids __x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegion_GetIids
#define IDisplayRegion_GetRuntimeClassName __x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegion_GetRuntimeClassName
#define IDisplayRegion_GetTrustLevel __x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegion_GetTrustLevel
#define IDisplayRegion_get_DisplayMonitorDeviceId __x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegion_get_DisplayMonitorDeviceId
#define IDisplayRegion_get_IsVisible __x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegion_get_IsVisible
#define IDisplayRegion_get_WorkAreaOffset __x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegion_get_WorkAreaOffset
#define IDisplayRegion_get_WorkAreaSize __x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegion_get_WorkAreaSize
#define IDisplayRegion_get_WindowingEnvironment __x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegion_get_WindowingEnvironment
#define IDisplayRegion_add_Changed __x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegion_add_Changed
#define IDisplayRegion_remove_Changed __x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegion_remove_Changed
#endif /* WIDL_using_Windows_UI_WindowManagement */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegion_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000 */

/*****************************************************************************
 * IWindowingEnvironment interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000
#ifndef ____x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironment_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironment_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironment, 0x264363c0, 0x2a49, 0x5417, 0xb3,0xae, 0x48,0xa7,0x1c,0x63,0xa3,0xbd);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace WindowManagement {
                MIDL_INTERFACE("264363c0-2a49-5417-b3ae-48a71c63a3bd")
                IWindowingEnvironment : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_IsEnabled(
                        boolean *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Kind(
                        ABI::Windows::UI::WindowManagement::WindowingEnvironmentKind *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE GetDisplayRegions(
                        ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::WindowManagement::DisplayRegion* > **result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE add_Changed(
                        ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::UI::WindowManagement::WindowingEnvironment*,ABI::Windows::UI::WindowManagement::WindowingEnvironmentChangedEventArgs* > *handler,
                        EventRegistrationToken *token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE remove_Changed(
                        EventRegistrationToken token) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironment, 0x264363c0, 0x2a49, 0x5417, 0xb3,0xae, 0x48,0xa7,0x1c,0x63,0xa3,0xbd)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironment *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironment *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironment *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironment *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironment *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironment *This,
        TrustLevel *trustLevel);

    /*** IWindowingEnvironment methods ***/
    HRESULT (STDMETHODCALLTYPE *get_IsEnabled)(
        __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironment *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *get_Kind)(
        __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironment *This,
        __x_ABI_CWindows_CUI_CWindowManagement_CWindowingEnvironmentKind *value);

    HRESULT (STDMETHODCALLTYPE *GetDisplayRegions)(
        __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironment *This,
        __FIVectorView_1_Windows__CUI__CWindowManagement__CDisplayRegion **result);

    HRESULT (STDMETHODCALLTYPE *add_Changed)(
        __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironment *This,
        __FITypedEventHandler_2_Windows__CUI__CWindowManagement__CWindowingEnvironment_Windows__CUI__CWindowManagement__CWindowingEnvironmentChangedEventArgs *handler,
        EventRegistrationToken *token);

    HRESULT (STDMETHODCALLTYPE *remove_Changed)(
        __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironment *This,
        EventRegistrationToken token);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentVtbl;

interface __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironment {
    CONST_VTBL __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironment_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironment_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironment_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironment_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironment_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironment_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IWindowingEnvironment methods ***/
#define __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironment_get_IsEnabled(This,value) (This)->lpVtbl->get_IsEnabled(This,value)
#define __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironment_get_Kind(This,value) (This)->lpVtbl->get_Kind(This,value)
#define __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironment_GetDisplayRegions(This,result) (This)->lpVtbl->GetDisplayRegions(This,result)
#define __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironment_add_Changed(This,handler,token) (This)->lpVtbl->add_Changed(This,handler,token)
#define __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironment_remove_Changed(This,token) (This)->lpVtbl->remove_Changed(This,token)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironment_QueryInterface(__x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironment* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironment_AddRef(__x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironment* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironment_Release(__x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironment* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironment_GetIids(__x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironment* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironment_GetRuntimeClassName(__x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironment* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironment_GetTrustLevel(__x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironment* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IWindowingEnvironment methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironment_get_IsEnabled(__x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironment* This,boolean *value) {
    return This->lpVtbl->get_IsEnabled(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironment_get_Kind(__x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironment* This,__x_ABI_CWindows_CUI_CWindowManagement_CWindowingEnvironmentKind *value) {
    return This->lpVtbl->get_Kind(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironment_GetDisplayRegions(__x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironment* This,__FIVectorView_1_Windows__CUI__CWindowManagement__CDisplayRegion **result) {
    return This->lpVtbl->GetDisplayRegions(This,result);
}
static inline HRESULT __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironment_add_Changed(__x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironment* This,__FITypedEventHandler_2_Windows__CUI__CWindowManagement__CWindowingEnvironment_Windows__CUI__CWindowManagement__CWindowingEnvironmentChangedEventArgs *handler,EventRegistrationToken *token) {
    return This->lpVtbl->add_Changed(This,handler,token);
}
static inline HRESULT __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironment_remove_Changed(__x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironment* This,EventRegistrationToken token) {
    return This->lpVtbl->remove_Changed(This,token);
}
#endif
#ifdef WIDL_using_Windows_UI_WindowManagement
#define IID_IWindowingEnvironment IID___x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironment
#define IWindowingEnvironmentVtbl __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentVtbl
#define IWindowingEnvironment __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironment
#define IWindowingEnvironment_QueryInterface __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironment_QueryInterface
#define IWindowingEnvironment_AddRef __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironment_AddRef
#define IWindowingEnvironment_Release __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironment_Release
#define IWindowingEnvironment_GetIids __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironment_GetIids
#define IWindowingEnvironment_GetRuntimeClassName __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironment_GetRuntimeClassName
#define IWindowingEnvironment_GetTrustLevel __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironment_GetTrustLevel
#define IWindowingEnvironment_get_IsEnabled __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironment_get_IsEnabled
#define IWindowingEnvironment_get_Kind __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironment_get_Kind
#define IWindowingEnvironment_GetDisplayRegions __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironment_GetDisplayRegions
#define IWindowingEnvironment_add_Changed __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironment_add_Changed
#define IWindowingEnvironment_remove_Changed __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironment_remove_Changed
#endif /* WIDL_using_Windows_UI_WindowManagement */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironment_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000 */

/*****************************************************************************
 * IWindowingEnvironmentAddedEventArgs interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000
#ifndef ____x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentAddedEventArgs_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentAddedEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentAddedEventArgs, 0xff2a5b7f, 0xf183, 0x5c66, 0x99,0xb2, 0x42,0x90,0x82,0x06,0x92,0x99);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace WindowManagement {
                MIDL_INTERFACE("ff2a5b7f-f183-5c66-99b2-429082069299")
                IWindowingEnvironmentAddedEventArgs : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_WindowingEnvironment(
                        ABI::Windows::UI::WindowManagement::IWindowingEnvironment **value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentAddedEventArgs, 0xff2a5b7f, 0xf183, 0x5c66, 0x99,0xb2, 0x42,0x90,0x82,0x06,0x92,0x99)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentAddedEventArgsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentAddedEventArgs *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentAddedEventArgs *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentAddedEventArgs *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentAddedEventArgs *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentAddedEventArgs *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentAddedEventArgs *This,
        TrustLevel *trustLevel);

    /*** IWindowingEnvironmentAddedEventArgs methods ***/
    HRESULT (STDMETHODCALLTYPE *get_WindowingEnvironment)(
        __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentAddedEventArgs *This,
        __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironment **value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentAddedEventArgsVtbl;

interface __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentAddedEventArgs {
    CONST_VTBL __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentAddedEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentAddedEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentAddedEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentAddedEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentAddedEventArgs_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentAddedEventArgs_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentAddedEventArgs_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IWindowingEnvironmentAddedEventArgs methods ***/
#define __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentAddedEventArgs_get_WindowingEnvironment(This,value) (This)->lpVtbl->get_WindowingEnvironment(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentAddedEventArgs_QueryInterface(__x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentAddedEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentAddedEventArgs_AddRef(__x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentAddedEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentAddedEventArgs_Release(__x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentAddedEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentAddedEventArgs_GetIids(__x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentAddedEventArgs* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentAddedEventArgs_GetRuntimeClassName(__x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentAddedEventArgs* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentAddedEventArgs_GetTrustLevel(__x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentAddedEventArgs* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IWindowingEnvironmentAddedEventArgs methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentAddedEventArgs_get_WindowingEnvironment(__x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentAddedEventArgs* This,__x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironment **value) {
    return This->lpVtbl->get_WindowingEnvironment(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_WindowManagement
#define IID_IWindowingEnvironmentAddedEventArgs IID___x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentAddedEventArgs
#define IWindowingEnvironmentAddedEventArgsVtbl __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentAddedEventArgsVtbl
#define IWindowingEnvironmentAddedEventArgs __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentAddedEventArgs
#define IWindowingEnvironmentAddedEventArgs_QueryInterface __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentAddedEventArgs_QueryInterface
#define IWindowingEnvironmentAddedEventArgs_AddRef __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentAddedEventArgs_AddRef
#define IWindowingEnvironmentAddedEventArgs_Release __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentAddedEventArgs_Release
#define IWindowingEnvironmentAddedEventArgs_GetIids __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentAddedEventArgs_GetIids
#define IWindowingEnvironmentAddedEventArgs_GetRuntimeClassName __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentAddedEventArgs_GetRuntimeClassName
#define IWindowingEnvironmentAddedEventArgs_GetTrustLevel __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentAddedEventArgs_GetTrustLevel
#define IWindowingEnvironmentAddedEventArgs_get_WindowingEnvironment __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentAddedEventArgs_get_WindowingEnvironment
#endif /* WIDL_using_Windows_UI_WindowManagement */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentAddedEventArgs_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000 */

/*****************************************************************************
 * IWindowingEnvironmentChangedEventArgs interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000
#ifndef ____x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentChangedEventArgs_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentChangedEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentChangedEventArgs, 0x4160cfc6, 0x023d, 0x5e9a, 0xb4,0x31, 0x35,0x0e,0x67,0xdc,0x97,0x8a);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace WindowManagement {
                MIDL_INTERFACE("4160cfc6-023d-5e9a-b431-350e67dc978a")
                IWindowingEnvironmentChangedEventArgs : public IInspectable
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentChangedEventArgs, 0x4160cfc6, 0x023d, 0x5e9a, 0xb4,0x31, 0x35,0x0e,0x67,0xdc,0x97,0x8a)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentChangedEventArgsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentChangedEventArgs *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentChangedEventArgs *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentChangedEventArgs *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentChangedEventArgs *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentChangedEventArgs *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentChangedEventArgs *This,
        TrustLevel *trustLevel);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentChangedEventArgsVtbl;

interface __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentChangedEventArgs {
    CONST_VTBL __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentChangedEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentChangedEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentChangedEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentChangedEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentChangedEventArgs_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentChangedEventArgs_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentChangedEventArgs_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentChangedEventArgs_QueryInterface(__x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentChangedEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentChangedEventArgs_AddRef(__x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentChangedEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentChangedEventArgs_Release(__x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentChangedEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentChangedEventArgs_GetIids(__x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentChangedEventArgs* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentChangedEventArgs_GetRuntimeClassName(__x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentChangedEventArgs* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentChangedEventArgs_GetTrustLevel(__x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentChangedEventArgs* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
#endif
#ifdef WIDL_using_Windows_UI_WindowManagement
#define IID_IWindowingEnvironmentChangedEventArgs IID___x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentChangedEventArgs
#define IWindowingEnvironmentChangedEventArgsVtbl __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentChangedEventArgsVtbl
#define IWindowingEnvironmentChangedEventArgs __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentChangedEventArgs
#define IWindowingEnvironmentChangedEventArgs_QueryInterface __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentChangedEventArgs_QueryInterface
#define IWindowingEnvironmentChangedEventArgs_AddRef __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentChangedEventArgs_AddRef
#define IWindowingEnvironmentChangedEventArgs_Release __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentChangedEventArgs_Release
#define IWindowingEnvironmentChangedEventArgs_GetIids __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentChangedEventArgs_GetIids
#define IWindowingEnvironmentChangedEventArgs_GetRuntimeClassName __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentChangedEventArgs_GetRuntimeClassName
#define IWindowingEnvironmentChangedEventArgs_GetTrustLevel __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentChangedEventArgs_GetTrustLevel
#endif /* WIDL_using_Windows_UI_WindowManagement */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentChangedEventArgs_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000 */

/*****************************************************************************
 * IWindowingEnvironmentRemovedEventArgs interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000
#ifndef ____x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentRemovedEventArgs_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentRemovedEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentRemovedEventArgs, 0x2e5b5473, 0xbeff, 0x5e53, 0x93,0x16, 0x7e,0x77,0x5f,0xe5,0x68,0xb3);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace WindowManagement {
                MIDL_INTERFACE("2e5b5473-beff-5e53-9316-7e775fe568b3")
                IWindowingEnvironmentRemovedEventArgs : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_WindowingEnvironment(
                        ABI::Windows::UI::WindowManagement::IWindowingEnvironment **value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentRemovedEventArgs, 0x2e5b5473, 0xbeff, 0x5e53, 0x93,0x16, 0x7e,0x77,0x5f,0xe5,0x68,0xb3)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentRemovedEventArgsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentRemovedEventArgs *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentRemovedEventArgs *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentRemovedEventArgs *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentRemovedEventArgs *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentRemovedEventArgs *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentRemovedEventArgs *This,
        TrustLevel *trustLevel);

    /*** IWindowingEnvironmentRemovedEventArgs methods ***/
    HRESULT (STDMETHODCALLTYPE *get_WindowingEnvironment)(
        __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentRemovedEventArgs *This,
        __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironment **value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentRemovedEventArgsVtbl;

interface __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentRemovedEventArgs {
    CONST_VTBL __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentRemovedEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentRemovedEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentRemovedEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentRemovedEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentRemovedEventArgs_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentRemovedEventArgs_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentRemovedEventArgs_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IWindowingEnvironmentRemovedEventArgs methods ***/
#define __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentRemovedEventArgs_get_WindowingEnvironment(This,value) (This)->lpVtbl->get_WindowingEnvironment(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentRemovedEventArgs_QueryInterface(__x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentRemovedEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentRemovedEventArgs_AddRef(__x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentRemovedEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentRemovedEventArgs_Release(__x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentRemovedEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentRemovedEventArgs_GetIids(__x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentRemovedEventArgs* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentRemovedEventArgs_GetRuntimeClassName(__x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentRemovedEventArgs* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentRemovedEventArgs_GetTrustLevel(__x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentRemovedEventArgs* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IWindowingEnvironmentRemovedEventArgs methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentRemovedEventArgs_get_WindowingEnvironment(__x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentRemovedEventArgs* This,__x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironment **value) {
    return This->lpVtbl->get_WindowingEnvironment(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_WindowManagement
#define IID_IWindowingEnvironmentRemovedEventArgs IID___x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentRemovedEventArgs
#define IWindowingEnvironmentRemovedEventArgsVtbl __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentRemovedEventArgsVtbl
#define IWindowingEnvironmentRemovedEventArgs __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentRemovedEventArgs
#define IWindowingEnvironmentRemovedEventArgs_QueryInterface __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentRemovedEventArgs_QueryInterface
#define IWindowingEnvironmentRemovedEventArgs_AddRef __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentRemovedEventArgs_AddRef
#define IWindowingEnvironmentRemovedEventArgs_Release __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentRemovedEventArgs_Release
#define IWindowingEnvironmentRemovedEventArgs_GetIids __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentRemovedEventArgs_GetIids
#define IWindowingEnvironmentRemovedEventArgs_GetRuntimeClassName __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentRemovedEventArgs_GetRuntimeClassName
#define IWindowingEnvironmentRemovedEventArgs_GetTrustLevel __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentRemovedEventArgs_GetTrustLevel
#define IWindowingEnvironmentRemovedEventArgs_get_WindowingEnvironment __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentRemovedEventArgs_get_WindowingEnvironment
#endif /* WIDL_using_Windows_UI_WindowManagement */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentRemovedEventArgs_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000 */

/*****************************************************************************
 * IWindowingEnvironmentStatics interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000
#ifndef ____x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentStatics_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentStatics_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentStatics, 0x874e9fb7, 0xc642, 0x55ab, 0x8a,0xa2, 0x16,0x2f,0x73,0x4a,0x9a,0x72);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace WindowManagement {
                MIDL_INTERFACE("874e9fb7-c642-55ab-8aa2-162f734a9a72")
                IWindowingEnvironmentStatics : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE FindAll(
                        ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::WindowManagement::WindowingEnvironment* > **result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE FindAllWithKind(
                        ABI::Windows::UI::WindowManagement::WindowingEnvironmentKind kind,
                        ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::WindowManagement::WindowingEnvironment* > **result) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentStatics, 0x874e9fb7, 0xc642, 0x55ab, 0x8a,0xa2, 0x16,0x2f,0x73,0x4a,0x9a,0x72)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentStaticsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentStatics *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentStatics *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentStatics *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentStatics *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentStatics *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentStatics *This,
        TrustLevel *trustLevel);

    /*** IWindowingEnvironmentStatics methods ***/
    HRESULT (STDMETHODCALLTYPE *FindAll)(
        __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentStatics *This,
        __FIVectorView_1_Windows__CUI__CWindowManagement__CWindowingEnvironment **result);

    HRESULT (STDMETHODCALLTYPE *FindAllWithKind)(
        __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentStatics *This,
        __x_ABI_CWindows_CUI_CWindowManagement_CWindowingEnvironmentKind kind,
        __FIVectorView_1_Windows__CUI__CWindowManagement__CWindowingEnvironment **result);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentStaticsVtbl;

interface __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentStatics {
    CONST_VTBL __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentStaticsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentStatics_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentStatics_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentStatics_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentStatics_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentStatics_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentStatics_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IWindowingEnvironmentStatics methods ***/
#define __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentStatics_FindAll(This,result) (This)->lpVtbl->FindAll(This,result)
#define __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentStatics_FindAllWithKind(This,kind,result) (This)->lpVtbl->FindAllWithKind(This,kind,result)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentStatics_QueryInterface(__x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentStatics* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentStatics_AddRef(__x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentStatics* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentStatics_Release(__x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentStatics* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentStatics_GetIids(__x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentStatics* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentStatics_GetRuntimeClassName(__x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentStatics* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentStatics_GetTrustLevel(__x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentStatics* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IWindowingEnvironmentStatics methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentStatics_FindAll(__x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentStatics* This,__FIVectorView_1_Windows__CUI__CWindowManagement__CWindowingEnvironment **result) {
    return This->lpVtbl->FindAll(This,result);
}
static inline HRESULT __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentStatics_FindAllWithKind(__x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentStatics* This,__x_ABI_CWindows_CUI_CWindowManagement_CWindowingEnvironmentKind kind,__FIVectorView_1_Windows__CUI__CWindowManagement__CWindowingEnvironment **result) {
    return This->lpVtbl->FindAllWithKind(This,kind,result);
}
#endif
#ifdef WIDL_using_Windows_UI_WindowManagement
#define IID_IWindowingEnvironmentStatics IID___x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentStatics
#define IWindowingEnvironmentStaticsVtbl __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentStaticsVtbl
#define IWindowingEnvironmentStatics __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentStatics
#define IWindowingEnvironmentStatics_QueryInterface __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentStatics_QueryInterface
#define IWindowingEnvironmentStatics_AddRef __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentStatics_AddRef
#define IWindowingEnvironmentStatics_Release __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentStatics_Release
#define IWindowingEnvironmentStatics_GetIids __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentStatics_GetIids
#define IWindowingEnvironmentStatics_GetRuntimeClassName __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentStatics_GetRuntimeClassName
#define IWindowingEnvironmentStatics_GetTrustLevel __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentStatics_GetTrustLevel
#define IWindowingEnvironmentStatics_FindAll __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentStatics_FindAll
#define IWindowingEnvironmentStatics_FindAllWithKind __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentStatics_FindAllWithKind
#endif /* WIDL_using_Windows_UI_WindowManagement */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentStatics_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000 */

/*
 * Class Windows.UI.WindowManagement.DisplayRegion
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000
#ifndef RUNTIMECLASS_Windows_UI_WindowManagement_DisplayRegion_DEFINED
#define RUNTIMECLASS_Windows_UI_WindowManagement_DisplayRegion_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_WindowManagement_DisplayRegion[] = {'W','i','n','d','o','w','s','.','U','I','.','W','i','n','d','o','w','M','a','n','a','g','e','m','e','n','t','.','D','i','s','p','l','a','y','R','e','g','i','o','n',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_WindowManagement_DisplayRegion[] = L"Windows.UI.WindowManagement.DisplayRegion";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_WindowManagement_DisplayRegion[] = {'W','i','n','d','o','w','s','.','U','I','.','W','i','n','d','o','w','M','a','n','a','g','e','m','e','n','t','.','D','i','s','p','l','a','y','R','e','g','i','o','n',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_WindowManagement_DisplayRegion_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000 */

/*
 * Class Windows.UI.WindowManagement.WindowingEnvironment
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000
#ifndef RUNTIMECLASS_Windows_UI_WindowManagement_WindowingEnvironment_DEFINED
#define RUNTIMECLASS_Windows_UI_WindowManagement_WindowingEnvironment_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_WindowManagement_WindowingEnvironment[] = {'W','i','n','d','o','w','s','.','U','I','.','W','i','n','d','o','w','M','a','n','a','g','e','m','e','n','t','.','W','i','n','d','o','w','i','n','g','E','n','v','i','r','o','n','m','e','n','t',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_WindowManagement_WindowingEnvironment[] = L"Windows.UI.WindowManagement.WindowingEnvironment";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_WindowManagement_WindowingEnvironment[] = {'W','i','n','d','o','w','s','.','U','I','.','W','i','n','d','o','w','M','a','n','a','g','e','m','e','n','t','.','W','i','n','d','o','w','i','n','g','E','n','v','i','r','o','n','m','e','n','t',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_WindowManagement_WindowingEnvironment_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000 */

/*
 * Class Windows.UI.WindowManagement.WindowingEnvironmentAddedEventArgs
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000
#ifndef RUNTIMECLASS_Windows_UI_WindowManagement_WindowingEnvironmentAddedEventArgs_DEFINED
#define RUNTIMECLASS_Windows_UI_WindowManagement_WindowingEnvironmentAddedEventArgs_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_WindowManagement_WindowingEnvironmentAddedEventArgs[] = {'W','i','n','d','o','w','s','.','U','I','.','W','i','n','d','o','w','M','a','n','a','g','e','m','e','n','t','.','W','i','n','d','o','w','i','n','g','E','n','v','i','r','o','n','m','e','n','t','A','d','d','e','d','E','v','e','n','t','A','r','g','s',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_WindowManagement_WindowingEnvironmentAddedEventArgs[] = L"Windows.UI.WindowManagement.WindowingEnvironmentAddedEventArgs";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_WindowManagement_WindowingEnvironmentAddedEventArgs[] = {'W','i','n','d','o','w','s','.','U','I','.','W','i','n','d','o','w','M','a','n','a','g','e','m','e','n','t','.','W','i','n','d','o','w','i','n','g','E','n','v','i','r','o','n','m','e','n','t','A','d','d','e','d','E','v','e','n','t','A','r','g','s',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_WindowManagement_WindowingEnvironmentAddedEventArgs_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000 */

/*
 * Class Windows.UI.WindowManagement.WindowingEnvironmentChangedEventArgs
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000
#ifndef RUNTIMECLASS_Windows_UI_WindowManagement_WindowingEnvironmentChangedEventArgs_DEFINED
#define RUNTIMECLASS_Windows_UI_WindowManagement_WindowingEnvironmentChangedEventArgs_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_WindowManagement_WindowingEnvironmentChangedEventArgs[] = {'W','i','n','d','o','w','s','.','U','I','.','W','i','n','d','o','w','M','a','n','a','g','e','m','e','n','t','.','W','i','n','d','o','w','i','n','g','E','n','v','i','r','o','n','m','e','n','t','C','h','a','n','g','e','d','E','v','e','n','t','A','r','g','s',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_WindowManagement_WindowingEnvironmentChangedEventArgs[] = L"Windows.UI.WindowManagement.WindowingEnvironmentChangedEventArgs";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_WindowManagement_WindowingEnvironmentChangedEventArgs[] = {'W','i','n','d','o','w','s','.','U','I','.','W','i','n','d','o','w','M','a','n','a','g','e','m','e','n','t','.','W','i','n','d','o','w','i','n','g','E','n','v','i','r','o','n','m','e','n','t','C','h','a','n','g','e','d','E','v','e','n','t','A','r','g','s',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_WindowManagement_WindowingEnvironmentChangedEventArgs_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000 */

/*
 * Class Windows.UI.WindowManagement.WindowingEnvironmentRemovedEventArgs
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000
#ifndef RUNTIMECLASS_Windows_UI_WindowManagement_WindowingEnvironmentRemovedEventArgs_DEFINED
#define RUNTIMECLASS_Windows_UI_WindowManagement_WindowingEnvironmentRemovedEventArgs_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_WindowManagement_WindowingEnvironmentRemovedEventArgs[] = {'W','i','n','d','o','w','s','.','U','I','.','W','i','n','d','o','w','M','a','n','a','g','e','m','e','n','t','.','W','i','n','d','o','w','i','n','g','E','n','v','i','r','o','n','m','e','n','t','R','e','m','o','v','e','d','E','v','e','n','t','A','r','g','s',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_WindowManagement_WindowingEnvironmentRemovedEventArgs[] = L"Windows.UI.WindowManagement.WindowingEnvironmentRemovedEventArgs";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_WindowManagement_WindowingEnvironmentRemovedEventArgs[] = {'W','i','n','d','o','w','s','.','U','I','.','W','i','n','d','o','w','M','a','n','a','g','e','m','e','n','t','.','W','i','n','d','o','w','i','n','g','E','n','v','i','r','o','n','m','e','n','t','R','e','m','o','v','e','d','E','v','e','n','t','A','r','g','s',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_WindowManagement_WindowingEnvironmentRemovedEventArgs_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000 */

/*****************************************************************************
 * IIterable<ABI::Windows::UI::WindowManagement::DisplayRegion* > interface
 */
#ifndef ____FIIterable_1_Windows__CUI__CWindowManagement__CDisplayRegion_INTERFACE_DEFINED__
#define ____FIIterable_1_Windows__CUI__CWindowManagement__CDisplayRegion_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterable_1_Windows__CUI__CWindowManagement__CDisplayRegion, 0x026730ab, 0x250d, 0x503c, 0xa8,0x76, 0x43,0xbb,0xb7,0x54,0xad,0x44);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("026730ab-250d-503c-a876-43bbb754ad44")
                IIterable<ABI::Windows::UI::WindowManagement::DisplayRegion* > : IIterable_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::WindowManagement::DisplayRegion*, ABI::Windows::UI::WindowManagement::IDisplayRegion* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterable_1_Windows__CUI__CWindowManagement__CDisplayRegion, 0x026730ab, 0x250d, 0x503c, 0xa8,0x76, 0x43,0xbb,0xb7,0x54,0xad,0x44)
#endif
#else
typedef struct __FIIterable_1_Windows__CUI__CWindowManagement__CDisplayRegionVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FIIterable_1_Windows__CUI__CWindowManagement__CDisplayRegion *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FIIterable_1_Windows__CUI__CWindowManagement__CDisplayRegion *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FIIterable_1_Windows__CUI__CWindowManagement__CDisplayRegion *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __FIIterable_1_Windows__CUI__CWindowManagement__CDisplayRegion *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __FIIterable_1_Windows__CUI__CWindowManagement__CDisplayRegion *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __FIIterable_1_Windows__CUI__CWindowManagement__CDisplayRegion *This,
        TrustLevel *trustLevel);

    /*** IIterable<ABI::Windows::UI::WindowManagement::DisplayRegion* > methods ***/
    HRESULT (STDMETHODCALLTYPE *First)(
        __FIIterable_1_Windows__CUI__CWindowManagement__CDisplayRegion *This,
        __FIIterator_1_Windows__CUI__CWindowManagement__CDisplayRegion **value);

    END_INTERFACE
} __FIIterable_1_Windows__CUI__CWindowManagement__CDisplayRegionVtbl;

interface __FIIterable_1_Windows__CUI__CWindowManagement__CDisplayRegion {
    CONST_VTBL __FIIterable_1_Windows__CUI__CWindowManagement__CDisplayRegionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterable_1_Windows__CUI__CWindowManagement__CDisplayRegion_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterable_1_Windows__CUI__CWindowManagement__CDisplayRegion_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterable_1_Windows__CUI__CWindowManagement__CDisplayRegion_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterable_1_Windows__CUI__CWindowManagement__CDisplayRegion_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterable_1_Windows__CUI__CWindowManagement__CDisplayRegion_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterable_1_Windows__CUI__CWindowManagement__CDisplayRegion_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterable<ABI::Windows::UI::WindowManagement::DisplayRegion* > methods ***/
#define __FIIterable_1_Windows__CUI__CWindowManagement__CDisplayRegion_First(This,value) (This)->lpVtbl->First(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIIterable_1_Windows__CUI__CWindowManagement__CDisplayRegion_QueryInterface(__FIIterable_1_Windows__CUI__CWindowManagement__CDisplayRegion* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIIterable_1_Windows__CUI__CWindowManagement__CDisplayRegion_AddRef(__FIIterable_1_Windows__CUI__CWindowManagement__CDisplayRegion* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIIterable_1_Windows__CUI__CWindowManagement__CDisplayRegion_Release(__FIIterable_1_Windows__CUI__CWindowManagement__CDisplayRegion* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIIterable_1_Windows__CUI__CWindowManagement__CDisplayRegion_GetIids(__FIIterable_1_Windows__CUI__CWindowManagement__CDisplayRegion* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIIterable_1_Windows__CUI__CWindowManagement__CDisplayRegion_GetRuntimeClassName(__FIIterable_1_Windows__CUI__CWindowManagement__CDisplayRegion* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIIterable_1_Windows__CUI__CWindowManagement__CDisplayRegion_GetTrustLevel(__FIIterable_1_Windows__CUI__CWindowManagement__CDisplayRegion* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterable<ABI::Windows::UI::WindowManagement::DisplayRegion* > methods ***/
static inline HRESULT __FIIterable_1_Windows__CUI__CWindowManagement__CDisplayRegion_First(__FIIterable_1_Windows__CUI__CWindowManagement__CDisplayRegion* This,__FIIterator_1_Windows__CUI__CWindowManagement__CDisplayRegion **value) {
    return This->lpVtbl->First(This,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterable_DisplayRegion IID___FIIterable_1_Windows__CUI__CWindowManagement__CDisplayRegion
#define IIterable_DisplayRegionVtbl __FIIterable_1_Windows__CUI__CWindowManagement__CDisplayRegionVtbl
#define IIterable_DisplayRegion __FIIterable_1_Windows__CUI__CWindowManagement__CDisplayRegion
#define IIterable_DisplayRegion_QueryInterface __FIIterable_1_Windows__CUI__CWindowManagement__CDisplayRegion_QueryInterface
#define IIterable_DisplayRegion_AddRef __FIIterable_1_Windows__CUI__CWindowManagement__CDisplayRegion_AddRef
#define IIterable_DisplayRegion_Release __FIIterable_1_Windows__CUI__CWindowManagement__CDisplayRegion_Release
#define IIterable_DisplayRegion_GetIids __FIIterable_1_Windows__CUI__CWindowManagement__CDisplayRegion_GetIids
#define IIterable_DisplayRegion_GetRuntimeClassName __FIIterable_1_Windows__CUI__CWindowManagement__CDisplayRegion_GetRuntimeClassName
#define IIterable_DisplayRegion_GetTrustLevel __FIIterable_1_Windows__CUI__CWindowManagement__CDisplayRegion_GetTrustLevel
#define IIterable_DisplayRegion_First __FIIterable_1_Windows__CUI__CWindowManagement__CDisplayRegion_First
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterable_1_Windows__CUI__CWindowManagement__CDisplayRegion_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IIterable<ABI::Windows::UI::WindowManagement::WindowingEnvironment* > interface
 */
#ifndef ____FIIterable_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_INTERFACE_DEFINED__
#define ____FIIterable_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterable_1_Windows__CUI__CWindowManagement__CWindowingEnvironment, 0x626a6481, 0x0174, 0x5a56, 0x84,0xc9, 0xe8,0xd4,0xc4,0x8c,0xfb,0x1b);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("626a6481-0174-5a56-84c9-e8d4c48cfb1b")
                IIterable<ABI::Windows::UI::WindowManagement::WindowingEnvironment* > : IIterable_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::WindowManagement::WindowingEnvironment*, ABI::Windows::UI::WindowManagement::IWindowingEnvironment* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterable_1_Windows__CUI__CWindowManagement__CWindowingEnvironment, 0x626a6481, 0x0174, 0x5a56, 0x84,0xc9, 0xe8,0xd4,0xc4,0x8c,0xfb,0x1b)
#endif
#else
typedef struct __FIIterable_1_Windows__CUI__CWindowManagement__CWindowingEnvironmentVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FIIterable_1_Windows__CUI__CWindowManagement__CWindowingEnvironment *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FIIterable_1_Windows__CUI__CWindowManagement__CWindowingEnvironment *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FIIterable_1_Windows__CUI__CWindowManagement__CWindowingEnvironment *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __FIIterable_1_Windows__CUI__CWindowManagement__CWindowingEnvironment *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __FIIterable_1_Windows__CUI__CWindowManagement__CWindowingEnvironment *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __FIIterable_1_Windows__CUI__CWindowManagement__CWindowingEnvironment *This,
        TrustLevel *trustLevel);

    /*** IIterable<ABI::Windows::UI::WindowManagement::WindowingEnvironment* > methods ***/
    HRESULT (STDMETHODCALLTYPE *First)(
        __FIIterable_1_Windows__CUI__CWindowManagement__CWindowingEnvironment *This,
        __FIIterator_1_Windows__CUI__CWindowManagement__CWindowingEnvironment **value);

    END_INTERFACE
} __FIIterable_1_Windows__CUI__CWindowManagement__CWindowingEnvironmentVtbl;

interface __FIIterable_1_Windows__CUI__CWindowManagement__CWindowingEnvironment {
    CONST_VTBL __FIIterable_1_Windows__CUI__CWindowManagement__CWindowingEnvironmentVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterable_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterable_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterable_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterable_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterable_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterable_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterable<ABI::Windows::UI::WindowManagement::WindowingEnvironment* > methods ***/
#define __FIIterable_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_First(This,value) (This)->lpVtbl->First(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIIterable_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_QueryInterface(__FIIterable_1_Windows__CUI__CWindowManagement__CWindowingEnvironment* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIIterable_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_AddRef(__FIIterable_1_Windows__CUI__CWindowManagement__CWindowingEnvironment* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIIterable_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_Release(__FIIterable_1_Windows__CUI__CWindowManagement__CWindowingEnvironment* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIIterable_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_GetIids(__FIIterable_1_Windows__CUI__CWindowManagement__CWindowingEnvironment* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIIterable_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_GetRuntimeClassName(__FIIterable_1_Windows__CUI__CWindowManagement__CWindowingEnvironment* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIIterable_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_GetTrustLevel(__FIIterable_1_Windows__CUI__CWindowManagement__CWindowingEnvironment* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterable<ABI::Windows::UI::WindowManagement::WindowingEnvironment* > methods ***/
static inline HRESULT __FIIterable_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_First(__FIIterable_1_Windows__CUI__CWindowManagement__CWindowingEnvironment* This,__FIIterator_1_Windows__CUI__CWindowManagement__CWindowingEnvironment **value) {
    return This->lpVtbl->First(This,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterable_WindowingEnvironment IID___FIIterable_1_Windows__CUI__CWindowManagement__CWindowingEnvironment
#define IIterable_WindowingEnvironmentVtbl __FIIterable_1_Windows__CUI__CWindowManagement__CWindowingEnvironmentVtbl
#define IIterable_WindowingEnvironment __FIIterable_1_Windows__CUI__CWindowManagement__CWindowingEnvironment
#define IIterable_WindowingEnvironment_QueryInterface __FIIterable_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_QueryInterface
#define IIterable_WindowingEnvironment_AddRef __FIIterable_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_AddRef
#define IIterable_WindowingEnvironment_Release __FIIterable_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_Release
#define IIterable_WindowingEnvironment_GetIids __FIIterable_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_GetIids
#define IIterable_WindowingEnvironment_GetRuntimeClassName __FIIterable_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_GetRuntimeClassName
#define IIterable_WindowingEnvironment_GetTrustLevel __FIIterable_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_GetTrustLevel
#define IIterable_WindowingEnvironment_First __FIIterable_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_First
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterable_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IIterator<ABI::Windows::UI::WindowManagement::DisplayRegion* > interface
 */
#ifndef ____FIIterator_1_Windows__CUI__CWindowManagement__CDisplayRegion_INTERFACE_DEFINED__
#define ____FIIterator_1_Windows__CUI__CWindowManagement__CDisplayRegion_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterator_1_Windows__CUI__CWindowManagement__CDisplayRegion, 0x110d4d7e, 0x2f29, 0x51b8, 0x96,0x91, 0x8b,0x20,0x6a,0xd1,0xd7,0x3b);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("110d4d7e-2f29-51b8-9691-8b206ad1d73b")
                IIterator<ABI::Windows::UI::WindowManagement::DisplayRegion* > : IIterator_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::WindowManagement::DisplayRegion*, ABI::Windows::UI::WindowManagement::IDisplayRegion* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterator_1_Windows__CUI__CWindowManagement__CDisplayRegion, 0x110d4d7e, 0x2f29, 0x51b8, 0x96,0x91, 0x8b,0x20,0x6a,0xd1,0xd7,0x3b)
#endif
#else
typedef struct __FIIterator_1_Windows__CUI__CWindowManagement__CDisplayRegionVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FIIterator_1_Windows__CUI__CWindowManagement__CDisplayRegion *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FIIterator_1_Windows__CUI__CWindowManagement__CDisplayRegion *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FIIterator_1_Windows__CUI__CWindowManagement__CDisplayRegion *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __FIIterator_1_Windows__CUI__CWindowManagement__CDisplayRegion *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __FIIterator_1_Windows__CUI__CWindowManagement__CDisplayRegion *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __FIIterator_1_Windows__CUI__CWindowManagement__CDisplayRegion *This,
        TrustLevel *trustLevel);

    /*** IIterator<ABI::Windows::UI::WindowManagement::DisplayRegion* > methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Current)(
        __FIIterator_1_Windows__CUI__CWindowManagement__CDisplayRegion *This,
        __x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegion **value);

    HRESULT (STDMETHODCALLTYPE *get_HasCurrent)(
        __FIIterator_1_Windows__CUI__CWindowManagement__CDisplayRegion *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *MoveNext)(
        __FIIterator_1_Windows__CUI__CWindowManagement__CDisplayRegion *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIIterator_1_Windows__CUI__CWindowManagement__CDisplayRegion *This,
        UINT32 items_size,
        __x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegion **items,
        UINT32 *value);

    END_INTERFACE
} __FIIterator_1_Windows__CUI__CWindowManagement__CDisplayRegionVtbl;

interface __FIIterator_1_Windows__CUI__CWindowManagement__CDisplayRegion {
    CONST_VTBL __FIIterator_1_Windows__CUI__CWindowManagement__CDisplayRegionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterator_1_Windows__CUI__CWindowManagement__CDisplayRegion_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterator_1_Windows__CUI__CWindowManagement__CDisplayRegion_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterator_1_Windows__CUI__CWindowManagement__CDisplayRegion_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterator_1_Windows__CUI__CWindowManagement__CDisplayRegion_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterator_1_Windows__CUI__CWindowManagement__CDisplayRegion_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterator_1_Windows__CUI__CWindowManagement__CDisplayRegion_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterator<ABI::Windows::UI::WindowManagement::DisplayRegion* > methods ***/
#define __FIIterator_1_Windows__CUI__CWindowManagement__CDisplayRegion_get_Current(This,value) (This)->lpVtbl->get_Current(This,value)
#define __FIIterator_1_Windows__CUI__CWindowManagement__CDisplayRegion_get_HasCurrent(This,value) (This)->lpVtbl->get_HasCurrent(This,value)
#define __FIIterator_1_Windows__CUI__CWindowManagement__CDisplayRegion_MoveNext(This,value) (This)->lpVtbl->MoveNext(This,value)
#define __FIIterator_1_Windows__CUI__CWindowManagement__CDisplayRegion_GetMany(This,items_size,items,value) (This)->lpVtbl->GetMany(This,items_size,items,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIIterator_1_Windows__CUI__CWindowManagement__CDisplayRegion_QueryInterface(__FIIterator_1_Windows__CUI__CWindowManagement__CDisplayRegion* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIIterator_1_Windows__CUI__CWindowManagement__CDisplayRegion_AddRef(__FIIterator_1_Windows__CUI__CWindowManagement__CDisplayRegion* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIIterator_1_Windows__CUI__CWindowManagement__CDisplayRegion_Release(__FIIterator_1_Windows__CUI__CWindowManagement__CDisplayRegion* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIIterator_1_Windows__CUI__CWindowManagement__CDisplayRegion_GetIids(__FIIterator_1_Windows__CUI__CWindowManagement__CDisplayRegion* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIIterator_1_Windows__CUI__CWindowManagement__CDisplayRegion_GetRuntimeClassName(__FIIterator_1_Windows__CUI__CWindowManagement__CDisplayRegion* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIIterator_1_Windows__CUI__CWindowManagement__CDisplayRegion_GetTrustLevel(__FIIterator_1_Windows__CUI__CWindowManagement__CDisplayRegion* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterator<ABI::Windows::UI::WindowManagement::DisplayRegion* > methods ***/
static inline HRESULT __FIIterator_1_Windows__CUI__CWindowManagement__CDisplayRegion_get_Current(__FIIterator_1_Windows__CUI__CWindowManagement__CDisplayRegion* This,__x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegion **value) {
    return This->lpVtbl->get_Current(This,value);
}
static inline HRESULT __FIIterator_1_Windows__CUI__CWindowManagement__CDisplayRegion_get_HasCurrent(__FIIterator_1_Windows__CUI__CWindowManagement__CDisplayRegion* This,boolean *value) {
    return This->lpVtbl->get_HasCurrent(This,value);
}
static inline HRESULT __FIIterator_1_Windows__CUI__CWindowManagement__CDisplayRegion_MoveNext(__FIIterator_1_Windows__CUI__CWindowManagement__CDisplayRegion* This,boolean *value) {
    return This->lpVtbl->MoveNext(This,value);
}
static inline HRESULT __FIIterator_1_Windows__CUI__CWindowManagement__CDisplayRegion_GetMany(__FIIterator_1_Windows__CUI__CWindowManagement__CDisplayRegion* This,UINT32 items_size,__x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegion **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterator_DisplayRegion IID___FIIterator_1_Windows__CUI__CWindowManagement__CDisplayRegion
#define IIterator_DisplayRegionVtbl __FIIterator_1_Windows__CUI__CWindowManagement__CDisplayRegionVtbl
#define IIterator_DisplayRegion __FIIterator_1_Windows__CUI__CWindowManagement__CDisplayRegion
#define IIterator_DisplayRegion_QueryInterface __FIIterator_1_Windows__CUI__CWindowManagement__CDisplayRegion_QueryInterface
#define IIterator_DisplayRegion_AddRef __FIIterator_1_Windows__CUI__CWindowManagement__CDisplayRegion_AddRef
#define IIterator_DisplayRegion_Release __FIIterator_1_Windows__CUI__CWindowManagement__CDisplayRegion_Release
#define IIterator_DisplayRegion_GetIids __FIIterator_1_Windows__CUI__CWindowManagement__CDisplayRegion_GetIids
#define IIterator_DisplayRegion_GetRuntimeClassName __FIIterator_1_Windows__CUI__CWindowManagement__CDisplayRegion_GetRuntimeClassName
#define IIterator_DisplayRegion_GetTrustLevel __FIIterator_1_Windows__CUI__CWindowManagement__CDisplayRegion_GetTrustLevel
#define IIterator_DisplayRegion_get_Current __FIIterator_1_Windows__CUI__CWindowManagement__CDisplayRegion_get_Current
#define IIterator_DisplayRegion_get_HasCurrent __FIIterator_1_Windows__CUI__CWindowManagement__CDisplayRegion_get_HasCurrent
#define IIterator_DisplayRegion_MoveNext __FIIterator_1_Windows__CUI__CWindowManagement__CDisplayRegion_MoveNext
#define IIterator_DisplayRegion_GetMany __FIIterator_1_Windows__CUI__CWindowManagement__CDisplayRegion_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterator_1_Windows__CUI__CWindowManagement__CDisplayRegion_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IIterator<ABI::Windows::UI::WindowManagement::WindowingEnvironment* > interface
 */
#ifndef ____FIIterator_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_INTERFACE_DEFINED__
#define ____FIIterator_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterator_1_Windows__CUI__CWindowManagement__CWindowingEnvironment, 0xa35c192a, 0x9459, 0x5bcc, 0x9d,0xb3, 0x23,0x24,0x37,0x16,0x19,0x7f);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("a35c192a-9459-5bcc-9db3-23243716197f")
                IIterator<ABI::Windows::UI::WindowManagement::WindowingEnvironment* > : IIterator_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::WindowManagement::WindowingEnvironment*, ABI::Windows::UI::WindowManagement::IWindowingEnvironment* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterator_1_Windows__CUI__CWindowManagement__CWindowingEnvironment, 0xa35c192a, 0x9459, 0x5bcc, 0x9d,0xb3, 0x23,0x24,0x37,0x16,0x19,0x7f)
#endif
#else
typedef struct __FIIterator_1_Windows__CUI__CWindowManagement__CWindowingEnvironmentVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FIIterator_1_Windows__CUI__CWindowManagement__CWindowingEnvironment *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FIIterator_1_Windows__CUI__CWindowManagement__CWindowingEnvironment *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FIIterator_1_Windows__CUI__CWindowManagement__CWindowingEnvironment *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __FIIterator_1_Windows__CUI__CWindowManagement__CWindowingEnvironment *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __FIIterator_1_Windows__CUI__CWindowManagement__CWindowingEnvironment *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __FIIterator_1_Windows__CUI__CWindowManagement__CWindowingEnvironment *This,
        TrustLevel *trustLevel);

    /*** IIterator<ABI::Windows::UI::WindowManagement::WindowingEnvironment* > methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Current)(
        __FIIterator_1_Windows__CUI__CWindowManagement__CWindowingEnvironment *This,
        __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironment **value);

    HRESULT (STDMETHODCALLTYPE *get_HasCurrent)(
        __FIIterator_1_Windows__CUI__CWindowManagement__CWindowingEnvironment *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *MoveNext)(
        __FIIterator_1_Windows__CUI__CWindowManagement__CWindowingEnvironment *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIIterator_1_Windows__CUI__CWindowManagement__CWindowingEnvironment *This,
        UINT32 items_size,
        __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironment **items,
        UINT32 *value);

    END_INTERFACE
} __FIIterator_1_Windows__CUI__CWindowManagement__CWindowingEnvironmentVtbl;

interface __FIIterator_1_Windows__CUI__CWindowManagement__CWindowingEnvironment {
    CONST_VTBL __FIIterator_1_Windows__CUI__CWindowManagement__CWindowingEnvironmentVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterator_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterator_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterator_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterator_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterator_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterator_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterator<ABI::Windows::UI::WindowManagement::WindowingEnvironment* > methods ***/
#define __FIIterator_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_get_Current(This,value) (This)->lpVtbl->get_Current(This,value)
#define __FIIterator_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_get_HasCurrent(This,value) (This)->lpVtbl->get_HasCurrent(This,value)
#define __FIIterator_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_MoveNext(This,value) (This)->lpVtbl->MoveNext(This,value)
#define __FIIterator_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_GetMany(This,items_size,items,value) (This)->lpVtbl->GetMany(This,items_size,items,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIIterator_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_QueryInterface(__FIIterator_1_Windows__CUI__CWindowManagement__CWindowingEnvironment* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIIterator_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_AddRef(__FIIterator_1_Windows__CUI__CWindowManagement__CWindowingEnvironment* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIIterator_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_Release(__FIIterator_1_Windows__CUI__CWindowManagement__CWindowingEnvironment* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIIterator_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_GetIids(__FIIterator_1_Windows__CUI__CWindowManagement__CWindowingEnvironment* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIIterator_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_GetRuntimeClassName(__FIIterator_1_Windows__CUI__CWindowManagement__CWindowingEnvironment* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIIterator_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_GetTrustLevel(__FIIterator_1_Windows__CUI__CWindowManagement__CWindowingEnvironment* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterator<ABI::Windows::UI::WindowManagement::WindowingEnvironment* > methods ***/
static inline HRESULT __FIIterator_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_get_Current(__FIIterator_1_Windows__CUI__CWindowManagement__CWindowingEnvironment* This,__x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironment **value) {
    return This->lpVtbl->get_Current(This,value);
}
static inline HRESULT __FIIterator_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_get_HasCurrent(__FIIterator_1_Windows__CUI__CWindowManagement__CWindowingEnvironment* This,boolean *value) {
    return This->lpVtbl->get_HasCurrent(This,value);
}
static inline HRESULT __FIIterator_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_MoveNext(__FIIterator_1_Windows__CUI__CWindowManagement__CWindowingEnvironment* This,boolean *value) {
    return This->lpVtbl->MoveNext(This,value);
}
static inline HRESULT __FIIterator_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_GetMany(__FIIterator_1_Windows__CUI__CWindowManagement__CWindowingEnvironment* This,UINT32 items_size,__x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironment **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterator_WindowingEnvironment IID___FIIterator_1_Windows__CUI__CWindowManagement__CWindowingEnvironment
#define IIterator_WindowingEnvironmentVtbl __FIIterator_1_Windows__CUI__CWindowManagement__CWindowingEnvironmentVtbl
#define IIterator_WindowingEnvironment __FIIterator_1_Windows__CUI__CWindowManagement__CWindowingEnvironment
#define IIterator_WindowingEnvironment_QueryInterface __FIIterator_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_QueryInterface
#define IIterator_WindowingEnvironment_AddRef __FIIterator_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_AddRef
#define IIterator_WindowingEnvironment_Release __FIIterator_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_Release
#define IIterator_WindowingEnvironment_GetIids __FIIterator_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_GetIids
#define IIterator_WindowingEnvironment_GetRuntimeClassName __FIIterator_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_GetRuntimeClassName
#define IIterator_WindowingEnvironment_GetTrustLevel __FIIterator_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_GetTrustLevel
#define IIterator_WindowingEnvironment_get_Current __FIIterator_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_get_Current
#define IIterator_WindowingEnvironment_get_HasCurrent __FIIterator_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_get_HasCurrent
#define IIterator_WindowingEnvironment_MoveNext __FIIterator_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_MoveNext
#define IIterator_WindowingEnvironment_GetMany __FIIterator_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterator_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVectorView<ABI::Windows::UI::WindowManagement::DisplayRegion* > interface
 */
#ifndef ____FIVectorView_1_Windows__CUI__CWindowManagement__CDisplayRegion_INTERFACE_DEFINED__
#define ____FIVectorView_1_Windows__CUI__CWindowManagement__CDisplayRegion_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIVectorView_1_Windows__CUI__CWindowManagement__CDisplayRegion, 0x9460debb, 0xa0d6, 0x5ab8, 0x84,0xf5, 0x90,0x87,0xf2,0xa6,0xbb,0x67);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("9460debb-a0d6-5ab8-84f5-9087f2a6bb67")
                IVectorView<ABI::Windows::UI::WindowManagement::DisplayRegion* > : IVectorView_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::WindowManagement::DisplayRegion*, ABI::Windows::UI::WindowManagement::IDisplayRegion* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIVectorView_1_Windows__CUI__CWindowManagement__CDisplayRegion, 0x9460debb, 0xa0d6, 0x5ab8, 0x84,0xf5, 0x90,0x87,0xf2,0xa6,0xbb,0x67)
#endif
#else
typedef struct __FIVectorView_1_Windows__CUI__CWindowManagement__CDisplayRegionVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FIVectorView_1_Windows__CUI__CWindowManagement__CDisplayRegion *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FIVectorView_1_Windows__CUI__CWindowManagement__CDisplayRegion *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FIVectorView_1_Windows__CUI__CWindowManagement__CDisplayRegion *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __FIVectorView_1_Windows__CUI__CWindowManagement__CDisplayRegion *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __FIVectorView_1_Windows__CUI__CWindowManagement__CDisplayRegion *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __FIVectorView_1_Windows__CUI__CWindowManagement__CDisplayRegion *This,
        TrustLevel *trustLevel);

    /*** IVectorView<ABI::Windows::UI::WindowManagement::DisplayRegion* > methods ***/
    HRESULT (STDMETHODCALLTYPE *GetAt)(
        __FIVectorView_1_Windows__CUI__CWindowManagement__CDisplayRegion *This,
        UINT32 index,
        __x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegion **value);

    HRESULT (STDMETHODCALLTYPE *get_Size)(
        __FIVectorView_1_Windows__CUI__CWindowManagement__CDisplayRegion *This,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *IndexOf)(
        __FIVectorView_1_Windows__CUI__CWindowManagement__CDisplayRegion *This,
        __x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegion *element,
        UINT32 *index,
        BOOLEAN *value);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIVectorView_1_Windows__CUI__CWindowManagement__CDisplayRegion *This,
        UINT32 start_index,
        UINT32 items_size,
        __x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegion **items,
        UINT32 *value);

    END_INTERFACE
} __FIVectorView_1_Windows__CUI__CWindowManagement__CDisplayRegionVtbl;

interface __FIVectorView_1_Windows__CUI__CWindowManagement__CDisplayRegion {
    CONST_VTBL __FIVectorView_1_Windows__CUI__CWindowManagement__CDisplayRegionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIVectorView_1_Windows__CUI__CWindowManagement__CDisplayRegion_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIVectorView_1_Windows__CUI__CWindowManagement__CDisplayRegion_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIVectorView_1_Windows__CUI__CWindowManagement__CDisplayRegion_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIVectorView_1_Windows__CUI__CWindowManagement__CDisplayRegion_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIVectorView_1_Windows__CUI__CWindowManagement__CDisplayRegion_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIVectorView_1_Windows__CUI__CWindowManagement__CDisplayRegion_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IVectorView<ABI::Windows::UI::WindowManagement::DisplayRegion* > methods ***/
#define __FIVectorView_1_Windows__CUI__CWindowManagement__CDisplayRegion_GetAt(This,index,value) (This)->lpVtbl->GetAt(This,index,value)
#define __FIVectorView_1_Windows__CUI__CWindowManagement__CDisplayRegion_get_Size(This,value) (This)->lpVtbl->get_Size(This,value)
#define __FIVectorView_1_Windows__CUI__CWindowManagement__CDisplayRegion_IndexOf(This,element,index,value) (This)->lpVtbl->IndexOf(This,element,index,value)
#define __FIVectorView_1_Windows__CUI__CWindowManagement__CDisplayRegion_GetMany(This,start_index,items_size,items,value) (This)->lpVtbl->GetMany(This,start_index,items_size,items,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIVectorView_1_Windows__CUI__CWindowManagement__CDisplayRegion_QueryInterface(__FIVectorView_1_Windows__CUI__CWindowManagement__CDisplayRegion* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIVectorView_1_Windows__CUI__CWindowManagement__CDisplayRegion_AddRef(__FIVectorView_1_Windows__CUI__CWindowManagement__CDisplayRegion* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIVectorView_1_Windows__CUI__CWindowManagement__CDisplayRegion_Release(__FIVectorView_1_Windows__CUI__CWindowManagement__CDisplayRegion* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIVectorView_1_Windows__CUI__CWindowManagement__CDisplayRegion_GetIids(__FIVectorView_1_Windows__CUI__CWindowManagement__CDisplayRegion* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIVectorView_1_Windows__CUI__CWindowManagement__CDisplayRegion_GetRuntimeClassName(__FIVectorView_1_Windows__CUI__CWindowManagement__CDisplayRegion* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIVectorView_1_Windows__CUI__CWindowManagement__CDisplayRegion_GetTrustLevel(__FIVectorView_1_Windows__CUI__CWindowManagement__CDisplayRegion* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IVectorView<ABI::Windows::UI::WindowManagement::DisplayRegion* > methods ***/
static inline HRESULT __FIVectorView_1_Windows__CUI__CWindowManagement__CDisplayRegion_GetAt(__FIVectorView_1_Windows__CUI__CWindowManagement__CDisplayRegion* This,UINT32 index,__x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegion **value) {
    return This->lpVtbl->GetAt(This,index,value);
}
static inline HRESULT __FIVectorView_1_Windows__CUI__CWindowManagement__CDisplayRegion_get_Size(__FIVectorView_1_Windows__CUI__CWindowManagement__CDisplayRegion* This,UINT32 *value) {
    return This->lpVtbl->get_Size(This,value);
}
static inline HRESULT __FIVectorView_1_Windows__CUI__CWindowManagement__CDisplayRegion_IndexOf(__FIVectorView_1_Windows__CUI__CWindowManagement__CDisplayRegion* This,__x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegion *element,UINT32 *index,BOOLEAN *value) {
    return This->lpVtbl->IndexOf(This,element,index,value);
}
static inline HRESULT __FIVectorView_1_Windows__CUI__CWindowManagement__CDisplayRegion_GetMany(__FIVectorView_1_Windows__CUI__CWindowManagement__CDisplayRegion* This,UINT32 start_index,UINT32 items_size,__x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegion **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,start_index,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IVectorView_DisplayRegion IID___FIVectorView_1_Windows__CUI__CWindowManagement__CDisplayRegion
#define IVectorView_DisplayRegionVtbl __FIVectorView_1_Windows__CUI__CWindowManagement__CDisplayRegionVtbl
#define IVectorView_DisplayRegion __FIVectorView_1_Windows__CUI__CWindowManagement__CDisplayRegion
#define IVectorView_DisplayRegion_QueryInterface __FIVectorView_1_Windows__CUI__CWindowManagement__CDisplayRegion_QueryInterface
#define IVectorView_DisplayRegion_AddRef __FIVectorView_1_Windows__CUI__CWindowManagement__CDisplayRegion_AddRef
#define IVectorView_DisplayRegion_Release __FIVectorView_1_Windows__CUI__CWindowManagement__CDisplayRegion_Release
#define IVectorView_DisplayRegion_GetIids __FIVectorView_1_Windows__CUI__CWindowManagement__CDisplayRegion_GetIids
#define IVectorView_DisplayRegion_GetRuntimeClassName __FIVectorView_1_Windows__CUI__CWindowManagement__CDisplayRegion_GetRuntimeClassName
#define IVectorView_DisplayRegion_GetTrustLevel __FIVectorView_1_Windows__CUI__CWindowManagement__CDisplayRegion_GetTrustLevel
#define IVectorView_DisplayRegion_GetAt __FIVectorView_1_Windows__CUI__CWindowManagement__CDisplayRegion_GetAt
#define IVectorView_DisplayRegion_get_Size __FIVectorView_1_Windows__CUI__CWindowManagement__CDisplayRegion_get_Size
#define IVectorView_DisplayRegion_IndexOf __FIVectorView_1_Windows__CUI__CWindowManagement__CDisplayRegion_IndexOf
#define IVectorView_DisplayRegion_GetMany __FIVectorView_1_Windows__CUI__CWindowManagement__CDisplayRegion_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIVectorView_1_Windows__CUI__CWindowManagement__CDisplayRegion_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVectorView<ABI::Windows::UI::WindowManagement::WindowingEnvironment* > interface
 */
#ifndef ____FIVectorView_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_INTERFACE_DEFINED__
#define ____FIVectorView_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIVectorView_1_Windows__CUI__CWindowManagement__CWindowingEnvironment, 0xc833c1c0, 0x79c6, 0x522e, 0xb7,0x1b, 0xd8,0x45,0xe0,0xf6,0x66,0x8e);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("c833c1c0-79c6-522e-b71b-d845e0f6668e")
                IVectorView<ABI::Windows::UI::WindowManagement::WindowingEnvironment* > : IVectorView_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::WindowManagement::WindowingEnvironment*, ABI::Windows::UI::WindowManagement::IWindowingEnvironment* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIVectorView_1_Windows__CUI__CWindowManagement__CWindowingEnvironment, 0xc833c1c0, 0x79c6, 0x522e, 0xb7,0x1b, 0xd8,0x45,0xe0,0xf6,0x66,0x8e)
#endif
#else
typedef struct __FIVectorView_1_Windows__CUI__CWindowManagement__CWindowingEnvironmentVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FIVectorView_1_Windows__CUI__CWindowManagement__CWindowingEnvironment *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FIVectorView_1_Windows__CUI__CWindowManagement__CWindowingEnvironment *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FIVectorView_1_Windows__CUI__CWindowManagement__CWindowingEnvironment *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __FIVectorView_1_Windows__CUI__CWindowManagement__CWindowingEnvironment *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __FIVectorView_1_Windows__CUI__CWindowManagement__CWindowingEnvironment *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __FIVectorView_1_Windows__CUI__CWindowManagement__CWindowingEnvironment *This,
        TrustLevel *trustLevel);

    /*** IVectorView<ABI::Windows::UI::WindowManagement::WindowingEnvironment* > methods ***/
    HRESULT (STDMETHODCALLTYPE *GetAt)(
        __FIVectorView_1_Windows__CUI__CWindowManagement__CWindowingEnvironment *This,
        UINT32 index,
        __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironment **value);

    HRESULT (STDMETHODCALLTYPE *get_Size)(
        __FIVectorView_1_Windows__CUI__CWindowManagement__CWindowingEnvironment *This,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *IndexOf)(
        __FIVectorView_1_Windows__CUI__CWindowManagement__CWindowingEnvironment *This,
        __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironment *element,
        UINT32 *index,
        BOOLEAN *value);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIVectorView_1_Windows__CUI__CWindowManagement__CWindowingEnvironment *This,
        UINT32 start_index,
        UINT32 items_size,
        __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironment **items,
        UINT32 *value);

    END_INTERFACE
} __FIVectorView_1_Windows__CUI__CWindowManagement__CWindowingEnvironmentVtbl;

interface __FIVectorView_1_Windows__CUI__CWindowManagement__CWindowingEnvironment {
    CONST_VTBL __FIVectorView_1_Windows__CUI__CWindowManagement__CWindowingEnvironmentVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIVectorView_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIVectorView_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIVectorView_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIVectorView_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIVectorView_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIVectorView_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IVectorView<ABI::Windows::UI::WindowManagement::WindowingEnvironment* > methods ***/
#define __FIVectorView_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_GetAt(This,index,value) (This)->lpVtbl->GetAt(This,index,value)
#define __FIVectorView_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_get_Size(This,value) (This)->lpVtbl->get_Size(This,value)
#define __FIVectorView_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_IndexOf(This,element,index,value) (This)->lpVtbl->IndexOf(This,element,index,value)
#define __FIVectorView_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_GetMany(This,start_index,items_size,items,value) (This)->lpVtbl->GetMany(This,start_index,items_size,items,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIVectorView_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_QueryInterface(__FIVectorView_1_Windows__CUI__CWindowManagement__CWindowingEnvironment* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIVectorView_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_AddRef(__FIVectorView_1_Windows__CUI__CWindowManagement__CWindowingEnvironment* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIVectorView_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_Release(__FIVectorView_1_Windows__CUI__CWindowManagement__CWindowingEnvironment* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIVectorView_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_GetIids(__FIVectorView_1_Windows__CUI__CWindowManagement__CWindowingEnvironment* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIVectorView_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_GetRuntimeClassName(__FIVectorView_1_Windows__CUI__CWindowManagement__CWindowingEnvironment* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIVectorView_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_GetTrustLevel(__FIVectorView_1_Windows__CUI__CWindowManagement__CWindowingEnvironment* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IVectorView<ABI::Windows::UI::WindowManagement::WindowingEnvironment* > methods ***/
static inline HRESULT __FIVectorView_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_GetAt(__FIVectorView_1_Windows__CUI__CWindowManagement__CWindowingEnvironment* This,UINT32 index,__x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironment **value) {
    return This->lpVtbl->GetAt(This,index,value);
}
static inline HRESULT __FIVectorView_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_get_Size(__FIVectorView_1_Windows__CUI__CWindowManagement__CWindowingEnvironment* This,UINT32 *value) {
    return This->lpVtbl->get_Size(This,value);
}
static inline HRESULT __FIVectorView_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_IndexOf(__FIVectorView_1_Windows__CUI__CWindowManagement__CWindowingEnvironment* This,__x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironment *element,UINT32 *index,BOOLEAN *value) {
    return This->lpVtbl->IndexOf(This,element,index,value);
}
static inline HRESULT __FIVectorView_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_GetMany(__FIVectorView_1_Windows__CUI__CWindowManagement__CWindowingEnvironment* This,UINT32 start_index,UINT32 items_size,__x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironment **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,start_index,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IVectorView_WindowingEnvironment IID___FIVectorView_1_Windows__CUI__CWindowManagement__CWindowingEnvironment
#define IVectorView_WindowingEnvironmentVtbl __FIVectorView_1_Windows__CUI__CWindowManagement__CWindowingEnvironmentVtbl
#define IVectorView_WindowingEnvironment __FIVectorView_1_Windows__CUI__CWindowManagement__CWindowingEnvironment
#define IVectorView_WindowingEnvironment_QueryInterface __FIVectorView_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_QueryInterface
#define IVectorView_WindowingEnvironment_AddRef __FIVectorView_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_AddRef
#define IVectorView_WindowingEnvironment_Release __FIVectorView_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_Release
#define IVectorView_WindowingEnvironment_GetIids __FIVectorView_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_GetIids
#define IVectorView_WindowingEnvironment_GetRuntimeClassName __FIVectorView_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_GetRuntimeClassName
#define IVectorView_WindowingEnvironment_GetTrustLevel __FIVectorView_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_GetTrustLevel
#define IVectorView_WindowingEnvironment_GetAt __FIVectorView_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_GetAt
#define IVectorView_WindowingEnvironment_get_Size __FIVectorView_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_get_Size
#define IVectorView_WindowingEnvironment_IndexOf __FIVectorView_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_IndexOf
#define IVectorView_WindowingEnvironment_GetMany __FIVectorView_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIVectorView_1_Windows__CUI__CWindowManagement__CWindowingEnvironment_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ITypedEventHandler<ABI::Windows::UI::WindowManagement::DisplayRegion*,IInspectable* > interface
 */
#ifndef ____FITypedEventHandler_2_Windows__CUI__CWindowManagement__CDisplayRegion_IInspectable_INTERFACE_DEFINED__
#define ____FITypedEventHandler_2_Windows__CUI__CWindowManagement__CDisplayRegion_IInspectable_INTERFACE_DEFINED__

DEFINE_GUID(IID___FITypedEventHandler_2_Windows__CUI__CWindowManagement__CDisplayRegion_IInspectable, 0x2c40d18b, 0x7438, 0x5eb4, 0x93,0x59, 0x78,0x97,0xfc,0xe7,0xe3,0xfc);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("2c40d18b-7438-5eb4-9359-7897fce7e3fc")
            ITypedEventHandler<ABI::Windows::UI::WindowManagement::DisplayRegion*,IInspectable* > : ITypedEventHandler_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::WindowManagement::DisplayRegion*, ABI::Windows::UI::WindowManagement::IDisplayRegion* >, IInspectable* >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FITypedEventHandler_2_Windows__CUI__CWindowManagement__CDisplayRegion_IInspectable, 0x2c40d18b, 0x7438, 0x5eb4, 0x93,0x59, 0x78,0x97,0xfc,0xe7,0xe3,0xfc)
#endif
#else
typedef struct __FITypedEventHandler_2_Windows__CUI__CWindowManagement__CDisplayRegion_IInspectableVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FITypedEventHandler_2_Windows__CUI__CWindowManagement__CDisplayRegion_IInspectable *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FITypedEventHandler_2_Windows__CUI__CWindowManagement__CDisplayRegion_IInspectable *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FITypedEventHandler_2_Windows__CUI__CWindowManagement__CDisplayRegion_IInspectable *This);

    /*** ITypedEventHandler<ABI::Windows::UI::WindowManagement::DisplayRegion*,IInspectable* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FITypedEventHandler_2_Windows__CUI__CWindowManagement__CDisplayRegion_IInspectable *This,
        __x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegion *sender,
        IInspectable *args);

    END_INTERFACE
} __FITypedEventHandler_2_Windows__CUI__CWindowManagement__CDisplayRegion_IInspectableVtbl;

interface __FITypedEventHandler_2_Windows__CUI__CWindowManagement__CDisplayRegion_IInspectable {
    CONST_VTBL __FITypedEventHandler_2_Windows__CUI__CWindowManagement__CDisplayRegion_IInspectableVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FITypedEventHandler_2_Windows__CUI__CWindowManagement__CDisplayRegion_IInspectable_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FITypedEventHandler_2_Windows__CUI__CWindowManagement__CDisplayRegion_IInspectable_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FITypedEventHandler_2_Windows__CUI__CWindowManagement__CDisplayRegion_IInspectable_Release(This) (This)->lpVtbl->Release(This)
/*** ITypedEventHandler<ABI::Windows::UI::WindowManagement::DisplayRegion*,IInspectable* > methods ***/
#define __FITypedEventHandler_2_Windows__CUI__CWindowManagement__CDisplayRegion_IInspectable_Invoke(This,sender,args) (This)->lpVtbl->Invoke(This,sender,args)
#else
/*** IUnknown methods ***/
static inline HRESULT __FITypedEventHandler_2_Windows__CUI__CWindowManagement__CDisplayRegion_IInspectable_QueryInterface(__FITypedEventHandler_2_Windows__CUI__CWindowManagement__CDisplayRegion_IInspectable* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FITypedEventHandler_2_Windows__CUI__CWindowManagement__CDisplayRegion_IInspectable_AddRef(__FITypedEventHandler_2_Windows__CUI__CWindowManagement__CDisplayRegion_IInspectable* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FITypedEventHandler_2_Windows__CUI__CWindowManagement__CDisplayRegion_IInspectable_Release(__FITypedEventHandler_2_Windows__CUI__CWindowManagement__CDisplayRegion_IInspectable* This) {
    return This->lpVtbl->Release(This);
}
/*** ITypedEventHandler<ABI::Windows::UI::WindowManagement::DisplayRegion*,IInspectable* > methods ***/
static inline HRESULT __FITypedEventHandler_2_Windows__CUI__CWindowManagement__CDisplayRegion_IInspectable_Invoke(__FITypedEventHandler_2_Windows__CUI__CWindowManagement__CDisplayRegion_IInspectable* This,__x_ABI_CWindows_CUI_CWindowManagement_CIDisplayRegion *sender,IInspectable *args) {
    return This->lpVtbl->Invoke(This,sender,args);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_ITypedEventHandler_DisplayRegion_IInspectable IID___FITypedEventHandler_2_Windows__CUI__CWindowManagement__CDisplayRegion_IInspectable
#define ITypedEventHandler_DisplayRegion_IInspectableVtbl __FITypedEventHandler_2_Windows__CUI__CWindowManagement__CDisplayRegion_IInspectableVtbl
#define ITypedEventHandler_DisplayRegion_IInspectable __FITypedEventHandler_2_Windows__CUI__CWindowManagement__CDisplayRegion_IInspectable
#define ITypedEventHandler_DisplayRegion_IInspectable_QueryInterface __FITypedEventHandler_2_Windows__CUI__CWindowManagement__CDisplayRegion_IInspectable_QueryInterface
#define ITypedEventHandler_DisplayRegion_IInspectable_AddRef __FITypedEventHandler_2_Windows__CUI__CWindowManagement__CDisplayRegion_IInspectable_AddRef
#define ITypedEventHandler_DisplayRegion_IInspectable_Release __FITypedEventHandler_2_Windows__CUI__CWindowManagement__CDisplayRegion_IInspectable_Release
#define ITypedEventHandler_DisplayRegion_IInspectable_Invoke __FITypedEventHandler_2_Windows__CUI__CWindowManagement__CDisplayRegion_IInspectable_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FITypedEventHandler_2_Windows__CUI__CWindowManagement__CDisplayRegion_IInspectable_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ITypedEventHandler<ABI::Windows::UI::WindowManagement::WindowingEnvironment*,ABI::Windows::UI::WindowManagement::WindowingEnvironmentChangedEventArgs* > interface
 */
#ifndef ____FITypedEventHandler_2_Windows__CUI__CWindowManagement__CWindowingEnvironment_Windows__CUI__CWindowManagement__CWindowingEnvironmentChangedEventArgs_INTERFACE_DEFINED__
#define ____FITypedEventHandler_2_Windows__CUI__CWindowManagement__CWindowingEnvironment_Windows__CUI__CWindowManagement__CWindowingEnvironmentChangedEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___FITypedEventHandler_2_Windows__CUI__CWindowManagement__CWindowingEnvironment_Windows__CUI__CWindowManagement__CWindowingEnvironmentChangedEventArgs, 0x3af2bd46, 0x4225, 0x5a93, 0x85,0xed, 0x73,0xa0,0x1e,0x91,0xd0,0xb5);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("3af2bd46-4225-5a93-85ed-73a01e91d0b5")
            ITypedEventHandler<ABI::Windows::UI::WindowManagement::WindowingEnvironment*,ABI::Windows::UI::WindowManagement::WindowingEnvironmentChangedEventArgs* > : ITypedEventHandler_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::WindowManagement::WindowingEnvironment*, ABI::Windows::UI::WindowManagement::IWindowingEnvironment* >, ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::WindowManagement::WindowingEnvironmentChangedEventArgs*, ABI::Windows::UI::WindowManagement::IWindowingEnvironmentChangedEventArgs* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FITypedEventHandler_2_Windows__CUI__CWindowManagement__CWindowingEnvironment_Windows__CUI__CWindowManagement__CWindowingEnvironmentChangedEventArgs, 0x3af2bd46, 0x4225, 0x5a93, 0x85,0xed, 0x73,0xa0,0x1e,0x91,0xd0,0xb5)
#endif
#else
typedef struct __FITypedEventHandler_2_Windows__CUI__CWindowManagement__CWindowingEnvironment_Windows__CUI__CWindowManagement__CWindowingEnvironmentChangedEventArgsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FITypedEventHandler_2_Windows__CUI__CWindowManagement__CWindowingEnvironment_Windows__CUI__CWindowManagement__CWindowingEnvironmentChangedEventArgs *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FITypedEventHandler_2_Windows__CUI__CWindowManagement__CWindowingEnvironment_Windows__CUI__CWindowManagement__CWindowingEnvironmentChangedEventArgs *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FITypedEventHandler_2_Windows__CUI__CWindowManagement__CWindowingEnvironment_Windows__CUI__CWindowManagement__CWindowingEnvironmentChangedEventArgs *This);

    /*** ITypedEventHandler<ABI::Windows::UI::WindowManagement::WindowingEnvironment*,ABI::Windows::UI::WindowManagement::WindowingEnvironmentChangedEventArgs* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FITypedEventHandler_2_Windows__CUI__CWindowManagement__CWindowingEnvironment_Windows__CUI__CWindowManagement__CWindowingEnvironmentChangedEventArgs *This,
        __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironment *sender,
        __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentChangedEventArgs *args);

    END_INTERFACE
} __FITypedEventHandler_2_Windows__CUI__CWindowManagement__CWindowingEnvironment_Windows__CUI__CWindowManagement__CWindowingEnvironmentChangedEventArgsVtbl;

interface __FITypedEventHandler_2_Windows__CUI__CWindowManagement__CWindowingEnvironment_Windows__CUI__CWindowManagement__CWindowingEnvironmentChangedEventArgs {
    CONST_VTBL __FITypedEventHandler_2_Windows__CUI__CWindowManagement__CWindowingEnvironment_Windows__CUI__CWindowManagement__CWindowingEnvironmentChangedEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FITypedEventHandler_2_Windows__CUI__CWindowManagement__CWindowingEnvironment_Windows__CUI__CWindowManagement__CWindowingEnvironmentChangedEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FITypedEventHandler_2_Windows__CUI__CWindowManagement__CWindowingEnvironment_Windows__CUI__CWindowManagement__CWindowingEnvironmentChangedEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FITypedEventHandler_2_Windows__CUI__CWindowManagement__CWindowingEnvironment_Windows__CUI__CWindowManagement__CWindowingEnvironmentChangedEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** ITypedEventHandler<ABI::Windows::UI::WindowManagement::WindowingEnvironment*,ABI::Windows::UI::WindowManagement::WindowingEnvironmentChangedEventArgs* > methods ***/
#define __FITypedEventHandler_2_Windows__CUI__CWindowManagement__CWindowingEnvironment_Windows__CUI__CWindowManagement__CWindowingEnvironmentChangedEventArgs_Invoke(This,sender,args) (This)->lpVtbl->Invoke(This,sender,args)
#else
/*** IUnknown methods ***/
static inline HRESULT __FITypedEventHandler_2_Windows__CUI__CWindowManagement__CWindowingEnvironment_Windows__CUI__CWindowManagement__CWindowingEnvironmentChangedEventArgs_QueryInterface(__FITypedEventHandler_2_Windows__CUI__CWindowManagement__CWindowingEnvironment_Windows__CUI__CWindowManagement__CWindowingEnvironmentChangedEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FITypedEventHandler_2_Windows__CUI__CWindowManagement__CWindowingEnvironment_Windows__CUI__CWindowManagement__CWindowingEnvironmentChangedEventArgs_AddRef(__FITypedEventHandler_2_Windows__CUI__CWindowManagement__CWindowingEnvironment_Windows__CUI__CWindowManagement__CWindowingEnvironmentChangedEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FITypedEventHandler_2_Windows__CUI__CWindowManagement__CWindowingEnvironment_Windows__CUI__CWindowManagement__CWindowingEnvironmentChangedEventArgs_Release(__FITypedEventHandler_2_Windows__CUI__CWindowManagement__CWindowingEnvironment_Windows__CUI__CWindowManagement__CWindowingEnvironmentChangedEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** ITypedEventHandler<ABI::Windows::UI::WindowManagement::WindowingEnvironment*,ABI::Windows::UI::WindowManagement::WindowingEnvironmentChangedEventArgs* > methods ***/
static inline HRESULT __FITypedEventHandler_2_Windows__CUI__CWindowManagement__CWindowingEnvironment_Windows__CUI__CWindowManagement__CWindowingEnvironmentChangedEventArgs_Invoke(__FITypedEventHandler_2_Windows__CUI__CWindowManagement__CWindowingEnvironment_Windows__CUI__CWindowManagement__CWindowingEnvironmentChangedEventArgs* This,__x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironment *sender,__x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironmentChangedEventArgs *args) {
    return This->lpVtbl->Invoke(This,sender,args);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_ITypedEventHandler_WindowingEnvironment_WindowingEnvironmentChangedEventArgs IID___FITypedEventHandler_2_Windows__CUI__CWindowManagement__CWindowingEnvironment_Windows__CUI__CWindowManagement__CWindowingEnvironmentChangedEventArgs
#define ITypedEventHandler_WindowingEnvironment_WindowingEnvironmentChangedEventArgsVtbl __FITypedEventHandler_2_Windows__CUI__CWindowManagement__CWindowingEnvironment_Windows__CUI__CWindowManagement__CWindowingEnvironmentChangedEventArgsVtbl
#define ITypedEventHandler_WindowingEnvironment_WindowingEnvironmentChangedEventArgs __FITypedEventHandler_2_Windows__CUI__CWindowManagement__CWindowingEnvironment_Windows__CUI__CWindowManagement__CWindowingEnvironmentChangedEventArgs
#define ITypedEventHandler_WindowingEnvironment_WindowingEnvironmentChangedEventArgs_QueryInterface __FITypedEventHandler_2_Windows__CUI__CWindowManagement__CWindowingEnvironment_Windows__CUI__CWindowManagement__CWindowingEnvironmentChangedEventArgs_QueryInterface
#define ITypedEventHandler_WindowingEnvironment_WindowingEnvironmentChangedEventArgs_AddRef __FITypedEventHandler_2_Windows__CUI__CWindowManagement__CWindowingEnvironment_Windows__CUI__CWindowManagement__CWindowingEnvironmentChangedEventArgs_AddRef
#define ITypedEventHandler_WindowingEnvironment_WindowingEnvironmentChangedEventArgs_Release __FITypedEventHandler_2_Windows__CUI__CWindowManagement__CWindowingEnvironment_Windows__CUI__CWindowManagement__CWindowingEnvironmentChangedEventArgs_Release
#define ITypedEventHandler_WindowingEnvironment_WindowingEnvironmentChangedEventArgs_Invoke __FITypedEventHandler_2_Windows__CUI__CWindowManagement__CWindowingEnvironment_Windows__CUI__CWindowManagement__CWindowingEnvironmentChangedEventArgs_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FITypedEventHandler_2_Windows__CUI__CWindowManagement__CWindowingEnvironment_Windows__CUI__CWindowManagement__CWindowingEnvironmentChangedEventArgs_INTERFACE_DEFINED__ */

/* Begin additional prototypes for all interfaces */

ULONG           __RPC_USER HSTRING_UserSize     (ULONG *, ULONG, HSTRING *);
unsigned char * __RPC_USER HSTRING_UserMarshal  (ULONG *, unsigned char *, HSTRING *);
unsigned char * __RPC_USER HSTRING_UserUnmarshal(ULONG *, unsigned char *, HSTRING *);
void            __RPC_USER HSTRING_UserFree     (ULONG *, HSTRING *);

/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __windows_ui_windowmanagement_h__ */
