/*** Autogenerated by WIDL 11.6 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__ */
