/*** Autogenerated by WIDL 9.8 from include/directmanipulation.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 __directmanipulation_h__
#define __directmanipulation_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 __IDirectManipulationFrameInfoProvider_FWD_DEFINED__
#define __IDirectManipulationFrameInfoProvider_FWD_DEFINED__
typedef interface IDirectManipulationFrameInfoProvider IDirectManipulationFrameInfoProvider;
#ifdef __cplusplus
interface IDirectManipulationFrameInfoProvider;
#endif /* __cplusplus */
#endif

#ifndef __IDirectManipulationManager_FWD_DEFINED__
#define __IDirectManipulationManager_FWD_DEFINED__
typedef interface IDirectManipulationManager IDirectManipulationManager;
#ifdef __cplusplus
interface IDirectManipulationManager;
#endif /* __cplusplus */
#endif

#ifndef __IDirectManipulationContent_FWD_DEFINED__
#define __IDirectManipulationContent_FWD_DEFINED__
typedef interface IDirectManipulationContent IDirectManipulationContent;
#ifdef __cplusplus
interface IDirectManipulationContent;
#endif /* __cplusplus */
#endif

#ifndef __IDirectManipulationUpdateHandler_FWD_DEFINED__
#define __IDirectManipulationUpdateHandler_FWD_DEFINED__
typedef interface IDirectManipulationUpdateHandler IDirectManipulationUpdateHandler;
#ifdef __cplusplus
interface IDirectManipulationUpdateHandler;
#endif /* __cplusplus */
#endif

#ifndef __IDirectManipulationUpdateManager_FWD_DEFINED__
#define __IDirectManipulationUpdateManager_FWD_DEFINED__
typedef interface IDirectManipulationUpdateManager IDirectManipulationUpdateManager;
#ifdef __cplusplus
interface IDirectManipulationUpdateManager;
#endif /* __cplusplus */
#endif

#ifndef __IDirectManipulationCompositor_FWD_DEFINED__
#define __IDirectManipulationCompositor_FWD_DEFINED__
typedef interface IDirectManipulationCompositor IDirectManipulationCompositor;
#ifdef __cplusplus
interface IDirectManipulationCompositor;
#endif /* __cplusplus */
#endif

#ifndef __IDirectManipulationViewport_FWD_DEFINED__
#define __IDirectManipulationViewport_FWD_DEFINED__
typedef interface IDirectManipulationViewport IDirectManipulationViewport;
#ifdef __cplusplus
interface IDirectManipulationViewport;
#endif /* __cplusplus */
#endif

#ifndef __IDirectManipulationViewport2_FWD_DEFINED__
#define __IDirectManipulationViewport2_FWD_DEFINED__
typedef interface IDirectManipulationViewport2 IDirectManipulationViewport2;
#ifdef __cplusplus
interface IDirectManipulationViewport2;
#endif /* __cplusplus */
#endif

#ifndef __IDirectManipulationViewportEventHandler_FWD_DEFINED__
#define __IDirectManipulationViewportEventHandler_FWD_DEFINED__
typedef interface IDirectManipulationViewportEventHandler IDirectManipulationViewportEventHandler;
#ifdef __cplusplus
interface IDirectManipulationViewportEventHandler;
#endif /* __cplusplus */
#endif

#ifndef __IDirectManipulationManager2_FWD_DEFINED__
#define __IDirectManipulationManager2_FWD_DEFINED__
typedef interface IDirectManipulationManager2 IDirectManipulationManager2;
#ifdef __cplusplus
interface IDirectManipulationManager2;
#endif /* __cplusplus */
#endif

#ifndef __IDirectManipulationPrimaryContent_FWD_DEFINED__
#define __IDirectManipulationPrimaryContent_FWD_DEFINED__
typedef interface IDirectManipulationPrimaryContent IDirectManipulationPrimaryContent;
#ifdef __cplusplus
interface IDirectManipulationPrimaryContent;
#endif /* __cplusplus */
#endif

#ifndef __IDirectManipulationCompositor2_FWD_DEFINED__
#define __IDirectManipulationCompositor2_FWD_DEFINED__
typedef interface IDirectManipulationCompositor2 IDirectManipulationCompositor2;
#ifdef __cplusplus
interface IDirectManipulationCompositor2;
#endif /* __cplusplus */
#endif

#ifndef __IDirectManipulationInteractionEventHandler_FWD_DEFINED__
#define __IDirectManipulationInteractionEventHandler_FWD_DEFINED__
typedef interface IDirectManipulationInteractionEventHandler IDirectManipulationInteractionEventHandler;
#ifdef __cplusplus
interface IDirectManipulationInteractionEventHandler;
#endif /* __cplusplus */
#endif

#ifndef __DirectManipulationManager_FWD_DEFINED__
#define __DirectManipulationManager_FWD_DEFINED__
#ifdef __cplusplus
typedef class DirectManipulationManager DirectManipulationManager;
#else
typedef struct DirectManipulationManager DirectManipulationManager;
#endif /* defined __cplusplus */
#endif /* defined __DirectManipulationManager_FWD_DEFINED__ */

#ifndef __DirectManipulationSharedManager_FWD_DEFINED__
#define __DirectManipulationSharedManager_FWD_DEFINED__
#ifdef __cplusplus
typedef class DirectManipulationSharedManager DirectManipulationSharedManager;
#else
typedef struct DirectManipulationSharedManager DirectManipulationSharedManager;
#endif /* defined __cplusplus */
#endif /* defined __DirectManipulationSharedManager_FWD_DEFINED__ */

#ifndef __DCompManipulationCompositor_FWD_DEFINED__
#define __DCompManipulationCompositor_FWD_DEFINED__
#ifdef __cplusplus
typedef class DCompManipulationCompositor DCompManipulationCompositor;
#else
typedef struct DCompManipulationCompositor DCompManipulationCompositor;
#endif /* defined __cplusplus */
#endif /* defined __DCompManipulationCompositor_FWD_DEFINED__ */

#ifndef __DirectManipulationViewport_FWD_DEFINED__
#define __DirectManipulationViewport_FWD_DEFINED__
#ifdef __cplusplus
typedef class DirectManipulationViewport DirectManipulationViewport;
#else
typedef struct DirectManipulationViewport DirectManipulationViewport;
#endif /* defined __cplusplus */
#endif /* defined __DirectManipulationViewport_FWD_DEFINED__ */

/* Headers for imported files */

#include <oaidl.h>
#include <ocidl.h>

#ifdef __cplusplus
extern "C" {
#endif

#if 0
typedef void *HWND;
#endif
#ifndef __IDirectManipulationViewportEventHandler_FWD_DEFINED__
#define __IDirectManipulationViewportEventHandler_FWD_DEFINED__
typedef interface IDirectManipulationViewportEventHandler IDirectManipulationViewportEventHandler;
#ifdef __cplusplus
interface IDirectManipulationViewportEventHandler;
#endif /* __cplusplus */
#endif

typedef enum DIRECTMANIPULATION_HITTEST_TYPE {
    DIRECTMANIPULATION_HITTEST_TYPE_ASYNCHRONOUS = 0x0,
    DIRECTMANIPULATION_HITTEST_TYPE_SYNCHRONOUS = 0x1,
    DIRECTMANIPULATION_HITTEST_TYPE_AUTO_SYNCHRONOUS = 0x2
} DIRECTMANIPULATION_HITTEST_TYPE;
DEFINE_ENUM_FLAG_OPERATORS(DIRECTMANIPULATION_HITTEST_TYPE)
typedef enum DIRECTMANIPULATION_STATUS {
    DIRECTMANIPULATION_BUILDING = 0,
    DIRECTMANIPULATION_ENABLED = 1,
    DIRECTMANIPULATION_DISABLED = 2,
    DIRECTMANIPULATION_RUNNING = 3,
    DIRECTMANIPULATION_INERTIA = 4,
    DIRECTMANIPULATION_READY = 5,
    DIRECTMANIPULATION_SUSPENDED = 6
} DIRECTMANIPULATION_STATUS;
typedef enum DIRECTMANIPULATION_VIEWPORT_OPTIONS {
    DIRECTMANIPULATION_VIEWPORT_OPTIONS_DEFAULT = 0x0,
    DIRECTMANIPULATION_VIEWPORT_OPTIONS_AUTODISABLE = 0x1,
    DIRECTMANIPULATION_VIEWPORT_OPTIONS_MANUALUPDATE = 0x2,
    DIRECTMANIPULATION_VIEWPORT_OPTIONS_INPUT = 0x4,
    DIRECTMANIPULATION_VIEWPORT_OPTIONS_EXPLICITHITTEST = 0x8,
    DIRECTMANIPULATION_VIEWPORT_OPTIONS_DISABLEPIXELSNAPPING = 0x10
} DIRECTMANIPULATION_VIEWPORT_OPTIONS;
DEFINE_ENUM_FLAG_OPERATORS(DIRECTMANIPULATION_VIEWPORT_OPTIONS)
typedef enum DIRECTMANIPULATION_CONFIGURATION {
    DIRECTMANIPULATION_CONFIGURATION_NONE = 0x0,
    DIRECTMANIPULATION_CONFIGURATION_INTERACTION = 0x1,
    DIRECTMANIPULATION_CONFIGURATION_TRANSLATION_X = 0x2,
    DIRECTMANIPULATION_CONFIGURATION_TRANSLATION_Y = 0x4,
    DIRECTMANIPULATION_CONFIGURATION_SCALING = 0x10,
    DIRECTMANIPULATION_CONFIGURATION_TRANSLATION_INERTIA = 0x20,
    DIRECTMANIPULATION_CONFIGURATION_SCALING_INERTIA = 0x80,
    DIRECTMANIPULATION_CONFIGURATION_RAILS_X = 0x100,
    DIRECTMANIPULATION_CONFIGURATION_RAILS_Y = 0x200
} DIRECTMANIPULATION_CONFIGURATION;
DEFINE_ENUM_FLAG_OPERATORS(DIRECTMANIPULATION_CONFIGURATION)
typedef enum DIRECTMANIPULATION_GESTURE_CONFIGURATION {
    DIRECTMANIPULATION_GESTURE_NONE = 0x0,
    DIRECTMANIPULATION_GESTURE_DEFAULT = 0x0,
    DIRECTMANIPULATION_GESTURE_CROSS_SLIDE_VERTICAL = 0x8,
    DIRECTMANIPULATION_GESTURE_CROSS_SLIDE_HORIZONTAL = 0x10,
    DIRECTMANIPULATION_GESTURE_PINCH_ZOOM = 0x20
} DIRECTMANIPULATION_GESTURE_CONFIGURATION;
DEFINE_ENUM_FLAG_OPERATORS(DIRECTMANIPULATION_GESTURE_CONFIGURATION)
typedef enum DIRECTMANIPULATION_MOTION_TYPES {
    DIRECTMANIPULATION_MOTION_NONE = 0x0,
    DIRECTMANIPULATION_MOTION_TRANSLATEX = 0x1,
    DIRECTMANIPULATION_MOTION_TRANSLATEY = 0x2,
    DIRECTMANIPULATION_MOTION_ZOOM = 0x4,
    DIRECTMANIPULATION_MOTION_CENTERX = 0x10,
    DIRECTMANIPULATION_MOTION_CENTERY = 0x20,
    DIRECTMANIPULATION_MOTION_ALL = (((DIRECTMANIPULATION_MOTION_TRANSLATEX | DIRECTMANIPULATION_MOTION_TRANSLATEY) | DIRECTMANIPULATION_MOTION_ZOOM) | DIRECTMANIPULATION_MOTION_CENTERX) | DIRECTMANIPULATION_MOTION_CENTERY
} DIRECTMANIPULATION_MOTION_TYPES;
DEFINE_ENUM_FLAG_OPERATORS(DIRECTMANIPULATION_MOTION_TYPES)
typedef enum DIRECTMANIPULATION_SNAPPOINT_TYPE {
    DIRECTMANIPULATION_SNAPPOINT_MANDATORY = 0,
    DIRECTMANIPULATION_SNAPPOINT_OPTIONAL = 1,
    DIRECTMANIPULATION_SNAPPOINT_MANDATORY_SINGLE = 2,
    DIRECTMANIPULATION_SNAPPOINT_OPTIONAL_SINGLE = 3
} DIRECTMANIPULATION_SNAPPOINT_TYPE;
typedef enum DIRECTMANIPULATION_SNAPPOINT_COORDINATE {
    DIRECTMANIPULATION_COORDINATE_BOUNDARY = 0x0,
    DIRECTMANIPULATION_COORDINATE_ORIGIN = 0x1,
    DIRECTMANIPULATION_COORDINATE_MIRRORED = 0x10
} DIRECTMANIPULATION_SNAPPOINT_COORDINATE;
DEFINE_ENUM_FLAG_OPERATORS(DIRECTMANIPULATION_SNAPPOINT_COORDINATE)
typedef enum DIRECTMANIPULATION_HORIZONTALALIGNMENT {
    DIRECTMANIPULATION_HORIZONTALALIGNMENT_NONE = 0x0,
    DIRECTMANIPULATION_HORIZONTALALIGNMENT_LEFT = 0x1,
    DIRECTMANIPULATION_HORIZONTALALIGNMENT_CENTER = 0x2,
    DIRECTMANIPULATION_HORIZONTALALIGNMENT_RIGHT = 0x4,
    DIRECTMANIPULATION_HORIZONTALALIGNMENT_UNLOCKCENTER = 0x8
} DIRECTMANIPULATION_HORIZONTALALIGNMENT;
DEFINE_ENUM_FLAG_OPERATORS(DIRECTMANIPULATION_HORIZONTALALIGNMENT)
typedef enum DIRECTMANIPULATION_VERTICALALIGNMENT {
    DIRECTMANIPULATION_VERTICALALIGNMENT_NONE = 0x0,
    DIRECTMANIPULATION_VERTICALALIGNMENT_TOP = 0x1,
    DIRECTMANIPULATION_VERTICALALIGNMENT_CENTER = 0x2,
    DIRECTMANIPULATION_VERTICALALIGNMENT_BOTTOM = 0x4,
    DIRECTMANIPULATION_VERTICALALIGNMENT_UNLOCKCENTER = 0x8
} DIRECTMANIPULATION_VERTICALALIGNMENT;
DEFINE_ENUM_FLAG_OPERATORS(DIRECTMANIPULATION_VERTICALALIGNMENT)
typedef enum DIRECTMANIPULATION_INPUT_MODE {
    DIRECTMANIPULATION_INPUT_MODE_AUTOMATIC = 0,
    DIRECTMANIPULATION_INPUT_MODE_MANUAL = 1
} DIRECTMANIPULATION_INPUT_MODE;
typedef enum DIRECTMANIPULATION_INTERACTION_TYPE {
    DIRECTMANIPULATION_INTERACTION_BEGIN = 0,
    DIRECTMANIPULATION_INTERACTION_TYPE_MANIPULATION = 1,
    DIRECTMANIPULATION_INTERACTION_TYPE_GESTURE_TAP = 2,
    DIRECTMANIPULATION_INTERACTION_TYPE_GESTURE_HOLD = 3,
    DIRECTMANIPULATION_INTERACTION_TYPE_GESTURE_CROSS_SLIDE = 4,
    DIRECTMANIPULATION_INTERACTION_TYPE_GESTURE_PINCH_ZOOM = 5,
    DIRECTMANIPULATION_INTERACTION_END = 100
} DIRECTMANIPULATION_INTERACTION_TYPE;
/*****************************************************************************
 * IDirectManipulationFrameInfoProvider interface
 */
#ifndef __IDirectManipulationFrameInfoProvider_INTERFACE_DEFINED__
#define __IDirectManipulationFrameInfoProvider_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDirectManipulationFrameInfoProvider, 0xfb759dba, 0x6f4c, 0x4c01, 0x87,0x4e, 0x19,0xc8,0xa0,0x59,0x07,0xf9);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("fb759dba-6f4c-4c01-874e-19c8a05907f9")
IDirectManipulationFrameInfoProvider : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetNextFrameInfo(
        ULONGLONG *time,
        ULONGLONG *process,
        ULONGLONG *composition) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDirectManipulationFrameInfoProvider, 0xfb759dba, 0x6f4c, 0x4c01, 0x87,0x4e, 0x19,0xc8,0xa0,0x59,0x07,0xf9)
#endif
#else
typedef struct IDirectManipulationFrameInfoProviderVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDirectManipulationFrameInfoProvider methods ***/
    HRESULT (STDMETHODCALLTYPE *GetNextFrameInfo)(
        IDirectManipulationFrameInfoProvider *This,
        ULONGLONG *time,
        ULONGLONG *process,
        ULONGLONG *composition);

    END_INTERFACE
} IDirectManipulationFrameInfoProviderVtbl;

interface IDirectManipulationFrameInfoProvider {
    CONST_VTBL IDirectManipulationFrameInfoProviderVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDirectManipulationFrameInfoProvider_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDirectManipulationFrameInfoProvider_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDirectManipulationFrameInfoProvider_Release(This) (This)->lpVtbl->Release(This)
/*** IDirectManipulationFrameInfoProvider methods ***/
#define IDirectManipulationFrameInfoProvider_GetNextFrameInfo(This,time,process,composition) (This)->lpVtbl->GetNextFrameInfo(This,time,process,composition)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IDirectManipulationFrameInfoProvider_QueryInterface(IDirectManipulationFrameInfoProvider* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDirectManipulationFrameInfoProvider_AddRef(IDirectManipulationFrameInfoProvider* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDirectManipulationFrameInfoProvider_Release(IDirectManipulationFrameInfoProvider* This) {
    return This->lpVtbl->Release(This);
}
/*** IDirectManipulationFrameInfoProvider methods ***/
static __WIDL_INLINE HRESULT IDirectManipulationFrameInfoProvider_GetNextFrameInfo(IDirectManipulationFrameInfoProvider* This,ULONGLONG *time,ULONGLONG *process,ULONGLONG *composition) {
    return This->lpVtbl->GetNextFrameInfo(This,time,process,composition);
}
#endif
#endif

#endif


#endif  /* __IDirectManipulationFrameInfoProvider_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDirectManipulationManager interface
 */
#ifndef __IDirectManipulationManager_INTERFACE_DEFINED__
#define __IDirectManipulationManager_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDirectManipulationManager, 0xfbf5d3b4, 0x70c7, 0x4163, 0x93,0x22, 0x5a,0x6f,0x66,0x0d,0x6f,0xbc);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("fbf5d3b4-70c7-4163-9322-5a6f660d6fbc")
IDirectManipulationManager : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Activate(
        HWND window) = 0;

    virtual HRESULT STDMETHODCALLTYPE Deactivate(
        HWND window) = 0;

    virtual HRESULT STDMETHODCALLTYPE RegisterHitTestTarget(
        HWND window,
        HWND hittest,
        DIRECTMANIPULATION_HITTEST_TYPE type) = 0;

    virtual HRESULT STDMETHODCALLTYPE ProcessInput(
        const MSG *msg,
        WINBOOL *handled) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetUpdateManager(
        REFIID riid,
        void **obj) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateViewport(
        IDirectManipulationFrameInfoProvider *frame,
        HWND window,
        REFIID riid,
        void **obj) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateContent(
        IDirectManipulationFrameInfoProvider *frame,
        REFCLSID clsid,
        REFIID riid,
        void **obj) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDirectManipulationManager, 0xfbf5d3b4, 0x70c7, 0x4163, 0x93,0x22, 0x5a,0x6f,0x66,0x0d,0x6f,0xbc)
#endif
#else
typedef struct IDirectManipulationManagerVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDirectManipulationManager methods ***/
    HRESULT (STDMETHODCALLTYPE *Activate)(
        IDirectManipulationManager *This,
        HWND window);

    HRESULT (STDMETHODCALLTYPE *Deactivate)(
        IDirectManipulationManager *This,
        HWND window);

    HRESULT (STDMETHODCALLTYPE *RegisterHitTestTarget)(
        IDirectManipulationManager *This,
        HWND window,
        HWND hittest,
        DIRECTMANIPULATION_HITTEST_TYPE type);

    HRESULT (STDMETHODCALLTYPE *ProcessInput)(
        IDirectManipulationManager *This,
        const MSG *msg,
        WINBOOL *handled);

    HRESULT (STDMETHODCALLTYPE *GetUpdateManager)(
        IDirectManipulationManager *This,
        REFIID riid,
        void **obj);

    HRESULT (STDMETHODCALLTYPE *CreateViewport)(
        IDirectManipulationManager *This,
        IDirectManipulationFrameInfoProvider *frame,
        HWND window,
        REFIID riid,
        void **obj);

    HRESULT (STDMETHODCALLTYPE *CreateContent)(
        IDirectManipulationManager *This,
        IDirectManipulationFrameInfoProvider *frame,
        REFCLSID clsid,
        REFIID riid,
        void **obj);

    END_INTERFACE
} IDirectManipulationManagerVtbl;

interface IDirectManipulationManager {
    CONST_VTBL IDirectManipulationManagerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDirectManipulationManager_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDirectManipulationManager_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDirectManipulationManager_Release(This) (This)->lpVtbl->Release(This)
/*** IDirectManipulationManager methods ***/
#define IDirectManipulationManager_Activate(This,window) (This)->lpVtbl->Activate(This,window)
#define IDirectManipulationManager_Deactivate(This,window) (This)->lpVtbl->Deactivate(This,window)
#define IDirectManipulationManager_RegisterHitTestTarget(This,window,hittest,type) (This)->lpVtbl->RegisterHitTestTarget(This,window,hittest,type)
#define IDirectManipulationManager_ProcessInput(This,msg,handled) (This)->lpVtbl->ProcessInput(This,msg,handled)
#define IDirectManipulationManager_GetUpdateManager(This,riid,obj) (This)->lpVtbl->GetUpdateManager(This,riid,obj)
#define IDirectManipulationManager_CreateViewport(This,frame,window,riid,obj) (This)->lpVtbl->CreateViewport(This,frame,window,riid,obj)
#define IDirectManipulationManager_CreateContent(This,frame,clsid,riid,obj) (This)->lpVtbl->CreateContent(This,frame,clsid,riid,obj)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IDirectManipulationManager_QueryInterface(IDirectManipulationManager* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDirectManipulationManager_AddRef(IDirectManipulationManager* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDirectManipulationManager_Release(IDirectManipulationManager* This) {
    return This->lpVtbl->Release(This);
}
/*** IDirectManipulationManager methods ***/
static __WIDL_INLINE HRESULT IDirectManipulationManager_Activate(IDirectManipulationManager* This,HWND window) {
    return This->lpVtbl->Activate(This,window);
}
static __WIDL_INLINE HRESULT IDirectManipulationManager_Deactivate(IDirectManipulationManager* This,HWND window) {
    return This->lpVtbl->Deactivate(This,window);
}
static __WIDL_INLINE HRESULT IDirectManipulationManager_RegisterHitTestTarget(IDirectManipulationManager* This,HWND window,HWND hittest,DIRECTMANIPULATION_HITTEST_TYPE type) {
    return This->lpVtbl->RegisterHitTestTarget(This,window,hittest,type);
}
static __WIDL_INLINE HRESULT IDirectManipulationManager_ProcessInput(IDirectManipulationManager* This,const MSG *msg,WINBOOL *handled) {
    return This->lpVtbl->ProcessInput(This,msg,handled);
}
static __WIDL_INLINE HRESULT IDirectManipulationManager_GetUpdateManager(IDirectManipulationManager* This,REFIID riid,void **obj) {
    return This->lpVtbl->GetUpdateManager(This,riid,obj);
}
static __WIDL_INLINE HRESULT IDirectManipulationManager_CreateViewport(IDirectManipulationManager* This,IDirectManipulationFrameInfoProvider *frame,HWND window,REFIID riid,void **obj) {
    return This->lpVtbl->CreateViewport(This,frame,window,riid,obj);
}
static __WIDL_INLINE HRESULT IDirectManipulationManager_CreateContent(IDirectManipulationManager* This,IDirectManipulationFrameInfoProvider *frame,REFCLSID clsid,REFIID riid,void **obj) {
    return This->lpVtbl->CreateContent(This,frame,clsid,riid,obj);
}
#endif
#endif

#endif


#endif  /* __IDirectManipulationManager_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDirectManipulationContent interface
 */
#ifndef __IDirectManipulationContent_INTERFACE_DEFINED__
#define __IDirectManipulationContent_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDirectManipulationContent, 0xb89962cb, 0x3d89, 0x442b, 0xbb,0x58, 0x50,0x98,0xfa,0x0f,0x9f,0x16);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("b89962cb-3d89-442b-bb58-5098fa0f9f16")
IDirectManipulationContent : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetContentRect(
        RECT *size) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetContentRect(
        const RECT *size) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetViewport(
        REFIID riid,
        void **object) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetTag(
        REFIID riid,
        void **object,
        UINT32 *id) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetTag(
        IUnknown *object,
        UINT32 id) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetOutputTransform(
        float *matrix,
        DWORD count) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetContentTransform(
        float *matrix,
        DWORD count) = 0;

    virtual HRESULT STDMETHODCALLTYPE SyncContentTransform(
        const float *matrix,
        DWORD count) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDirectManipulationContent, 0xb89962cb, 0x3d89, 0x442b, 0xbb,0x58, 0x50,0x98,0xfa,0x0f,0x9f,0x16)
#endif
#else
typedef struct IDirectManipulationContentVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDirectManipulationContent methods ***/
    HRESULT (STDMETHODCALLTYPE *GetContentRect)(
        IDirectManipulationContent *This,
        RECT *size);

    HRESULT (STDMETHODCALLTYPE *SetContentRect)(
        IDirectManipulationContent *This,
        const RECT *size);

    HRESULT (STDMETHODCALLTYPE *GetViewport)(
        IDirectManipulationContent *This,
        REFIID riid,
        void **object);

    HRESULT (STDMETHODCALLTYPE *GetTag)(
        IDirectManipulationContent *This,
        REFIID riid,
        void **object,
        UINT32 *id);

    HRESULT (STDMETHODCALLTYPE *SetTag)(
        IDirectManipulationContent *This,
        IUnknown *object,
        UINT32 id);

    HRESULT (STDMETHODCALLTYPE *GetOutputTransform)(
        IDirectManipulationContent *This,
        float *matrix,
        DWORD count);

    HRESULT (STDMETHODCALLTYPE *GetContentTransform)(
        IDirectManipulationContent *This,
        float *matrix,
        DWORD count);

    HRESULT (STDMETHODCALLTYPE *SyncContentTransform)(
        IDirectManipulationContent *This,
        const float *matrix,
        DWORD count);

    END_INTERFACE
} IDirectManipulationContentVtbl;

interface IDirectManipulationContent {
    CONST_VTBL IDirectManipulationContentVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDirectManipulationContent_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDirectManipulationContent_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDirectManipulationContent_Release(This) (This)->lpVtbl->Release(This)
/*** IDirectManipulationContent methods ***/
#define IDirectManipulationContent_GetContentRect(This,size) (This)->lpVtbl->GetContentRect(This,size)
#define IDirectManipulationContent_SetContentRect(This,size) (This)->lpVtbl->SetContentRect(This,size)
#define IDirectManipulationContent_GetViewport(This,riid,object) (This)->lpVtbl->GetViewport(This,riid,object)
#define IDirectManipulationContent_GetTag(This,riid,object,id) (This)->lpVtbl->GetTag(This,riid,object,id)
#define IDirectManipulationContent_SetTag(This,object,id) (This)->lpVtbl->SetTag(This,object,id)
#define IDirectManipulationContent_GetOutputTransform(This,matrix,count) (This)->lpVtbl->GetOutputTransform(This,matrix,count)
#define IDirectManipulationContent_GetContentTransform(This,matrix,count) (This)->lpVtbl->GetContentTransform(This,matrix,count)
#define IDirectManipulationContent_SyncContentTransform(This,matrix,count) (This)->lpVtbl->SyncContentTransform(This,matrix,count)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IDirectManipulationContent_QueryInterface(IDirectManipulationContent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDirectManipulationContent_AddRef(IDirectManipulationContent* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDirectManipulationContent_Release(IDirectManipulationContent* This) {
    return This->lpVtbl->Release(This);
}
/*** IDirectManipulationContent methods ***/
static __WIDL_INLINE HRESULT IDirectManipulationContent_GetContentRect(IDirectManipulationContent* This,RECT *size) {
    return This->lpVtbl->GetContentRect(This,size);
}
static __WIDL_INLINE HRESULT IDirectManipulationContent_SetContentRect(IDirectManipulationContent* This,const RECT *size) {
    return This->lpVtbl->SetContentRect(This,size);
}
static __WIDL_INLINE HRESULT IDirectManipulationContent_GetViewport(IDirectManipulationContent* This,REFIID riid,void **object) {
    return This->lpVtbl->GetViewport(This,riid,object);
}
static __WIDL_INLINE HRESULT IDirectManipulationContent_GetTag(IDirectManipulationContent* This,REFIID riid,void **object,UINT32 *id) {
    return This->lpVtbl->GetTag(This,riid,object,id);
}
static __WIDL_INLINE HRESULT IDirectManipulationContent_SetTag(IDirectManipulationContent* This,IUnknown *object,UINT32 id) {
    return This->lpVtbl->SetTag(This,object,id);
}
static __WIDL_INLINE HRESULT IDirectManipulationContent_GetOutputTransform(IDirectManipulationContent* This,float *matrix,DWORD count) {
    return This->lpVtbl->GetOutputTransform(This,matrix,count);
}
static __WIDL_INLINE HRESULT IDirectManipulationContent_GetContentTransform(IDirectManipulationContent* This,float *matrix,DWORD count) {
    return This->lpVtbl->GetContentTransform(This,matrix,count);
}
static __WIDL_INLINE HRESULT IDirectManipulationContent_SyncContentTransform(IDirectManipulationContent* This,const float *matrix,DWORD count) {
    return This->lpVtbl->SyncContentTransform(This,matrix,count);
}
#endif
#endif

#endif


#endif  /* __IDirectManipulationContent_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDirectManipulationUpdateHandler interface
 */
#ifndef __IDirectManipulationUpdateHandler_INTERFACE_DEFINED__
#define __IDirectManipulationUpdateHandler_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDirectManipulationUpdateHandler, 0x790b6337, 0x64f8, 0x4ff5, 0xa2,0x69, 0xb3,0x2b,0xc2,0xaf,0x27,0xa7);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("790b6337-64f8-4ff5-a269-b32bc2af27a7")
IDirectManipulationUpdateHandler : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Update(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDirectManipulationUpdateHandler, 0x790b6337, 0x64f8, 0x4ff5, 0xa2,0x69, 0xb3,0x2b,0xc2,0xaf,0x27,0xa7)
#endif
#else
typedef struct IDirectManipulationUpdateHandlerVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDirectManipulationUpdateHandler methods ***/
    HRESULT (STDMETHODCALLTYPE *Update)(
        IDirectManipulationUpdateHandler *This);

    END_INTERFACE
} IDirectManipulationUpdateHandlerVtbl;

interface IDirectManipulationUpdateHandler {
    CONST_VTBL IDirectManipulationUpdateHandlerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDirectManipulationUpdateHandler_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDirectManipulationUpdateHandler_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDirectManipulationUpdateHandler_Release(This) (This)->lpVtbl->Release(This)
/*** IDirectManipulationUpdateHandler methods ***/
#define IDirectManipulationUpdateHandler_Update(This) (This)->lpVtbl->Update(This)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IDirectManipulationUpdateHandler_QueryInterface(IDirectManipulationUpdateHandler* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDirectManipulationUpdateHandler_AddRef(IDirectManipulationUpdateHandler* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDirectManipulationUpdateHandler_Release(IDirectManipulationUpdateHandler* This) {
    return This->lpVtbl->Release(This);
}
/*** IDirectManipulationUpdateHandler methods ***/
static __WIDL_INLINE HRESULT IDirectManipulationUpdateHandler_Update(IDirectManipulationUpdateHandler* This) {
    return This->lpVtbl->Update(This);
}
#endif
#endif

#endif


#endif  /* __IDirectManipulationUpdateHandler_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDirectManipulationUpdateManager interface
 */
#ifndef __IDirectManipulationUpdateManager_INTERFACE_DEFINED__
#define __IDirectManipulationUpdateManager_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDirectManipulationUpdateManager, 0xb0ae62fd, 0xbe34, 0x46e7, 0x9c,0xaa, 0xd3,0x61,0xfa,0xcb,0xb9,0xcc);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("b0ae62fd-be34-46e7-9caa-d361facbb9cc")
IDirectManipulationUpdateManager : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE RegisterWaitHandleCallback(
        HANDLE handle,
        IDirectManipulationUpdateHandler *handler,
        DWORD *cookie) = 0;

    virtual HRESULT STDMETHODCALLTYPE UnregisterWaitHandleCallback(
        DWORD cookie) = 0;

    virtual HRESULT STDMETHODCALLTYPE Update(
        IDirectManipulationFrameInfoProvider *provider) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDirectManipulationUpdateManager, 0xb0ae62fd, 0xbe34, 0x46e7, 0x9c,0xaa, 0xd3,0x61,0xfa,0xcb,0xb9,0xcc)
#endif
#else
typedef struct IDirectManipulationUpdateManagerVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDirectManipulationUpdateManager methods ***/
    HRESULT (STDMETHODCALLTYPE *RegisterWaitHandleCallback)(
        IDirectManipulationUpdateManager *This,
        HANDLE handle,
        IDirectManipulationUpdateHandler *handler,
        DWORD *cookie);

    HRESULT (STDMETHODCALLTYPE *UnregisterWaitHandleCallback)(
        IDirectManipulationUpdateManager *This,
        DWORD cookie);

    HRESULT (STDMETHODCALLTYPE *Update)(
        IDirectManipulationUpdateManager *This,
        IDirectManipulationFrameInfoProvider *provider);

    END_INTERFACE
} IDirectManipulationUpdateManagerVtbl;

interface IDirectManipulationUpdateManager {
    CONST_VTBL IDirectManipulationUpdateManagerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDirectManipulationUpdateManager_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDirectManipulationUpdateManager_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDirectManipulationUpdateManager_Release(This) (This)->lpVtbl->Release(This)
/*** IDirectManipulationUpdateManager methods ***/
#define IDirectManipulationUpdateManager_RegisterWaitHandleCallback(This,handle,handler,cookie) (This)->lpVtbl->RegisterWaitHandleCallback(This,handle,handler,cookie)
#define IDirectManipulationUpdateManager_UnregisterWaitHandleCallback(This,cookie) (This)->lpVtbl->UnregisterWaitHandleCallback(This,cookie)
#define IDirectManipulationUpdateManager_Update(This,provider) (This)->lpVtbl->Update(This,provider)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IDirectManipulationUpdateManager_QueryInterface(IDirectManipulationUpdateManager* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDirectManipulationUpdateManager_AddRef(IDirectManipulationUpdateManager* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDirectManipulationUpdateManager_Release(IDirectManipulationUpdateManager* This) {
    return This->lpVtbl->Release(This);
}
/*** IDirectManipulationUpdateManager methods ***/
static __WIDL_INLINE HRESULT IDirectManipulationUpdateManager_RegisterWaitHandleCallback(IDirectManipulationUpdateManager* This,HANDLE handle,IDirectManipulationUpdateHandler *handler,DWORD *cookie) {
    return This->lpVtbl->RegisterWaitHandleCallback(This,handle,handler,cookie);
}
static __WIDL_INLINE HRESULT IDirectManipulationUpdateManager_UnregisterWaitHandleCallback(IDirectManipulationUpdateManager* This,DWORD cookie) {
    return This->lpVtbl->UnregisterWaitHandleCallback(This,cookie);
}
static __WIDL_INLINE HRESULT IDirectManipulationUpdateManager_Update(IDirectManipulationUpdateManager* This,IDirectManipulationFrameInfoProvider *provider) {
    return This->lpVtbl->Update(This,provider);
}
#endif
#endif

#endif


#endif  /* __IDirectManipulationUpdateManager_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDirectManipulationCompositor interface
 */
#ifndef __IDirectManipulationCompositor_INTERFACE_DEFINED__
#define __IDirectManipulationCompositor_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDirectManipulationCompositor, 0x537a0825, 0x0387, 0x4efa, 0xb6,0x2f, 0x71,0xeb,0x1f,0x08,0x5a,0x7e);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("537a0825-0387-4efa-b62f-71eb1f085a7e")
IDirectManipulationCompositor : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE AddContent(
        IDirectManipulationContent *content,
        IUnknown *device,
        IUnknown *parent,
        IUnknown *child) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveContent(
        IDirectManipulationContent *content) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetUpdateManager(
        IDirectManipulationUpdateManager *manager) = 0;

    virtual HRESULT STDMETHODCALLTYPE Flush(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDirectManipulationCompositor, 0x537a0825, 0x0387, 0x4efa, 0xb6,0x2f, 0x71,0xeb,0x1f,0x08,0x5a,0x7e)
#endif
#else
typedef struct IDirectManipulationCompositorVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDirectManipulationCompositor methods ***/
    HRESULT (STDMETHODCALLTYPE *AddContent)(
        IDirectManipulationCompositor *This,
        IDirectManipulationContent *content,
        IUnknown *device,
        IUnknown *parent,
        IUnknown *child);

    HRESULT (STDMETHODCALLTYPE *RemoveContent)(
        IDirectManipulationCompositor *This,
        IDirectManipulationContent *content);

    HRESULT (STDMETHODCALLTYPE *SetUpdateManager)(
        IDirectManipulationCompositor *This,
        IDirectManipulationUpdateManager *manager);

    HRESULT (STDMETHODCALLTYPE *Flush)(
        IDirectManipulationCompositor *This);

    END_INTERFACE
} IDirectManipulationCompositorVtbl;

interface IDirectManipulationCompositor {
    CONST_VTBL IDirectManipulationCompositorVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDirectManipulationCompositor_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDirectManipulationCompositor_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDirectManipulationCompositor_Release(This) (This)->lpVtbl->Release(This)
/*** IDirectManipulationCompositor methods ***/
#define IDirectManipulationCompositor_AddContent(This,content,device,parent,child) (This)->lpVtbl->AddContent(This,content,device,parent,child)
#define IDirectManipulationCompositor_RemoveContent(This,content) (This)->lpVtbl->RemoveContent(This,content)
#define IDirectManipulationCompositor_SetUpdateManager(This,manager) (This)->lpVtbl->SetUpdateManager(This,manager)
#define IDirectManipulationCompositor_Flush(This) (This)->lpVtbl->Flush(This)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IDirectManipulationCompositor_QueryInterface(IDirectManipulationCompositor* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDirectManipulationCompositor_AddRef(IDirectManipulationCompositor* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDirectManipulationCompositor_Release(IDirectManipulationCompositor* This) {
    return This->lpVtbl->Release(This);
}
/*** IDirectManipulationCompositor methods ***/
static __WIDL_INLINE HRESULT IDirectManipulationCompositor_AddContent(IDirectManipulationCompositor* This,IDirectManipulationContent *content,IUnknown *device,IUnknown *parent,IUnknown *child) {
    return This->lpVtbl->AddContent(This,content,device,parent,child);
}
static __WIDL_INLINE HRESULT IDirectManipulationCompositor_RemoveContent(IDirectManipulationCompositor* This,IDirectManipulationContent *content) {
    return This->lpVtbl->RemoveContent(This,content);
}
static __WIDL_INLINE HRESULT IDirectManipulationCompositor_SetUpdateManager(IDirectManipulationCompositor* This,IDirectManipulationUpdateManager *manager) {
    return This->lpVtbl->SetUpdateManager(This,manager);
}
static __WIDL_INLINE HRESULT IDirectManipulationCompositor_Flush(IDirectManipulationCompositor* This) {
    return This->lpVtbl->Flush(This);
}
#endif
#endif

#endif


#endif  /* __IDirectManipulationCompositor_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDirectManipulationViewport interface
 */
#ifndef __IDirectManipulationViewport_INTERFACE_DEFINED__
#define __IDirectManipulationViewport_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDirectManipulationViewport, 0x28b85a3d, 0x60a0, 0x48bd, 0x9b,0xa1, 0x5c,0xe8,0xd9,0xea,0x3a,0x6d);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("28b85a3d-60a0-48bd-9ba1-5ce8d9ea3a6d")
IDirectManipulationViewport : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Enable(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Disable(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetContact(
        UINT32 id) = 0;

    virtual HRESULT STDMETHODCALLTYPE ReleaseContact(
        UINT32 id) = 0;

    virtual HRESULT STDMETHODCALLTYPE ReleaseAllContacts(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetStatus(
        DIRECTMANIPULATION_STATUS *status) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetTag(
        REFIID riid,
        void **object,
        UINT32 *id) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetTag(
        IUnknown *object,
        UINT32 id) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetViewportRect(
        RECT *viewport) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetViewportRect(
        const RECT *viewport) = 0;

    virtual HRESULT STDMETHODCALLTYPE ZoomToRect(
        const float left,
        const float top,
        const float right,
        const float bottom,
        WINBOOL animate) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetViewportTransform(
        const float *matrix,
        DWORD count) = 0;

    virtual HRESULT STDMETHODCALLTYPE SyncDisplayTransform(
        const float *matrix,
        DWORD count) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPrimaryContent(
        REFIID riid,
        void **object) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddContent(
        IDirectManipulationContent *content) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveContent(
        IDirectManipulationContent *content) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetViewportOptions(
        DIRECTMANIPULATION_VIEWPORT_OPTIONS options) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddConfiguration(
        DIRECTMANIPULATION_CONFIGURATION configuration) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveConfiguration(
        DIRECTMANIPULATION_CONFIGURATION configuration) = 0;

    virtual HRESULT STDMETHODCALLTYPE ActivateConfiguration(
        DIRECTMANIPULATION_CONFIGURATION configuration) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetManualGesture(
        DIRECTMANIPULATION_GESTURE_CONFIGURATION configuration) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetChaining(
        DIRECTMANIPULATION_MOTION_TYPES enabledTypes) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddEventHandler(
        HWND window,
        IDirectManipulationViewportEventHandler *eventHandler,
        DWORD *cookie) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveEventHandler(
        DWORD cookie) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetInputMode(
        DIRECTMANIPULATION_INPUT_MODE mode) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetUpdateMode(
        DIRECTMANIPULATION_INPUT_MODE mode) = 0;

    virtual HRESULT STDMETHODCALLTYPE Stop(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Abandon(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDirectManipulationViewport, 0x28b85a3d, 0x60a0, 0x48bd, 0x9b,0xa1, 0x5c,0xe8,0xd9,0xea,0x3a,0x6d)
#endif
#else
typedef struct IDirectManipulationViewportVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDirectManipulationViewport methods ***/
    HRESULT (STDMETHODCALLTYPE *Enable)(
        IDirectManipulationViewport *This);

    HRESULT (STDMETHODCALLTYPE *Disable)(
        IDirectManipulationViewport *This);

    HRESULT (STDMETHODCALLTYPE *SetContact)(
        IDirectManipulationViewport *This,
        UINT32 id);

    HRESULT (STDMETHODCALLTYPE *ReleaseContact)(
        IDirectManipulationViewport *This,
        UINT32 id);

    HRESULT (STDMETHODCALLTYPE *ReleaseAllContacts)(
        IDirectManipulationViewport *This);

    HRESULT (STDMETHODCALLTYPE *GetStatus)(
        IDirectManipulationViewport *This,
        DIRECTMANIPULATION_STATUS *status);

    HRESULT (STDMETHODCALLTYPE *GetTag)(
        IDirectManipulationViewport *This,
        REFIID riid,
        void **object,
        UINT32 *id);

    HRESULT (STDMETHODCALLTYPE *SetTag)(
        IDirectManipulationViewport *This,
        IUnknown *object,
        UINT32 id);

    HRESULT (STDMETHODCALLTYPE *GetViewportRect)(
        IDirectManipulationViewport *This,
        RECT *viewport);

    HRESULT (STDMETHODCALLTYPE *SetViewportRect)(
        IDirectManipulationViewport *This,
        const RECT *viewport);

    HRESULT (STDMETHODCALLTYPE *ZoomToRect)(
        IDirectManipulationViewport *This,
        const float left,
        const float top,
        const float right,
        const float bottom,
        WINBOOL animate);

    HRESULT (STDMETHODCALLTYPE *SetViewportTransform)(
        IDirectManipulationViewport *This,
        const float *matrix,
        DWORD count);

    HRESULT (STDMETHODCALLTYPE *SyncDisplayTransform)(
        IDirectManipulationViewport *This,
        const float *matrix,
        DWORD count);

    HRESULT (STDMETHODCALLTYPE *GetPrimaryContent)(
        IDirectManipulationViewport *This,
        REFIID riid,
        void **object);

    HRESULT (STDMETHODCALLTYPE *AddContent)(
        IDirectManipulationViewport *This,
        IDirectManipulationContent *content);

    HRESULT (STDMETHODCALLTYPE *RemoveContent)(
        IDirectManipulationViewport *This,
        IDirectManipulationContent *content);

    HRESULT (STDMETHODCALLTYPE *SetViewportOptions)(
        IDirectManipulationViewport *This,
        DIRECTMANIPULATION_VIEWPORT_OPTIONS options);

    HRESULT (STDMETHODCALLTYPE *AddConfiguration)(
        IDirectManipulationViewport *This,
        DIRECTMANIPULATION_CONFIGURATION configuration);

    HRESULT (STDMETHODCALLTYPE *RemoveConfiguration)(
        IDirectManipulationViewport *This,
        DIRECTMANIPULATION_CONFIGURATION configuration);

    HRESULT (STDMETHODCALLTYPE *ActivateConfiguration)(
        IDirectManipulationViewport *This,
        DIRECTMANIPULATION_CONFIGURATION configuration);

    HRESULT (STDMETHODCALLTYPE *SetManualGesture)(
        IDirectManipulationViewport *This,
        DIRECTMANIPULATION_GESTURE_CONFIGURATION configuration);

    HRESULT (STDMETHODCALLTYPE *SetChaining)(
        IDirectManipulationViewport *This,
        DIRECTMANIPULATION_MOTION_TYPES enabledTypes);

    HRESULT (STDMETHODCALLTYPE *AddEventHandler)(
        IDirectManipulationViewport *This,
        HWND window,
        IDirectManipulationViewportEventHandler *eventHandler,
        DWORD *cookie);

    HRESULT (STDMETHODCALLTYPE *RemoveEventHandler)(
        IDirectManipulationViewport *This,
        DWORD cookie);

    HRESULT (STDMETHODCALLTYPE *SetInputMode)(
        IDirectManipulationViewport *This,
        DIRECTMANIPULATION_INPUT_MODE mode);

    HRESULT (STDMETHODCALLTYPE *SetUpdateMode)(
        IDirectManipulationViewport *This,
        DIRECTMANIPULATION_INPUT_MODE mode);

    HRESULT (STDMETHODCALLTYPE *Stop)(
        IDirectManipulationViewport *This);

    HRESULT (STDMETHODCALLTYPE *Abandon)(
        IDirectManipulationViewport *This);

    END_INTERFACE
} IDirectManipulationViewportVtbl;

interface IDirectManipulationViewport {
    CONST_VTBL IDirectManipulationViewportVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDirectManipulationViewport_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDirectManipulationViewport_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDirectManipulationViewport_Release(This) (This)->lpVtbl->Release(This)
/*** IDirectManipulationViewport methods ***/
#define IDirectManipulationViewport_Enable(This) (This)->lpVtbl->Enable(This)
#define IDirectManipulationViewport_Disable(This) (This)->lpVtbl->Disable(This)
#define IDirectManipulationViewport_SetContact(This,id) (This)->lpVtbl->SetContact(This,id)
#define IDirectManipulationViewport_ReleaseContact(This,id) (This)->lpVtbl->ReleaseContact(This,id)
#define IDirectManipulationViewport_ReleaseAllContacts(This) (This)->lpVtbl->ReleaseAllContacts(This)
#define IDirectManipulationViewport_GetStatus(This,status) (This)->lpVtbl->GetStatus(This,status)
#define IDirectManipulationViewport_GetTag(This,riid,object,id) (This)->lpVtbl->GetTag(This,riid,object,id)
#define IDirectManipulationViewport_SetTag(This,object,id) (This)->lpVtbl->SetTag(This,object,id)
#define IDirectManipulationViewport_GetViewportRect(This,viewport) (This)->lpVtbl->GetViewportRect(This,viewport)
#define IDirectManipulationViewport_SetViewportRect(This,viewport) (This)->lpVtbl->SetViewportRect(This,viewport)
#define IDirectManipulationViewport_ZoomToRect(This,left,top,right,bottom,animate) (This)->lpVtbl->ZoomToRect(This,left,top,right,bottom,animate)
#define IDirectManipulationViewport_SetViewportTransform(This,matrix,count) (This)->lpVtbl->SetViewportTransform(This,matrix,count)
#define IDirectManipulationViewport_SyncDisplayTransform(This,matrix,count) (This)->lpVtbl->SyncDisplayTransform(This,matrix,count)
#define IDirectManipulationViewport_GetPrimaryContent(This,riid,object) (This)->lpVtbl->GetPrimaryContent(This,riid,object)
#define IDirectManipulationViewport_AddContent(This,content) (This)->lpVtbl->AddContent(This,content)
#define IDirectManipulationViewport_RemoveContent(This,content) (This)->lpVtbl->RemoveContent(This,content)
#define IDirectManipulationViewport_SetViewportOptions(This,options) (This)->lpVtbl->SetViewportOptions(This,options)
#define IDirectManipulationViewport_AddConfiguration(This,configuration) (This)->lpVtbl->AddConfiguration(This,configuration)
#define IDirectManipulationViewport_RemoveConfiguration(This,configuration) (This)->lpVtbl->RemoveConfiguration(This,configuration)
#define IDirectManipulationViewport_ActivateConfiguration(This,configuration) (This)->lpVtbl->ActivateConfiguration(This,configuration)
#define IDirectManipulationViewport_SetManualGesture(This,configuration) (This)->lpVtbl->SetManualGesture(This,configuration)
#define IDirectManipulationViewport_SetChaining(This,enabledTypes) (This)->lpVtbl->SetChaining(This,enabledTypes)
#define IDirectManipulationViewport_AddEventHandler(This,window,eventHandler,cookie) (This)->lpVtbl->AddEventHandler(This,window,eventHandler,cookie)
#define IDirectManipulationViewport_RemoveEventHandler(This,cookie) (This)->lpVtbl->RemoveEventHandler(This,cookie)
#define IDirectManipulationViewport_SetInputMode(This,mode) (This)->lpVtbl->SetInputMode(This,mode)
#define IDirectManipulationViewport_SetUpdateMode(This,mode) (This)->lpVtbl->SetUpdateMode(This,mode)
#define IDirectManipulationViewport_Stop(This) (This)->lpVtbl->Stop(This)
#define IDirectManipulationViewport_Abandon(This) (This)->lpVtbl->Abandon(This)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IDirectManipulationViewport_QueryInterface(IDirectManipulationViewport* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDirectManipulationViewport_AddRef(IDirectManipulationViewport* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDirectManipulationViewport_Release(IDirectManipulationViewport* This) {
    return This->lpVtbl->Release(This);
}
/*** IDirectManipulationViewport methods ***/
static __WIDL_INLINE HRESULT IDirectManipulationViewport_Enable(IDirectManipulationViewport* This) {
    return This->lpVtbl->Enable(This);
}
static __WIDL_INLINE HRESULT IDirectManipulationViewport_Disable(IDirectManipulationViewport* This) {
    return This->lpVtbl->Disable(This);
}
static __WIDL_INLINE HRESULT IDirectManipulationViewport_SetContact(IDirectManipulationViewport* This,UINT32 id) {
    return This->lpVtbl->SetContact(This,id);
}
static __WIDL_INLINE HRESULT IDirectManipulationViewport_ReleaseContact(IDirectManipulationViewport* This,UINT32 id) {
    return This->lpVtbl->ReleaseContact(This,id);
}
static __WIDL_INLINE HRESULT IDirectManipulationViewport_ReleaseAllContacts(IDirectManipulationViewport* This) {
    return This->lpVtbl->ReleaseAllContacts(This);
}
static __WIDL_INLINE HRESULT IDirectManipulationViewport_GetStatus(IDirectManipulationViewport* This,DIRECTMANIPULATION_STATUS *status) {
    return This->lpVtbl->GetStatus(This,status);
}
static __WIDL_INLINE HRESULT IDirectManipulationViewport_GetTag(IDirectManipulationViewport* This,REFIID riid,void **object,UINT32 *id) {
    return This->lpVtbl->GetTag(This,riid,object,id);
}
static __WIDL_INLINE HRESULT IDirectManipulationViewport_SetTag(IDirectManipulationViewport* This,IUnknown *object,UINT32 id) {
    return This->lpVtbl->SetTag(This,object,id);
}
static __WIDL_INLINE HRESULT IDirectManipulationViewport_GetViewportRect(IDirectManipulationViewport* This,RECT *viewport) {
    return This->lpVtbl->GetViewportRect(This,viewport);
}
static __WIDL_INLINE HRESULT IDirectManipulationViewport_SetViewportRect(IDirectManipulationViewport* This,const RECT *viewport) {
    return This->lpVtbl->SetViewportRect(This,viewport);
}
static __WIDL_INLINE HRESULT IDirectManipulationViewport_ZoomToRect(IDirectManipulationViewport* This,const float left,const float top,const float right,const float bottom,WINBOOL animate) {
    return This->lpVtbl->ZoomToRect(This,left,top,right,bottom,animate);
}
static __WIDL_INLINE HRESULT IDirectManipulationViewport_SetViewportTransform(IDirectManipulationViewport* This,const float *matrix,DWORD count) {
    return This->lpVtbl->SetViewportTransform(This,matrix,count);
}
static __WIDL_INLINE HRESULT IDirectManipulationViewport_SyncDisplayTransform(IDirectManipulationViewport* This,const float *matrix,DWORD count) {
    return This->lpVtbl->SyncDisplayTransform(This,matrix,count);
}
static __WIDL_INLINE HRESULT IDirectManipulationViewport_GetPrimaryContent(IDirectManipulationViewport* This,REFIID riid,void **object) {
    return This->lpVtbl->GetPrimaryContent(This,riid,object);
}
static __WIDL_INLINE HRESULT IDirectManipulationViewport_AddContent(IDirectManipulationViewport* This,IDirectManipulationContent *content) {
    return This->lpVtbl->AddContent(This,content);
}
static __WIDL_INLINE HRESULT IDirectManipulationViewport_RemoveContent(IDirectManipulationViewport* This,IDirectManipulationContent *content) {
    return This->lpVtbl->RemoveContent(This,content);
}
static __WIDL_INLINE HRESULT IDirectManipulationViewport_SetViewportOptions(IDirectManipulationViewport* This,DIRECTMANIPULATION_VIEWPORT_OPTIONS options) {
    return This->lpVtbl->SetViewportOptions(This,options);
}
static __WIDL_INLINE HRESULT IDirectManipulationViewport_AddConfiguration(IDirectManipulationViewport* This,DIRECTMANIPULATION_CONFIGURATION configuration) {
    return This->lpVtbl->AddConfiguration(This,configuration);
}
static __WIDL_INLINE HRESULT IDirectManipulationViewport_RemoveConfiguration(IDirectManipulationViewport* This,DIRECTMANIPULATION_CONFIGURATION configuration) {
    return This->lpVtbl->RemoveConfiguration(This,configuration);
}
static __WIDL_INLINE HRESULT IDirectManipulationViewport_ActivateConfiguration(IDirectManipulationViewport* This,DIRECTMANIPULATION_CONFIGURATION configuration) {
    return This->lpVtbl->ActivateConfiguration(This,configuration);
}
static __WIDL_INLINE HRESULT IDirectManipulationViewport_SetManualGesture(IDirectManipulationViewport* This,DIRECTMANIPULATION_GESTURE_CONFIGURATION configuration) {
    return This->lpVtbl->SetManualGesture(This,configuration);
}
static __WIDL_INLINE HRESULT IDirectManipulationViewport_SetChaining(IDirectManipulationViewport* This,DIRECTMANIPULATION_MOTION_TYPES enabledTypes) {
    return This->lpVtbl->SetChaining(This,enabledTypes);
}
static __WIDL_INLINE HRESULT IDirectManipulationViewport_AddEventHandler(IDirectManipulationViewport* This,HWND window,IDirectManipulationViewportEventHandler *eventHandler,DWORD *cookie) {
    return This->lpVtbl->AddEventHandler(This,window,eventHandler,cookie);
}
static __WIDL_INLINE HRESULT IDirectManipulationViewport_RemoveEventHandler(IDirectManipulationViewport* This,DWORD cookie) {
    return This->lpVtbl->RemoveEventHandler(This,cookie);
}
static __WIDL_INLINE HRESULT IDirectManipulationViewport_SetInputMode(IDirectManipulationViewport* This,DIRECTMANIPULATION_INPUT_MODE mode) {
    return This->lpVtbl->SetInputMode(This,mode);
}
static __WIDL_INLINE HRESULT IDirectManipulationViewport_SetUpdateMode(IDirectManipulationViewport* This,DIRECTMANIPULATION_INPUT_MODE mode) {
    return This->lpVtbl->SetUpdateMode(This,mode);
}
static __WIDL_INLINE HRESULT IDirectManipulationViewport_Stop(IDirectManipulationViewport* This) {
    return This->lpVtbl->Stop(This);
}
static __WIDL_INLINE HRESULT IDirectManipulationViewport_Abandon(IDirectManipulationViewport* This) {
    return This->lpVtbl->Abandon(This);
}
#endif
#endif

#endif


#endif  /* __IDirectManipulationViewport_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDirectManipulationViewport2 interface
 */
#ifndef __IDirectManipulationViewport2_INTERFACE_DEFINED__
#define __IDirectManipulationViewport2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDirectManipulationViewport2, 0x923ccaac, 0x61e1, 0x4385, 0xb7,0x26, 0x01,0x7a,0xf1,0x89,0x88,0x2a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("923ccaac-61e1-4385-b726-017af189882a")
IDirectManipulationViewport2 : public IDirectManipulationViewport
{
    virtual HRESULT STDMETHODCALLTYPE AddBehavior(
        IUnknown *behavior,
        DWORD *cookie) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveBehavior(
        DWORD cookie) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveAllBehaviors(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDirectManipulationViewport2, 0x923ccaac, 0x61e1, 0x4385, 0xb7,0x26, 0x01,0x7a,0xf1,0x89,0x88,0x2a)
#endif
#else
typedef struct IDirectManipulationViewport2Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDirectManipulationViewport methods ***/
    HRESULT (STDMETHODCALLTYPE *Enable)(
        IDirectManipulationViewport2 *This);

    HRESULT (STDMETHODCALLTYPE *Disable)(
        IDirectManipulationViewport2 *This);

    HRESULT (STDMETHODCALLTYPE *SetContact)(
        IDirectManipulationViewport2 *This,
        UINT32 id);

    HRESULT (STDMETHODCALLTYPE *ReleaseContact)(
        IDirectManipulationViewport2 *This,
        UINT32 id);

    HRESULT (STDMETHODCALLTYPE *ReleaseAllContacts)(
        IDirectManipulationViewport2 *This);

    HRESULT (STDMETHODCALLTYPE *GetStatus)(
        IDirectManipulationViewport2 *This,
        DIRECTMANIPULATION_STATUS *status);

    HRESULT (STDMETHODCALLTYPE *GetTag)(
        IDirectManipulationViewport2 *This,
        REFIID riid,
        void **object,
        UINT32 *id);

    HRESULT (STDMETHODCALLTYPE *SetTag)(
        IDirectManipulationViewport2 *This,
        IUnknown *object,
        UINT32 id);

    HRESULT (STDMETHODCALLTYPE *GetViewportRect)(
        IDirectManipulationViewport2 *This,
        RECT *viewport);

    HRESULT (STDMETHODCALLTYPE *SetViewportRect)(
        IDirectManipulationViewport2 *This,
        const RECT *viewport);

    HRESULT (STDMETHODCALLTYPE *ZoomToRect)(
        IDirectManipulationViewport2 *This,
        const float left,
        const float top,
        const float right,
        const float bottom,
        WINBOOL animate);

    HRESULT (STDMETHODCALLTYPE *SetViewportTransform)(
        IDirectManipulationViewport2 *This,
        const float *matrix,
        DWORD count);

    HRESULT (STDMETHODCALLTYPE *SyncDisplayTransform)(
        IDirectManipulationViewport2 *This,
        const float *matrix,
        DWORD count);

    HRESULT (STDMETHODCALLTYPE *GetPrimaryContent)(
        IDirectManipulationViewport2 *This,
        REFIID riid,
        void **object);

    HRESULT (STDMETHODCALLTYPE *AddContent)(
        IDirectManipulationViewport2 *This,
        IDirectManipulationContent *content);

    HRESULT (STDMETHODCALLTYPE *RemoveContent)(
        IDirectManipulationViewport2 *This,
        IDirectManipulationContent *content);

    HRESULT (STDMETHODCALLTYPE *SetViewportOptions)(
        IDirectManipulationViewport2 *This,
        DIRECTMANIPULATION_VIEWPORT_OPTIONS options);

    HRESULT (STDMETHODCALLTYPE *AddConfiguration)(
        IDirectManipulationViewport2 *This,
        DIRECTMANIPULATION_CONFIGURATION configuration);

    HRESULT (STDMETHODCALLTYPE *RemoveConfiguration)(
        IDirectManipulationViewport2 *This,
        DIRECTMANIPULATION_CONFIGURATION configuration);

    HRESULT (STDMETHODCALLTYPE *ActivateConfiguration)(
        IDirectManipulationViewport2 *This,
        DIRECTMANIPULATION_CONFIGURATION configuration);

    HRESULT (STDMETHODCALLTYPE *SetManualGesture)(
        IDirectManipulationViewport2 *This,
        DIRECTMANIPULATION_GESTURE_CONFIGURATION configuration);

    HRESULT (STDMETHODCALLTYPE *SetChaining)(
        IDirectManipulationViewport2 *This,
        DIRECTMANIPULATION_MOTION_TYPES enabledTypes);

    HRESULT (STDMETHODCALLTYPE *AddEventHandler)(
        IDirectManipulationViewport2 *This,
        HWND window,
        IDirectManipulationViewportEventHandler *eventHandler,
        DWORD *cookie);

    HRESULT (STDMETHODCALLTYPE *RemoveEventHandler)(
        IDirectManipulationViewport2 *This,
        DWORD cookie);

    HRESULT (STDMETHODCALLTYPE *SetInputMode)(
        IDirectManipulationViewport2 *This,
        DIRECTMANIPULATION_INPUT_MODE mode);

    HRESULT (STDMETHODCALLTYPE *SetUpdateMode)(
        IDirectManipulationViewport2 *This,
        DIRECTMANIPULATION_INPUT_MODE mode);

    HRESULT (STDMETHODCALLTYPE *Stop)(
        IDirectManipulationViewport2 *This);

    HRESULT (STDMETHODCALLTYPE *Abandon)(
        IDirectManipulationViewport2 *This);

    /*** IDirectManipulationViewport2 methods ***/
    HRESULT (STDMETHODCALLTYPE *AddBehavior)(
        IDirectManipulationViewport2 *This,
        IUnknown *behavior,
        DWORD *cookie);

    HRESULT (STDMETHODCALLTYPE *RemoveBehavior)(
        IDirectManipulationViewport2 *This,
        DWORD cookie);

    HRESULT (STDMETHODCALLTYPE *RemoveAllBehaviors)(
        IDirectManipulationViewport2 *This);

    END_INTERFACE
} IDirectManipulationViewport2Vtbl;

interface IDirectManipulationViewport2 {
    CONST_VTBL IDirectManipulationViewport2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDirectManipulationViewport2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDirectManipulationViewport2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDirectManipulationViewport2_Release(This) (This)->lpVtbl->Release(This)
/*** IDirectManipulationViewport methods ***/
#define IDirectManipulationViewport2_Enable(This) (This)->lpVtbl->Enable(This)
#define IDirectManipulationViewport2_Disable(This) (This)->lpVtbl->Disable(This)
#define IDirectManipulationViewport2_SetContact(This,id) (This)->lpVtbl->SetContact(This,id)
#define IDirectManipulationViewport2_ReleaseContact(This,id) (This)->lpVtbl->ReleaseContact(This,id)
#define IDirectManipulationViewport2_ReleaseAllContacts(This) (This)->lpVtbl->ReleaseAllContacts(This)
#define IDirectManipulationViewport2_GetStatus(This,status) (This)->lpVtbl->GetStatus(This,status)
#define IDirectManipulationViewport2_GetTag(This,riid,object,id) (This)->lpVtbl->GetTag(This,riid,object,id)
#define IDirectManipulationViewport2_SetTag(This,object,id) (This)->lpVtbl->SetTag(This,object,id)
#define IDirectManipulationViewport2_GetViewportRect(This,viewport) (This)->lpVtbl->GetViewportRect(This,viewport)
#define IDirectManipulationViewport2_SetViewportRect(This,viewport) (This)->lpVtbl->SetViewportRect(This,viewport)
#define IDirectManipulationViewport2_ZoomToRect(This,left,top,right,bottom,animate) (This)->lpVtbl->ZoomToRect(This,left,top,right,bottom,animate)
#define IDirectManipulationViewport2_SetViewportTransform(This,matrix,count) (This)->lpVtbl->SetViewportTransform(This,matrix,count)
#define IDirectManipulationViewport2_SyncDisplayTransform(This,matrix,count) (This)->lpVtbl->SyncDisplayTransform(This,matrix,count)
#define IDirectManipulationViewport2_GetPrimaryContent(This,riid,object) (This)->lpVtbl->GetPrimaryContent(This,riid,object)
#define IDirectManipulationViewport2_AddContent(This,content) (This)->lpVtbl->AddContent(This,content)
#define IDirectManipulationViewport2_RemoveContent(This,content) (This)->lpVtbl->RemoveContent(This,content)
#define IDirectManipulationViewport2_SetViewportOptions(This,options) (This)->lpVtbl->SetViewportOptions(This,options)
#define IDirectManipulationViewport2_AddConfiguration(This,configuration) (This)->lpVtbl->AddConfiguration(This,configuration)
#define IDirectManipulationViewport2_RemoveConfiguration(This,configuration) (This)->lpVtbl->RemoveConfiguration(This,configuration)
#define IDirectManipulationViewport2_ActivateConfiguration(This,configuration) (This)->lpVtbl->ActivateConfiguration(This,configuration)
#define IDirectManipulationViewport2_SetManualGesture(This,configuration) (This)->lpVtbl->SetManualGesture(This,configuration)
#define IDirectManipulationViewport2_SetChaining(This,enabledTypes) (This)->lpVtbl->SetChaining(This,enabledTypes)
#define IDirectManipulationViewport2_AddEventHandler(This,window,eventHandler,cookie) (This)->lpVtbl->AddEventHandler(This,window,eventHandler,cookie)
#define IDirectManipulationViewport2_RemoveEventHandler(This,cookie) (This)->lpVtbl->RemoveEventHandler(This,cookie)
#define IDirectManipulationViewport2_SetInputMode(This,mode) (This)->lpVtbl->SetInputMode(This,mode)
#define IDirectManipulationViewport2_SetUpdateMode(This,mode) (This)->lpVtbl->SetUpdateMode(This,mode)
#define IDirectManipulationViewport2_Stop(This) (This)->lpVtbl->Stop(This)
#define IDirectManipulationViewport2_Abandon(This) (This)->lpVtbl->Abandon(This)
/*** IDirectManipulationViewport2 methods ***/
#define IDirectManipulationViewport2_AddBehavior(This,behavior,cookie) (This)->lpVtbl->AddBehavior(This,behavior,cookie)
#define IDirectManipulationViewport2_RemoveBehavior(This,cookie) (This)->lpVtbl->RemoveBehavior(This,cookie)
#define IDirectManipulationViewport2_RemoveAllBehaviors(This) (This)->lpVtbl->RemoveAllBehaviors(This)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IDirectManipulationViewport2_QueryInterface(IDirectManipulationViewport2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDirectManipulationViewport2_AddRef(IDirectManipulationViewport2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDirectManipulationViewport2_Release(IDirectManipulationViewport2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDirectManipulationViewport methods ***/
static __WIDL_INLINE HRESULT IDirectManipulationViewport2_Enable(IDirectManipulationViewport2* This) {
    return This->lpVtbl->Enable(This);
}
static __WIDL_INLINE HRESULT IDirectManipulationViewport2_Disable(IDirectManipulationViewport2* This) {
    return This->lpVtbl->Disable(This);
}
static __WIDL_INLINE HRESULT IDirectManipulationViewport2_SetContact(IDirectManipulationViewport2* This,UINT32 id) {
    return This->lpVtbl->SetContact(This,id);
}
static __WIDL_INLINE HRESULT IDirectManipulationViewport2_ReleaseContact(IDirectManipulationViewport2* This,UINT32 id) {
    return This->lpVtbl->ReleaseContact(This,id);
}
static __WIDL_INLINE HRESULT IDirectManipulationViewport2_ReleaseAllContacts(IDirectManipulationViewport2* This) {
    return This->lpVtbl->ReleaseAllContacts(This);
}
static __WIDL_INLINE HRESULT IDirectManipulationViewport2_GetStatus(IDirectManipulationViewport2* This,DIRECTMANIPULATION_STATUS *status) {
    return This->lpVtbl->GetStatus(This,status);
}
static __WIDL_INLINE HRESULT IDirectManipulationViewport2_GetTag(IDirectManipulationViewport2* This,REFIID riid,void **object,UINT32 *id) {
    return This->lpVtbl->GetTag(This,riid,object,id);
}
static __WIDL_INLINE HRESULT IDirectManipulationViewport2_SetTag(IDirectManipulationViewport2* This,IUnknown *object,UINT32 id) {
    return This->lpVtbl->SetTag(This,object,id);
}
static __WIDL_INLINE HRESULT IDirectManipulationViewport2_GetViewportRect(IDirectManipulationViewport2* This,RECT *viewport) {
    return This->lpVtbl->GetViewportRect(This,viewport);
}
static __WIDL_INLINE HRESULT IDirectManipulationViewport2_SetViewportRect(IDirectManipulationViewport2* This,const RECT *viewport) {
    return This->lpVtbl->SetViewportRect(This,viewport);
}
static __WIDL_INLINE HRESULT IDirectManipulationViewport2_ZoomToRect(IDirectManipulationViewport2* This,const float left,const float top,const float right,const float bottom,WINBOOL animate) {
    return This->lpVtbl->ZoomToRect(This,left,top,right,bottom,animate);
}
static __WIDL_INLINE HRESULT IDirectManipulationViewport2_SetViewportTransform(IDirectManipulationViewport2* This,const float *matrix,DWORD count) {
    return This->lpVtbl->SetViewportTransform(This,matrix,count);
}
static __WIDL_INLINE HRESULT IDirectManipulationViewport2_SyncDisplayTransform(IDirectManipulationViewport2* This,const float *matrix,DWORD count) {
    return This->lpVtbl->SyncDisplayTransform(This,matrix,count);
}
static __WIDL_INLINE HRESULT IDirectManipulationViewport2_GetPrimaryContent(IDirectManipulationViewport2* This,REFIID riid,void **object) {
    return This->lpVtbl->GetPrimaryContent(This,riid,object);
}
static __WIDL_INLINE HRESULT IDirectManipulationViewport2_AddContent(IDirectManipulationViewport2* This,IDirectManipulationContent *content) {
    return This->lpVtbl->AddContent(This,content);
}
static __WIDL_INLINE HRESULT IDirectManipulationViewport2_RemoveContent(IDirectManipulationViewport2* This,IDirectManipulationContent *content) {
    return This->lpVtbl->RemoveContent(This,content);
}
static __WIDL_INLINE HRESULT IDirectManipulationViewport2_SetViewportOptions(IDirectManipulationViewport2* This,DIRECTMANIPULATION_VIEWPORT_OPTIONS options) {
    return This->lpVtbl->SetViewportOptions(This,options);
}
static __WIDL_INLINE HRESULT IDirectManipulationViewport2_AddConfiguration(IDirectManipulationViewport2* This,DIRECTMANIPULATION_CONFIGURATION configuration) {
    return This->lpVtbl->AddConfiguration(This,configuration);
}
static __WIDL_INLINE HRESULT IDirectManipulationViewport2_RemoveConfiguration(IDirectManipulationViewport2* This,DIRECTMANIPULATION_CONFIGURATION configuration) {
    return This->lpVtbl->RemoveConfiguration(This,configuration);
}
static __WIDL_INLINE HRESULT IDirectManipulationViewport2_ActivateConfiguration(IDirectManipulationViewport2* This,DIRECTMANIPULATION_CONFIGURATION configuration) {
    return This->lpVtbl->ActivateConfiguration(This,configuration);
}
static __WIDL_INLINE HRESULT IDirectManipulationViewport2_SetManualGesture(IDirectManipulationViewport2* This,DIRECTMANIPULATION_GESTURE_CONFIGURATION configuration) {
    return This->lpVtbl->SetManualGesture(This,configuration);
}
static __WIDL_INLINE HRESULT IDirectManipulationViewport2_SetChaining(IDirectManipulationViewport2* This,DIRECTMANIPULATION_MOTION_TYPES enabledTypes) {
    return This->lpVtbl->SetChaining(This,enabledTypes);
}
static __WIDL_INLINE HRESULT IDirectManipulationViewport2_AddEventHandler(IDirectManipulationViewport2* This,HWND window,IDirectManipulationViewportEventHandler *eventHandler,DWORD *cookie) {
    return This->lpVtbl->AddEventHandler(This,window,eventHandler,cookie);
}
static __WIDL_INLINE HRESULT IDirectManipulationViewport2_RemoveEventHandler(IDirectManipulationViewport2* This,DWORD cookie) {
    return This->lpVtbl->RemoveEventHandler(This,cookie);
}
static __WIDL_INLINE HRESULT IDirectManipulationViewport2_SetInputMode(IDirectManipulationViewport2* This,DIRECTMANIPULATION_INPUT_MODE mode) {
    return This->lpVtbl->SetInputMode(This,mode);
}
static __WIDL_INLINE HRESULT IDirectManipulationViewport2_SetUpdateMode(IDirectManipulationViewport2* This,DIRECTMANIPULATION_INPUT_MODE mode) {
    return This->lpVtbl->SetUpdateMode(This,mode);
}
static __WIDL_INLINE HRESULT IDirectManipulationViewport2_Stop(IDirectManipulationViewport2* This) {
    return This->lpVtbl->Stop(This);
}
static __WIDL_INLINE HRESULT IDirectManipulationViewport2_Abandon(IDirectManipulationViewport2* This) {
    return This->lpVtbl->Abandon(This);
}
/*** IDirectManipulationViewport2 methods ***/
static __WIDL_INLINE HRESULT IDirectManipulationViewport2_AddBehavior(IDirectManipulationViewport2* This,IUnknown *behavior,DWORD *cookie) {
    return This->lpVtbl->AddBehavior(This,behavior,cookie);
}
static __WIDL_INLINE HRESULT IDirectManipulationViewport2_RemoveBehavior(IDirectManipulationViewport2* This,DWORD cookie) {
    return This->lpVtbl->RemoveBehavior(This,cookie);
}
static __WIDL_INLINE HRESULT IDirectManipulationViewport2_RemoveAllBehaviors(IDirectManipulationViewport2* This) {
    return This->lpVtbl->RemoveAllBehaviors(This);
}
#endif
#endif

#endif


#endif  /* __IDirectManipulationViewport2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDirectManipulationViewportEventHandler interface
 */
#ifndef __IDirectManipulationViewportEventHandler_INTERFACE_DEFINED__
#define __IDirectManipulationViewportEventHandler_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDirectManipulationViewportEventHandler, 0x952121da, 0xd69f, 0x45f9, 0xb0,0xf9, 0xf2,0x39,0x44,0x32,0x1a,0x6d);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("952121da-d69f-45f9-b0f9-f23944321a6d")
IDirectManipulationViewportEventHandler : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE OnViewportStatusChanged(
        IDirectManipulationViewport *viewport,
        DIRECTMANIPULATION_STATUS current,
        DIRECTMANIPULATION_STATUS previous) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnViewportUpdated(
        IDirectManipulationViewport *viewport) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnContentUpdated(
        IDirectManipulationViewport *viewport,
        IDirectManipulationContent *content) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDirectManipulationViewportEventHandler, 0x952121da, 0xd69f, 0x45f9, 0xb0,0xf9, 0xf2,0x39,0x44,0x32,0x1a,0x6d)
#endif
#else
typedef struct IDirectManipulationViewportEventHandlerVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDirectManipulationViewportEventHandler methods ***/
    HRESULT (STDMETHODCALLTYPE *OnViewportStatusChanged)(
        IDirectManipulationViewportEventHandler *This,
        IDirectManipulationViewport *viewport,
        DIRECTMANIPULATION_STATUS current,
        DIRECTMANIPULATION_STATUS previous);

    HRESULT (STDMETHODCALLTYPE *OnViewportUpdated)(
        IDirectManipulationViewportEventHandler *This,
        IDirectManipulationViewport *viewport);

    HRESULT (STDMETHODCALLTYPE *OnContentUpdated)(
        IDirectManipulationViewportEventHandler *This,
        IDirectManipulationViewport *viewport,
        IDirectManipulationContent *content);

    END_INTERFACE
} IDirectManipulationViewportEventHandlerVtbl;

interface IDirectManipulationViewportEventHandler {
    CONST_VTBL IDirectManipulationViewportEventHandlerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDirectManipulationViewportEventHandler_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDirectManipulationViewportEventHandler_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDirectManipulationViewportEventHandler_Release(This) (This)->lpVtbl->Release(This)
/*** IDirectManipulationViewportEventHandler methods ***/
#define IDirectManipulationViewportEventHandler_OnViewportStatusChanged(This,viewport,current,previous) (This)->lpVtbl->OnViewportStatusChanged(This,viewport,current,previous)
#define IDirectManipulationViewportEventHandler_OnViewportUpdated(This,viewport) (This)->lpVtbl->OnViewportUpdated(This,viewport)
#define IDirectManipulationViewportEventHandler_OnContentUpdated(This,viewport,content) (This)->lpVtbl->OnContentUpdated(This,viewport,content)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IDirectManipulationViewportEventHandler_QueryInterface(IDirectManipulationViewportEventHandler* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDirectManipulationViewportEventHandler_AddRef(IDirectManipulationViewportEventHandler* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDirectManipulationViewportEventHandler_Release(IDirectManipulationViewportEventHandler* This) {
    return This->lpVtbl->Release(This);
}
/*** IDirectManipulationViewportEventHandler methods ***/
static __WIDL_INLINE HRESULT IDirectManipulationViewportEventHandler_OnViewportStatusChanged(IDirectManipulationViewportEventHandler* This,IDirectManipulationViewport *viewport,DIRECTMANIPULATION_STATUS current,DIRECTMANIPULATION_STATUS previous) {
    return This->lpVtbl->OnViewportStatusChanged(This,viewport,current,previous);
}
static __WIDL_INLINE HRESULT IDirectManipulationViewportEventHandler_OnViewportUpdated(IDirectManipulationViewportEventHandler* This,IDirectManipulationViewport *viewport) {
    return This->lpVtbl->OnViewportUpdated(This,viewport);
}
static __WIDL_INLINE HRESULT IDirectManipulationViewportEventHandler_OnContentUpdated(IDirectManipulationViewportEventHandler* This,IDirectManipulationViewport *viewport,IDirectManipulationContent *content) {
    return This->lpVtbl->OnContentUpdated(This,viewport,content);
}
#endif
#endif

#endif


#endif  /* __IDirectManipulationViewportEventHandler_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDirectManipulationManager2 interface
 */
#ifndef __IDirectManipulationManager2_INTERFACE_DEFINED__
#define __IDirectManipulationManager2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDirectManipulationManager2, 0xfa1005e9, 0x3d16, 0x484c, 0xbf,0xc9, 0x62,0xb6,0x1e,0x56,0xec,0x4e);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("fa1005e9-3d16-484c-bfc9-62b61e56ec4e")
IDirectManipulationManager2 : public IDirectManipulationManager
{
    virtual HRESULT STDMETHODCALLTYPE CreateBehavior(
        REFCLSID clsid,
        REFIID riid,
        void **obj) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDirectManipulationManager2, 0xfa1005e9, 0x3d16, 0x484c, 0xbf,0xc9, 0x62,0xb6,0x1e,0x56,0xec,0x4e)
#endif
#else
typedef struct IDirectManipulationManager2Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDirectManipulationManager methods ***/
    HRESULT (STDMETHODCALLTYPE *Activate)(
        IDirectManipulationManager2 *This,
        HWND window);

    HRESULT (STDMETHODCALLTYPE *Deactivate)(
        IDirectManipulationManager2 *This,
        HWND window);

    HRESULT (STDMETHODCALLTYPE *RegisterHitTestTarget)(
        IDirectManipulationManager2 *This,
        HWND window,
        HWND hittest,
        DIRECTMANIPULATION_HITTEST_TYPE type);

    HRESULT (STDMETHODCALLTYPE *ProcessInput)(
        IDirectManipulationManager2 *This,
        const MSG *msg,
        WINBOOL *handled);

    HRESULT (STDMETHODCALLTYPE *GetUpdateManager)(
        IDirectManipulationManager2 *This,
        REFIID riid,
        void **obj);

    HRESULT (STDMETHODCALLTYPE *CreateViewport)(
        IDirectManipulationManager2 *This,
        IDirectManipulationFrameInfoProvider *frame,
        HWND window,
        REFIID riid,
        void **obj);

    HRESULT (STDMETHODCALLTYPE *CreateContent)(
        IDirectManipulationManager2 *This,
        IDirectManipulationFrameInfoProvider *frame,
        REFCLSID clsid,
        REFIID riid,
        void **obj);

    /*** IDirectManipulationManager2 methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateBehavior)(
        IDirectManipulationManager2 *This,
        REFCLSID clsid,
        REFIID riid,
        void **obj);

    END_INTERFACE
} IDirectManipulationManager2Vtbl;

interface IDirectManipulationManager2 {
    CONST_VTBL IDirectManipulationManager2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDirectManipulationManager2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDirectManipulationManager2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDirectManipulationManager2_Release(This) (This)->lpVtbl->Release(This)
/*** IDirectManipulationManager methods ***/
#define IDirectManipulationManager2_Activate(This,window) (This)->lpVtbl->Activate(This,window)
#define IDirectManipulationManager2_Deactivate(This,window) (This)->lpVtbl->Deactivate(This,window)
#define IDirectManipulationManager2_RegisterHitTestTarget(This,window,hittest,type) (This)->lpVtbl->RegisterHitTestTarget(This,window,hittest,type)
#define IDirectManipulationManager2_ProcessInput(This,msg,handled) (This)->lpVtbl->ProcessInput(This,msg,handled)
#define IDirectManipulationManager2_GetUpdateManager(This,riid,obj) (This)->lpVtbl->GetUpdateManager(This,riid,obj)
#define IDirectManipulationManager2_CreateViewport(This,frame,window,riid,obj) (This)->lpVtbl->CreateViewport(This,frame,window,riid,obj)
#define IDirectManipulationManager2_CreateContent(This,frame,clsid,riid,obj) (This)->lpVtbl->CreateContent(This,frame,clsid,riid,obj)
/*** IDirectManipulationManager2 methods ***/
#define IDirectManipulationManager2_CreateBehavior(This,clsid,riid,obj) (This)->lpVtbl->CreateBehavior(This,clsid,riid,obj)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IDirectManipulationManager2_QueryInterface(IDirectManipulationManager2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDirectManipulationManager2_AddRef(IDirectManipulationManager2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDirectManipulationManager2_Release(IDirectManipulationManager2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDirectManipulationManager methods ***/
static __WIDL_INLINE HRESULT IDirectManipulationManager2_Activate(IDirectManipulationManager2* This,HWND window) {
    return This->lpVtbl->Activate(This,window);
}
static __WIDL_INLINE HRESULT IDirectManipulationManager2_Deactivate(IDirectManipulationManager2* This,HWND window) {
    return This->lpVtbl->Deactivate(This,window);
}
static __WIDL_INLINE HRESULT IDirectManipulationManager2_RegisterHitTestTarget(IDirectManipulationManager2* This,HWND window,HWND hittest,DIRECTMANIPULATION_HITTEST_TYPE type) {
    return This->lpVtbl->RegisterHitTestTarget(This,window,hittest,type);
}
static __WIDL_INLINE HRESULT IDirectManipulationManager2_ProcessInput(IDirectManipulationManager2* This,const MSG *msg,WINBOOL *handled) {
    return This->lpVtbl->ProcessInput(This,msg,handled);
}
static __WIDL_INLINE HRESULT IDirectManipulationManager2_GetUpdateManager(IDirectManipulationManager2* This,REFIID riid,void **obj) {
    return This->lpVtbl->GetUpdateManager(This,riid,obj);
}
static __WIDL_INLINE HRESULT IDirectManipulationManager2_CreateViewport(IDirectManipulationManager2* This,IDirectManipulationFrameInfoProvider *frame,HWND window,REFIID riid,void **obj) {
    return This->lpVtbl->CreateViewport(This,frame,window,riid,obj);
}
static __WIDL_INLINE HRESULT IDirectManipulationManager2_CreateContent(IDirectManipulationManager2* This,IDirectManipulationFrameInfoProvider *frame,REFCLSID clsid,REFIID riid,void **obj) {
    return This->lpVtbl->CreateContent(This,frame,clsid,riid,obj);
}
/*** IDirectManipulationManager2 methods ***/
static __WIDL_INLINE HRESULT IDirectManipulationManager2_CreateBehavior(IDirectManipulationManager2* This,REFCLSID clsid,REFIID riid,void **obj) {
    return This->lpVtbl->CreateBehavior(This,clsid,riid,obj);
}
#endif
#endif

#endif


#endif  /* __IDirectManipulationManager2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDirectManipulationPrimaryContent interface
 */
#ifndef __IDirectManipulationPrimaryContent_INTERFACE_DEFINED__
#define __IDirectManipulationPrimaryContent_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDirectManipulationPrimaryContent, 0xc12851e4, 0x1698, 0x4625, 0xb9,0xb1, 0x7c,0xa3,0xec,0x18,0x63,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("c12851e4-1698-4625-b9b1-7ca3ec18630b")
IDirectManipulationPrimaryContent : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SetSnapInterval(
        DIRECTMANIPULATION_MOTION_TYPES motion,
        float interval,
        float offset) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetSnapPoints(
        DIRECTMANIPULATION_MOTION_TYPES motion,
        const float *points,
        DWORD count) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetSnapType(
        DIRECTMANIPULATION_MOTION_TYPES motion,
        DIRECTMANIPULATION_SNAPPOINT_TYPE type) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetSnapCoordinate(
        DIRECTMANIPULATION_MOTION_TYPES motion,
        DIRECTMANIPULATION_SNAPPOINT_COORDINATE coordinate,
        float origin) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetZoomBoundaries(
        float minimum,
        float maximum) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetHorizontalAlignment(
        DIRECTMANIPULATION_HORIZONTALALIGNMENT alignment) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetVerticalAlignment(
        DIRECTMANIPULATION_VERTICALALIGNMENT alignment) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetInertiaEndTransform(
        float *matrix,
        DWORD count) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCenterPoint(
        float *x,
        float *y) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDirectManipulationPrimaryContent, 0xc12851e4, 0x1698, 0x4625, 0xb9,0xb1, 0x7c,0xa3,0xec,0x18,0x63,0x0b)
#endif
#else
typedef struct IDirectManipulationPrimaryContentVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDirectManipulationPrimaryContent methods ***/
    HRESULT (STDMETHODCALLTYPE *SetSnapInterval)(
        IDirectManipulationPrimaryContent *This,
        DIRECTMANIPULATION_MOTION_TYPES motion,
        float interval,
        float offset);

    HRESULT (STDMETHODCALLTYPE *SetSnapPoints)(
        IDirectManipulationPrimaryContent *This,
        DIRECTMANIPULATION_MOTION_TYPES motion,
        const float *points,
        DWORD count);

    HRESULT (STDMETHODCALLTYPE *SetSnapType)(
        IDirectManipulationPrimaryContent *This,
        DIRECTMANIPULATION_MOTION_TYPES motion,
        DIRECTMANIPULATION_SNAPPOINT_TYPE type);

    HRESULT (STDMETHODCALLTYPE *SetSnapCoordinate)(
        IDirectManipulationPrimaryContent *This,
        DIRECTMANIPULATION_MOTION_TYPES motion,
        DIRECTMANIPULATION_SNAPPOINT_COORDINATE coordinate,
        float origin);

    HRESULT (STDMETHODCALLTYPE *SetZoomBoundaries)(
        IDirectManipulationPrimaryContent *This,
        float minimum,
        float maximum);

    HRESULT (STDMETHODCALLTYPE *SetHorizontalAlignment)(
        IDirectManipulationPrimaryContent *This,
        DIRECTMANIPULATION_HORIZONTALALIGNMENT alignment);

    HRESULT (STDMETHODCALLTYPE *SetVerticalAlignment)(
        IDirectManipulationPrimaryContent *This,
        DIRECTMANIPULATION_VERTICALALIGNMENT alignment);

    HRESULT (STDMETHODCALLTYPE *GetInertiaEndTransform)(
        IDirectManipulationPrimaryContent *This,
        float *matrix,
        DWORD count);

    HRESULT (STDMETHODCALLTYPE *GetCenterPoint)(
        IDirectManipulationPrimaryContent *This,
        float *x,
        float *y);

    END_INTERFACE
} IDirectManipulationPrimaryContentVtbl;

interface IDirectManipulationPrimaryContent {
    CONST_VTBL IDirectManipulationPrimaryContentVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDirectManipulationPrimaryContent_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDirectManipulationPrimaryContent_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDirectManipulationPrimaryContent_Release(This) (This)->lpVtbl->Release(This)
/*** IDirectManipulationPrimaryContent methods ***/
#define IDirectManipulationPrimaryContent_SetSnapInterval(This,motion,interval,offset) (This)->lpVtbl->SetSnapInterval(This,motion,interval,offset)
#define IDirectManipulationPrimaryContent_SetSnapPoints(This,motion,points,count) (This)->lpVtbl->SetSnapPoints(This,motion,points,count)
#define IDirectManipulationPrimaryContent_SetSnapType(This,motion,type) (This)->lpVtbl->SetSnapType(This,motion,type)
#define IDirectManipulationPrimaryContent_SetSnapCoordinate(This,motion,coordinate,origin) (This)->lpVtbl->SetSnapCoordinate(This,motion,coordinate,origin)
#define IDirectManipulationPrimaryContent_SetZoomBoundaries(This,minimum,maximum) (This)->lpVtbl->SetZoomBoundaries(This,minimum,maximum)
#define IDirectManipulationPrimaryContent_SetHorizontalAlignment(This,alignment) (This)->lpVtbl->SetHorizontalAlignment(This,alignment)
#define IDirectManipulationPrimaryContent_SetVerticalAlignment(This,alignment) (This)->lpVtbl->SetVerticalAlignment(This,alignment)
#define IDirectManipulationPrimaryContent_GetInertiaEndTransform(This,matrix,count) (This)->lpVtbl->GetInertiaEndTransform(This,matrix,count)
#define IDirectManipulationPrimaryContent_GetCenterPoint(This,x,y) (This)->lpVtbl->GetCenterPoint(This,x,y)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IDirectManipulationPrimaryContent_QueryInterface(IDirectManipulationPrimaryContent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDirectManipulationPrimaryContent_AddRef(IDirectManipulationPrimaryContent* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDirectManipulationPrimaryContent_Release(IDirectManipulationPrimaryContent* This) {
    return This->lpVtbl->Release(This);
}
/*** IDirectManipulationPrimaryContent methods ***/
static __WIDL_INLINE HRESULT IDirectManipulationPrimaryContent_SetSnapInterval(IDirectManipulationPrimaryContent* This,DIRECTMANIPULATION_MOTION_TYPES motion,float interval,float offset) {
    return This->lpVtbl->SetSnapInterval(This,motion,interval,offset);
}
static __WIDL_INLINE HRESULT IDirectManipulationPrimaryContent_SetSnapPoints(IDirectManipulationPrimaryContent* This,DIRECTMANIPULATION_MOTION_TYPES motion,const float *points,DWORD count) {
    return This->lpVtbl->SetSnapPoints(This,motion,points,count);
}
static __WIDL_INLINE HRESULT IDirectManipulationPrimaryContent_SetSnapType(IDirectManipulationPrimaryContent* This,DIRECTMANIPULATION_MOTION_TYPES motion,DIRECTMANIPULATION_SNAPPOINT_TYPE type) {
    return This->lpVtbl->SetSnapType(This,motion,type);
}
static __WIDL_INLINE HRESULT IDirectManipulationPrimaryContent_SetSnapCoordinate(IDirectManipulationPrimaryContent* This,DIRECTMANIPULATION_MOTION_TYPES motion,DIRECTMANIPULATION_SNAPPOINT_COORDINATE coordinate,float origin) {
    return This->lpVtbl->SetSnapCoordinate(This,motion,coordinate,origin);
}
static __WIDL_INLINE HRESULT IDirectManipulationPrimaryContent_SetZoomBoundaries(IDirectManipulationPrimaryContent* This,float minimum,float maximum) {
    return This->lpVtbl->SetZoomBoundaries(This,minimum,maximum);
}
static __WIDL_INLINE HRESULT IDirectManipulationPrimaryContent_SetHorizontalAlignment(IDirectManipulationPrimaryContent* This,DIRECTMANIPULATION_HORIZONTALALIGNMENT alignment) {
    return This->lpVtbl->SetHorizontalAlignment(This,alignment);
}
static __WIDL_INLINE HRESULT IDirectManipulationPrimaryContent_SetVerticalAlignment(IDirectManipulationPrimaryContent* This,DIRECTMANIPULATION_VERTICALALIGNMENT alignment) {
    return This->lpVtbl->SetVerticalAlignment(This,alignment);
}
static __WIDL_INLINE HRESULT IDirectManipulationPrimaryContent_GetInertiaEndTransform(IDirectManipulationPrimaryContent* This,float *matrix,DWORD count) {
    return This->lpVtbl->GetInertiaEndTransform(This,matrix,count);
}
static __WIDL_INLINE HRESULT IDirectManipulationPrimaryContent_GetCenterPoint(IDirectManipulationPrimaryContent* This,float *x,float *y) {
    return This->lpVtbl->GetCenterPoint(This,x,y);
}
#endif
#endif

#endif


#endif  /* __IDirectManipulationPrimaryContent_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDirectManipulationCompositor2 interface
 */
#ifndef __IDirectManipulationCompositor2_INTERFACE_DEFINED__
#define __IDirectManipulationCompositor2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDirectManipulationCompositor2, 0xd38c7822, 0xf1cb, 0x43cb, 0xb4,0xb9, 0xac,0x0c,0x76,0x7a,0x41,0x2e);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("d38c7822-f1cb-43cb-b4b9-ac0c767a412e")
IDirectManipulationCompositor2 : public IDirectManipulationCompositor
{
    virtual HRESULT STDMETHODCALLTYPE AddContentWithCrossProcessChaining(
        IDirectManipulationPrimaryContent *content,
        IUnknown *device,
        IUnknown *parentVisual,
        IUnknown *childVisual) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDirectManipulationCompositor2, 0xd38c7822, 0xf1cb, 0x43cb, 0xb4,0xb9, 0xac,0x0c,0x76,0x7a,0x41,0x2e)
#endif
#else
typedef struct IDirectManipulationCompositor2Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDirectManipulationCompositor methods ***/
    HRESULT (STDMETHODCALLTYPE *AddContent)(
        IDirectManipulationCompositor2 *This,
        IDirectManipulationContent *content,
        IUnknown *device,
        IUnknown *parent,
        IUnknown *child);

    HRESULT (STDMETHODCALLTYPE *RemoveContent)(
        IDirectManipulationCompositor2 *This,
        IDirectManipulationContent *content);

    HRESULT (STDMETHODCALLTYPE *SetUpdateManager)(
        IDirectManipulationCompositor2 *This,
        IDirectManipulationUpdateManager *manager);

    HRESULT (STDMETHODCALLTYPE *Flush)(
        IDirectManipulationCompositor2 *This);

    /*** IDirectManipulationCompositor2 methods ***/
    HRESULT (STDMETHODCALLTYPE *AddContentWithCrossProcessChaining)(
        IDirectManipulationCompositor2 *This,
        IDirectManipulationPrimaryContent *content,
        IUnknown *device,
        IUnknown *parentVisual,
        IUnknown *childVisual);

    END_INTERFACE
} IDirectManipulationCompositor2Vtbl;

interface IDirectManipulationCompositor2 {
    CONST_VTBL IDirectManipulationCompositor2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDirectManipulationCompositor2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDirectManipulationCompositor2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDirectManipulationCompositor2_Release(This) (This)->lpVtbl->Release(This)
/*** IDirectManipulationCompositor methods ***/
#define IDirectManipulationCompositor2_AddContent(This,content,device,parent,child) (This)->lpVtbl->AddContent(This,content,device,parent,child)
#define IDirectManipulationCompositor2_RemoveContent(This,content) (This)->lpVtbl->RemoveContent(This,content)
#define IDirectManipulationCompositor2_SetUpdateManager(This,manager) (This)->lpVtbl->SetUpdateManager(This,manager)
#define IDirectManipulationCompositor2_Flush(This) (This)->lpVtbl->Flush(This)
/*** IDirectManipulationCompositor2 methods ***/
#define IDirectManipulationCompositor2_AddContentWithCrossProcessChaining(This,content,device,parentVisual,childVisual) (This)->lpVtbl->AddContentWithCrossProcessChaining(This,content,device,parentVisual,childVisual)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IDirectManipulationCompositor2_QueryInterface(IDirectManipulationCompositor2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDirectManipulationCompositor2_AddRef(IDirectManipulationCompositor2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDirectManipulationCompositor2_Release(IDirectManipulationCompositor2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDirectManipulationCompositor methods ***/
static __WIDL_INLINE HRESULT IDirectManipulationCompositor2_AddContent(IDirectManipulationCompositor2* This,IDirectManipulationContent *content,IUnknown *device,IUnknown *parent,IUnknown *child) {
    return This->lpVtbl->AddContent(This,content,device,parent,child);
}
static __WIDL_INLINE HRESULT IDirectManipulationCompositor2_RemoveContent(IDirectManipulationCompositor2* This,IDirectManipulationContent *content) {
    return This->lpVtbl->RemoveContent(This,content);
}
static __WIDL_INLINE HRESULT IDirectManipulationCompositor2_SetUpdateManager(IDirectManipulationCompositor2* This,IDirectManipulationUpdateManager *manager) {
    return This->lpVtbl->SetUpdateManager(This,manager);
}
static __WIDL_INLINE HRESULT IDirectManipulationCompositor2_Flush(IDirectManipulationCompositor2* This) {
    return This->lpVtbl->Flush(This);
}
/*** IDirectManipulationCompositor2 methods ***/
static __WIDL_INLINE HRESULT IDirectManipulationCompositor2_AddContentWithCrossProcessChaining(IDirectManipulationCompositor2* This,IDirectManipulationPrimaryContent *content,IUnknown *device,IUnknown *parentVisual,IUnknown *childVisual) {
    return This->lpVtbl->AddContentWithCrossProcessChaining(This,content,device,parentVisual,childVisual);
}
#endif
#endif

#endif


#endif  /* __IDirectManipulationCompositor2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDirectManipulationInteractionEventHandler interface
 */
#ifndef __IDirectManipulationInteractionEventHandler_INTERFACE_DEFINED__
#define __IDirectManipulationInteractionEventHandler_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDirectManipulationInteractionEventHandler, 0xe43f45b8, 0x42b4, 0x403e, 0xb1,0xf2, 0x27,0x3b,0x8f,0x51,0x08,0x30);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("e43f45b8-42b4-403e-b1f2-273b8f510830")
IDirectManipulationInteractionEventHandler : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE OnInteraction(
        IDirectManipulationViewport2 *viewport,
        DIRECTMANIPULATION_INTERACTION_TYPE interaction) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDirectManipulationInteractionEventHandler, 0xe43f45b8, 0x42b4, 0x403e, 0xb1,0xf2, 0x27,0x3b,0x8f,0x51,0x08,0x30)
#endif
#else
typedef struct IDirectManipulationInteractionEventHandlerVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDirectManipulationInteractionEventHandler methods ***/
    HRESULT (STDMETHODCALLTYPE *OnInteraction)(
        IDirectManipulationInteractionEventHandler *This,
        IDirectManipulationViewport2 *viewport,
        DIRECTMANIPULATION_INTERACTION_TYPE interaction);

    END_INTERFACE
} IDirectManipulationInteractionEventHandlerVtbl;

interface IDirectManipulationInteractionEventHandler {
    CONST_VTBL IDirectManipulationInteractionEventHandlerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDirectManipulationInteractionEventHandler_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDirectManipulationInteractionEventHandler_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDirectManipulationInteractionEventHandler_Release(This) (This)->lpVtbl->Release(This)
/*** IDirectManipulationInteractionEventHandler methods ***/
#define IDirectManipulationInteractionEventHandler_OnInteraction(This,viewport,interaction) (This)->lpVtbl->OnInteraction(This,viewport,interaction)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IDirectManipulationInteractionEventHandler_QueryInterface(IDirectManipulationInteractionEventHandler* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDirectManipulationInteractionEventHandler_AddRef(IDirectManipulationInteractionEventHandler* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDirectManipulationInteractionEventHandler_Release(IDirectManipulationInteractionEventHandler* This) {
    return This->lpVtbl->Release(This);
}
/*** IDirectManipulationInteractionEventHandler methods ***/
static __WIDL_INLINE HRESULT IDirectManipulationInteractionEventHandler_OnInteraction(IDirectManipulationInteractionEventHandler* This,IDirectManipulationViewport2 *viewport,DIRECTMANIPULATION_INTERACTION_TYPE interaction) {
    return This->lpVtbl->OnInteraction(This,viewport,interaction);
}
#endif
#endif

#endif


#endif  /* __IDirectManipulationInteractionEventHandler_INTERFACE_DEFINED__ */

#ifndef __DirectManipulation_LIBRARY_DEFINED__
#define __DirectManipulation_LIBRARY_DEFINED__

DEFINE_GUID(LIBID_DirectManipulation, 0x9fbedf98, 0xf6d8, 0x4e3b, 0xb4,0x88, 0xfa,0x66,0xdb,0xf5,0xe9,0xf3);

/*****************************************************************************
 * DirectManipulationManager coclass
 */

DEFINE_GUID(CLSID_DirectManipulationManager, 0x54e211b6, 0x3650, 0x4f75, 0x83,0x34, 0xfa,0x35,0x95,0x98,0xe1,0xc5);

#ifdef __cplusplus
class DECLSPEC_UUID("54e211b6-3650-4f75-8334-fa359598e1c5") DirectManipulationManager;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DirectManipulationManager, 0x54e211b6, 0x3650, 0x4f75, 0x83,0x34, 0xfa,0x35,0x95,0x98,0xe1,0xc5)
#endif
#endif

/*****************************************************************************
 * DirectManipulationSharedManager coclass
 */

DEFINE_GUID(CLSID_DirectManipulationSharedManager, 0x99793286, 0x77cc, 0x4b57, 0x96,0xdb, 0x3b,0x35,0x4f,0x6f,0x9f,0xb5);

#ifdef __cplusplus
class DECLSPEC_UUID("99793286-77cc-4b57-96db-3b354f6f9fb5") DirectManipulationSharedManager;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DirectManipulationSharedManager, 0x99793286, 0x77cc, 0x4b57, 0x96,0xdb, 0x3b,0x35,0x4f,0x6f,0x9f,0xb5)
#endif
#endif

/*****************************************************************************
 * DCompManipulationCompositor coclass
 */

DEFINE_GUID(CLSID_DCompManipulationCompositor, 0x79dea627, 0xa08a, 0x43ac, 0x8e,0xf5, 0x69,0x00,0xb9,0x29,0x91,0x26);

#ifdef __cplusplus
class DECLSPEC_UUID("79dea627-a08a-43ac-8ef5-6900b9299126") DCompManipulationCompositor;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DCompManipulationCompositor, 0x79dea627, 0xa08a, 0x43ac, 0x8e,0xf5, 0x69,0x00,0xb9,0x29,0x91,0x26)
#endif
#endif

/*****************************************************************************
 * DirectManipulationViewport coclass
 */

DEFINE_GUID(CLSID_DirectManipulationViewport, 0x34e211b6, 0x3650, 0x4f75, 0x83,0x34, 0xfa,0x35,0x95,0x98,0xe1,0xc5);

#ifdef __cplusplus
class DECLSPEC_UUID("34e211b6-3650-4f75-8334-fa359598e1c5") DirectManipulationViewport;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DirectManipulationViewport, 0x34e211b6, 0x3650, 0x4f75, 0x83,0x34, 0xfa,0x35,0x95,0x98,0xe1,0xc5)
#endif
#endif

#endif /* __DirectManipulation_LIBRARY_DEFINED__ */
/* Begin additional prototypes for all interfaces */


/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __directmanipulation_h__ */
