/*** Autogenerated by WIDL 9.8 from include/windows.ui.core.idl - Do not edit ***/

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

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

#ifndef __windows_ui_core_h__
#define __windows_ui_core_h__

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

/* Forward declarations */

#ifndef ____x_ABI_CWindows_CUI_CCore_CIDispatchedHandler_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CCore_CIDispatchedHandler_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CCore_CIDispatchedHandler __x_ABI_CWindows_CUI_CCore_CIDispatchedHandler;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CCore_CIDispatchedHandler ABI::Windows::UI::Core::IDispatchedHandler
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Core {
                interface IDispatchedHandler;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CCore_CIIdleDispatchedHandler_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CCore_CIIdleDispatchedHandler_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CCore_CIIdleDispatchedHandler __x_ABI_CWindows_CUI_CCore_CIIdleDispatchedHandler;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CCore_CIIdleDispatchedHandler ABI::Windows::UI::Core::IIdleDispatchedHandler
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Core {
                interface IIdleDispatchedHandler;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CCore_CICoreDispatcher_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CCore_CICoreDispatcher_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CCore_CICoreDispatcher __x_ABI_CWindows_CUI_CCore_CICoreDispatcher;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CCore_CICoreDispatcher ABI::Windows::UI::Core::ICoreDispatcher
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Core {
                interface ICoreDispatcher;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CCore_CIIdleDispatchedHandlerArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CCore_CIIdleDispatchedHandlerArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CCore_CIIdleDispatchedHandlerArgs __x_ABI_CWindows_CUI_CCore_CIIdleDispatchedHandlerArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CCore_CIIdleDispatchedHandlerArgs ABI::Windows::UI::Core::IIdleDispatchedHandlerArgs
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Core {
                interface IIdleDispatchedHandlerArgs;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CCore_CCoreDispatcher_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CCore_CCoreDispatcher_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Core {
                class CoreDispatcher;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CCore_CCoreDispatcher __x_ABI_CWindows_CUI_CCore_CCoreDispatcher;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CCore_CCoreDispatcher_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CCore_CIdleDispatchedHandlerArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CCore_CIdleDispatchedHandlerArgs_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Core {
                class IdleDispatchedHandlerArgs;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CCore_CIdleDispatchedHandlerArgs __x_ABI_CWindows_CUI_CCore_CIdleDispatchedHandlerArgs;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CCore_CIdleDispatchedHandlerArgs_FWD_DEFINED__ */

/* Headers for imported files */

#include <inspectable.h>
#include <asyncinfo.h>
#include <eventtoken.h>
#include <windowscontracts.h>
#include <windows.foundation.h>
#include <windows.system.h>
#include <windows.ui.h>

#ifdef __cplusplus
extern "C" {
#endif

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

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

#ifndef ____x_ABI_CWindows_CUI_CCore_CICoreAcceleratorKeys_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CCore_CICoreAcceleratorKeys_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CCore_CICoreAcceleratorKeys __x_ABI_CWindows_CUI_CCore_CICoreAcceleratorKeys;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CCore_CICoreAcceleratorKeys ABI::Windows::UI::Core::ICoreAcceleratorKeys
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Core {
                interface ICoreAcceleratorKeys;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CCore_CICoreDispatcher_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CCore_CICoreDispatcher_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CCore_CICoreDispatcher __x_ABI_CWindows_CUI_CCore_CICoreDispatcher;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CCore_CICoreDispatcher ABI::Windows::UI::Core::ICoreDispatcher
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Core {
                interface ICoreDispatcher;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CCore_CICoreDispatcher2_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CCore_CICoreDispatcher2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CCore_CICoreDispatcher2 __x_ABI_CWindows_CUI_CCore_CICoreDispatcher2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CCore_CICoreDispatcher2 ABI::Windows::UI::Core::ICoreDispatcher2
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Core {
                interface ICoreDispatcher2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CCore_CICoreDispatcherWithTaskPriority_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CCore_CICoreDispatcherWithTaskPriority_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CCore_CICoreDispatcherWithTaskPriority __x_ABI_CWindows_CUI_CCore_CICoreDispatcherWithTaskPriority;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CCore_CICoreDispatcherWithTaskPriority ABI::Windows::UI::Core::ICoreDispatcherWithTaskPriority
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Core {
                interface ICoreDispatcherWithTaskPriority;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CCore_CIIdleDispatchedHandlerArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CCore_CIIdleDispatchedHandlerArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CCore_CIIdleDispatchedHandlerArgs __x_ABI_CWindows_CUI_CCore_CIIdleDispatchedHandlerArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CCore_CIIdleDispatchedHandlerArgs ABI::Windows::UI::Core::IIdleDispatchedHandlerArgs
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Core {
                interface IIdleDispatchedHandlerArgs;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Core {
                enum CoreDispatcherPriority {
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
                    CoreDispatcherPriority_Idle = -2,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
                    CoreDispatcherPriority_Low = -1,
                    CoreDispatcherPriority_Normal = 0,
                    CoreDispatcherPriority_High = 1
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CUI_CCore_CCoreDispatcherPriority {
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
    CoreDispatcherPriority_Idle = -2,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
    CoreDispatcherPriority_Low = -1,
    CoreDispatcherPriority_Normal = 0,
    CoreDispatcherPriority_High = 1
};
#ifdef WIDL_using_Windows_UI_Core
#define CoreDispatcherPriority __x_ABI_CWindows_CUI_CCore_CCoreDispatcherPriority
#endif /* WIDL_using_Windows_UI_Core */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Core {
                enum CoreProcessEventsOption {
                    CoreProcessEventsOption_ProcessOneAndAllPending = 0,
                    CoreProcessEventsOption_ProcessOneIfPresent = 1,
                    CoreProcessEventsOption_ProcessUntilQuit = 2,
                    CoreProcessEventsOption_ProcessAllIfPresent = 3
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CUI_CCore_CCoreProcessEventsOption {
    CoreProcessEventsOption_ProcessOneAndAllPending = 0,
    CoreProcessEventsOption_ProcessOneIfPresent = 1,
    CoreProcessEventsOption_ProcessUntilQuit = 2,
    CoreProcessEventsOption_ProcessAllIfPresent = 3
};
#ifdef WIDL_using_Windows_UI_Core
#define CoreProcessEventsOption __x_ABI_CWindows_CUI_CCore_CCoreProcessEventsOption
#endif /* WIDL_using_Windows_UI_Core */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
/*****************************************************************************
 * IDispatchedHandler interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CCore_CIDispatchedHandler_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CCore_CIDispatchedHandler_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CCore_CIDispatchedHandler, 0xd1f276c4, 0x98d8, 0x4636, 0xbf,0x49, 0xeb,0x79,0x50,0x75,0x48,0xe9);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Core {
                MIDL_INTERFACE("d1f276c4-98d8-4636-bf49-eb79507548e9")
                IDispatchedHandler : public IUnknown
                {
                    virtual HRESULT STDMETHODCALLTYPE Invoke(
                        ) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CCore_CIDispatchedHandler, 0xd1f276c4, 0x98d8, 0x4636, 0xbf,0x49, 0xeb,0x79,0x50,0x75,0x48,0xe9)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CCore_CIDispatchedHandlerVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDispatchedHandler methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __x_ABI_CWindows_CUI_CCore_CIDispatchedHandler *This);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CCore_CIDispatchedHandlerVtbl;

interface __x_ABI_CWindows_CUI_CCore_CIDispatchedHandler {
    CONST_VTBL __x_ABI_CWindows_CUI_CCore_CIDispatchedHandlerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CCore_CIDispatchedHandler_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CCore_CIDispatchedHandler_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CCore_CIDispatchedHandler_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatchedHandler methods ***/
#define __x_ABI_CWindows_CUI_CCore_CIDispatchedHandler_Invoke(This) (This)->lpVtbl->Invoke(This)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CCore_CIDispatchedHandler_QueryInterface(__x_ABI_CWindows_CUI_CCore_CIDispatchedHandler* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CCore_CIDispatchedHandler_AddRef(__x_ABI_CWindows_CUI_CCore_CIDispatchedHandler* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CCore_CIDispatchedHandler_Release(__x_ABI_CWindows_CUI_CCore_CIDispatchedHandler* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatchedHandler methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CCore_CIDispatchedHandler_Invoke(__x_ABI_CWindows_CUI_CCore_CIDispatchedHandler* This) {
    return This->lpVtbl->Invoke(This);
}
#endif
#ifdef WIDL_using_Windows_UI_Core
#define IID_IDispatchedHandler IID___x_ABI_CWindows_CUI_CCore_CIDispatchedHandler
#define IDispatchedHandlerVtbl __x_ABI_CWindows_CUI_CCore_CIDispatchedHandlerVtbl
#define IDispatchedHandler __x_ABI_CWindows_CUI_CCore_CIDispatchedHandler
#define IDispatchedHandler_QueryInterface __x_ABI_CWindows_CUI_CCore_CIDispatchedHandler_QueryInterface
#define IDispatchedHandler_AddRef __x_ABI_CWindows_CUI_CCore_CIDispatchedHandler_AddRef
#define IDispatchedHandler_Release __x_ABI_CWindows_CUI_CCore_CIDispatchedHandler_Release
#define IDispatchedHandler_Invoke __x_ABI_CWindows_CUI_CCore_CIDispatchedHandler_Invoke
#endif /* WIDL_using_Windows_UI_Core */
#endif

#endif

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

/*****************************************************************************
 * IIdleDispatchedHandler interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CCore_CIIdleDispatchedHandler_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CCore_CIIdleDispatchedHandler_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CCore_CIIdleDispatchedHandler, 0xa42b0c24, 0x7f21, 0x4abc, 0x99,0xc1, 0x8f,0x01,0x00,0x7f,0x08,0x80);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Core {
                MIDL_INTERFACE("a42b0c24-7f21-4abc-99c1-8f01007f0880")
                IIdleDispatchedHandler : public IUnknown
                {
                    virtual HRESULT STDMETHODCALLTYPE Invoke(
                        ABI::Windows::UI::Core::IIdleDispatchedHandlerArgs *e) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CCore_CIIdleDispatchedHandler, 0xa42b0c24, 0x7f21, 0x4abc, 0x99,0xc1, 0x8f,0x01,0x00,0x7f,0x08,0x80)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CCore_CIIdleDispatchedHandlerVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IIdleDispatchedHandler methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __x_ABI_CWindows_CUI_CCore_CIIdleDispatchedHandler *This,
        __x_ABI_CWindows_CUI_CCore_CIIdleDispatchedHandlerArgs *e);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CCore_CIIdleDispatchedHandlerVtbl;

interface __x_ABI_CWindows_CUI_CCore_CIIdleDispatchedHandler {
    CONST_VTBL __x_ABI_CWindows_CUI_CCore_CIIdleDispatchedHandlerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CCore_CIIdleDispatchedHandler_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CCore_CIIdleDispatchedHandler_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CCore_CIIdleDispatchedHandler_Release(This) (This)->lpVtbl->Release(This)
/*** IIdleDispatchedHandler methods ***/
#define __x_ABI_CWindows_CUI_CCore_CIIdleDispatchedHandler_Invoke(This,e) (This)->lpVtbl->Invoke(This,e)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CCore_CIIdleDispatchedHandler_QueryInterface(__x_ABI_CWindows_CUI_CCore_CIIdleDispatchedHandler* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CCore_CIIdleDispatchedHandler_AddRef(__x_ABI_CWindows_CUI_CCore_CIIdleDispatchedHandler* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CCore_CIIdleDispatchedHandler_Release(__x_ABI_CWindows_CUI_CCore_CIIdleDispatchedHandler* This) {
    return This->lpVtbl->Release(This);
}
/*** IIdleDispatchedHandler methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CCore_CIIdleDispatchedHandler_Invoke(__x_ABI_CWindows_CUI_CCore_CIIdleDispatchedHandler* This,__x_ABI_CWindows_CUI_CCore_CIIdleDispatchedHandlerArgs *e) {
    return This->lpVtbl->Invoke(This,e);
}
#endif
#ifdef WIDL_using_Windows_UI_Core
#define IID_IIdleDispatchedHandler IID___x_ABI_CWindows_CUI_CCore_CIIdleDispatchedHandler
#define IIdleDispatchedHandlerVtbl __x_ABI_CWindows_CUI_CCore_CIIdleDispatchedHandlerVtbl
#define IIdleDispatchedHandler __x_ABI_CWindows_CUI_CCore_CIIdleDispatchedHandler
#define IIdleDispatchedHandler_QueryInterface __x_ABI_CWindows_CUI_CCore_CIIdleDispatchedHandler_QueryInterface
#define IIdleDispatchedHandler_AddRef __x_ABI_CWindows_CUI_CCore_CIIdleDispatchedHandler_AddRef
#define IIdleDispatchedHandler_Release __x_ABI_CWindows_CUI_CCore_CIIdleDispatchedHandler_Release
#define IIdleDispatchedHandler_Invoke __x_ABI_CWindows_CUI_CCore_CIIdleDispatchedHandler_Invoke
#endif /* WIDL_using_Windows_UI_Core */
#endif

#endif

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

/*****************************************************************************
 * ICoreDispatcher interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CCore_CICoreDispatcher_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CCore_CICoreDispatcher_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CCore_CICoreDispatcher, 0x60db2fa8, 0xb705, 0x4fde, 0xa7,0xd6, 0xeb,0xbb,0x18,0x91,0xd3,0x9e);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Core {
                MIDL_INTERFACE("60db2fa8-b705-4fde-a7d6-ebbb1891d39e")
                ICoreDispatcher : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_HasThreadAccess(
                        boolean *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE ProcessEvents(
                        enum CoreProcessEventsOption options) = 0;

                    virtual HRESULT STDMETHODCALLTYPE RunAsync(
                        enum CoreDispatcherPriority priority,
                        ABI::Windows::UI::Core::IDispatchedHandler *callback,
                        ABI::Windows::Foundation::IAsyncAction **action) = 0;

                    virtual HRESULT STDMETHODCALLTYPE RunIdleAsync(
                        ABI::Windows::UI::Core::IIdleDispatchedHandler *callback,
                        ABI::Windows::Foundation::IAsyncAction **action) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CCore_CICoreDispatcher, 0x60db2fa8, 0xb705, 0x4fde, 0xa7,0xd6, 0xeb,0xbb,0x18,0x91,0xd3,0x9e)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CCore_CICoreDispatcherVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** ICoreDispatcher methods ***/
    HRESULT (STDMETHODCALLTYPE *get_HasThreadAccess)(
        __x_ABI_CWindows_CUI_CCore_CICoreDispatcher *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *ProcessEvents)(
        __x_ABI_CWindows_CUI_CCore_CICoreDispatcher *This,
        enum __x_ABI_CWindows_CUI_CCore_CCoreProcessEventsOption options);

    HRESULT (STDMETHODCALLTYPE *RunAsync)(
        __x_ABI_CWindows_CUI_CCore_CICoreDispatcher *This,
        enum __x_ABI_CWindows_CUI_CCore_CCoreDispatcherPriority priority,
        __x_ABI_CWindows_CUI_CCore_CIDispatchedHandler *callback,
        __x_ABI_CWindows_CFoundation_CIAsyncAction **action);

    HRESULT (STDMETHODCALLTYPE *RunIdleAsync)(
        __x_ABI_CWindows_CUI_CCore_CICoreDispatcher *This,
        __x_ABI_CWindows_CUI_CCore_CIIdleDispatchedHandler *callback,
        __x_ABI_CWindows_CFoundation_CIAsyncAction **action);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CCore_CICoreDispatcherVtbl;

interface __x_ABI_CWindows_CUI_CCore_CICoreDispatcher {
    CONST_VTBL __x_ABI_CWindows_CUI_CCore_CICoreDispatcherVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CCore_CICoreDispatcher_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CCore_CICoreDispatcher_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CCore_CICoreDispatcher_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CCore_CICoreDispatcher_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CCore_CICoreDispatcher_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CCore_CICoreDispatcher_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ICoreDispatcher methods ***/
#define __x_ABI_CWindows_CUI_CCore_CICoreDispatcher_get_HasThreadAccess(This,value) (This)->lpVtbl->get_HasThreadAccess(This,value)
#define __x_ABI_CWindows_CUI_CCore_CICoreDispatcher_ProcessEvents(This,options) (This)->lpVtbl->ProcessEvents(This,options)
#define __x_ABI_CWindows_CUI_CCore_CICoreDispatcher_RunAsync(This,priority,callback,action) (This)->lpVtbl->RunAsync(This,priority,callback,action)
#define __x_ABI_CWindows_CUI_CCore_CICoreDispatcher_RunIdleAsync(This,callback,action) (This)->lpVtbl->RunIdleAsync(This,callback,action)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CCore_CICoreDispatcher_QueryInterface(__x_ABI_CWindows_CUI_CCore_CICoreDispatcher* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CCore_CICoreDispatcher_AddRef(__x_ABI_CWindows_CUI_CCore_CICoreDispatcher* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CCore_CICoreDispatcher_Release(__x_ABI_CWindows_CUI_CCore_CICoreDispatcher* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CCore_CICoreDispatcher_GetIids(__x_ABI_CWindows_CUI_CCore_CICoreDispatcher* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CCore_CICoreDispatcher_GetRuntimeClassName(__x_ABI_CWindows_CUI_CCore_CICoreDispatcher* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CCore_CICoreDispatcher_GetTrustLevel(__x_ABI_CWindows_CUI_CCore_CICoreDispatcher* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ICoreDispatcher methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CCore_CICoreDispatcher_get_HasThreadAccess(__x_ABI_CWindows_CUI_CCore_CICoreDispatcher* This,boolean *value) {
    return This->lpVtbl->get_HasThreadAccess(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CCore_CICoreDispatcher_ProcessEvents(__x_ABI_CWindows_CUI_CCore_CICoreDispatcher* This,enum __x_ABI_CWindows_CUI_CCore_CCoreProcessEventsOption options) {
    return This->lpVtbl->ProcessEvents(This,options);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CCore_CICoreDispatcher_RunAsync(__x_ABI_CWindows_CUI_CCore_CICoreDispatcher* This,enum __x_ABI_CWindows_CUI_CCore_CCoreDispatcherPriority priority,__x_ABI_CWindows_CUI_CCore_CIDispatchedHandler *callback,__x_ABI_CWindows_CFoundation_CIAsyncAction **action) {
    return This->lpVtbl->RunAsync(This,priority,callback,action);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CCore_CICoreDispatcher_RunIdleAsync(__x_ABI_CWindows_CUI_CCore_CICoreDispatcher* This,__x_ABI_CWindows_CUI_CCore_CIIdleDispatchedHandler *callback,__x_ABI_CWindows_CFoundation_CIAsyncAction **action) {
    return This->lpVtbl->RunIdleAsync(This,callback,action);
}
#endif
#ifdef WIDL_using_Windows_UI_Core
#define IID_ICoreDispatcher IID___x_ABI_CWindows_CUI_CCore_CICoreDispatcher
#define ICoreDispatcherVtbl __x_ABI_CWindows_CUI_CCore_CICoreDispatcherVtbl
#define ICoreDispatcher __x_ABI_CWindows_CUI_CCore_CICoreDispatcher
#define ICoreDispatcher_QueryInterface __x_ABI_CWindows_CUI_CCore_CICoreDispatcher_QueryInterface
#define ICoreDispatcher_AddRef __x_ABI_CWindows_CUI_CCore_CICoreDispatcher_AddRef
#define ICoreDispatcher_Release __x_ABI_CWindows_CUI_CCore_CICoreDispatcher_Release
#define ICoreDispatcher_GetIids __x_ABI_CWindows_CUI_CCore_CICoreDispatcher_GetIids
#define ICoreDispatcher_GetRuntimeClassName __x_ABI_CWindows_CUI_CCore_CICoreDispatcher_GetRuntimeClassName
#define ICoreDispatcher_GetTrustLevel __x_ABI_CWindows_CUI_CCore_CICoreDispatcher_GetTrustLevel
#define ICoreDispatcher_get_HasThreadAccess __x_ABI_CWindows_CUI_CCore_CICoreDispatcher_get_HasThreadAccess
#define ICoreDispatcher_ProcessEvents __x_ABI_CWindows_CUI_CCore_CICoreDispatcher_ProcessEvents
#define ICoreDispatcher_RunAsync __x_ABI_CWindows_CUI_CCore_CICoreDispatcher_RunAsync
#define ICoreDispatcher_RunIdleAsync __x_ABI_CWindows_CUI_CCore_CICoreDispatcher_RunIdleAsync
#endif /* WIDL_using_Windows_UI_Core */
#endif

#endif

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

/*****************************************************************************
 * IIdleDispatchedHandlerArgs interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CCore_CIIdleDispatchedHandlerArgs_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CCore_CIIdleDispatchedHandlerArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CCore_CIIdleDispatchedHandlerArgs, 0x98bb6a24, 0xdc1c, 0x43cb, 0xb4,0xed, 0xd1,0xc0,0xeb,0x23,0x91,0xf3);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Core {
                MIDL_INTERFACE("98bb6a24-dc1c-43cb-b4ed-d1c0eb2391f3")
                IIdleDispatchedHandlerArgs : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_IsDispatcherIdle(
                        boolean *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CCore_CIIdleDispatchedHandlerArgs, 0x98bb6a24, 0xdc1c, 0x43cb, 0xb4,0xed, 0xd1,0xc0,0xeb,0x23,0x91,0xf3)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CCore_CIIdleDispatchedHandlerArgsVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IIdleDispatchedHandlerArgs methods ***/
    HRESULT (STDMETHODCALLTYPE *get_IsDispatcherIdle)(
        __x_ABI_CWindows_CUI_CCore_CIIdleDispatchedHandlerArgs *This,
        boolean *value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CCore_CIIdleDispatchedHandlerArgsVtbl;

interface __x_ABI_CWindows_CUI_CCore_CIIdleDispatchedHandlerArgs {
    CONST_VTBL __x_ABI_CWindows_CUI_CCore_CIIdleDispatchedHandlerArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CCore_CIIdleDispatchedHandlerArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CCore_CIIdleDispatchedHandlerArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CCore_CIIdleDispatchedHandlerArgs_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CCore_CIIdleDispatchedHandlerArgs_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CCore_CIIdleDispatchedHandlerArgs_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CCore_CIIdleDispatchedHandlerArgs_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIdleDispatchedHandlerArgs methods ***/
#define __x_ABI_CWindows_CUI_CCore_CIIdleDispatchedHandlerArgs_get_IsDispatcherIdle(This,value) (This)->lpVtbl->get_IsDispatcherIdle(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CCore_CIIdleDispatchedHandlerArgs_QueryInterface(__x_ABI_CWindows_CUI_CCore_CIIdleDispatchedHandlerArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CCore_CIIdleDispatchedHandlerArgs_AddRef(__x_ABI_CWindows_CUI_CCore_CIIdleDispatchedHandlerArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CCore_CIIdleDispatchedHandlerArgs_Release(__x_ABI_CWindows_CUI_CCore_CIIdleDispatchedHandlerArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CCore_CIIdleDispatchedHandlerArgs_GetIids(__x_ABI_CWindows_CUI_CCore_CIIdleDispatchedHandlerArgs* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CCore_CIIdleDispatchedHandlerArgs_GetRuntimeClassName(__x_ABI_CWindows_CUI_CCore_CIIdleDispatchedHandlerArgs* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CCore_CIIdleDispatchedHandlerArgs_GetTrustLevel(__x_ABI_CWindows_CUI_CCore_CIIdleDispatchedHandlerArgs* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIdleDispatchedHandlerArgs methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CCore_CIIdleDispatchedHandlerArgs_get_IsDispatcherIdle(__x_ABI_CWindows_CUI_CCore_CIIdleDispatchedHandlerArgs* This,boolean *value) {
    return This->lpVtbl->get_IsDispatcherIdle(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Core
#define IID_IIdleDispatchedHandlerArgs IID___x_ABI_CWindows_CUI_CCore_CIIdleDispatchedHandlerArgs
#define IIdleDispatchedHandlerArgsVtbl __x_ABI_CWindows_CUI_CCore_CIIdleDispatchedHandlerArgsVtbl
#define IIdleDispatchedHandlerArgs __x_ABI_CWindows_CUI_CCore_CIIdleDispatchedHandlerArgs
#define IIdleDispatchedHandlerArgs_QueryInterface __x_ABI_CWindows_CUI_CCore_CIIdleDispatchedHandlerArgs_QueryInterface
#define IIdleDispatchedHandlerArgs_AddRef __x_ABI_CWindows_CUI_CCore_CIIdleDispatchedHandlerArgs_AddRef
#define IIdleDispatchedHandlerArgs_Release __x_ABI_CWindows_CUI_CCore_CIIdleDispatchedHandlerArgs_Release
#define IIdleDispatchedHandlerArgs_GetIids __x_ABI_CWindows_CUI_CCore_CIIdleDispatchedHandlerArgs_GetIids
#define IIdleDispatchedHandlerArgs_GetRuntimeClassName __x_ABI_CWindows_CUI_CCore_CIIdleDispatchedHandlerArgs_GetRuntimeClassName
#define IIdleDispatchedHandlerArgs_GetTrustLevel __x_ABI_CWindows_CUI_CCore_CIIdleDispatchedHandlerArgs_GetTrustLevel
#define IIdleDispatchedHandlerArgs_get_IsDispatcherIdle __x_ABI_CWindows_CUI_CCore_CIIdleDispatchedHandlerArgs_get_IsDispatcherIdle
#endif /* WIDL_using_Windows_UI_Core */
#endif

#endif

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

/*
 * Class Windows.UI.Core.CoreDispatcher
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_UI_Core_CoreDispatcher_DEFINED
#define RUNTIMECLASS_Windows_UI_Core_CoreDispatcher_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Core_CoreDispatcher[] = {'W','i','n','d','o','w','s','.','U','I','.','C','o','r','e','.','C','o','r','e','D','i','s','p','a','t','c','h','e','r',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Core_CoreDispatcher[] = L"Windows.UI.Core.CoreDispatcher";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Core_CoreDispatcher[] = {'W','i','n','d','o','w','s','.','U','I','.','C','o','r','e','.','C','o','r','e','D','i','s','p','a','t','c','h','e','r',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Core_CoreDispatcher_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.UI.Core.IdleDispatchedHandlerArgs
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_UI_Core_IdleDispatchedHandlerArgs_DEFINED
#define RUNTIMECLASS_Windows_UI_Core_IdleDispatchedHandlerArgs_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Core_IdleDispatchedHandlerArgs[] = {'W','i','n','d','o','w','s','.','U','I','.','C','o','r','e','.','I','d','l','e','D','i','s','p','a','t','c','h','e','d','H','a','n','d','l','e','r','A','r','g','s',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Core_IdleDispatchedHandlerArgs[] = L"Windows.UI.Core.IdleDispatchedHandlerArgs";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Core_IdleDispatchedHandlerArgs[] = {'W','i','n','d','o','w','s','.','U','I','.','C','o','r','e','.','I','d','l','e','D','i','s','p','a','t','c','h','e','d','H','a','n','d','l','e','r','A','r','g','s',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Core_IdleDispatchedHandlerArgs_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/* Begin additional prototypes for all interfaces */


/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __windows_ui_core_h__ */
