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