/*** Autogenerated by WIDL 9.18 from include/windows.ui.input.idl - Do not edit ***/

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

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

#ifndef __windows_ui_input_h__
#define __windows_ui_input_h__

#ifndef __WIDL_INLINE
#if defined(__cplusplus) || defined(_MSC_VER)
#define __WIDL_INLINE inline
#elif defined(__GNUC__)
#define __WIDL_INLINE __inline__
#endif
#endif

/* Forward declarations */

#ifndef ____x_ABI_CWindows_CUI_CInput_CIPointerPoint_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CInput_CIPointerPoint_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CInput_CIPointerPoint __x_ABI_CWindows_CUI_CInput_CIPointerPoint;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CInput_CIPointerPoint ABI::Windows::UI::Input::IPointerPoint
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Input {
                interface IPointerPoint;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CInput_CIPointerPointProperties_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CInput_CIPointerPointProperties_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties ABI::Windows::UI::Input::IPointerPointProperties
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Input {
                interface IPointerPointProperties;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CInput_CIPointerPointProperties2_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CInput_CIPointerPointProperties2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties2 __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties2 ABI::Windows::UI::Input::IPointerPointProperties2
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Input {
                interface IPointerPointProperties2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CInput_CIPointerPointStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CInput_CIPointerPointStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CInput_CIPointerPointStatics __x_ABI_CWindows_CUI_CInput_CIPointerPointStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CInput_CIPointerPointStatics ABI::Windows::UI::Input::IPointerPointStatics
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Input {
                interface IPointerPointStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CInput_CIPointerPointTransform_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CInput_CIPointerPointTransform_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CInput_CIPointerPointTransform __x_ABI_CWindows_CUI_CInput_CIPointerPointTransform;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CInput_CIPointerPointTransform ABI::Windows::UI::Input::IPointerPointTransform
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Input {
                interface IPointerPointTransform;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CInput_CPointerPoint_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CInput_CPointerPoint_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Input {
                class PointerPoint;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CInput_CPointerPoint __x_ABI_CWindows_CUI_CInput_CPointerPoint;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CInput_CPointerPoint_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CInput_CPointerPointProperties_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CInput_CPointerPointProperties_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Input {
                class PointerPointProperties;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CInput_CPointerPointProperties __x_ABI_CWindows_CUI_CInput_CPointerPointProperties;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CInput_CPointerPointProperties_FWD_DEFINED__ */

#ifndef ____FIVectorView_1_Windows__CUI__CInput__CPointerPoint_FWD_DEFINED__
#define ____FIVectorView_1_Windows__CUI__CInput__CPointerPoint_FWD_DEFINED__
typedef interface __FIVectorView_1_Windows__CUI__CInput__CPointerPoint __FIVectorView_1_Windows__CUI__CInput__CPointerPoint;
#ifdef __cplusplus
#define __FIVectorView_1_Windows__CUI__CInput__CPointerPoint ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Input::PointerPoint* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVector_1_Windows__CUI__CInput__CPointerPoint_FWD_DEFINED__
#define ____FIVector_1_Windows__CUI__CInput__CPointerPoint_FWD_DEFINED__
typedef interface __FIVector_1_Windows__CUI__CInput__CPointerPoint __FIVector_1_Windows__CUI__CInput__CPointerPoint;
#ifdef __cplusplus
#define __FIVector_1_Windows__CUI__CInput__CPointerPoint ABI::Windows::Foundation::Collections::IVector<ABI::Windows::UI::Input::PointerPoint* >
#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.devices.input.h>
#include <windows.system.h>
#include <windows.ui.core.h>

#ifdef __cplusplus
extern "C" {
#endif

#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CUI_CInput_CPointerUpdateKind __x_ABI_CWindows_CUI_CInput_CPointerUpdateKind;
#endif /* __cplusplus */

#ifndef ____x_ABI_CWindows_CUI_CInput_CIPointerPoint_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CInput_CIPointerPoint_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CInput_CIPointerPoint __x_ABI_CWindows_CUI_CInput_CIPointerPoint;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CInput_CIPointerPoint ABI::Windows::UI::Input::IPointerPoint
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Input {
                interface IPointerPoint;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CInput_CIPointerPointProperties_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CInput_CIPointerPointProperties_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties ABI::Windows::UI::Input::IPointerPointProperties
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Input {
                interface IPointerPointProperties;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CInput_CIPointerPointProperties2_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CInput_CIPointerPointProperties2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties2 __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties2 ABI::Windows::UI::Input::IPointerPointProperties2
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Input {
                interface IPointerPointProperties2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CInput_CIPointerPointStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CInput_CIPointerPointStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CInput_CIPointerPointStatics __x_ABI_CWindows_CUI_CInput_CIPointerPointStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CInput_CIPointerPointStatics ABI::Windows::UI::Input::IPointerPointStatics
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Input {
                interface IPointerPointStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CInput_CIPointerPointTransform_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CInput_CIPointerPointTransform_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CInput_CIPointerPointTransform __x_ABI_CWindows_CUI_CInput_CIPointerPointTransform;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CInput_CIPointerPointTransform ABI::Windows::UI::Input::IPointerPointTransform
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Input {
                interface IPointerPointTransform;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_Windows__CUI__CInput__CPointerPoint_FWD_DEFINED__
#define ____FIVectorView_1_Windows__CUI__CInput__CPointerPoint_FWD_DEFINED__
typedef interface __FIVectorView_1_Windows__CUI__CInput__CPointerPoint __FIVectorView_1_Windows__CUI__CInput__CPointerPoint;
#ifdef __cplusplus
#define __FIVectorView_1_Windows__CUI__CInput__CPointerPoint ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Input::PointerPoint* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVector_1_Windows__CUI__CInput__CPointerPoint_FWD_DEFINED__
#define ____FIVector_1_Windows__CUI__CInput__CPointerPoint_FWD_DEFINED__
typedef interface __FIVector_1_Windows__CUI__CInput__CPointerPoint __FIVector_1_Windows__CUI__CInput__CPointerPoint;
#ifdef __cplusplus
#define __FIVector_1_Windows__CUI__CInput__CPointerPoint ABI::Windows::Foundation::Collections::IVector<ABI::Windows::UI::Input::PointerPoint* >
#endif /* __cplusplus */
#endif

#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Input {
                enum PointerUpdateKind {
                    PointerUpdateKind_Other = 0,
                    PointerUpdateKind_LeftButtonPressed = 1,
                    PointerUpdateKind_LeftButtonReleased = 2,
                    PointerUpdateKind_RightButtonPressed = 3,
                    PointerUpdateKind_RightButtonReleased = 4,
                    PointerUpdateKind_MiddleButtonPressed = 5,
                    PointerUpdateKind_MiddleButtonReleased = 6,
                    PointerUpdateKind_XButton1Pressed = 7,
                    PointerUpdateKind_XButton1Released = 8,
                    PointerUpdateKind_XButton2Pressed = 9,
                    PointerUpdateKind_XButton2Released = 10
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CUI_CInput_CPointerUpdateKind {
    PointerUpdateKind_Other = 0,
    PointerUpdateKind_LeftButtonPressed = 1,
    PointerUpdateKind_LeftButtonReleased = 2,
    PointerUpdateKind_RightButtonPressed = 3,
    PointerUpdateKind_RightButtonReleased = 4,
    PointerUpdateKind_MiddleButtonPressed = 5,
    PointerUpdateKind_MiddleButtonReleased = 6,
    PointerUpdateKind_XButton1Pressed = 7,
    PointerUpdateKind_XButton1Released = 8,
    PointerUpdateKind_XButton2Pressed = 9,
    PointerUpdateKind_XButton2Released = 10
};
#ifdef WIDL_using_Windows_UI_Input
#define PointerUpdateKind __x_ABI_CWindows_CUI_CInput_CPointerUpdateKind
#endif /* WIDL_using_Windows_UI_Input */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
/*****************************************************************************
 * IPointerPoint interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CInput_CIPointerPoint_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CInput_CIPointerPoint_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CInput_CIPointerPoint, 0xe995317d, 0x7296, 0x42d9, 0x82,0x33, 0xc5,0xbe,0x73,0xb7,0x4a,0x4a);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Input {
                MIDL_INTERFACE("e995317d-7296-42d9-8233-c5be73b74a4a")
                IPointerPoint : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_PointerDevice(
                        ABI::Windows::Devices::Input::IPointerDevice **value) = 0;

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

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

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

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

                    virtual HRESULT STDMETHODCALLTYPE get_Timestamp(
                        UINT64 *value) = 0;

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

                    virtual HRESULT STDMETHODCALLTYPE get_Properties(
                        ABI::Windows::UI::Input::IPointerPointProperties **value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CInput_CIPointerPoint, 0xe995317d, 0x7296, 0x42d9, 0x82,0x33, 0xc5,0xbe,0x73,0xb7,0x4a,0x4a)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CInput_CIPointerPointVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IPointerPoint methods ***/
    HRESULT (STDMETHODCALLTYPE *get_PointerDevice)(
        __x_ABI_CWindows_CUI_CInput_CIPointerPoint *This,
        __x_ABI_CWindows_CDevices_CInput_CIPointerDevice **value);

    HRESULT (STDMETHODCALLTYPE *get_Position)(
        __x_ABI_CWindows_CUI_CInput_CIPointerPoint *This,
        __x_ABI_CWindows_CFoundation_CPoint *value);

    HRESULT (STDMETHODCALLTYPE *get_RawPosition)(
        __x_ABI_CWindows_CUI_CInput_CIPointerPoint *This,
        __x_ABI_CWindows_CFoundation_CPoint *value);

    HRESULT (STDMETHODCALLTYPE *get_pointer_id)(
        __x_ABI_CWindows_CUI_CInput_CIPointerPoint *This,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *get_FrameId)(
        __x_ABI_CWindows_CUI_CInput_CIPointerPoint *This,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *get_Timestamp)(
        __x_ABI_CWindows_CUI_CInput_CIPointerPoint *This,
        UINT64 *value);

    HRESULT (STDMETHODCALLTYPE *get_IsInContact)(
        __x_ABI_CWindows_CUI_CInput_CIPointerPoint *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *get_Properties)(
        __x_ABI_CWindows_CUI_CInput_CIPointerPoint *This,
        __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties **value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CInput_CIPointerPointVtbl;

interface __x_ABI_CWindows_CUI_CInput_CIPointerPoint {
    CONST_VTBL __x_ABI_CWindows_CUI_CInput_CIPointerPointVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CInput_CIPointerPoint_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CInput_CIPointerPoint_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CInput_CIPointerPoint_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CInput_CIPointerPoint_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CInput_CIPointerPoint_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CInput_CIPointerPoint_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IPointerPoint methods ***/
#define __x_ABI_CWindows_CUI_CInput_CIPointerPoint_get_PointerDevice(This,value) (This)->lpVtbl->get_PointerDevice(This,value)
#define __x_ABI_CWindows_CUI_CInput_CIPointerPoint_get_Position(This,value) (This)->lpVtbl->get_Position(This,value)
#define __x_ABI_CWindows_CUI_CInput_CIPointerPoint_get_RawPosition(This,value) (This)->lpVtbl->get_RawPosition(This,value)
#define __x_ABI_CWindows_CUI_CInput_CIPointerPoint_get_pointer_id(This,value) (This)->lpVtbl->get_pointer_id(This,value)
#define __x_ABI_CWindows_CUI_CInput_CIPointerPoint_get_FrameId(This,value) (This)->lpVtbl->get_FrameId(This,value)
#define __x_ABI_CWindows_CUI_CInput_CIPointerPoint_get_Timestamp(This,value) (This)->lpVtbl->get_Timestamp(This,value)
#define __x_ABI_CWindows_CUI_CInput_CIPointerPoint_get_IsInContact(This,value) (This)->lpVtbl->get_IsInContact(This,value)
#define __x_ABI_CWindows_CUI_CInput_CIPointerPoint_get_Properties(This,value) (This)->lpVtbl->get_Properties(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CInput_CIPointerPoint_QueryInterface(__x_ABI_CWindows_CUI_CInput_CIPointerPoint* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CInput_CIPointerPoint_AddRef(__x_ABI_CWindows_CUI_CInput_CIPointerPoint* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CInput_CIPointerPoint_Release(__x_ABI_CWindows_CUI_CInput_CIPointerPoint* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CInput_CIPointerPoint_GetIids(__x_ABI_CWindows_CUI_CInput_CIPointerPoint* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CInput_CIPointerPoint_GetRuntimeClassName(__x_ABI_CWindows_CUI_CInput_CIPointerPoint* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CInput_CIPointerPoint_GetTrustLevel(__x_ABI_CWindows_CUI_CInput_CIPointerPoint* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IPointerPoint methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CInput_CIPointerPoint_get_PointerDevice(__x_ABI_CWindows_CUI_CInput_CIPointerPoint* This,__x_ABI_CWindows_CDevices_CInput_CIPointerDevice **value) {
    return This->lpVtbl->get_PointerDevice(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CInput_CIPointerPoint_get_Position(__x_ABI_CWindows_CUI_CInput_CIPointerPoint* This,__x_ABI_CWindows_CFoundation_CPoint *value) {
    return This->lpVtbl->get_Position(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CInput_CIPointerPoint_get_RawPosition(__x_ABI_CWindows_CUI_CInput_CIPointerPoint* This,__x_ABI_CWindows_CFoundation_CPoint *value) {
    return This->lpVtbl->get_RawPosition(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CInput_CIPointerPoint_get_pointer_id(__x_ABI_CWindows_CUI_CInput_CIPointerPoint* This,UINT32 *value) {
    return This->lpVtbl->get_pointer_id(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CInput_CIPointerPoint_get_FrameId(__x_ABI_CWindows_CUI_CInput_CIPointerPoint* This,UINT32 *value) {
    return This->lpVtbl->get_FrameId(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CInput_CIPointerPoint_get_Timestamp(__x_ABI_CWindows_CUI_CInput_CIPointerPoint* This,UINT64 *value) {
    return This->lpVtbl->get_Timestamp(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CInput_CIPointerPoint_get_IsInContact(__x_ABI_CWindows_CUI_CInput_CIPointerPoint* This,boolean *value) {
    return This->lpVtbl->get_IsInContact(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CInput_CIPointerPoint_get_Properties(__x_ABI_CWindows_CUI_CInput_CIPointerPoint* This,__x_ABI_CWindows_CUI_CInput_CIPointerPointProperties **value) {
    return This->lpVtbl->get_Properties(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Input
#define IID_IPointerPoint IID___x_ABI_CWindows_CUI_CInput_CIPointerPoint
#define IPointerPointVtbl __x_ABI_CWindows_CUI_CInput_CIPointerPointVtbl
#define IPointerPoint __x_ABI_CWindows_CUI_CInput_CIPointerPoint
#define IPointerPoint_QueryInterface __x_ABI_CWindows_CUI_CInput_CIPointerPoint_QueryInterface
#define IPointerPoint_AddRef __x_ABI_CWindows_CUI_CInput_CIPointerPoint_AddRef
#define IPointerPoint_Release __x_ABI_CWindows_CUI_CInput_CIPointerPoint_Release
#define IPointerPoint_GetIids __x_ABI_CWindows_CUI_CInput_CIPointerPoint_GetIids
#define IPointerPoint_GetRuntimeClassName __x_ABI_CWindows_CUI_CInput_CIPointerPoint_GetRuntimeClassName
#define IPointerPoint_GetTrustLevel __x_ABI_CWindows_CUI_CInput_CIPointerPoint_GetTrustLevel
#define IPointerPoint_get_PointerDevice __x_ABI_CWindows_CUI_CInput_CIPointerPoint_get_PointerDevice
#define IPointerPoint_get_Position __x_ABI_CWindows_CUI_CInput_CIPointerPoint_get_Position
#define IPointerPoint_get_RawPosition __x_ABI_CWindows_CUI_CInput_CIPointerPoint_get_RawPosition
#define IPointerPoint_get_pointer_id __x_ABI_CWindows_CUI_CInput_CIPointerPoint_get_pointer_id
#define IPointerPoint_get_FrameId __x_ABI_CWindows_CUI_CInput_CIPointerPoint_get_FrameId
#define IPointerPoint_get_Timestamp __x_ABI_CWindows_CUI_CInput_CIPointerPoint_get_Timestamp
#define IPointerPoint_get_IsInContact __x_ABI_CWindows_CUI_CInput_CIPointerPoint_get_IsInContact
#define IPointerPoint_get_Properties __x_ABI_CWindows_CUI_CInput_CIPointerPoint_get_Properties
#endif /* WIDL_using_Windows_UI_Input */
#endif

#endif

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

/*****************************************************************************
 * IPointerPointProperties interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CInput_CIPointerPointProperties_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CInput_CIPointerPointProperties_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CInput_CIPointerPointProperties, 0xc79d8a4b, 0xc163, 0x4ee7, 0x80,0x3f, 0x67,0xce,0x79,0xf9,0x97,0x2d);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Input {
                MIDL_INTERFACE("c79d8a4b-c163-4ee7-803f-67ce79f9972d")
                IPointerPointProperties : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_Pressure(
                        FLOAT *value) = 0;

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

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

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

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

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

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

                    virtual HRESULT STDMETHODCALLTYPE get_ContactRect(
                        ABI::Windows::Foundation::Rect *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_ContactRectRaw(
                        ABI::Windows::Foundation::Rect *value) = 0;

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

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

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

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

                    virtual HRESULT STDMETHODCALLTYPE get_MouseWheelDelta(
                        INT32 *value) = 0;

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

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

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

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

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

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

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

                    virtual HRESULT STDMETHODCALLTYPE get_PointerUpdateKind(
                        ABI::Windows::UI::Input::PointerUpdateKind *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE HasUsage(
                        UINT32 usage_page,
                        UINT32 usage_id,
                        boolean *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE GetUsageValue(
                        UINT32 usage_page,
                        UINT32 usage_id,
                        INT32 *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CInput_CIPointerPointProperties, 0xc79d8a4b, 0xc163, 0x4ee7, 0x80,0x3f, 0x67,0xce,0x79,0xf9,0x97,0x2d)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CInput_CIPointerPointPropertiesVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IPointerPointProperties methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Pressure)(
        __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties *This,
        FLOAT *value);

    HRESULT (STDMETHODCALLTYPE *get_IsInverted)(
        __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *get_IsEraser)(
        __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *get_Orientation)(
        __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties *This,
        FLOAT *value);

    HRESULT (STDMETHODCALLTYPE *get_XTilt)(
        __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties *This,
        FLOAT *value);

    HRESULT (STDMETHODCALLTYPE *get_YTilt)(
        __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties *This,
        FLOAT *value);

    HRESULT (STDMETHODCALLTYPE *get_Twist)(
        __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties *This,
        FLOAT *value);

    HRESULT (STDMETHODCALLTYPE *get_ContactRect)(
        __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties *This,
        __x_ABI_CWindows_CFoundation_CRect *value);

    HRESULT (STDMETHODCALLTYPE *get_ContactRectRaw)(
        __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties *This,
        __x_ABI_CWindows_CFoundation_CRect *value);

    HRESULT (STDMETHODCALLTYPE *get_TouchConfidence)(
        __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *get_IsLeftButtonPressed)(
        __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *get_IsRightButtonPressed)(
        __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *get_IsMiddleButtonPressed)(
        __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *get_MouseWheelDelta)(
        __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties *This,
        INT32 *value);

    HRESULT (STDMETHODCALLTYPE *get_IsHorizontalMouseWheel)(
        __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *get_IsPrimary)(
        __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *get_IsInRange)(
        __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *get_IsCanceled)(
        __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *get_IsBarrelButtonPressed)(
        __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *get_IsXButton1Pressed)(
        __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *get_IsXButton2Pressed)(
        __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *get_PointerUpdateKind)(
        __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties *This,
        __x_ABI_CWindows_CUI_CInput_CPointerUpdateKind *value);

    HRESULT (STDMETHODCALLTYPE *HasUsage)(
        __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties *This,
        UINT32 usage_page,
        UINT32 usage_id,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *GetUsageValue)(
        __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties *This,
        UINT32 usage_page,
        UINT32 usage_id,
        INT32 *value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CInput_CIPointerPointPropertiesVtbl;

interface __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties {
    CONST_VTBL __x_ABI_CWindows_CUI_CInput_CIPointerPointPropertiesVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IPointerPointProperties methods ***/
#define __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties_get_Pressure(This,value) (This)->lpVtbl->get_Pressure(This,value)
#define __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties_get_IsInverted(This,value) (This)->lpVtbl->get_IsInverted(This,value)
#define __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties_get_IsEraser(This,value) (This)->lpVtbl->get_IsEraser(This,value)
#define __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties_get_Orientation(This,value) (This)->lpVtbl->get_Orientation(This,value)
#define __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties_get_XTilt(This,value) (This)->lpVtbl->get_XTilt(This,value)
#define __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties_get_YTilt(This,value) (This)->lpVtbl->get_YTilt(This,value)
#define __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties_get_Twist(This,value) (This)->lpVtbl->get_Twist(This,value)
#define __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties_get_ContactRect(This,value) (This)->lpVtbl->get_ContactRect(This,value)
#define __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties_get_ContactRectRaw(This,value) (This)->lpVtbl->get_ContactRectRaw(This,value)
#define __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties_get_TouchConfidence(This,value) (This)->lpVtbl->get_TouchConfidence(This,value)
#define __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties_get_IsLeftButtonPressed(This,value) (This)->lpVtbl->get_IsLeftButtonPressed(This,value)
#define __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties_get_IsRightButtonPressed(This,value) (This)->lpVtbl->get_IsRightButtonPressed(This,value)
#define __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties_get_IsMiddleButtonPressed(This,value) (This)->lpVtbl->get_IsMiddleButtonPressed(This,value)
#define __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties_get_MouseWheelDelta(This,value) (This)->lpVtbl->get_MouseWheelDelta(This,value)
#define __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties_get_IsHorizontalMouseWheel(This,value) (This)->lpVtbl->get_IsHorizontalMouseWheel(This,value)
#define __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties_get_IsPrimary(This,value) (This)->lpVtbl->get_IsPrimary(This,value)
#define __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties_get_IsInRange(This,value) (This)->lpVtbl->get_IsInRange(This,value)
#define __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties_get_IsCanceled(This,value) (This)->lpVtbl->get_IsCanceled(This,value)
#define __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties_get_IsBarrelButtonPressed(This,value) (This)->lpVtbl->get_IsBarrelButtonPressed(This,value)
#define __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties_get_IsXButton1Pressed(This,value) (This)->lpVtbl->get_IsXButton1Pressed(This,value)
#define __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties_get_IsXButton2Pressed(This,value) (This)->lpVtbl->get_IsXButton2Pressed(This,value)
#define __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties_get_PointerUpdateKind(This,value) (This)->lpVtbl->get_PointerUpdateKind(This,value)
#define __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties_HasUsage(This,usage_page,usage_id,value) (This)->lpVtbl->HasUsage(This,usage_page,usage_id,value)
#define __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties_GetUsageValue(This,usage_page,usage_id,value) (This)->lpVtbl->GetUsageValue(This,usage_page,usage_id,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties_QueryInterface(__x_ABI_CWindows_CUI_CInput_CIPointerPointProperties* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties_AddRef(__x_ABI_CWindows_CUI_CInput_CIPointerPointProperties* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties_Release(__x_ABI_CWindows_CUI_CInput_CIPointerPointProperties* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties_GetIids(__x_ABI_CWindows_CUI_CInput_CIPointerPointProperties* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties_GetRuntimeClassName(__x_ABI_CWindows_CUI_CInput_CIPointerPointProperties* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties_GetTrustLevel(__x_ABI_CWindows_CUI_CInput_CIPointerPointProperties* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IPointerPointProperties methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties_get_Pressure(__x_ABI_CWindows_CUI_CInput_CIPointerPointProperties* This,FLOAT *value) {
    return This->lpVtbl->get_Pressure(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties_get_IsInverted(__x_ABI_CWindows_CUI_CInput_CIPointerPointProperties* This,boolean *value) {
    return This->lpVtbl->get_IsInverted(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties_get_IsEraser(__x_ABI_CWindows_CUI_CInput_CIPointerPointProperties* This,boolean *value) {
    return This->lpVtbl->get_IsEraser(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties_get_Orientation(__x_ABI_CWindows_CUI_CInput_CIPointerPointProperties* This,FLOAT *value) {
    return This->lpVtbl->get_Orientation(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties_get_XTilt(__x_ABI_CWindows_CUI_CInput_CIPointerPointProperties* This,FLOAT *value) {
    return This->lpVtbl->get_XTilt(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties_get_YTilt(__x_ABI_CWindows_CUI_CInput_CIPointerPointProperties* This,FLOAT *value) {
    return This->lpVtbl->get_YTilt(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties_get_Twist(__x_ABI_CWindows_CUI_CInput_CIPointerPointProperties* This,FLOAT *value) {
    return This->lpVtbl->get_Twist(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties_get_ContactRect(__x_ABI_CWindows_CUI_CInput_CIPointerPointProperties* This,__x_ABI_CWindows_CFoundation_CRect *value) {
    return This->lpVtbl->get_ContactRect(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties_get_ContactRectRaw(__x_ABI_CWindows_CUI_CInput_CIPointerPointProperties* This,__x_ABI_CWindows_CFoundation_CRect *value) {
    return This->lpVtbl->get_ContactRectRaw(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties_get_TouchConfidence(__x_ABI_CWindows_CUI_CInput_CIPointerPointProperties* This,boolean *value) {
    return This->lpVtbl->get_TouchConfidence(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties_get_IsLeftButtonPressed(__x_ABI_CWindows_CUI_CInput_CIPointerPointProperties* This,boolean *value) {
    return This->lpVtbl->get_IsLeftButtonPressed(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties_get_IsRightButtonPressed(__x_ABI_CWindows_CUI_CInput_CIPointerPointProperties* This,boolean *value) {
    return This->lpVtbl->get_IsRightButtonPressed(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties_get_IsMiddleButtonPressed(__x_ABI_CWindows_CUI_CInput_CIPointerPointProperties* This,boolean *value) {
    return This->lpVtbl->get_IsMiddleButtonPressed(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties_get_MouseWheelDelta(__x_ABI_CWindows_CUI_CInput_CIPointerPointProperties* This,INT32 *value) {
    return This->lpVtbl->get_MouseWheelDelta(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties_get_IsHorizontalMouseWheel(__x_ABI_CWindows_CUI_CInput_CIPointerPointProperties* This,boolean *value) {
    return This->lpVtbl->get_IsHorizontalMouseWheel(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties_get_IsPrimary(__x_ABI_CWindows_CUI_CInput_CIPointerPointProperties* This,boolean *value) {
    return This->lpVtbl->get_IsPrimary(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties_get_IsInRange(__x_ABI_CWindows_CUI_CInput_CIPointerPointProperties* This,boolean *value) {
    return This->lpVtbl->get_IsInRange(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties_get_IsCanceled(__x_ABI_CWindows_CUI_CInput_CIPointerPointProperties* This,boolean *value) {
    return This->lpVtbl->get_IsCanceled(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties_get_IsBarrelButtonPressed(__x_ABI_CWindows_CUI_CInput_CIPointerPointProperties* This,boolean *value) {
    return This->lpVtbl->get_IsBarrelButtonPressed(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties_get_IsXButton1Pressed(__x_ABI_CWindows_CUI_CInput_CIPointerPointProperties* This,boolean *value) {
    return This->lpVtbl->get_IsXButton1Pressed(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties_get_IsXButton2Pressed(__x_ABI_CWindows_CUI_CInput_CIPointerPointProperties* This,boolean *value) {
    return This->lpVtbl->get_IsXButton2Pressed(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties_get_PointerUpdateKind(__x_ABI_CWindows_CUI_CInput_CIPointerPointProperties* This,__x_ABI_CWindows_CUI_CInput_CPointerUpdateKind *value) {
    return This->lpVtbl->get_PointerUpdateKind(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties_HasUsage(__x_ABI_CWindows_CUI_CInput_CIPointerPointProperties* This,UINT32 usage_page,UINT32 usage_id,boolean *value) {
    return This->lpVtbl->HasUsage(This,usage_page,usage_id,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties_GetUsageValue(__x_ABI_CWindows_CUI_CInput_CIPointerPointProperties* This,UINT32 usage_page,UINT32 usage_id,INT32 *value) {
    return This->lpVtbl->GetUsageValue(This,usage_page,usage_id,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Input
#define IID_IPointerPointProperties IID___x_ABI_CWindows_CUI_CInput_CIPointerPointProperties
#define IPointerPointPropertiesVtbl __x_ABI_CWindows_CUI_CInput_CIPointerPointPropertiesVtbl
#define IPointerPointProperties __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties
#define IPointerPointProperties_QueryInterface __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties_QueryInterface
#define IPointerPointProperties_AddRef __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties_AddRef
#define IPointerPointProperties_Release __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties_Release
#define IPointerPointProperties_GetIids __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties_GetIids
#define IPointerPointProperties_GetRuntimeClassName __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties_GetRuntimeClassName
#define IPointerPointProperties_GetTrustLevel __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties_GetTrustLevel
#define IPointerPointProperties_get_Pressure __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties_get_Pressure
#define IPointerPointProperties_get_IsInverted __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties_get_IsInverted
#define IPointerPointProperties_get_IsEraser __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties_get_IsEraser
#define IPointerPointProperties_get_Orientation __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties_get_Orientation
#define IPointerPointProperties_get_XTilt __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties_get_XTilt
#define IPointerPointProperties_get_YTilt __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties_get_YTilt
#define IPointerPointProperties_get_Twist __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties_get_Twist
#define IPointerPointProperties_get_ContactRect __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties_get_ContactRect
#define IPointerPointProperties_get_ContactRectRaw __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties_get_ContactRectRaw
#define IPointerPointProperties_get_TouchConfidence __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties_get_TouchConfidence
#define IPointerPointProperties_get_IsLeftButtonPressed __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties_get_IsLeftButtonPressed
#define IPointerPointProperties_get_IsRightButtonPressed __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties_get_IsRightButtonPressed
#define IPointerPointProperties_get_IsMiddleButtonPressed __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties_get_IsMiddleButtonPressed
#define IPointerPointProperties_get_MouseWheelDelta __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties_get_MouseWheelDelta
#define IPointerPointProperties_get_IsHorizontalMouseWheel __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties_get_IsHorizontalMouseWheel
#define IPointerPointProperties_get_IsPrimary __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties_get_IsPrimary
#define IPointerPointProperties_get_IsInRange __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties_get_IsInRange
#define IPointerPointProperties_get_IsCanceled __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties_get_IsCanceled
#define IPointerPointProperties_get_IsBarrelButtonPressed __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties_get_IsBarrelButtonPressed
#define IPointerPointProperties_get_IsXButton1Pressed __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties_get_IsXButton1Pressed
#define IPointerPointProperties_get_IsXButton2Pressed __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties_get_IsXButton2Pressed
#define IPointerPointProperties_get_PointerUpdateKind __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties_get_PointerUpdateKind
#define IPointerPointProperties_HasUsage __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties_HasUsage
#define IPointerPointProperties_GetUsageValue __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties_GetUsageValue
#endif /* WIDL_using_Windows_UI_Input */
#endif

#endif

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

/*****************************************************************************
 * IPointerPointProperties2 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CInput_CIPointerPointProperties2_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CInput_CIPointerPointProperties2_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CInput_CIPointerPointProperties2, 0x22c3433a, 0xc83b, 0x41c0, 0xa2,0x96, 0x5e,0x23,0x2d,0x64,0xd6,0xaf);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Input {
                MIDL_INTERFACE("22c3433a-c83b-41c0-a296-5e232d64d6af")
                IPointerPointProperties2 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_ZDistance(
                        ABI::Windows::Foundation::IReference<FLOAT > **value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CInput_CIPointerPointProperties2, 0x22c3433a, 0xc83b, 0x41c0, 0xa2,0x96, 0x5e,0x23,0x2d,0x64,0xd6,0xaf)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties2Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IPointerPointProperties2 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_ZDistance)(
        __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties2 *This,
        __FIReference_1_FLOAT **value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties2Vtbl;

interface __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties2 {
    CONST_VTBL __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties2_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties2_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties2_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties2_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IPointerPointProperties2 methods ***/
#define __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties2_get_ZDistance(This,value) (This)->lpVtbl->get_ZDistance(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties2_QueryInterface(__x_ABI_CWindows_CUI_CInput_CIPointerPointProperties2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties2_AddRef(__x_ABI_CWindows_CUI_CInput_CIPointerPointProperties2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties2_Release(__x_ABI_CWindows_CUI_CInput_CIPointerPointProperties2* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties2_GetIids(__x_ABI_CWindows_CUI_CInput_CIPointerPointProperties2* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties2_GetRuntimeClassName(__x_ABI_CWindows_CUI_CInput_CIPointerPointProperties2* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties2_GetTrustLevel(__x_ABI_CWindows_CUI_CInput_CIPointerPointProperties2* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IPointerPointProperties2 methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties2_get_ZDistance(__x_ABI_CWindows_CUI_CInput_CIPointerPointProperties2* This,__FIReference_1_FLOAT **value) {
    return This->lpVtbl->get_ZDistance(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Input
#define IID_IPointerPointProperties2 IID___x_ABI_CWindows_CUI_CInput_CIPointerPointProperties2
#define IPointerPointProperties2Vtbl __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties2Vtbl
#define IPointerPointProperties2 __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties2
#define IPointerPointProperties2_QueryInterface __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties2_QueryInterface
#define IPointerPointProperties2_AddRef __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties2_AddRef
#define IPointerPointProperties2_Release __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties2_Release
#define IPointerPointProperties2_GetIids __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties2_GetIids
#define IPointerPointProperties2_GetRuntimeClassName __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties2_GetRuntimeClassName
#define IPointerPointProperties2_GetTrustLevel __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties2_GetTrustLevel
#define IPointerPointProperties2_get_ZDistance __x_ABI_CWindows_CUI_CInput_CIPointerPointProperties2_get_ZDistance
#endif /* WIDL_using_Windows_UI_Input */
#endif

#endif

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

/*****************************************************************************
 * IPointerPointStatics interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CInput_CIPointerPointStatics_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CInput_CIPointerPointStatics_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CInput_CIPointerPointStatics, 0xa506638d, 0x2a1a, 0x413e, 0xbc,0x75, 0x9f,0x38,0x38,0x1c,0xc0,0x69);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Input {
                MIDL_INTERFACE("a506638d-2a1a-413e-bc75-9f38381cc069")
                IPointerPointStatics : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE GetCurrentPoint(
                        UINT32 pointer_id,
                        ABI::Windows::UI::Input::IPointerPoint **point) = 0;

                    virtual HRESULT STDMETHODCALLTYPE GetIntermediatePoints(
                        UINT32 pointer_id,
                        ABI::Windows::Foundation::Collections::IVector<ABI::Windows::UI::Input::PointerPoint* > **points) = 0;

                    virtual HRESULT STDMETHODCALLTYPE GetCurrentPointTransformed(
                        UINT32 pointer_id,
                        ABI::Windows::UI::Input::IPointerPointTransform *transform,
                        ABI::Windows::UI::Input::IPointerPoint **point) = 0;

                    virtual HRESULT STDMETHODCALLTYPE GetIntermediatePointsTransformed(
                        UINT32 pointer_id,
                        ABI::Windows::UI::Input::IPointerPointTransform *transform,
                        ABI::Windows::Foundation::Collections::IVector<ABI::Windows::UI::Input::PointerPoint* > **points) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CInput_CIPointerPointStatics, 0xa506638d, 0x2a1a, 0x413e, 0xbc,0x75, 0x9f,0x38,0x38,0x1c,0xc0,0x69)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CInput_CIPointerPointStaticsVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IPointerPointStatics methods ***/
    HRESULT (STDMETHODCALLTYPE *GetCurrentPoint)(
        __x_ABI_CWindows_CUI_CInput_CIPointerPointStatics *This,
        UINT32 pointer_id,
        __x_ABI_CWindows_CUI_CInput_CIPointerPoint **point);

    HRESULT (STDMETHODCALLTYPE *GetIntermediatePoints)(
        __x_ABI_CWindows_CUI_CInput_CIPointerPointStatics *This,
        UINT32 pointer_id,
        __FIVector_1_Windows__CUI__CInput__CPointerPoint **points);

    HRESULT (STDMETHODCALLTYPE *GetCurrentPointTransformed)(
        __x_ABI_CWindows_CUI_CInput_CIPointerPointStatics *This,
        UINT32 pointer_id,
        __x_ABI_CWindows_CUI_CInput_CIPointerPointTransform *transform,
        __x_ABI_CWindows_CUI_CInput_CIPointerPoint **point);

    HRESULT (STDMETHODCALLTYPE *GetIntermediatePointsTransformed)(
        __x_ABI_CWindows_CUI_CInput_CIPointerPointStatics *This,
        UINT32 pointer_id,
        __x_ABI_CWindows_CUI_CInput_CIPointerPointTransform *transform,
        __FIVector_1_Windows__CUI__CInput__CPointerPoint **points);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CInput_CIPointerPointStaticsVtbl;

interface __x_ABI_CWindows_CUI_CInput_CIPointerPointStatics {
    CONST_VTBL __x_ABI_CWindows_CUI_CInput_CIPointerPointStaticsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CInput_CIPointerPointStatics_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CInput_CIPointerPointStatics_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CInput_CIPointerPointStatics_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CInput_CIPointerPointStatics_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CInput_CIPointerPointStatics_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CInput_CIPointerPointStatics_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IPointerPointStatics methods ***/
#define __x_ABI_CWindows_CUI_CInput_CIPointerPointStatics_GetCurrentPoint(This,pointer_id,point) (This)->lpVtbl->GetCurrentPoint(This,pointer_id,point)
#define __x_ABI_CWindows_CUI_CInput_CIPointerPointStatics_GetIntermediatePoints(This,pointer_id,points) (This)->lpVtbl->GetIntermediatePoints(This,pointer_id,points)
#define __x_ABI_CWindows_CUI_CInput_CIPointerPointStatics_GetCurrentPointTransformed(This,pointer_id,transform,point) (This)->lpVtbl->GetCurrentPointTransformed(This,pointer_id,transform,point)
#define __x_ABI_CWindows_CUI_CInput_CIPointerPointStatics_GetIntermediatePointsTransformed(This,pointer_id,transform,points) (This)->lpVtbl->GetIntermediatePointsTransformed(This,pointer_id,transform,points)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CInput_CIPointerPointStatics_QueryInterface(__x_ABI_CWindows_CUI_CInput_CIPointerPointStatics* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CInput_CIPointerPointStatics_AddRef(__x_ABI_CWindows_CUI_CInput_CIPointerPointStatics* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CInput_CIPointerPointStatics_Release(__x_ABI_CWindows_CUI_CInput_CIPointerPointStatics* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CInput_CIPointerPointStatics_GetIids(__x_ABI_CWindows_CUI_CInput_CIPointerPointStatics* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CInput_CIPointerPointStatics_GetRuntimeClassName(__x_ABI_CWindows_CUI_CInput_CIPointerPointStatics* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CInput_CIPointerPointStatics_GetTrustLevel(__x_ABI_CWindows_CUI_CInput_CIPointerPointStatics* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IPointerPointStatics methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CInput_CIPointerPointStatics_GetCurrentPoint(__x_ABI_CWindows_CUI_CInput_CIPointerPointStatics* This,UINT32 pointer_id,__x_ABI_CWindows_CUI_CInput_CIPointerPoint **point) {
    return This->lpVtbl->GetCurrentPoint(This,pointer_id,point);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CInput_CIPointerPointStatics_GetIntermediatePoints(__x_ABI_CWindows_CUI_CInput_CIPointerPointStatics* This,UINT32 pointer_id,__FIVector_1_Windows__CUI__CInput__CPointerPoint **points) {
    return This->lpVtbl->GetIntermediatePoints(This,pointer_id,points);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CInput_CIPointerPointStatics_GetCurrentPointTransformed(__x_ABI_CWindows_CUI_CInput_CIPointerPointStatics* This,UINT32 pointer_id,__x_ABI_CWindows_CUI_CInput_CIPointerPointTransform *transform,__x_ABI_CWindows_CUI_CInput_CIPointerPoint **point) {
    return This->lpVtbl->GetCurrentPointTransformed(This,pointer_id,transform,point);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CInput_CIPointerPointStatics_GetIntermediatePointsTransformed(__x_ABI_CWindows_CUI_CInput_CIPointerPointStatics* This,UINT32 pointer_id,__x_ABI_CWindows_CUI_CInput_CIPointerPointTransform *transform,__FIVector_1_Windows__CUI__CInput__CPointerPoint **points) {
    return This->lpVtbl->GetIntermediatePointsTransformed(This,pointer_id,transform,points);
}
#endif
#ifdef WIDL_using_Windows_UI_Input
#define IID_IPointerPointStatics IID___x_ABI_CWindows_CUI_CInput_CIPointerPointStatics
#define IPointerPointStaticsVtbl __x_ABI_CWindows_CUI_CInput_CIPointerPointStaticsVtbl
#define IPointerPointStatics __x_ABI_CWindows_CUI_CInput_CIPointerPointStatics
#define IPointerPointStatics_QueryInterface __x_ABI_CWindows_CUI_CInput_CIPointerPointStatics_QueryInterface
#define IPointerPointStatics_AddRef __x_ABI_CWindows_CUI_CInput_CIPointerPointStatics_AddRef
#define IPointerPointStatics_Release __x_ABI_CWindows_CUI_CInput_CIPointerPointStatics_Release
#define IPointerPointStatics_GetIids __x_ABI_CWindows_CUI_CInput_CIPointerPointStatics_GetIids
#define IPointerPointStatics_GetRuntimeClassName __x_ABI_CWindows_CUI_CInput_CIPointerPointStatics_GetRuntimeClassName
#define IPointerPointStatics_GetTrustLevel __x_ABI_CWindows_CUI_CInput_CIPointerPointStatics_GetTrustLevel
#define IPointerPointStatics_GetCurrentPoint __x_ABI_CWindows_CUI_CInput_CIPointerPointStatics_GetCurrentPoint
#define IPointerPointStatics_GetIntermediatePoints __x_ABI_CWindows_CUI_CInput_CIPointerPointStatics_GetIntermediatePoints
#define IPointerPointStatics_GetCurrentPointTransformed __x_ABI_CWindows_CUI_CInput_CIPointerPointStatics_GetCurrentPointTransformed
#define IPointerPointStatics_GetIntermediatePointsTransformed __x_ABI_CWindows_CUI_CInput_CIPointerPointStatics_GetIntermediatePointsTransformed
#endif /* WIDL_using_Windows_UI_Input */
#endif

#endif

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

/*****************************************************************************
 * IPointerPointTransform interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CInput_CIPointerPointTransform_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CInput_CIPointerPointTransform_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CInput_CIPointerPointTransform, 0x4d5fe14f, 0xb87c, 0x4028, 0xbc,0x9c, 0x59,0xe9,0x94,0x7f,0xb0,0x56);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Input {
                MIDL_INTERFACE("4d5fe14f-b87c-4028-bc9c-59e9947fb056")
                IPointerPointTransform : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_Inverse(
                        ABI::Windows::UI::Input::IPointerPointTransform **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE TryTransform(
                        ABI::Windows::Foundation::Point in_point,
                        ABI::Windows::Foundation::Point *out_point,
                        boolean *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE TransformBounds(
                        ABI::Windows::Foundation::Rect rect,
                        ABI::Windows::Foundation::Rect *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CInput_CIPointerPointTransform, 0x4d5fe14f, 0xb87c, 0x4028, 0xbc,0x9c, 0x59,0xe9,0x94,0x7f,0xb0,0x56)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CInput_CIPointerPointTransformVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IPointerPointTransform methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Inverse)(
        __x_ABI_CWindows_CUI_CInput_CIPointerPointTransform *This,
        __x_ABI_CWindows_CUI_CInput_CIPointerPointTransform **value);

    HRESULT (STDMETHODCALLTYPE *TryTransform)(
        __x_ABI_CWindows_CUI_CInput_CIPointerPointTransform *This,
        __x_ABI_CWindows_CFoundation_CPoint in_point,
        __x_ABI_CWindows_CFoundation_CPoint *out_point,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *TransformBounds)(
        __x_ABI_CWindows_CUI_CInput_CIPointerPointTransform *This,
        __x_ABI_CWindows_CFoundation_CRect rect,
        __x_ABI_CWindows_CFoundation_CRect *value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CInput_CIPointerPointTransformVtbl;

interface __x_ABI_CWindows_CUI_CInput_CIPointerPointTransform {
    CONST_VTBL __x_ABI_CWindows_CUI_CInput_CIPointerPointTransformVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CInput_CIPointerPointTransform_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CInput_CIPointerPointTransform_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CInput_CIPointerPointTransform_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CInput_CIPointerPointTransform_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CInput_CIPointerPointTransform_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CInput_CIPointerPointTransform_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IPointerPointTransform methods ***/
#define __x_ABI_CWindows_CUI_CInput_CIPointerPointTransform_get_Inverse(This,value) (This)->lpVtbl->get_Inverse(This,value)
#define __x_ABI_CWindows_CUI_CInput_CIPointerPointTransform_TryTransform(This,in_point,out_point,value) (This)->lpVtbl->TryTransform(This,in_point,out_point,value)
#define __x_ABI_CWindows_CUI_CInput_CIPointerPointTransform_TransformBounds(This,rect,value) (This)->lpVtbl->TransformBounds(This,rect,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CInput_CIPointerPointTransform_QueryInterface(__x_ABI_CWindows_CUI_CInput_CIPointerPointTransform* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CInput_CIPointerPointTransform_AddRef(__x_ABI_CWindows_CUI_CInput_CIPointerPointTransform* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CInput_CIPointerPointTransform_Release(__x_ABI_CWindows_CUI_CInput_CIPointerPointTransform* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CInput_CIPointerPointTransform_GetIids(__x_ABI_CWindows_CUI_CInput_CIPointerPointTransform* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CInput_CIPointerPointTransform_GetRuntimeClassName(__x_ABI_CWindows_CUI_CInput_CIPointerPointTransform* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CInput_CIPointerPointTransform_GetTrustLevel(__x_ABI_CWindows_CUI_CInput_CIPointerPointTransform* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IPointerPointTransform methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CInput_CIPointerPointTransform_get_Inverse(__x_ABI_CWindows_CUI_CInput_CIPointerPointTransform* This,__x_ABI_CWindows_CUI_CInput_CIPointerPointTransform **value) {
    return This->lpVtbl->get_Inverse(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CInput_CIPointerPointTransform_TryTransform(__x_ABI_CWindows_CUI_CInput_CIPointerPointTransform* This,__x_ABI_CWindows_CFoundation_CPoint in_point,__x_ABI_CWindows_CFoundation_CPoint *out_point,boolean *value) {
    return This->lpVtbl->TryTransform(This,in_point,out_point,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CInput_CIPointerPointTransform_TransformBounds(__x_ABI_CWindows_CUI_CInput_CIPointerPointTransform* This,__x_ABI_CWindows_CFoundation_CRect rect,__x_ABI_CWindows_CFoundation_CRect *value) {
    return This->lpVtbl->TransformBounds(This,rect,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Input
#define IID_IPointerPointTransform IID___x_ABI_CWindows_CUI_CInput_CIPointerPointTransform
#define IPointerPointTransformVtbl __x_ABI_CWindows_CUI_CInput_CIPointerPointTransformVtbl
#define IPointerPointTransform __x_ABI_CWindows_CUI_CInput_CIPointerPointTransform
#define IPointerPointTransform_QueryInterface __x_ABI_CWindows_CUI_CInput_CIPointerPointTransform_QueryInterface
#define IPointerPointTransform_AddRef __x_ABI_CWindows_CUI_CInput_CIPointerPointTransform_AddRef
#define IPointerPointTransform_Release __x_ABI_CWindows_CUI_CInput_CIPointerPointTransform_Release
#define IPointerPointTransform_GetIids __x_ABI_CWindows_CUI_CInput_CIPointerPointTransform_GetIids
#define IPointerPointTransform_GetRuntimeClassName __x_ABI_CWindows_CUI_CInput_CIPointerPointTransform_GetRuntimeClassName
#define IPointerPointTransform_GetTrustLevel __x_ABI_CWindows_CUI_CInput_CIPointerPointTransform_GetTrustLevel
#define IPointerPointTransform_get_Inverse __x_ABI_CWindows_CUI_CInput_CIPointerPointTransform_get_Inverse
#define IPointerPointTransform_TryTransform __x_ABI_CWindows_CUI_CInput_CIPointerPointTransform_TryTransform
#define IPointerPointTransform_TransformBounds __x_ABI_CWindows_CUI_CInput_CIPointerPointTransform_TransformBounds
#endif /* WIDL_using_Windows_UI_Input */
#endif

#endif

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

/*
 * Class Windows.UI.Input.PointerPoint
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_UI_Input_PointerPoint_DEFINED
#define RUNTIMECLASS_Windows_UI_Input_PointerPoint_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Input_PointerPoint[] = {'W','i','n','d','o','w','s','.','U','I','.','I','n','p','u','t','.','P','o','i','n','t','e','r','P','o','i','n','t',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Input_PointerPoint[] = L"Windows.UI.Input.PointerPoint";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Input_PointerPoint[] = {'W','i','n','d','o','w','s','.','U','I','.','I','n','p','u','t','.','P','o','i','n','t','e','r','P','o','i','n','t',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Input_PointerPoint_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.UI.Input.PointerPointProperties
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_UI_Input_PointerPointProperties_DEFINED
#define RUNTIMECLASS_Windows_UI_Input_PointerPointProperties_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Input_PointerPointProperties[] = {'W','i','n','d','o','w','s','.','U','I','.','I','n','p','u','t','.','P','o','i','n','t','e','r','P','o','i','n','t','P','r','o','p','e','r','t','i','e','s',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Input_PointerPointProperties[] = L"Windows.UI.Input.PointerPointProperties";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Input_PointerPointProperties[] = {'W','i','n','d','o','w','s','.','U','I','.','I','n','p','u','t','.','P','o','i','n','t','e','r','P','o','i','n','t','P','r','o','p','e','r','t','i','e','s',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Input_PointerPointProperties_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IVectorView<ABI::Windows::UI::Input::PointerPoint* > interface
 */
#ifndef ____FIVectorView_1_Windows__CUI__CInput__CPointerPoint_INTERFACE_DEFINED__
#define ____FIVectorView_1_Windows__CUI__CInput__CPointerPoint_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIVectorView_1_Windows__CUI__CInput__CPointerPoint, 0xf0f57411, 0x7786, 0x5174, 0x87,0x52, 0x4c,0x5e,0x83,0x4b,0x6d,0xa2);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("f0f57411-7786-5174-8752-4c5e834b6da2")
                IVectorView<ABI::Windows::UI::Input::PointerPoint* > : IVectorView_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Input::PointerPoint*, ABI::Windows::UI::Input::IPointerPoint* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIVectorView_1_Windows__CUI__CInput__CPointerPoint, 0xf0f57411, 0x7786, 0x5174, 0x87,0x52, 0x4c,0x5e,0x83,0x4b,0x6d,0xa2)
#endif
#else
typedef struct __FIVectorView_1_Windows__CUI__CInput__CPointerPointVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IVectorView<ABI::Windows::UI::Input::PointerPoint* > methods ***/
    HRESULT (STDMETHODCALLTYPE *GetAt)(
        __FIVectorView_1_Windows__CUI__CInput__CPointerPoint *This,
        UINT32 index,
        __x_ABI_CWindows_CUI_CInput_CIPointerPoint **value);

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

    HRESULT (STDMETHODCALLTYPE *IndexOf)(
        __FIVectorView_1_Windows__CUI__CInput__CPointerPoint *This,
        __x_ABI_CWindows_CUI_CInput_CIPointerPoint *element,
        UINT32 *index,
        BOOLEAN *value);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIVectorView_1_Windows__CUI__CInput__CPointerPoint *This,
        UINT32 start_index,
        UINT32 items_size,
        __x_ABI_CWindows_CUI_CInput_CIPointerPoint **items,
        UINT32 *value);

    END_INTERFACE
} __FIVectorView_1_Windows__CUI__CInput__CPointerPointVtbl;

interface __FIVectorView_1_Windows__CUI__CInput__CPointerPoint {
    CONST_VTBL __FIVectorView_1_Windows__CUI__CInput__CPointerPointVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIVectorView_1_Windows__CUI__CInput__CPointerPoint_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIVectorView_1_Windows__CUI__CInput__CPointerPoint_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIVectorView_1_Windows__CUI__CInput__CPointerPoint_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIVectorView_1_Windows__CUI__CInput__CPointerPoint_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIVectorView_1_Windows__CUI__CInput__CPointerPoint_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIVectorView_1_Windows__CUI__CInput__CPointerPoint_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IVectorView<ABI::Windows::UI::Input::PointerPoint* > methods ***/
#define __FIVectorView_1_Windows__CUI__CInput__CPointerPoint_GetAt(This,index,value) (This)->lpVtbl->GetAt(This,index,value)
#define __FIVectorView_1_Windows__CUI__CInput__CPointerPoint_get_Size(This,value) (This)->lpVtbl->get_Size(This,value)
#define __FIVectorView_1_Windows__CUI__CInput__CPointerPoint_IndexOf(This,element,index,value) (This)->lpVtbl->IndexOf(This,element,index,value)
#define __FIVectorView_1_Windows__CUI__CInput__CPointerPoint_GetMany(This,start_index,items_size,items,value) (This)->lpVtbl->GetMany(This,start_index,items_size,items,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CUI__CInput__CPointerPoint_QueryInterface(__FIVectorView_1_Windows__CUI__CInput__CPointerPoint* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIVectorView_1_Windows__CUI__CInput__CPointerPoint_AddRef(__FIVectorView_1_Windows__CUI__CInput__CPointerPoint* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIVectorView_1_Windows__CUI__CInput__CPointerPoint_Release(__FIVectorView_1_Windows__CUI__CInput__CPointerPoint* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CUI__CInput__CPointerPoint_GetIids(__FIVectorView_1_Windows__CUI__CInput__CPointerPoint* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CUI__CInput__CPointerPoint_GetRuntimeClassName(__FIVectorView_1_Windows__CUI__CInput__CPointerPoint* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CUI__CInput__CPointerPoint_GetTrustLevel(__FIVectorView_1_Windows__CUI__CInput__CPointerPoint* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IVectorView<ABI::Windows::UI::Input::PointerPoint* > methods ***/
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CUI__CInput__CPointerPoint_GetAt(__FIVectorView_1_Windows__CUI__CInput__CPointerPoint* This,UINT32 index,__x_ABI_CWindows_CUI_CInput_CIPointerPoint **value) {
    return This->lpVtbl->GetAt(This,index,value);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CUI__CInput__CPointerPoint_get_Size(__FIVectorView_1_Windows__CUI__CInput__CPointerPoint* This,UINT32 *value) {
    return This->lpVtbl->get_Size(This,value);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CUI__CInput__CPointerPoint_IndexOf(__FIVectorView_1_Windows__CUI__CInput__CPointerPoint* This,__x_ABI_CWindows_CUI_CInput_CIPointerPoint *element,UINT32 *index,BOOLEAN *value) {
    return This->lpVtbl->IndexOf(This,element,index,value);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CUI__CInput__CPointerPoint_GetMany(__FIVectorView_1_Windows__CUI__CInput__CPointerPoint* This,UINT32 start_index,UINT32 items_size,__x_ABI_CWindows_CUI_CInput_CIPointerPoint **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,start_index,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IVectorView_PointerPoint IID___FIVectorView_1_Windows__CUI__CInput__CPointerPoint
#define IVectorView_PointerPointVtbl __FIVectorView_1_Windows__CUI__CInput__CPointerPointVtbl
#define IVectorView_PointerPoint __FIVectorView_1_Windows__CUI__CInput__CPointerPoint
#define IVectorView_PointerPoint_QueryInterface __FIVectorView_1_Windows__CUI__CInput__CPointerPoint_QueryInterface
#define IVectorView_PointerPoint_AddRef __FIVectorView_1_Windows__CUI__CInput__CPointerPoint_AddRef
#define IVectorView_PointerPoint_Release __FIVectorView_1_Windows__CUI__CInput__CPointerPoint_Release
#define IVectorView_PointerPoint_GetIids __FIVectorView_1_Windows__CUI__CInput__CPointerPoint_GetIids
#define IVectorView_PointerPoint_GetRuntimeClassName __FIVectorView_1_Windows__CUI__CInput__CPointerPoint_GetRuntimeClassName
#define IVectorView_PointerPoint_GetTrustLevel __FIVectorView_1_Windows__CUI__CInput__CPointerPoint_GetTrustLevel
#define IVectorView_PointerPoint_GetAt __FIVectorView_1_Windows__CUI__CInput__CPointerPoint_GetAt
#define IVectorView_PointerPoint_get_Size __FIVectorView_1_Windows__CUI__CInput__CPointerPoint_get_Size
#define IVectorView_PointerPoint_IndexOf __FIVectorView_1_Windows__CUI__CInput__CPointerPoint_IndexOf
#define IVectorView_PointerPoint_GetMany __FIVectorView_1_Windows__CUI__CInput__CPointerPoint_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIVectorView_1_Windows__CUI__CInput__CPointerPoint_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVector<ABI::Windows::UI::Input::PointerPoint* > interface
 */
#ifndef ____FIVector_1_Windows__CUI__CInput__CPointerPoint_INTERFACE_DEFINED__
#define ____FIVector_1_Windows__CUI__CInput__CPointerPoint_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIVector_1_Windows__CUI__CInput__CPointerPoint, 0xdfa655cf, 0xfde7, 0x5048, 0xb4,0xbf, 0xc9,0x09,0x23,0x1b,0x7e,0xdb);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("dfa655cf-fde7-5048-b4bf-c909231b7edb")
                IVector<ABI::Windows::UI::Input::PointerPoint* > : IVector_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Input::PointerPoint*, ABI::Windows::UI::Input::IPointerPoint* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIVector_1_Windows__CUI__CInput__CPointerPoint, 0xdfa655cf, 0xfde7, 0x5048, 0xb4,0xbf, 0xc9,0x09,0x23,0x1b,0x7e,0xdb)
#endif
#else
typedef struct __FIVector_1_Windows__CUI__CInput__CPointerPointVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IVector<ABI::Windows::UI::Input::PointerPoint* > methods ***/
    HRESULT (STDMETHODCALLTYPE *GetAt)(
        __FIVector_1_Windows__CUI__CInput__CPointerPoint *This,
        UINT32 index,
        __x_ABI_CWindows_CUI_CInput_CIPointerPoint **value);

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

    HRESULT (STDMETHODCALLTYPE *GetView)(
        __FIVector_1_Windows__CUI__CInput__CPointerPoint *This,
        __FIVectorView_1_Windows__CUI__CInput__CPointerPoint **value);

    HRESULT (STDMETHODCALLTYPE *IndexOf)(
        __FIVector_1_Windows__CUI__CInput__CPointerPoint *This,
        __x_ABI_CWindows_CUI_CInput_CIPointerPoint *element,
        UINT32 *index,
        BOOLEAN *value);

    HRESULT (STDMETHODCALLTYPE *SetAt)(
        __FIVector_1_Windows__CUI__CInput__CPointerPoint *This,
        UINT32 index,
        __x_ABI_CWindows_CUI_CInput_CIPointerPoint *value);

    HRESULT (STDMETHODCALLTYPE *InsertAt)(
        __FIVector_1_Windows__CUI__CInput__CPointerPoint *This,
        UINT32 index,
        __x_ABI_CWindows_CUI_CInput_CIPointerPoint *value);

    HRESULT (STDMETHODCALLTYPE *RemoveAt)(
        __FIVector_1_Windows__CUI__CInput__CPointerPoint *This,
        UINT32 index);

    HRESULT (STDMETHODCALLTYPE *Append)(
        __FIVector_1_Windows__CUI__CInput__CPointerPoint *This,
        __x_ABI_CWindows_CUI_CInput_CIPointerPoint *value);

    HRESULT (STDMETHODCALLTYPE *RemoveAtEnd)(
        __FIVector_1_Windows__CUI__CInput__CPointerPoint *This);

    HRESULT (STDMETHODCALLTYPE *Clear)(
        __FIVector_1_Windows__CUI__CInput__CPointerPoint *This);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIVector_1_Windows__CUI__CInput__CPointerPoint *This,
        UINT32 start_index,
        UINT32 items_size,
        __x_ABI_CWindows_CUI_CInput_CIPointerPoint **items,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *ReplaceAll)(
        __FIVector_1_Windows__CUI__CInput__CPointerPoint *This,
        UINT32 count,
        __x_ABI_CWindows_CUI_CInput_CIPointerPoint **items);

    END_INTERFACE
} __FIVector_1_Windows__CUI__CInput__CPointerPointVtbl;

interface __FIVector_1_Windows__CUI__CInput__CPointerPoint {
    CONST_VTBL __FIVector_1_Windows__CUI__CInput__CPointerPointVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIVector_1_Windows__CUI__CInput__CPointerPoint_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIVector_1_Windows__CUI__CInput__CPointerPoint_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIVector_1_Windows__CUI__CInput__CPointerPoint_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIVector_1_Windows__CUI__CInput__CPointerPoint_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIVector_1_Windows__CUI__CInput__CPointerPoint_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIVector_1_Windows__CUI__CInput__CPointerPoint_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IVector<ABI::Windows::UI::Input::PointerPoint* > methods ***/
#define __FIVector_1_Windows__CUI__CInput__CPointerPoint_GetAt(This,index,value) (This)->lpVtbl->GetAt(This,index,value)
#define __FIVector_1_Windows__CUI__CInput__CPointerPoint_get_Size(This,value) (This)->lpVtbl->get_Size(This,value)
#define __FIVector_1_Windows__CUI__CInput__CPointerPoint_GetView(This,value) (This)->lpVtbl->GetView(This,value)
#define __FIVector_1_Windows__CUI__CInput__CPointerPoint_IndexOf(This,element,index,value) (This)->lpVtbl->IndexOf(This,element,index,value)
#define __FIVector_1_Windows__CUI__CInput__CPointerPoint_SetAt(This,index,value) (This)->lpVtbl->SetAt(This,index,value)
#define __FIVector_1_Windows__CUI__CInput__CPointerPoint_InsertAt(This,index,value) (This)->lpVtbl->InsertAt(This,index,value)
#define __FIVector_1_Windows__CUI__CInput__CPointerPoint_RemoveAt(This,index) (This)->lpVtbl->RemoveAt(This,index)
#define __FIVector_1_Windows__CUI__CInput__CPointerPoint_Append(This,value) (This)->lpVtbl->Append(This,value)
#define __FIVector_1_Windows__CUI__CInput__CPointerPoint_RemoveAtEnd(This) (This)->lpVtbl->RemoveAtEnd(This)
#define __FIVector_1_Windows__CUI__CInput__CPointerPoint_Clear(This) (This)->lpVtbl->Clear(This)
#define __FIVector_1_Windows__CUI__CInput__CPointerPoint_GetMany(This,start_index,items_size,items,value) (This)->lpVtbl->GetMany(This,start_index,items_size,items,value)
#define __FIVector_1_Windows__CUI__CInput__CPointerPoint_ReplaceAll(This,count,items) (This)->lpVtbl->ReplaceAll(This,count,items)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CUI__CInput__CPointerPoint_QueryInterface(__FIVector_1_Windows__CUI__CInput__CPointerPoint* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIVector_1_Windows__CUI__CInput__CPointerPoint_AddRef(__FIVector_1_Windows__CUI__CInput__CPointerPoint* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIVector_1_Windows__CUI__CInput__CPointerPoint_Release(__FIVector_1_Windows__CUI__CInput__CPointerPoint* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CUI__CInput__CPointerPoint_GetIids(__FIVector_1_Windows__CUI__CInput__CPointerPoint* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CUI__CInput__CPointerPoint_GetRuntimeClassName(__FIVector_1_Windows__CUI__CInput__CPointerPoint* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CUI__CInput__CPointerPoint_GetTrustLevel(__FIVector_1_Windows__CUI__CInput__CPointerPoint* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IVector<ABI::Windows::UI::Input::PointerPoint* > methods ***/
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CUI__CInput__CPointerPoint_GetAt(__FIVector_1_Windows__CUI__CInput__CPointerPoint* This,UINT32 index,__x_ABI_CWindows_CUI_CInput_CIPointerPoint **value) {
    return This->lpVtbl->GetAt(This,index,value);
}
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CUI__CInput__CPointerPoint_get_Size(__FIVector_1_Windows__CUI__CInput__CPointerPoint* This,UINT32 *value) {
    return This->lpVtbl->get_Size(This,value);
}
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CUI__CInput__CPointerPoint_GetView(__FIVector_1_Windows__CUI__CInput__CPointerPoint* This,__FIVectorView_1_Windows__CUI__CInput__CPointerPoint **value) {
    return This->lpVtbl->GetView(This,value);
}
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CUI__CInput__CPointerPoint_IndexOf(__FIVector_1_Windows__CUI__CInput__CPointerPoint* This,__x_ABI_CWindows_CUI_CInput_CIPointerPoint *element,UINT32 *index,BOOLEAN *value) {
    return This->lpVtbl->IndexOf(This,element,index,value);
}
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CUI__CInput__CPointerPoint_SetAt(__FIVector_1_Windows__CUI__CInput__CPointerPoint* This,UINT32 index,__x_ABI_CWindows_CUI_CInput_CIPointerPoint *value) {
    return This->lpVtbl->SetAt(This,index,value);
}
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CUI__CInput__CPointerPoint_InsertAt(__FIVector_1_Windows__CUI__CInput__CPointerPoint* This,UINT32 index,__x_ABI_CWindows_CUI_CInput_CIPointerPoint *value) {
    return This->lpVtbl->InsertAt(This,index,value);
}
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CUI__CInput__CPointerPoint_RemoveAt(__FIVector_1_Windows__CUI__CInput__CPointerPoint* This,UINT32 index) {
    return This->lpVtbl->RemoveAt(This,index);
}
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CUI__CInput__CPointerPoint_Append(__FIVector_1_Windows__CUI__CInput__CPointerPoint* This,__x_ABI_CWindows_CUI_CInput_CIPointerPoint *value) {
    return This->lpVtbl->Append(This,value);
}
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CUI__CInput__CPointerPoint_RemoveAtEnd(__FIVector_1_Windows__CUI__CInput__CPointerPoint* This) {
    return This->lpVtbl->RemoveAtEnd(This);
}
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CUI__CInput__CPointerPoint_Clear(__FIVector_1_Windows__CUI__CInput__CPointerPoint* This) {
    return This->lpVtbl->Clear(This);
}
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CUI__CInput__CPointerPoint_GetMany(__FIVector_1_Windows__CUI__CInput__CPointerPoint* This,UINT32 start_index,UINT32 items_size,__x_ABI_CWindows_CUI_CInput_CIPointerPoint **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,start_index,items_size,items,value);
}
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CUI__CInput__CPointerPoint_ReplaceAll(__FIVector_1_Windows__CUI__CInput__CPointerPoint* This,UINT32 count,__x_ABI_CWindows_CUI_CInput_CIPointerPoint **items) {
    return This->lpVtbl->ReplaceAll(This,count,items);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IVector_PointerPoint IID___FIVector_1_Windows__CUI__CInput__CPointerPoint
#define IVector_PointerPointVtbl __FIVector_1_Windows__CUI__CInput__CPointerPointVtbl
#define IVector_PointerPoint __FIVector_1_Windows__CUI__CInput__CPointerPoint
#define IVector_PointerPoint_QueryInterface __FIVector_1_Windows__CUI__CInput__CPointerPoint_QueryInterface
#define IVector_PointerPoint_AddRef __FIVector_1_Windows__CUI__CInput__CPointerPoint_AddRef
#define IVector_PointerPoint_Release __FIVector_1_Windows__CUI__CInput__CPointerPoint_Release
#define IVector_PointerPoint_GetIids __FIVector_1_Windows__CUI__CInput__CPointerPoint_GetIids
#define IVector_PointerPoint_GetRuntimeClassName __FIVector_1_Windows__CUI__CInput__CPointerPoint_GetRuntimeClassName
#define IVector_PointerPoint_GetTrustLevel __FIVector_1_Windows__CUI__CInput__CPointerPoint_GetTrustLevel
#define IVector_PointerPoint_GetAt __FIVector_1_Windows__CUI__CInput__CPointerPoint_GetAt
#define IVector_PointerPoint_get_Size __FIVector_1_Windows__CUI__CInput__CPointerPoint_get_Size
#define IVector_PointerPoint_GetView __FIVector_1_Windows__CUI__CInput__CPointerPoint_GetView
#define IVector_PointerPoint_IndexOf __FIVector_1_Windows__CUI__CInput__CPointerPoint_IndexOf
#define IVector_PointerPoint_SetAt __FIVector_1_Windows__CUI__CInput__CPointerPoint_SetAt
#define IVector_PointerPoint_InsertAt __FIVector_1_Windows__CUI__CInput__CPointerPoint_InsertAt
#define IVector_PointerPoint_RemoveAt __FIVector_1_Windows__CUI__CInput__CPointerPoint_RemoveAt
#define IVector_PointerPoint_Append __FIVector_1_Windows__CUI__CInput__CPointerPoint_Append
#define IVector_PointerPoint_RemoveAtEnd __FIVector_1_Windows__CUI__CInput__CPointerPoint_RemoveAtEnd
#define IVector_PointerPoint_Clear __FIVector_1_Windows__CUI__CInput__CPointerPoint_Clear
#define IVector_PointerPoint_GetMany __FIVector_1_Windows__CUI__CInput__CPointerPoint_GetMany
#define IVector_PointerPoint_ReplaceAll __FIVector_1_Windows__CUI__CInput__CPointerPoint_ReplaceAll
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIVector_1_Windows__CUI__CInput__CPointerPoint_INTERFACE_DEFINED__ */

/* Begin additional prototypes for all interfaces */


/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __windows_ui_input_h__ */
