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