/*** Autogenerated by WIDL 11.12 from include/windows.graphics.display.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_graphics_display_h__
#define __windows_graphics_display_h__

/* Forward declarations */

#ifndef ____x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo_FWD_DEFINED__
#define ____x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo __x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo ABI::Windows::Graphics::Display::IAdvancedColorInfo
namespace ABI {
    namespace Windows {
        namespace Graphics {
            namespace Display {
                interface IAdvancedColorInfo;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation_FWD_DEFINED__
#define ____x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation ABI::Windows::Graphics::Display::IDisplayInformation
namespace ABI {
    namespace Windows {
        namespace Graphics {
            namespace Display {
                interface IDisplayInformation;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation2_FWD_DEFINED__
#define ____x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation2 __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation2 ABI::Windows::Graphics::Display::IDisplayInformation2
namespace ABI {
    namespace Windows {
        namespace Graphics {
            namespace Display {
                interface IDisplayInformation2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation3_FWD_DEFINED__
#define ____x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation3_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation3 __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation3;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation3 ABI::Windows::Graphics::Display::IDisplayInformation3
namespace ABI {
    namespace Windows {
        namespace Graphics {
            namespace Display {
                interface IDisplayInformation3;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation4_FWD_DEFINED__
#define ____x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation4_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation4 __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation4;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation4 ABI::Windows::Graphics::Display::IDisplayInformation4
namespace ABI {
    namespace Windows {
        namespace Graphics {
            namespace Display {
                interface IDisplayInformation4;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation5_FWD_DEFINED__
#define ____x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation5_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation5 __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation5;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation5 ABI::Windows::Graphics::Display::IDisplayInformation5
namespace ABI {
    namespace Windows {
        namespace Graphics {
            namespace Display {
                interface IDisplayInformation5;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformationStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformationStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformationStatics __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformationStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformationStatics ABI::Windows::Graphics::Display::IDisplayInformationStatics
namespace ABI {
    namespace Windows {
        namespace Graphics {
            namespace Display {
                interface IDisplayInformationStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGraphics_CDisplay_CAdvancedColorInfo_FWD_DEFINED__
#define ____x_ABI_CWindows_CGraphics_CDisplay_CAdvancedColorInfo_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Graphics {
            namespace Display {
                class AdvancedColorInfo;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CGraphics_CDisplay_CAdvancedColorInfo __x_ABI_CWindows_CGraphics_CDisplay_CAdvancedColorInfo;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CGraphics_CDisplay_CAdvancedColorInfo_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CGraphics_CDisplay_CDisplayInformation_FWD_DEFINED__
#define ____x_ABI_CWindows_CGraphics_CDisplay_CDisplayInformation_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Graphics {
            namespace Display {
                class DisplayInformation;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CGraphics_CDisplay_CDisplayInformation __x_ABI_CWindows_CGraphics_CDisplay_CDisplayInformation;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CGraphics_CDisplay_CDisplayInformation_FWD_DEFINED__ */

#ifndef ____FITypedEventHandler_2_Windows__CGraphics__CDisplay__CDisplayInformation_IInspectable_FWD_DEFINED__
#define ____FITypedEventHandler_2_Windows__CGraphics__CDisplay__CDisplayInformation_IInspectable_FWD_DEFINED__
typedef interface __FITypedEventHandler_2_Windows__CGraphics__CDisplay__CDisplayInformation_IInspectable __FITypedEventHandler_2_Windows__CGraphics__CDisplay__CDisplayInformation_IInspectable;
#ifdef __cplusplus
#define __FITypedEventHandler_2_Windows__CGraphics__CDisplay__CDisplayInformation_IInspectable ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::Graphics::Display::DisplayInformation*,IInspectable* >
#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.graphics.h>
#include <windows.storage.streams.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 >= 0x60000
#ifndef ____x_ABI_CWindows_CGraphics_CDisplay_CAdvancedColorKind_ENUM_DEFINED__
#define ____x_ABI_CWindows_CGraphics_CDisplay_CAdvancedColorKind_ENUM_DEFINED__
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Graphics {
            namespace Display {
                enum AdvancedColorKind {
                    AdvancedColorKind_StandardDynamicRange = 0,
                    AdvancedColorKind_WideColorGamut = 1,
                    AdvancedColorKind_HighDynamicRange = 2
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CGraphics_CDisplay_CAdvancedColorKind {
    AdvancedColorKind_StandardDynamicRange = 0,
    AdvancedColorKind_WideColorGamut = 1,
    AdvancedColorKind_HighDynamicRange = 2
};
#ifdef WIDL_using_Windows_Graphics_Display
#define AdvancedColorKind __x_ABI_CWindows_CGraphics_CDisplay_CAdvancedColorKind
#endif /* WIDL_using_Windows_Graphics_Display */
#endif

#endif /* ____x_ABI_CWindows_CGraphics_CDisplay_CAdvancedColorKind_ENUM_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x60000 */
#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CGraphics_CDisplay_CAdvancedColorKind __x_ABI_CWindows_CGraphics_CDisplay_CAdvancedColorKind;
#endif /* __cplusplus */

#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CGraphics_CDisplay_CDisplayOrientations_ENUM_DEFINED__
#define ____x_ABI_CWindows_CGraphics_CDisplay_CDisplayOrientations_ENUM_DEFINED__
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Graphics {
            namespace Display {
                enum DisplayOrientations {
                    DisplayOrientations_None = 0x0,
                    DisplayOrientations_Landscape = 0x1,
                    DisplayOrientations_Portrait = 0x2,
                    DisplayOrientations_LandscapeFlipped = 0x4,
                    DisplayOrientations_PortraitFlipped = 0x8
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CGraphics_CDisplay_CDisplayOrientations {
    DisplayOrientations_None = 0x0,
    DisplayOrientations_Landscape = 0x1,
    DisplayOrientations_Portrait = 0x2,
    DisplayOrientations_LandscapeFlipped = 0x4,
    DisplayOrientations_PortraitFlipped = 0x8
};
#ifdef WIDL_using_Windows_Graphics_Display
#define DisplayOrientations __x_ABI_CWindows_CGraphics_CDisplay_CDisplayOrientations
#endif /* WIDL_using_Windows_Graphics_Display */
#endif

#endif /* ____x_ABI_CWindows_CGraphics_CDisplay_CDisplayOrientations_ENUM_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CGraphics_CDisplay_CDisplayOrientations __x_ABI_CWindows_CGraphics_CDisplay_CDisplayOrientations;
#endif /* __cplusplus */

#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x60000
#ifndef ____x_ABI_CWindows_CGraphics_CDisplay_CHdrMetadataFormat_ENUM_DEFINED__
#define ____x_ABI_CWindows_CGraphics_CDisplay_CHdrMetadataFormat_ENUM_DEFINED__
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Graphics {
            namespace Display {
                enum HdrMetadataFormat {
                    HdrMetadataFormat_Hdr10 = 0,
                    HdrMetadataFormat_Hdr10Plus = 1
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CGraphics_CDisplay_CHdrMetadataFormat {
    HdrMetadataFormat_Hdr10 = 0,
    HdrMetadataFormat_Hdr10Plus = 1
};
#ifdef WIDL_using_Windows_Graphics_Display
#define HdrMetadataFormat __x_ABI_CWindows_CGraphics_CDisplay_CHdrMetadataFormat
#endif /* WIDL_using_Windows_Graphics_Display */
#endif

#endif /* ____x_ABI_CWindows_CGraphics_CDisplay_CHdrMetadataFormat_ENUM_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x60000 */
#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CGraphics_CDisplay_CHdrMetadataFormat __x_ABI_CWindows_CGraphics_CDisplay_CHdrMetadataFormat;
#endif /* __cplusplus */

#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CGraphics_CDisplay_CResolutionScale_ENUM_DEFINED__
#define ____x_ABI_CWindows_CGraphics_CDisplay_CResolutionScale_ENUM_DEFINED__
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Graphics {
            namespace Display {
                enum ResolutionScale {
                    ResolutionScale_Invalid = 0,
                    ResolutionScale_Scale100Percent = 100,
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
                    ResolutionScale_Scale120Percent = 120,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
                    ResolutionScale_Scale125Percent = 125,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
                    ResolutionScale_Scale140Percent = 140,
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
                    ResolutionScale_Scale150Percent = 150,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
                    ResolutionScale_Scale160Percent = 160,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
                    ResolutionScale_Scale175Percent = 175,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
                    ResolutionScale_Scale180Percent = 180,
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
                    ResolutionScale_Scale200Percent = 200,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
                    ResolutionScale_Scale225Percent = 225,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
                    ResolutionScale_Scale250Percent = 250,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
                    ResolutionScale_Scale300Percent = 300,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
                    ResolutionScale_Scale350Percent = 350,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
                    ResolutionScale_Scale400Percent = 400,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
                    ResolutionScale_Scale450Percent = 450,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
                    ResolutionScale_Scale500Percent = 500
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CGraphics_CDisplay_CResolutionScale {
    ResolutionScale_Invalid = 0,
    ResolutionScale_Scale100Percent = 100,
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
    ResolutionScale_Scale120Percent = 120,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
    ResolutionScale_Scale125Percent = 125,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
    ResolutionScale_Scale140Percent = 140,
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
    ResolutionScale_Scale150Percent = 150,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
    ResolutionScale_Scale160Percent = 160,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
    ResolutionScale_Scale175Percent = 175,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
    ResolutionScale_Scale180Percent = 180,
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
    ResolutionScale_Scale200Percent = 200,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
    ResolutionScale_Scale225Percent = 225,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
    ResolutionScale_Scale250Percent = 250,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
    ResolutionScale_Scale300Percent = 300,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
    ResolutionScale_Scale350Percent = 350,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
    ResolutionScale_Scale400Percent = 400,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
    ResolutionScale_Scale450Percent = 450,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
    ResolutionScale_Scale500Percent = 500
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
};
#ifdef WIDL_using_Windows_Graphics_Display
#define ResolutionScale __x_ABI_CWindows_CGraphics_CDisplay_CResolutionScale
#endif /* WIDL_using_Windows_Graphics_Display */
#endif

#endif /* ____x_ABI_CWindows_CGraphics_CDisplay_CResolutionScale_ENUM_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CGraphics_CDisplay_CResolutionScale __x_ABI_CWindows_CGraphics_CDisplay_CResolutionScale;
#endif /* __cplusplus */

#ifndef ____x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo_FWD_DEFINED__
#define ____x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo __x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo ABI::Windows::Graphics::Display::IAdvancedColorInfo
namespace ABI {
    namespace Windows {
        namespace Graphics {
            namespace Display {
                interface IAdvancedColorInfo;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformationStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformationStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformationStatics __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformationStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformationStatics ABI::Windows::Graphics::Display::IDisplayInformationStatics
namespace ABI {
    namespace Windows {
        namespace Graphics {
            namespace Display {
                interface IDisplayInformationStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

/*****************************************************************************
 * IAdvancedColorInfo interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x60000
#ifndef ____x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo, 0x8797dcfb, 0xb229, 0x4081, 0xae,0x9a, 0x2c,0xc8,0x5e,0x34,0xad,0x6a);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Graphics {
            namespace Display {
                MIDL_INTERFACE("8797dcfb-b229-4081-ae9a-2cc85e34ad6a")
                IAdvancedColorInfo : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_CurrentAdvancedColorKind(
                        ABI::Windows::Graphics::Display::AdvancedColorKind *value) = 0;

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

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

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

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

                    virtual HRESULT STDMETHODCALLTYPE get_MaxLuminanceInNits(
                        FLOAT *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_MinLuminanceInNits(
                        FLOAT *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_MaxAverageFullFrameLuminanceInNits(
                        FLOAT *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_SdrWhiteLevelInNits(
                        FLOAT *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE IsHdrMetadataFormatCurrentlySupported(
                        ABI::Windows::Graphics::Display::HdrMetadataFormat format,
                        boolean *result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE IsAdvancedColorKindAvailable(
                        ABI::Windows::Graphics::Display::AdvancedColorKind kind,
                        boolean *result) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo, 0x8797dcfb, 0xb229, 0x4081, 0xae,0x9a, 0x2c,0xc8,0x5e,0x34,0xad,0x6a)
#endif
#else
typedef struct __x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfoVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IAdvancedColorInfo methods ***/
    HRESULT (STDMETHODCALLTYPE *get_CurrentAdvancedColorKind)(
        __x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo *This,
        __x_ABI_CWindows_CGraphics_CDisplay_CAdvancedColorKind *value);

    HRESULT (STDMETHODCALLTYPE *get_RedPrimary)(
        __x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo *This,
        __x_ABI_CWindows_CFoundation_CPoint *value);

    HRESULT (STDMETHODCALLTYPE *get_GreenPrimary)(
        __x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo *This,
        __x_ABI_CWindows_CFoundation_CPoint *value);

    HRESULT (STDMETHODCALLTYPE *get_BluePrimary)(
        __x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo *This,
        __x_ABI_CWindows_CFoundation_CPoint *value);

    HRESULT (STDMETHODCALLTYPE *get_WhitePoint)(
        __x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo *This,
        __x_ABI_CWindows_CFoundation_CPoint *value);

    HRESULT (STDMETHODCALLTYPE *get_MaxLuminanceInNits)(
        __x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo *This,
        FLOAT *value);

    HRESULT (STDMETHODCALLTYPE *get_MinLuminanceInNits)(
        __x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo *This,
        FLOAT *value);

    HRESULT (STDMETHODCALLTYPE *get_MaxAverageFullFrameLuminanceInNits)(
        __x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo *This,
        FLOAT *value);

    HRESULT (STDMETHODCALLTYPE *get_SdrWhiteLevelInNits)(
        __x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo *This,
        FLOAT *value);

    HRESULT (STDMETHODCALLTYPE *IsHdrMetadataFormatCurrentlySupported)(
        __x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo *This,
        __x_ABI_CWindows_CGraphics_CDisplay_CHdrMetadataFormat format,
        boolean *result);

    HRESULT (STDMETHODCALLTYPE *IsAdvancedColorKindAvailable)(
        __x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo *This,
        __x_ABI_CWindows_CGraphics_CDisplay_CAdvancedColorKind kind,
        boolean *result);

    END_INTERFACE
} __x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfoVtbl;

interface __x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo {
    CONST_VTBL __x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfoVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IAdvancedColorInfo methods ***/
#define __x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo_get_CurrentAdvancedColorKind(This,value) (This)->lpVtbl->get_CurrentAdvancedColorKind(This,value)
#define __x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo_get_RedPrimary(This,value) (This)->lpVtbl->get_RedPrimary(This,value)
#define __x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo_get_GreenPrimary(This,value) (This)->lpVtbl->get_GreenPrimary(This,value)
#define __x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo_get_BluePrimary(This,value) (This)->lpVtbl->get_BluePrimary(This,value)
#define __x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo_get_WhitePoint(This,value) (This)->lpVtbl->get_WhitePoint(This,value)
#define __x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo_get_MaxLuminanceInNits(This,value) (This)->lpVtbl->get_MaxLuminanceInNits(This,value)
#define __x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo_get_MinLuminanceInNits(This,value) (This)->lpVtbl->get_MinLuminanceInNits(This,value)
#define __x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo_get_MaxAverageFullFrameLuminanceInNits(This,value) (This)->lpVtbl->get_MaxAverageFullFrameLuminanceInNits(This,value)
#define __x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo_get_SdrWhiteLevelInNits(This,value) (This)->lpVtbl->get_SdrWhiteLevelInNits(This,value)
#define __x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo_IsHdrMetadataFormatCurrentlySupported(This,format,result) (This)->lpVtbl->IsHdrMetadataFormatCurrentlySupported(This,format,result)
#define __x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo_IsAdvancedColorKindAvailable(This,kind,result) (This)->lpVtbl->IsAdvancedColorKindAvailable(This,kind,result)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo_QueryInterface(__x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo_AddRef(__x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo_Release(__x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo_GetIids(__x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo_GetRuntimeClassName(__x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo_GetTrustLevel(__x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IAdvancedColorInfo methods ***/
static inline HRESULT __x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo_get_CurrentAdvancedColorKind(__x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo* This,__x_ABI_CWindows_CGraphics_CDisplay_CAdvancedColorKind *value) {
    return This->lpVtbl->get_CurrentAdvancedColorKind(This,value);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo_get_RedPrimary(__x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo* This,__x_ABI_CWindows_CFoundation_CPoint *value) {
    return This->lpVtbl->get_RedPrimary(This,value);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo_get_GreenPrimary(__x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo* This,__x_ABI_CWindows_CFoundation_CPoint *value) {
    return This->lpVtbl->get_GreenPrimary(This,value);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo_get_BluePrimary(__x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo* This,__x_ABI_CWindows_CFoundation_CPoint *value) {
    return This->lpVtbl->get_BluePrimary(This,value);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo_get_WhitePoint(__x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo* This,__x_ABI_CWindows_CFoundation_CPoint *value) {
    return This->lpVtbl->get_WhitePoint(This,value);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo_get_MaxLuminanceInNits(__x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo* This,FLOAT *value) {
    return This->lpVtbl->get_MaxLuminanceInNits(This,value);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo_get_MinLuminanceInNits(__x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo* This,FLOAT *value) {
    return This->lpVtbl->get_MinLuminanceInNits(This,value);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo_get_MaxAverageFullFrameLuminanceInNits(__x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo* This,FLOAT *value) {
    return This->lpVtbl->get_MaxAverageFullFrameLuminanceInNits(This,value);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo_get_SdrWhiteLevelInNits(__x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo* This,FLOAT *value) {
    return This->lpVtbl->get_SdrWhiteLevelInNits(This,value);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo_IsHdrMetadataFormatCurrentlySupported(__x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo* This,__x_ABI_CWindows_CGraphics_CDisplay_CHdrMetadataFormat format,boolean *result) {
    return This->lpVtbl->IsHdrMetadataFormatCurrentlySupported(This,format,result);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo_IsAdvancedColorKindAvailable(__x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo* This,__x_ABI_CWindows_CGraphics_CDisplay_CAdvancedColorKind kind,boolean *result) {
    return This->lpVtbl->IsAdvancedColorKindAvailable(This,kind,result);
}
#endif
#ifdef WIDL_using_Windows_Graphics_Display
#define IID_IAdvancedColorInfo IID___x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo
#define IAdvancedColorInfoVtbl __x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfoVtbl
#define IAdvancedColorInfo __x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo
#define IAdvancedColorInfo_QueryInterface __x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo_QueryInterface
#define IAdvancedColorInfo_AddRef __x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo_AddRef
#define IAdvancedColorInfo_Release __x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo_Release
#define IAdvancedColorInfo_GetIids __x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo_GetIids
#define IAdvancedColorInfo_GetRuntimeClassName __x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo_GetRuntimeClassName
#define IAdvancedColorInfo_GetTrustLevel __x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo_GetTrustLevel
#define IAdvancedColorInfo_get_CurrentAdvancedColorKind __x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo_get_CurrentAdvancedColorKind
#define IAdvancedColorInfo_get_RedPrimary __x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo_get_RedPrimary
#define IAdvancedColorInfo_get_GreenPrimary __x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo_get_GreenPrimary
#define IAdvancedColorInfo_get_BluePrimary __x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo_get_BluePrimary
#define IAdvancedColorInfo_get_WhitePoint __x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo_get_WhitePoint
#define IAdvancedColorInfo_get_MaxLuminanceInNits __x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo_get_MaxLuminanceInNits
#define IAdvancedColorInfo_get_MinLuminanceInNits __x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo_get_MinLuminanceInNits
#define IAdvancedColorInfo_get_MaxAverageFullFrameLuminanceInNits __x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo_get_MaxAverageFullFrameLuminanceInNits
#define IAdvancedColorInfo_get_SdrWhiteLevelInNits __x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo_get_SdrWhiteLevelInNits
#define IAdvancedColorInfo_IsHdrMetadataFormatCurrentlySupported __x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo_IsHdrMetadataFormatCurrentlySupported
#define IAdvancedColorInfo_IsAdvancedColorKindAvailable __x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo_IsAdvancedColorKindAvailable
#endif /* WIDL_using_Windows_Graphics_Display */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x60000 */

/*****************************************************************************
 * IDisplayInformation interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation, 0xbed112ae, 0xadc3, 0x4dc9, 0xae,0x65, 0x85,0x1f,0x4d,0x7d,0x47,0x99);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Graphics {
            namespace Display {
                MIDL_INTERFACE("bed112ae-adc3-4dc9-ae65-851f4d7d4799")
                IDisplayInformation : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_CurrentOrientation(
                        ABI::Windows::Graphics::Display::DisplayOrientations *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_NativeOrientation(
                        ABI::Windows::Graphics::Display::DisplayOrientations *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE add_OrientationChanged(
                        ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::Graphics::Display::DisplayInformation*,IInspectable* > *handler,
                        EventRegistrationToken *token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE remove_OrientationChanged(
                        EventRegistrationToken token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_ResolutionScale(
                        ABI::Windows::Graphics::Display::ResolutionScale *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_LogicalDpi(
                        FLOAT *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_RawDpiX(
                        FLOAT *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_RawDpiY(
                        FLOAT *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE add_DpiChanged(
                        ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::Graphics::Display::DisplayInformation*,IInspectable* > *handler,
                        EventRegistrationToken *token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE remove_DpiChanged(
                        EventRegistrationToken token) = 0;

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

                    virtual HRESULT STDMETHODCALLTYPE add_StereoEnabledChanged(
                        ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::Graphics::Display::DisplayInformation*,IInspectable* > *handler,
                        EventRegistrationToken *token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE remove_StereoEnabledChanged(
                        EventRegistrationToken token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE GetColorProfileAsync(
                        ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Storage::Streams::IRandomAccessStream* > **async_info) = 0;

                    virtual HRESULT STDMETHODCALLTYPE add_ColorProfileChanged(
                        ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::Graphics::Display::DisplayInformation*,IInspectable* > *handler,
                        EventRegistrationToken *token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE remove_ColorProfileChanged(
                        EventRegistrationToken token) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation, 0xbed112ae, 0xadc3, 0x4dc9, 0xae,0x65, 0x85,0x1f,0x4d,0x7d,0x47,0x99)
#endif
#else
typedef struct __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformationVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IDisplayInformation methods ***/
    HRESULT (STDMETHODCALLTYPE *get_CurrentOrientation)(
        __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation *This,
        __x_ABI_CWindows_CGraphics_CDisplay_CDisplayOrientations *value);

    HRESULT (STDMETHODCALLTYPE *get_NativeOrientation)(
        __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation *This,
        __x_ABI_CWindows_CGraphics_CDisplay_CDisplayOrientations *value);

    HRESULT (STDMETHODCALLTYPE *add_OrientationChanged)(
        __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation *This,
        __FITypedEventHandler_2_Windows__CGraphics__CDisplay__CDisplayInformation_IInspectable *handler,
        EventRegistrationToken *token);

    HRESULT (STDMETHODCALLTYPE *remove_OrientationChanged)(
        __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation *This,
        EventRegistrationToken token);

    HRESULT (STDMETHODCALLTYPE *get_ResolutionScale)(
        __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation *This,
        __x_ABI_CWindows_CGraphics_CDisplay_CResolutionScale *value);

    HRESULT (STDMETHODCALLTYPE *get_LogicalDpi)(
        __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation *This,
        FLOAT *value);

    HRESULT (STDMETHODCALLTYPE *get_RawDpiX)(
        __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation *This,
        FLOAT *value);

    HRESULT (STDMETHODCALLTYPE *get_RawDpiY)(
        __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation *This,
        FLOAT *value);

    HRESULT (STDMETHODCALLTYPE *add_DpiChanged)(
        __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation *This,
        __FITypedEventHandler_2_Windows__CGraphics__CDisplay__CDisplayInformation_IInspectable *handler,
        EventRegistrationToken *token);

    HRESULT (STDMETHODCALLTYPE *remove_DpiChanged)(
        __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation *This,
        EventRegistrationToken token);

    HRESULT (STDMETHODCALLTYPE *get_StereoEnabled)(
        __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *add_StereoEnabledChanged)(
        __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation *This,
        __FITypedEventHandler_2_Windows__CGraphics__CDisplay__CDisplayInformation_IInspectable *handler,
        EventRegistrationToken *token);

    HRESULT (STDMETHODCALLTYPE *remove_StereoEnabledChanged)(
        __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation *This,
        EventRegistrationToken token);

    HRESULT (STDMETHODCALLTYPE *GetColorProfileAsync)(
        __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation *This,
        __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStream **async_info);

    HRESULT (STDMETHODCALLTYPE *add_ColorProfileChanged)(
        __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation *This,
        __FITypedEventHandler_2_Windows__CGraphics__CDisplay__CDisplayInformation_IInspectable *handler,
        EventRegistrationToken *token);

    HRESULT (STDMETHODCALLTYPE *remove_ColorProfileChanged)(
        __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation *This,
        EventRegistrationToken token);

    END_INTERFACE
} __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformationVtbl;

interface __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation {
    CONST_VTBL __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IDisplayInformation methods ***/
#define __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation_get_CurrentOrientation(This,value) (This)->lpVtbl->get_CurrentOrientation(This,value)
#define __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation_get_NativeOrientation(This,value) (This)->lpVtbl->get_NativeOrientation(This,value)
#define __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation_add_OrientationChanged(This,handler,token) (This)->lpVtbl->add_OrientationChanged(This,handler,token)
#define __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation_remove_OrientationChanged(This,token) (This)->lpVtbl->remove_OrientationChanged(This,token)
#define __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation_get_ResolutionScale(This,value) (This)->lpVtbl->get_ResolutionScale(This,value)
#define __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation_get_LogicalDpi(This,value) (This)->lpVtbl->get_LogicalDpi(This,value)
#define __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation_get_RawDpiX(This,value) (This)->lpVtbl->get_RawDpiX(This,value)
#define __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation_get_RawDpiY(This,value) (This)->lpVtbl->get_RawDpiY(This,value)
#define __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation_add_DpiChanged(This,handler,token) (This)->lpVtbl->add_DpiChanged(This,handler,token)
#define __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation_remove_DpiChanged(This,token) (This)->lpVtbl->remove_DpiChanged(This,token)
#define __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation_get_StereoEnabled(This,value) (This)->lpVtbl->get_StereoEnabled(This,value)
#define __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation_add_StereoEnabledChanged(This,handler,token) (This)->lpVtbl->add_StereoEnabledChanged(This,handler,token)
#define __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation_remove_StereoEnabledChanged(This,token) (This)->lpVtbl->remove_StereoEnabledChanged(This,token)
#define __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation_GetColorProfileAsync(This,async_info) (This)->lpVtbl->GetColorProfileAsync(This,async_info)
#define __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation_add_ColorProfileChanged(This,handler,token) (This)->lpVtbl->add_ColorProfileChanged(This,handler,token)
#define __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation_remove_ColorProfileChanged(This,token) (This)->lpVtbl->remove_ColorProfileChanged(This,token)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation_QueryInterface(__x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation_AddRef(__x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation_Release(__x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation_GetIids(__x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation_GetRuntimeClassName(__x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation_GetTrustLevel(__x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IDisplayInformation methods ***/
static inline HRESULT __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation_get_CurrentOrientation(__x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation* This,__x_ABI_CWindows_CGraphics_CDisplay_CDisplayOrientations *value) {
    return This->lpVtbl->get_CurrentOrientation(This,value);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation_get_NativeOrientation(__x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation* This,__x_ABI_CWindows_CGraphics_CDisplay_CDisplayOrientations *value) {
    return This->lpVtbl->get_NativeOrientation(This,value);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation_add_OrientationChanged(__x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation* This,__FITypedEventHandler_2_Windows__CGraphics__CDisplay__CDisplayInformation_IInspectable *handler,EventRegistrationToken *token) {
    return This->lpVtbl->add_OrientationChanged(This,handler,token);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation_remove_OrientationChanged(__x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation* This,EventRegistrationToken token) {
    return This->lpVtbl->remove_OrientationChanged(This,token);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation_get_ResolutionScale(__x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation* This,__x_ABI_CWindows_CGraphics_CDisplay_CResolutionScale *value) {
    return This->lpVtbl->get_ResolutionScale(This,value);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation_get_LogicalDpi(__x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation* This,FLOAT *value) {
    return This->lpVtbl->get_LogicalDpi(This,value);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation_get_RawDpiX(__x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation* This,FLOAT *value) {
    return This->lpVtbl->get_RawDpiX(This,value);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation_get_RawDpiY(__x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation* This,FLOAT *value) {
    return This->lpVtbl->get_RawDpiY(This,value);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation_add_DpiChanged(__x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation* This,__FITypedEventHandler_2_Windows__CGraphics__CDisplay__CDisplayInformation_IInspectable *handler,EventRegistrationToken *token) {
    return This->lpVtbl->add_DpiChanged(This,handler,token);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation_remove_DpiChanged(__x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation* This,EventRegistrationToken token) {
    return This->lpVtbl->remove_DpiChanged(This,token);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation_get_StereoEnabled(__x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation* This,boolean *value) {
    return This->lpVtbl->get_StereoEnabled(This,value);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation_add_StereoEnabledChanged(__x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation* This,__FITypedEventHandler_2_Windows__CGraphics__CDisplay__CDisplayInformation_IInspectable *handler,EventRegistrationToken *token) {
    return This->lpVtbl->add_StereoEnabledChanged(This,handler,token);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation_remove_StereoEnabledChanged(__x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation* This,EventRegistrationToken token) {
    return This->lpVtbl->remove_StereoEnabledChanged(This,token);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation_GetColorProfileAsync(__x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation* This,__FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStream **async_info) {
    return This->lpVtbl->GetColorProfileAsync(This,async_info);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation_add_ColorProfileChanged(__x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation* This,__FITypedEventHandler_2_Windows__CGraphics__CDisplay__CDisplayInformation_IInspectable *handler,EventRegistrationToken *token) {
    return This->lpVtbl->add_ColorProfileChanged(This,handler,token);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation_remove_ColorProfileChanged(__x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation* This,EventRegistrationToken token) {
    return This->lpVtbl->remove_ColorProfileChanged(This,token);
}
#endif
#ifdef WIDL_using_Windows_Graphics_Display
#define IID_IDisplayInformation IID___x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation
#define IDisplayInformationVtbl __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformationVtbl
#define IDisplayInformation __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation
#define IDisplayInformation_QueryInterface __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation_QueryInterface
#define IDisplayInformation_AddRef __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation_AddRef
#define IDisplayInformation_Release __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation_Release
#define IDisplayInformation_GetIids __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation_GetIids
#define IDisplayInformation_GetRuntimeClassName __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation_GetRuntimeClassName
#define IDisplayInformation_GetTrustLevel __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation_GetTrustLevel
#define IDisplayInformation_get_CurrentOrientation __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation_get_CurrentOrientation
#define IDisplayInformation_get_NativeOrientation __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation_get_NativeOrientation
#define IDisplayInformation_add_OrientationChanged __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation_add_OrientationChanged
#define IDisplayInformation_remove_OrientationChanged __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation_remove_OrientationChanged
#define IDisplayInformation_get_ResolutionScale __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation_get_ResolutionScale
#define IDisplayInformation_get_LogicalDpi __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation_get_LogicalDpi
#define IDisplayInformation_get_RawDpiX __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation_get_RawDpiX
#define IDisplayInformation_get_RawDpiY __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation_get_RawDpiY
#define IDisplayInformation_add_DpiChanged __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation_add_DpiChanged
#define IDisplayInformation_remove_DpiChanged __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation_remove_DpiChanged
#define IDisplayInformation_get_StereoEnabled __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation_get_StereoEnabled
#define IDisplayInformation_add_StereoEnabledChanged __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation_add_StereoEnabledChanged
#define IDisplayInformation_remove_StereoEnabledChanged __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation_remove_StereoEnabledChanged
#define IDisplayInformation_GetColorProfileAsync __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation_GetColorProfileAsync
#define IDisplayInformation_add_ColorProfileChanged __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation_add_ColorProfileChanged
#define IDisplayInformation_remove_ColorProfileChanged __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation_remove_ColorProfileChanged
#endif /* WIDL_using_Windows_Graphics_Display */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IDisplayInformation2 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation2_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation2_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation2, 0x4dcd0021, 0xfad1, 0x4b8e, 0x8e,0xdf, 0x77,0x58,0x87,0xb8,0xbf,0x19);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Graphics {
            namespace Display {
                MIDL_INTERFACE("4dcd0021-fad1-4b8e-8edf-775887b8bf19")
                IDisplayInformation2 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_RawPixelsPerViewPixel(
                        DOUBLE *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation2, 0x4dcd0021, 0xfad1, 0x4b8e, 0x8e,0xdf, 0x77,0x58,0x87,0xb8,0xbf,0x19)
#endif
#else
typedef struct __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation2Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IDisplayInformation2 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_RawPixelsPerViewPixel)(
        __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation2 *This,
        DOUBLE *value);

    END_INTERFACE
} __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation2Vtbl;

interface __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation2 {
    CONST_VTBL __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation2_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation2_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation2_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation2_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IDisplayInformation2 methods ***/
#define __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation2_get_RawPixelsPerViewPixel(This,value) (This)->lpVtbl->get_RawPixelsPerViewPixel(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation2_QueryInterface(__x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation2_AddRef(__x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation2* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation2_Release(__x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation2* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation2_GetIids(__x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation2* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation2_GetRuntimeClassName(__x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation2* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation2_GetTrustLevel(__x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation2* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IDisplayInformation2 methods ***/
static inline HRESULT __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation2_get_RawPixelsPerViewPixel(__x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation2* This,DOUBLE *value) {
    return This->lpVtbl->get_RawPixelsPerViewPixel(This,value);
}
#endif
#ifdef WIDL_using_Windows_Graphics_Display
#define IID_IDisplayInformation2 IID___x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation2
#define IDisplayInformation2Vtbl __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation2Vtbl
#define IDisplayInformation2 __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation2
#define IDisplayInformation2_QueryInterface __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation2_QueryInterface
#define IDisplayInformation2_AddRef __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation2_AddRef
#define IDisplayInformation2_Release __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation2_Release
#define IDisplayInformation2_GetIids __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation2_GetIids
#define IDisplayInformation2_GetRuntimeClassName __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation2_GetRuntimeClassName
#define IDisplayInformation2_GetTrustLevel __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation2_GetTrustLevel
#define IDisplayInformation2_get_RawPixelsPerViewPixel __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation2_get_RawPixelsPerViewPixel
#endif /* WIDL_using_Windows_Graphics_Display */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation2_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IDisplayInformation3 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef ____x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation3_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation3_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation3, 0xdb15011d, 0x0f09, 0x4466, 0x8f,0xf3, 0x11,0xde,0x9a,0x3c,0x92,0x9a);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Graphics {
            namespace Display {
                MIDL_INTERFACE("db15011d-0f09-4466-8ff3-11de9a3c929a")
                IDisplayInformation3 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_DiagonalSizeInInches(
                        ABI::Windows::Foundation::IReference<DOUBLE > **value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation3, 0xdb15011d, 0x0f09, 0x4466, 0x8f,0xf3, 0x11,0xde,0x9a,0x3c,0x92,0x9a)
#endif
#else
typedef struct __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation3Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IDisplayInformation3 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_DiagonalSizeInInches)(
        __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation3 *This,
        __FIReference_1_DOUBLE **value);

    END_INTERFACE
} __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation3Vtbl;

interface __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation3 {
    CONST_VTBL __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation3_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation3_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation3_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation3_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IDisplayInformation3 methods ***/
#define __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation3_get_DiagonalSizeInInches(This,value) (This)->lpVtbl->get_DiagonalSizeInInches(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation3_QueryInterface(__x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation3_AddRef(__x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation3* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation3_Release(__x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation3* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation3_GetIids(__x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation3* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation3_GetRuntimeClassName(__x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation3* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation3_GetTrustLevel(__x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation3* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IDisplayInformation3 methods ***/
static inline HRESULT __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation3_get_DiagonalSizeInInches(__x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation3* This,__FIReference_1_DOUBLE **value) {
    return This->lpVtbl->get_DiagonalSizeInInches(This,value);
}
#endif
#ifdef WIDL_using_Windows_Graphics_Display
#define IID_IDisplayInformation3 IID___x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation3
#define IDisplayInformation3Vtbl __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation3Vtbl
#define IDisplayInformation3 __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation3
#define IDisplayInformation3_QueryInterface __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation3_QueryInterface
#define IDisplayInformation3_AddRef __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation3_AddRef
#define IDisplayInformation3_Release __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation3_Release
#define IDisplayInformation3_GetIids __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation3_GetIids
#define IDisplayInformation3_GetRuntimeClassName __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation3_GetRuntimeClassName
#define IDisplayInformation3_GetTrustLevel __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation3_GetTrustLevel
#define IDisplayInformation3_get_DiagonalSizeInInches __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation3_get_DiagonalSizeInInches
#endif /* WIDL_using_Windows_Graphics_Display */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation3_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*****************************************************************************
 * IDisplayInformation4 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef ____x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation4_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation4_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation4, 0xc972ce2f, 0x1242, 0x46be, 0xb5,0x36, 0xe1,0xaa,0xfe,0x9e,0x7a,0xcf);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Graphics {
            namespace Display {
                MIDL_INTERFACE("c972ce2f-1242-46be-b536-e1aafe9e7acf")
                IDisplayInformation4 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_ScreenWidthInRawPixels(
                        UINT32 *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_ScreenHeightInRawPixels(
                        UINT32 *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation4, 0xc972ce2f, 0x1242, 0x46be, 0xb5,0x36, 0xe1,0xaa,0xfe,0x9e,0x7a,0xcf)
#endif
#else
typedef struct __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation4Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IDisplayInformation4 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_ScreenWidthInRawPixels)(
        __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation4 *This,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *get_ScreenHeightInRawPixels)(
        __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation4 *This,
        UINT32 *value);

    END_INTERFACE
} __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation4Vtbl;

interface __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation4 {
    CONST_VTBL __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation4Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation4_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation4_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation4_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation4_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation4_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation4_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IDisplayInformation4 methods ***/
#define __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation4_get_ScreenWidthInRawPixels(This,value) (This)->lpVtbl->get_ScreenWidthInRawPixels(This,value)
#define __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation4_get_ScreenHeightInRawPixels(This,value) (This)->lpVtbl->get_ScreenHeightInRawPixels(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation4_QueryInterface(__x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation4* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation4_AddRef(__x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation4* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation4_Release(__x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation4* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation4_GetIids(__x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation4* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation4_GetRuntimeClassName(__x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation4* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation4_GetTrustLevel(__x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation4* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IDisplayInformation4 methods ***/
static inline HRESULT __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation4_get_ScreenWidthInRawPixels(__x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation4* This,UINT32 *value) {
    return This->lpVtbl->get_ScreenWidthInRawPixels(This,value);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation4_get_ScreenHeightInRawPixels(__x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation4* This,UINT32 *value) {
    return This->lpVtbl->get_ScreenHeightInRawPixels(This,value);
}
#endif
#ifdef WIDL_using_Windows_Graphics_Display
#define IID_IDisplayInformation4 IID___x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation4
#define IDisplayInformation4Vtbl __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation4Vtbl
#define IDisplayInformation4 __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation4
#define IDisplayInformation4_QueryInterface __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation4_QueryInterface
#define IDisplayInformation4_AddRef __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation4_AddRef
#define IDisplayInformation4_Release __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation4_Release
#define IDisplayInformation4_GetIids __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation4_GetIids
#define IDisplayInformation4_GetRuntimeClassName __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation4_GetRuntimeClassName
#define IDisplayInformation4_GetTrustLevel __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation4_GetTrustLevel
#define IDisplayInformation4_get_ScreenWidthInRawPixels __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation4_get_ScreenWidthInRawPixels
#define IDisplayInformation4_get_ScreenHeightInRawPixels __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation4_get_ScreenHeightInRawPixels
#endif /* WIDL_using_Windows_Graphics_Display */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation4_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */

/*****************************************************************************
 * IDisplayInformation5 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x60000
#ifndef ____x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation5_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation5_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation5, 0x3a5442dc, 0x2cde, 0x4a8d, 0x80,0xd1, 0x21,0xdc,0x5a,0xdc,0xc1,0xaa);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Graphics {
            namespace Display {
                MIDL_INTERFACE("3a5442dc-2cde-4a8d-80d1-21dc5adcc1aa")
                IDisplayInformation5 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE GetAdvancedColorInfo(
                        ABI::Windows::Graphics::Display::IAdvancedColorInfo **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE add_AdvancedColorInfoChanged(
                        ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::Graphics::Display::DisplayInformation*,IInspectable* > *handler,
                        EventRegistrationToken *token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE remove_AdvancedColorInfoChanged(
                        EventRegistrationToken token) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation5, 0x3a5442dc, 0x2cde, 0x4a8d, 0x80,0xd1, 0x21,0xdc,0x5a,0xdc,0xc1,0xaa)
#endif
#else
typedef struct __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation5Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IDisplayInformation5 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetAdvancedColorInfo)(
        __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation5 *This,
        __x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo **value);

    HRESULT (STDMETHODCALLTYPE *add_AdvancedColorInfoChanged)(
        __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation5 *This,
        __FITypedEventHandler_2_Windows__CGraphics__CDisplay__CDisplayInformation_IInspectable *handler,
        EventRegistrationToken *token);

    HRESULT (STDMETHODCALLTYPE *remove_AdvancedColorInfoChanged)(
        __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation5 *This,
        EventRegistrationToken token);

    END_INTERFACE
} __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation5Vtbl;

interface __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation5 {
    CONST_VTBL __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation5Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation5_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation5_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation5_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation5_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation5_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation5_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IDisplayInformation5 methods ***/
#define __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation5_GetAdvancedColorInfo(This,value) (This)->lpVtbl->GetAdvancedColorInfo(This,value)
#define __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation5_add_AdvancedColorInfoChanged(This,handler,token) (This)->lpVtbl->add_AdvancedColorInfoChanged(This,handler,token)
#define __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation5_remove_AdvancedColorInfoChanged(This,token) (This)->lpVtbl->remove_AdvancedColorInfoChanged(This,token)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation5_QueryInterface(__x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation5* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation5_AddRef(__x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation5* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation5_Release(__x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation5* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation5_GetIids(__x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation5* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation5_GetRuntimeClassName(__x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation5* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation5_GetTrustLevel(__x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation5* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IDisplayInformation5 methods ***/
static inline HRESULT __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation5_GetAdvancedColorInfo(__x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation5* This,__x_ABI_CWindows_CGraphics_CDisplay_CIAdvancedColorInfo **value) {
    return This->lpVtbl->GetAdvancedColorInfo(This,value);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation5_add_AdvancedColorInfoChanged(__x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation5* This,__FITypedEventHandler_2_Windows__CGraphics__CDisplay__CDisplayInformation_IInspectable *handler,EventRegistrationToken *token) {
    return This->lpVtbl->add_AdvancedColorInfoChanged(This,handler,token);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation5_remove_AdvancedColorInfoChanged(__x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation5* This,EventRegistrationToken token) {
    return This->lpVtbl->remove_AdvancedColorInfoChanged(This,token);
}
#endif
#ifdef WIDL_using_Windows_Graphics_Display
#define IID_IDisplayInformation5 IID___x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation5
#define IDisplayInformation5Vtbl __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation5Vtbl
#define IDisplayInformation5 __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation5
#define IDisplayInformation5_QueryInterface __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation5_QueryInterface
#define IDisplayInformation5_AddRef __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation5_AddRef
#define IDisplayInformation5_Release __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation5_Release
#define IDisplayInformation5_GetIids __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation5_GetIids
#define IDisplayInformation5_GetRuntimeClassName __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation5_GetRuntimeClassName
#define IDisplayInformation5_GetTrustLevel __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation5_GetTrustLevel
#define IDisplayInformation5_GetAdvancedColorInfo __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation5_GetAdvancedColorInfo
#define IDisplayInformation5_add_AdvancedColorInfoChanged __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation5_add_AdvancedColorInfoChanged
#define IDisplayInformation5_remove_AdvancedColorInfoChanged __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation5_remove_AdvancedColorInfoChanged
#endif /* WIDL_using_Windows_Graphics_Display */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation5_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x60000 */

/*****************************************************************************
 * IDisplayInformationStatics interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformationStatics_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformationStatics_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformationStatics, 0xc6a02a6c, 0xd452, 0x44dc, 0xba,0x07, 0x96,0xf3,0xc6,0xad,0xf9,0xd1);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Graphics {
            namespace Display {
                MIDL_INTERFACE("c6a02a6c-d452-44dc-ba07-96f3c6adf9d1")
                IDisplayInformationStatics : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE GetForCurrentView(
                        ABI::Windows::Graphics::Display::IDisplayInformation **current) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_AutoRotationPreferences(
                        ABI::Windows::Graphics::Display::DisplayOrientations *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_AutoRotationPreferences(
                        ABI::Windows::Graphics::Display::DisplayOrientations value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE add_DisplayContentsInvalidated(
                        ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::Graphics::Display::DisplayInformation*,IInspectable* > *handler,
                        EventRegistrationToken *token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE remove_DisplayContentsInvalidated(
                        EventRegistrationToken token) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformationStatics, 0xc6a02a6c, 0xd452, 0x44dc, 0xba,0x07, 0x96,0xf3,0xc6,0xad,0xf9,0xd1)
#endif
#else
typedef struct __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformationStaticsVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IDisplayInformationStatics methods ***/
    HRESULT (STDMETHODCALLTYPE *GetForCurrentView)(
        __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformationStatics *This,
        __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation **current);

    HRESULT (STDMETHODCALLTYPE *get_AutoRotationPreferences)(
        __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformationStatics *This,
        __x_ABI_CWindows_CGraphics_CDisplay_CDisplayOrientations *value);

    HRESULT (STDMETHODCALLTYPE *put_AutoRotationPreferences)(
        __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformationStatics *This,
        __x_ABI_CWindows_CGraphics_CDisplay_CDisplayOrientations value);

    HRESULT (STDMETHODCALLTYPE *add_DisplayContentsInvalidated)(
        __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformationStatics *This,
        __FITypedEventHandler_2_Windows__CGraphics__CDisplay__CDisplayInformation_IInspectable *handler,
        EventRegistrationToken *token);

    HRESULT (STDMETHODCALLTYPE *remove_DisplayContentsInvalidated)(
        __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformationStatics *This,
        EventRegistrationToken token);

    END_INTERFACE
} __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformationStaticsVtbl;

interface __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformationStatics {
    CONST_VTBL __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformationStaticsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformationStatics_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformationStatics_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformationStatics_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformationStatics_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformationStatics_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformationStatics_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IDisplayInformationStatics methods ***/
#define __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformationStatics_GetForCurrentView(This,current) (This)->lpVtbl->GetForCurrentView(This,current)
#define __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformationStatics_get_AutoRotationPreferences(This,value) (This)->lpVtbl->get_AutoRotationPreferences(This,value)
#define __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformationStatics_put_AutoRotationPreferences(This,value) (This)->lpVtbl->put_AutoRotationPreferences(This,value)
#define __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformationStatics_add_DisplayContentsInvalidated(This,handler,token) (This)->lpVtbl->add_DisplayContentsInvalidated(This,handler,token)
#define __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformationStatics_remove_DisplayContentsInvalidated(This,token) (This)->lpVtbl->remove_DisplayContentsInvalidated(This,token)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformationStatics_QueryInterface(__x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformationStatics* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformationStatics_AddRef(__x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformationStatics* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformationStatics_Release(__x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformationStatics* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformationStatics_GetIids(__x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformationStatics* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformationStatics_GetRuntimeClassName(__x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformationStatics* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformationStatics_GetTrustLevel(__x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformationStatics* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IDisplayInformationStatics methods ***/
static inline HRESULT __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformationStatics_GetForCurrentView(__x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformationStatics* This,__x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation **current) {
    return This->lpVtbl->GetForCurrentView(This,current);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformationStatics_get_AutoRotationPreferences(__x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformationStatics* This,__x_ABI_CWindows_CGraphics_CDisplay_CDisplayOrientations *value) {
    return This->lpVtbl->get_AutoRotationPreferences(This,value);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformationStatics_put_AutoRotationPreferences(__x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformationStatics* This,__x_ABI_CWindows_CGraphics_CDisplay_CDisplayOrientations value) {
    return This->lpVtbl->put_AutoRotationPreferences(This,value);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformationStatics_add_DisplayContentsInvalidated(__x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformationStatics* This,__FITypedEventHandler_2_Windows__CGraphics__CDisplay__CDisplayInformation_IInspectable *handler,EventRegistrationToken *token) {
    return This->lpVtbl->add_DisplayContentsInvalidated(This,handler,token);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformationStatics_remove_DisplayContentsInvalidated(__x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformationStatics* This,EventRegistrationToken token) {
    return This->lpVtbl->remove_DisplayContentsInvalidated(This,token);
}
#endif
#ifdef WIDL_using_Windows_Graphics_Display
#define IID_IDisplayInformationStatics IID___x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformationStatics
#define IDisplayInformationStaticsVtbl __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformationStaticsVtbl
#define IDisplayInformationStatics __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformationStatics
#define IDisplayInformationStatics_QueryInterface __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformationStatics_QueryInterface
#define IDisplayInformationStatics_AddRef __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformationStatics_AddRef
#define IDisplayInformationStatics_Release __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformationStatics_Release
#define IDisplayInformationStatics_GetIids __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformationStatics_GetIids
#define IDisplayInformationStatics_GetRuntimeClassName __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformationStatics_GetRuntimeClassName
#define IDisplayInformationStatics_GetTrustLevel __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformationStatics_GetTrustLevel
#define IDisplayInformationStatics_GetForCurrentView __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformationStatics_GetForCurrentView
#define IDisplayInformationStatics_get_AutoRotationPreferences __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformationStatics_get_AutoRotationPreferences
#define IDisplayInformationStatics_put_AutoRotationPreferences __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformationStatics_put_AutoRotationPreferences
#define IDisplayInformationStatics_add_DisplayContentsInvalidated __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformationStatics_add_DisplayContentsInvalidated
#define IDisplayInformationStatics_remove_DisplayContentsInvalidated __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformationStatics_remove_DisplayContentsInvalidated
#endif /* WIDL_using_Windows_Graphics_Display */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformationStatics_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.Graphics.Display.AdvancedColorInfo
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x60000
#ifndef RUNTIMECLASS_Windows_Graphics_Display_AdvancedColorInfo_DEFINED
#define RUNTIMECLASS_Windows_Graphics_Display_AdvancedColorInfo_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Graphics_Display_AdvancedColorInfo[] = {'W','i','n','d','o','w','s','.','G','r','a','p','h','i','c','s','.','D','i','s','p','l','a','y','.','A','d','v','a','n','c','e','d','C','o','l','o','r','I','n','f','o',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Graphics_Display_AdvancedColorInfo[] = L"Windows.Graphics.Display.AdvancedColorInfo";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Graphics_Display_AdvancedColorInfo[] = {'W','i','n','d','o','w','s','.','G','r','a','p','h','i','c','s','.','D','i','s','p','l','a','y','.','A','d','v','a','n','c','e','d','C','o','l','o','r','I','n','f','o',0};
#endif
#endif /* RUNTIMECLASS_Windows_Graphics_Display_AdvancedColorInfo_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x60000 */

/*
 * Class Windows.Graphics.Display.DisplayInformation
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Graphics_Display_DisplayInformation_DEFINED
#define RUNTIMECLASS_Windows_Graphics_Display_DisplayInformation_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Graphics_Display_DisplayInformation[] = {'W','i','n','d','o','w','s','.','G','r','a','p','h','i','c','s','.','D','i','s','p','l','a','y','.','D','i','s','p','l','a','y','I','n','f','o','r','m','a','t','i','o','n',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Graphics_Display_DisplayInformation[] = L"Windows.Graphics.Display.DisplayInformation";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Graphics_Display_DisplayInformation[] = {'W','i','n','d','o','w','s','.','G','r','a','p','h','i','c','s','.','D','i','s','p','l','a','y','.','D','i','s','p','l','a','y','I','n','f','o','r','m','a','t','i','o','n',0};
#endif
#endif /* RUNTIMECLASS_Windows_Graphics_Display_DisplayInformation_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * ITypedEventHandler<ABI::Windows::Graphics::Display::DisplayInformation*,IInspectable* > interface
 */
#ifndef ____FITypedEventHandler_2_Windows__CGraphics__CDisplay__CDisplayInformation_IInspectable_INTERFACE_DEFINED__
#define ____FITypedEventHandler_2_Windows__CGraphics__CDisplay__CDisplayInformation_IInspectable_INTERFACE_DEFINED__

DEFINE_GUID(IID___FITypedEventHandler_2_Windows__CGraphics__CDisplay__CDisplayInformation_IInspectable, 0x86c4f619, 0x67b6, 0x51c7, 0xb3,0x0d, 0xd8,0xcf,0x13,0x62,0x53,0x27);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("86c4f619-67b6-51c7-b30d-d8cf13625327")
            ITypedEventHandler<ABI::Windows::Graphics::Display::DisplayInformation*,IInspectable* > : ITypedEventHandler_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Graphics::Display::DisplayInformation*, ABI::Windows::Graphics::Display::IDisplayInformation* >, IInspectable* >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FITypedEventHandler_2_Windows__CGraphics__CDisplay__CDisplayInformation_IInspectable, 0x86c4f619, 0x67b6, 0x51c7, 0xb3,0x0d, 0xd8,0xcf,0x13,0x62,0x53,0x27)
#endif
#else
typedef struct __FITypedEventHandler_2_Windows__CGraphics__CDisplay__CDisplayInformation_IInspectableVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ITypedEventHandler<ABI::Windows::Graphics::Display::DisplayInformation*,IInspectable* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FITypedEventHandler_2_Windows__CGraphics__CDisplay__CDisplayInformation_IInspectable *This,
        __x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation *sender,
        IInspectable *args);

    END_INTERFACE
} __FITypedEventHandler_2_Windows__CGraphics__CDisplay__CDisplayInformation_IInspectableVtbl;

interface __FITypedEventHandler_2_Windows__CGraphics__CDisplay__CDisplayInformation_IInspectable {
    CONST_VTBL __FITypedEventHandler_2_Windows__CGraphics__CDisplay__CDisplayInformation_IInspectableVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FITypedEventHandler_2_Windows__CGraphics__CDisplay__CDisplayInformation_IInspectable_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FITypedEventHandler_2_Windows__CGraphics__CDisplay__CDisplayInformation_IInspectable_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FITypedEventHandler_2_Windows__CGraphics__CDisplay__CDisplayInformation_IInspectable_Release(This) (This)->lpVtbl->Release(This)
/*** ITypedEventHandler<ABI::Windows::Graphics::Display::DisplayInformation*,IInspectable* > methods ***/
#define __FITypedEventHandler_2_Windows__CGraphics__CDisplay__CDisplayInformation_IInspectable_Invoke(This,sender,args) (This)->lpVtbl->Invoke(This,sender,args)
#else
/*** IUnknown methods ***/
static inline HRESULT __FITypedEventHandler_2_Windows__CGraphics__CDisplay__CDisplayInformation_IInspectable_QueryInterface(__FITypedEventHandler_2_Windows__CGraphics__CDisplay__CDisplayInformation_IInspectable* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FITypedEventHandler_2_Windows__CGraphics__CDisplay__CDisplayInformation_IInspectable_AddRef(__FITypedEventHandler_2_Windows__CGraphics__CDisplay__CDisplayInformation_IInspectable* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FITypedEventHandler_2_Windows__CGraphics__CDisplay__CDisplayInformation_IInspectable_Release(__FITypedEventHandler_2_Windows__CGraphics__CDisplay__CDisplayInformation_IInspectable* This) {
    return This->lpVtbl->Release(This);
}
/*** ITypedEventHandler<ABI::Windows::Graphics::Display::DisplayInformation*,IInspectable* > methods ***/
static inline HRESULT __FITypedEventHandler_2_Windows__CGraphics__CDisplay__CDisplayInformation_IInspectable_Invoke(__FITypedEventHandler_2_Windows__CGraphics__CDisplay__CDisplayInformation_IInspectable* This,__x_ABI_CWindows_CGraphics_CDisplay_CIDisplayInformation *sender,IInspectable *args) {
    return This->lpVtbl->Invoke(This,sender,args);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_ITypedEventHandler_DisplayInformation_IInspectable IID___FITypedEventHandler_2_Windows__CGraphics__CDisplay__CDisplayInformation_IInspectable
#define ITypedEventHandler_DisplayInformation_IInspectableVtbl __FITypedEventHandler_2_Windows__CGraphics__CDisplay__CDisplayInformation_IInspectableVtbl
#define ITypedEventHandler_DisplayInformation_IInspectable __FITypedEventHandler_2_Windows__CGraphics__CDisplay__CDisplayInformation_IInspectable
#define ITypedEventHandler_DisplayInformation_IInspectable_QueryInterface __FITypedEventHandler_2_Windows__CGraphics__CDisplay__CDisplayInformation_IInspectable_QueryInterface
#define ITypedEventHandler_DisplayInformation_IInspectable_AddRef __FITypedEventHandler_2_Windows__CGraphics__CDisplay__CDisplayInformation_IInspectable_AddRef
#define ITypedEventHandler_DisplayInformation_IInspectable_Release __FITypedEventHandler_2_Windows__CGraphics__CDisplay__CDisplayInformation_IInspectable_Release
#define ITypedEventHandler_DisplayInformation_IInspectable_Invoke __FITypedEventHandler_2_Windows__CGraphics__CDisplay__CDisplayInformation_IInspectable_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FITypedEventHandler_2_Windows__CGraphics__CDisplay__CDisplayInformation_IInspectable_INTERFACE_DEFINED__ */

/* Begin additional prototypes for all interfaces */


/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __windows_graphics_display_h__ */
