/*** Autogenerated by WIDL 11.12 from include/notificationactivationcallback.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 __notificationactivationcallback_h__
#define __notificationactivationcallback_h__

/* Forward declarations */

#ifndef __INotificationActivationCallback_FWD_DEFINED__
#define __INotificationActivationCallback_FWD_DEFINED__
typedef interface INotificationActivationCallback INotificationActivationCallback;
#ifdef __cplusplus
interface INotificationActivationCallback;
#endif /* __cplusplus */
#endif

/* Headers for imported files */

#include <oaidl.h>

#ifdef __cplusplus
extern "C" {
#endif

#include <winapifamily.h>
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM)
#if (NTDDI_VERSION >= NTDDI_WIN10)
typedef struct NOTIFICATION_USER_INPUT_DATA {
    LPCWSTR Key;
    LPCWSTR Value;
} NOTIFICATION_USER_INPUT_DATA;
/*****************************************************************************
 * INotificationActivationCallback interface
 */
#ifndef __INotificationActivationCallback_INTERFACE_DEFINED__
#define __INotificationActivationCallback_INTERFACE_DEFINED__

DEFINE_GUID(IID_INotificationActivationCallback, 0x53e31837, 0x6600, 0x4a81, 0x93,0x95, 0x75,0xcf,0xfe,0x74,0x6f,0x94);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("53e31837-6600-4a81-9395-75cffe746f94")
INotificationActivationCallback : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Activate(
        LPCWSTR app_user_model_id,
        LPCWSTR invoked_args,
        const NOTIFICATION_USER_INPUT_DATA *data,
        ULONG count) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(INotificationActivationCallback, 0x53e31837, 0x6600, 0x4a81, 0x93,0x95, 0x75,0xcf,0xfe,0x74,0x6f,0x94)
#endif
#else
typedef struct INotificationActivationCallbackVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** INotificationActivationCallback methods ***/
    HRESULT (STDMETHODCALLTYPE *Activate)(
        INotificationActivationCallback *This,
        LPCWSTR app_user_model_id,
        LPCWSTR invoked_args,
        const NOTIFICATION_USER_INPUT_DATA *data,
        ULONG count);

    END_INTERFACE
} INotificationActivationCallbackVtbl;

interface INotificationActivationCallback {
    CONST_VTBL INotificationActivationCallbackVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define INotificationActivationCallback_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define INotificationActivationCallback_AddRef(This) (This)->lpVtbl->AddRef(This)
#define INotificationActivationCallback_Release(This) (This)->lpVtbl->Release(This)
/*** INotificationActivationCallback methods ***/
#define INotificationActivationCallback_Activate(This,app_user_model_id,invoked_args,data,count) (This)->lpVtbl->Activate(This,app_user_model_id,invoked_args,data,count)
#else
/*** IUnknown methods ***/
static inline HRESULT INotificationActivationCallback_QueryInterface(INotificationActivationCallback* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG INotificationActivationCallback_AddRef(INotificationActivationCallback* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG INotificationActivationCallback_Release(INotificationActivationCallback* This) {
    return This->lpVtbl->Release(This);
}
/*** INotificationActivationCallback methods ***/
static inline HRESULT INotificationActivationCallback_Activate(INotificationActivationCallback* This,LPCWSTR app_user_model_id,LPCWSTR invoked_args,const NOTIFICATION_USER_INPUT_DATA *data,ULONG count) {
    return This->lpVtbl->Activate(This,app_user_model_id,invoked_args,data,count);
}
#endif
#endif

#endif


#endif  /* __INotificationActivationCallback_INTERFACE_DEFINED__ */

#endif /* NTDDI_WIN10 */
#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM) */
/* Begin additional prototypes for all interfaces */


/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __notificationactivationcallback_h__ */
