/*** Autogenerated by WIDL 11.5 from include/windows.ui.viewmanagement.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_viewmanagement_h__
#define __windows_ui_viewmanagement_h__

/* Forward declarations */

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIAccessibilitySettings_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIAccessibilitySettings_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CViewManagement_CIAccessibilitySettings __x_ABI_CWindows_CUI_CViewManagement_CIAccessibilitySettings;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CViewManagement_CIAccessibilitySettings ABI::Windows::UI::ViewManagement::IAccessibilitySettings
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                interface IAccessibilitySettings;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationView_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationView_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView ABI::Windows::UI::ViewManagement::IApplicationView
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                interface IApplicationView;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationView2_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationView2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView2 __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView2 ABI::Windows::UI::ViewManagement::IApplicationView2
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                interface IApplicationView2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationView3_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationView3_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView3 __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView3;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView3 ABI::Windows::UI::ViewManagement::IApplicationView3
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                interface IApplicationView3;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationView4_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationView4_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView4 __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView4;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView4 ABI::Windows::UI::ViewManagement::IApplicationView4
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                interface IApplicationView4;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationView7_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationView7_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView7 __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView7;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView7 ABI::Windows::UI::ViewManagement::IApplicationView7
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                interface IApplicationView7;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationView9_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationView9_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView9 __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView9;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView9 ABI::Windows::UI::ViewManagement::IApplicationView9
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                interface IApplicationView9;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs ABI::Windows::UI::ViewManagement::IApplicationViewConsolidatedEventArgs
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                interface IApplicationViewConsolidatedEventArgs;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs2_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs2 __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs2 ABI::Windows::UI::ViewManagement::IApplicationViewConsolidatedEventArgs2
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                interface IApplicationViewConsolidatedEventArgs2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewFullscreenStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewFullscreenStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewFullscreenStatics __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewFullscreenStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewFullscreenStatics ABI::Windows::UI::ViewManagement::IApplicationViewFullscreenStatics
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                interface IApplicationViewFullscreenStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewInteropStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewInteropStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewInteropStatics __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewInteropStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewInteropStatics ABI::Windows::UI::ViewManagement::IApplicationViewInteropStatics
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                interface IApplicationViewInteropStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScaling_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScaling_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScaling __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScaling;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScaling ABI::Windows::UI::ViewManagement::IApplicationViewScaling
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                interface IApplicationViewScaling;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScalingStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScalingStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScalingStatics __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScalingStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScalingStatics ABI::Windows::UI::ViewManagement::IApplicationViewScalingStatics
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                interface IApplicationViewScalingStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics ABI::Windows::UI::ViewManagement::IApplicationViewStatics
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                interface IApplicationViewStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics2_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics2 __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics2 ABI::Windows::UI::ViewManagement::IApplicationViewStatics2
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                interface IApplicationViewStatics2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics3_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics3_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics3 __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics3;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics3 ABI::Windows::UI::ViewManagement::IApplicationViewStatics3
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                interface IApplicationViewStatics3;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics4_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics4_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics4 __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics4;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics4 ABI::Windows::UI::ViewManagement::IApplicationViewStatics4
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                interface IApplicationViewStatics4;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics ABI::Windows::UI::ViewManagement::IApplicationViewSwitcherStatics
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                interface IApplicationViewSwitcherStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics2_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics2 __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics2 ABI::Windows::UI::ViewManagement::IApplicationViewSwitcherStatics2
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                interface IApplicationViewSwitcherStatics2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics3_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics3_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics3 __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics3;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics3 ABI::Windows::UI::ViewManagement::IApplicationViewSwitcherStatics3
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                interface IApplicationViewSwitcherStatics3;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar ABI::Windows::UI::ViewManagement::IApplicationViewTitleBar
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                interface IApplicationViewTitleBar;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContext_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContext_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContext __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContext;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContext ABI::Windows::UI::ViewManagement::IApplicationViewTransferContext
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                interface IApplicationViewTransferContext;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContextStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContextStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContextStatics __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContextStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContextStatics ABI::Windows::UI::ViewManagement::IApplicationViewTransferContextStatics
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                interface IApplicationViewTransferContextStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewWithContext_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewWithContext_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewWithContext __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewWithContext;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewWithContext ABI::Windows::UI::ViewManagement::IApplicationViewWithContext
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                interface IApplicationViewWithContext;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIUISettings_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIUISettings_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CViewManagement_CIUISettings __x_ABI_CWindows_CUI_CViewManagement_CIUISettings;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettings ABI::Windows::UI::ViewManagement::IUISettings
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                interface IUISettings;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIUISettings2_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIUISettings2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CViewManagement_CIUISettings2 __x_ABI_CWindows_CUI_CViewManagement_CIUISettings2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettings2 ABI::Windows::UI::ViewManagement::IUISettings2
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                interface IUISettings2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIUISettings3_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIUISettings3_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CViewManagement_CIUISettings3 __x_ABI_CWindows_CUI_CViewManagement_CIUISettings3;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettings3 ABI::Windows::UI::ViewManagement::IUISettings3
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                interface IUISettings3;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIUISettings4_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIUISettings4_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CViewManagement_CIUISettings4 __x_ABI_CWindows_CUI_CViewManagement_CIUISettings4;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettings4 ABI::Windows::UI::ViewManagement::IUISettings4
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                interface IUISettings4;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIUISettings5_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIUISettings5_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CViewManagement_CIUISettings5 __x_ABI_CWindows_CUI_CViewManagement_CIUISettings5;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettings5 ABI::Windows::UI::ViewManagement::IUISettings5
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                interface IUISettings5;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIUISettings6_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIUISettings6_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CViewManagement_CIUISettings6 __x_ABI_CWindows_CUI_CViewManagement_CIUISettings6;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettings6 ABI::Windows::UI::ViewManagement::IUISettings6
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                interface IUISettings6;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIUISettingsAnimationsEnabledChangedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIUISettingsAnimationsEnabledChangedEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CViewManagement_CIUISettingsAnimationsEnabledChangedEventArgs __x_ABI_CWindows_CUI_CViewManagement_CIUISettingsAnimationsEnabledChangedEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettingsAnimationsEnabledChangedEventArgs ABI::Windows::UI::ViewManagement::IUISettingsAnimationsEnabledChangedEventArgs
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                interface IUISettingsAnimationsEnabledChangedEventArgs;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIUISettingsAutoHideScrollBarsChangedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIUISettingsAutoHideScrollBarsChangedEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CViewManagement_CIUISettingsAutoHideScrollBarsChangedEventArgs __x_ABI_CWindows_CUI_CViewManagement_CIUISettingsAutoHideScrollBarsChangedEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettingsAutoHideScrollBarsChangedEventArgs ABI::Windows::UI::ViewManagement::IUISettingsAutoHideScrollBarsChangedEventArgs
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                interface IUISettingsAutoHideScrollBarsChangedEventArgs;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIUISettingsMessageDurationChangedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIUISettingsMessageDurationChangedEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CViewManagement_CIUISettingsMessageDurationChangedEventArgs __x_ABI_CWindows_CUI_CViewManagement_CIUISettingsMessageDurationChangedEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettingsMessageDurationChangedEventArgs ABI::Windows::UI::ViewManagement::IUISettingsMessageDurationChangedEventArgs
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                interface IUISettingsMessageDurationChangedEventArgs;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettings_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettings_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettings __x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettings;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettings ABI::Windows::UI::ViewManagement::IUIViewSettings
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                interface IUIViewSettings;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettingsStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettingsStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettingsStatics __x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettingsStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettingsStatics ABI::Windows::UI::ViewManagement::IUIViewSettingsStatics
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                interface IUIViewSettingsStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIInputPane_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIInputPane_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CViewManagement_CIInputPane __x_ABI_CWindows_CUI_CViewManagement_CIInputPane;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CViewManagement_CIInputPane ABI::Windows::UI::ViewManagement::IInputPane
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                interface IInputPane;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIInputPane2_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIInputPane2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CViewManagement_CIInputPane2 __x_ABI_CWindows_CUI_CViewManagement_CIInputPane2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CViewManagement_CIInputPane2 ABI::Windows::UI::ViewManagement::IInputPane2
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                interface IInputPane2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIInputPaneControl_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIInputPaneControl_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneControl __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneControl;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneControl ABI::Windows::UI::ViewManagement::IInputPaneControl
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                interface IInputPaneControl;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIInputPaneVisibilityEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIInputPaneVisibilityEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneVisibilityEventArgs __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneVisibilityEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneVisibilityEventArgs ABI::Windows::UI::ViewManagement::IInputPaneVisibilityEventArgs
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                interface IInputPaneVisibilityEventArgs;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStatics __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStatics ABI::Windows::UI::ViewManagement::IInputPaneStatics
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                interface IInputPaneStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStatics2_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStatics2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStatics2 __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStatics2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStatics2 ABI::Windows::UI::ViewManagement::IInputPaneStatics2
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                interface IInputPaneStatics2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferences_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferences_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferences __x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferences;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferences ABI::Windows::UI::ViewManagement::IViewModePreferences
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                interface IViewModePreferences;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferencesStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferencesStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferencesStatics __x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferencesStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferencesStatics ABI::Windows::UI::ViewManagement::IViewModePreferencesStatics
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                interface IViewModePreferencesStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CAccessibilitySettings_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CAccessibilitySettings_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                class AccessibilitySettings;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CViewManagement_CAccessibilitySettings __x_ABI_CWindows_CUI_CViewManagement_CAccessibilitySettings;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CViewManagement_CAccessibilitySettings_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CApplicationView_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CApplicationView_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                class ApplicationView;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CViewManagement_CApplicationView __x_ABI_CWindows_CUI_CViewManagement_CApplicationView;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CViewManagement_CApplicationView_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CApplicationViewConsolidatedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CApplicationViewConsolidatedEventArgs_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                class ApplicationViewConsolidatedEventArgs;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CViewManagement_CApplicationViewConsolidatedEventArgs __x_ABI_CWindows_CUI_CViewManagement_CApplicationViewConsolidatedEventArgs;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CViewManagement_CApplicationViewConsolidatedEventArgs_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CApplicationViewScaling_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CApplicationViewScaling_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                class ApplicationViewScaling;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CViewManagement_CApplicationViewScaling __x_ABI_CWindows_CUI_CViewManagement_CApplicationViewScaling;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CViewManagement_CApplicationViewScaling_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CApplicationViewSwitcher_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CApplicationViewSwitcher_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                class ApplicationViewSwitcher;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CViewManagement_CApplicationViewSwitcher __x_ABI_CWindows_CUI_CViewManagement_CApplicationViewSwitcher;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CViewManagement_CApplicationViewSwitcher_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CApplicationViewTitleBar_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CApplicationViewTitleBar_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                class ApplicationViewTitleBar;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CViewManagement_CApplicationViewTitleBar __x_ABI_CWindows_CUI_CViewManagement_CApplicationViewTitleBar;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CViewManagement_CApplicationViewTitleBar_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CApplicationViewTransferContext_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CApplicationViewTransferContext_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                class ApplicationViewTransferContext;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CViewManagement_CApplicationViewTransferContext __x_ABI_CWindows_CUI_CViewManagement_CApplicationViewTransferContext;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CViewManagement_CApplicationViewTransferContext_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CUISettings_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CUISettings_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                class UISettings;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CViewManagement_CUISettings __x_ABI_CWindows_CUI_CViewManagement_CUISettings;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CViewManagement_CUISettings_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CUISettingsAnimationsEnabledChangedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CUISettingsAnimationsEnabledChangedEventArgs_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                class UISettingsAnimationsEnabledChangedEventArgs;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CViewManagement_CUISettingsAnimationsEnabledChangedEventArgs __x_ABI_CWindows_CUI_CViewManagement_CUISettingsAnimationsEnabledChangedEventArgs;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CViewManagement_CUISettingsAnimationsEnabledChangedEventArgs_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CUISettingsAutoHideScrollBarsChangedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CUISettingsAutoHideScrollBarsChangedEventArgs_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                class UISettingsAutoHideScrollBarsChangedEventArgs;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CViewManagement_CUISettingsAutoHideScrollBarsChangedEventArgs __x_ABI_CWindows_CUI_CViewManagement_CUISettingsAutoHideScrollBarsChangedEventArgs;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CViewManagement_CUISettingsAutoHideScrollBarsChangedEventArgs_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CUISettingsMessageDurationChangedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CUISettingsMessageDurationChangedEventArgs_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                class UISettingsMessageDurationChangedEventArgs;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CViewManagement_CUISettingsMessageDurationChangedEventArgs __x_ABI_CWindows_CUI_CViewManagement_CUISettingsMessageDurationChangedEventArgs;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CViewManagement_CUISettingsMessageDurationChangedEventArgs_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CUIViewSettings_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CUIViewSettings_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                class UIViewSettings;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CViewManagement_CUIViewSettings __x_ABI_CWindows_CUI_CViewManagement_CUIViewSettings;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CViewManagement_CUIViewSettings_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CInputPane_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CInputPane_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                class InputPane;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CViewManagement_CInputPane __x_ABI_CWindows_CUI_CViewManagement_CInputPane;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CViewManagement_CInputPane_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CInputPaneVisibilityEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CInputPaneVisibilityEventArgs_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                class InputPaneVisibilityEventArgs;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CViewManagement_CInputPaneVisibilityEventArgs __x_ABI_CWindows_CUI_CViewManagement_CInputPaneVisibilityEventArgs;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CViewManagement_CInputPaneVisibilityEventArgs_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CViewModePreferences_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CViewModePreferences_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                class ViewModePreferences;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CViewManagement_CViewModePreferences __x_ABI_CWindows_CUI_CViewManagement_CViewModePreferences;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CViewManagement_CViewModePreferences_FWD_DEFINED__ */

#ifndef ____FITypedEventHandler_2_Windows__CUI__CViewManagement__CAccessibilitySettings_IInspectable_FWD_DEFINED__
#define ____FITypedEventHandler_2_Windows__CUI__CViewManagement__CAccessibilitySettings_IInspectable_FWD_DEFINED__
typedef interface __FITypedEventHandler_2_Windows__CUI__CViewManagement__CAccessibilitySettings_IInspectable __FITypedEventHandler_2_Windows__CUI__CViewManagement__CAccessibilitySettings_IInspectable;
#ifdef __cplusplus
#define __FITypedEventHandler_2_Windows__CUI__CViewManagement__CAccessibilitySettings_IInspectable ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::UI::ViewManagement::AccessibilitySettings*,IInspectable* >
#endif /* __cplusplus */
#endif

#ifndef ____FITypedEventHandler_2_Windows__CUI__CViewManagement__CApplicationView_IInspectable_FWD_DEFINED__
#define ____FITypedEventHandler_2_Windows__CUI__CViewManagement__CApplicationView_IInspectable_FWD_DEFINED__
typedef interface __FITypedEventHandler_2_Windows__CUI__CViewManagement__CApplicationView_IInspectable __FITypedEventHandler_2_Windows__CUI__CViewManagement__CApplicationView_IInspectable;
#ifdef __cplusplus
#define __FITypedEventHandler_2_Windows__CUI__CViewManagement__CApplicationView_IInspectable ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::UI::ViewManagement::ApplicationView*,IInspectable* >
#endif /* __cplusplus */
#endif

#ifndef ____FITypedEventHandler_2_Windows__CUI__CViewManagement__CApplicationView_Windows__CUI__CViewManagement__CApplicationViewConsolidatedEventArgs_FWD_DEFINED__
#define ____FITypedEventHandler_2_Windows__CUI__CViewManagement__CApplicationView_Windows__CUI__CViewManagement__CApplicationViewConsolidatedEventArgs_FWD_DEFINED__
typedef interface __FITypedEventHandler_2_Windows__CUI__CViewManagement__CApplicationView_Windows__CUI__CViewManagement__CApplicationViewConsolidatedEventArgs __FITypedEventHandler_2_Windows__CUI__CViewManagement__CApplicationView_Windows__CUI__CViewManagement__CApplicationViewConsolidatedEventArgs;
#ifdef __cplusplus
#define __FITypedEventHandler_2_Windows__CUI__CViewManagement__CApplicationView_Windows__CUI__CViewManagement__CApplicationViewConsolidatedEventArgs ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::UI::ViewManagement::ApplicationView*,ABI::Windows::UI::ViewManagement::ApplicationViewConsolidatedEventArgs* >
#endif /* __cplusplus */
#endif

#ifndef ____FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_IInspectable_FWD_DEFINED__
#define ____FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_IInspectable_FWD_DEFINED__
typedef interface __FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_IInspectable __FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_IInspectable;
#ifdef __cplusplus
#define __FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_IInspectable ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::UI::ViewManagement::UISettings*,IInspectable* >
#endif /* __cplusplus */
#endif

#ifndef ____FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsAnimationsEnabledChangedEventArgs_FWD_DEFINED__
#define ____FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsAnimationsEnabledChangedEventArgs_FWD_DEFINED__
typedef interface __FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsAnimationsEnabledChangedEventArgs __FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsAnimationsEnabledChangedEventArgs;
#ifdef __cplusplus
#define __FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsAnimationsEnabledChangedEventArgs ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::UI::ViewManagement::UISettings*,ABI::Windows::UI::ViewManagement::UISettingsAnimationsEnabledChangedEventArgs* >
#endif /* __cplusplus */
#endif

#ifndef ____FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsAutoHideScrollBarsChangedEventArgs_FWD_DEFINED__
#define ____FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsAutoHideScrollBarsChangedEventArgs_FWD_DEFINED__
typedef interface __FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsAutoHideScrollBarsChangedEventArgs __FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsAutoHideScrollBarsChangedEventArgs;
#ifdef __cplusplus
#define __FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsAutoHideScrollBarsChangedEventArgs ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::UI::ViewManagement::UISettings*,ABI::Windows::UI::ViewManagement::UISettingsAutoHideScrollBarsChangedEventArgs* >
#endif /* __cplusplus */
#endif

#ifndef ____FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsMessageDurationChangedEventArgs_FWD_DEFINED__
#define ____FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsMessageDurationChangedEventArgs_FWD_DEFINED__
typedef interface __FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsMessageDurationChangedEventArgs __FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsMessageDurationChangedEventArgs;
#ifdef __cplusplus
#define __FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsMessageDurationChangedEventArgs ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::UI::ViewManagement::UISettings*,ABI::Windows::UI::ViewManagement::UISettingsMessageDurationChangedEventArgs* >
#endif /* __cplusplus */
#endif

#ifndef ____FITypedEventHandler_2_Windows__CUI__CViewManagement__CInputPane_Windows__CUI__CViewManagement__CInputPaneVisibilityEventArgs_FWD_DEFINED__
#define ____FITypedEventHandler_2_Windows__CUI__CViewManagement__CInputPane_Windows__CUI__CViewManagement__CInputPaneVisibilityEventArgs_FWD_DEFINED__
typedef interface __FITypedEventHandler_2_Windows__CUI__CViewManagement__CInputPane_Windows__CUI__CViewManagement__CInputPaneVisibilityEventArgs __FITypedEventHandler_2_Windows__CUI__CViewManagement__CInputPane_Windows__CUI__CViewManagement__CInputPaneVisibilityEventArgs;
#ifdef __cplusplus
#define __FITypedEventHandler_2_Windows__CUI__CViewManagement__CInputPane_Windows__CUI__CViewManagement__CInputPaneVisibilityEventArgs ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::UI::ViewManagement::InputPane*,ABI::Windows::UI::ViewManagement::InputPaneVisibilityEventArgs* >
#endif /* __cplusplus */
#endif

#ifndef ____FIReference_1_UIElementType_FWD_DEFINED__
#define ____FIReference_1_UIElementType_FWD_DEFINED__
typedef interface __FIReference_1_UIElementType __FIReference_1_UIElementType;
#ifdef __cplusplus
#define __FIReference_1_UIElementType ABI::Windows::Foundation::IReference<ABI::Windows::UI::ViewManagement::UIElementType >
#endif /* __cplusplus */
#endif

/* Headers for imported files */

#include <inspectable.h>
#include <asyncinfo.h>
#include <eventtoken.h>
#include <windowscontracts.h>
#include <windows.foundation.h>
#include <windows.devices.enumeration.h>
#include <windows.ui.h>
#include <windows.ui.core.h>
#include <windows.ui.windowmanagement.h>

#ifdef __cplusplus
extern "C" {
#endif

#if !defined(WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION)
#define WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION 0xe0000
#endif // defined(WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION)

#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CApplicationViewBoundsMode_ENUM_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CApplicationViewBoundsMode_ENUM_DEFINED__
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                enum ApplicationViewBoundsMode {
                    ApplicationViewBoundsMode_UseVisible = 0,
                    ApplicationViewBoundsMode_UseCoreWindow = 1
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CUI_CViewManagement_CApplicationViewBoundsMode {
    ApplicationViewBoundsMode_UseVisible = 0,
    ApplicationViewBoundsMode_UseCoreWindow = 1
};
#ifdef WIDL_using_Windows_UI_ViewManagement
#define ApplicationViewBoundsMode __x_ABI_CWindows_CUI_CViewManagement_CApplicationViewBoundsMode
#endif /* WIDL_using_Windows_UI_ViewManagement */
#endif

#endif /* ____x_ABI_CWindows_CUI_CViewManagement_CApplicationViewBoundsMode_ENUM_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CUI_CViewManagement_CApplicationViewBoundsMode __x_ABI_CWindows_CUI_CViewManagement_CApplicationViewBoundsMode;
#endif /* __cplusplus */

#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000
#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CApplicationViewMode_ENUM_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CApplicationViewMode_ENUM_DEFINED__
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                enum ApplicationViewMode {
                    ApplicationViewMode_Default = 0,
                    ApplicationViewMode_CompactOverlay = 1
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CUI_CViewManagement_CApplicationViewMode {
    ApplicationViewMode_Default = 0,
    ApplicationViewMode_CompactOverlay = 1
};
#ifdef WIDL_using_Windows_UI_ViewManagement
#define ApplicationViewMode __x_ABI_CWindows_CUI_CViewManagement_CApplicationViewMode
#endif /* WIDL_using_Windows_UI_ViewManagement */
#endif

#endif /* ____x_ABI_CWindows_CUI_CViewManagement_CApplicationViewMode_ENUM_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000 */
#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CUI_CViewManagement_CApplicationViewMode __x_ABI_CWindows_CUI_CViewManagement_CApplicationViewMode;
#endif /* __cplusplus */

#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CApplicationViewOrientation_ENUM_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CApplicationViewOrientation_ENUM_DEFINED__
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                enum ApplicationViewOrientation {
                    ApplicationViewOrientation_Landscape = 0,
                    ApplicationViewOrientation_Portrait = 1
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CUI_CViewManagement_CApplicationViewOrientation {
    ApplicationViewOrientation_Landscape = 0,
    ApplicationViewOrientation_Portrait = 1
};
#ifdef WIDL_using_Windows_UI_ViewManagement
#define ApplicationViewOrientation __x_ABI_CWindows_CUI_CViewManagement_CApplicationViewOrientation
#endif /* WIDL_using_Windows_UI_ViewManagement */
#endif

#endif /* ____x_ABI_CWindows_CUI_CViewManagement_CApplicationViewOrientation_ENUM_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CUI_CViewManagement_CApplicationViewOrientation __x_ABI_CWindows_CUI_CViewManagement_CApplicationViewOrientation;
#endif /* __cplusplus */

#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CApplicationViewState_ENUM_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CApplicationViewState_ENUM_DEFINED__
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                enum ApplicationViewState {
                    ApplicationViewState_FullScreenLandscape = 0,
                    ApplicationViewState_Filled = 1,
                    ApplicationViewState_Snapped = 2,
                    ApplicationViewState_FullScreenPortrait = 3
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CUI_CViewManagement_CApplicationViewState {
    ApplicationViewState_FullScreenLandscape = 0,
    ApplicationViewState_Filled = 1,
    ApplicationViewState_Snapped = 2,
    ApplicationViewState_FullScreenPortrait = 3
};
#ifdef WIDL_using_Windows_UI_ViewManagement
#define ApplicationViewState __x_ABI_CWindows_CUI_CViewManagement_CApplicationViewState
#endif /* WIDL_using_Windows_UI_ViewManagement */
#endif

#endif /* ____x_ABI_CWindows_CUI_CViewManagement_CApplicationViewState_ENUM_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CUI_CViewManagement_CApplicationViewState __x_ABI_CWindows_CUI_CViewManagement_CApplicationViewState;
#endif /* __cplusplus */

#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CApplicationViewSwitchingOptions_ENUM_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CApplicationViewSwitchingOptions_ENUM_DEFINED__
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                enum ApplicationViewSwitchingOptions {
                    ApplicationViewSwitchingOptions_Default = 0x0,
                    ApplicationViewSwitchingOptions_SkipAnimation = 0x1,
                    ApplicationViewSwitchingOptions_ConsolidateViews = 0x2
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CUI_CViewManagement_CApplicationViewSwitchingOptions {
    ApplicationViewSwitchingOptions_Default = 0x0,
    ApplicationViewSwitchingOptions_SkipAnimation = 0x1,
    ApplicationViewSwitchingOptions_ConsolidateViews = 0x2
};
#ifdef WIDL_using_Windows_UI_ViewManagement
#define ApplicationViewSwitchingOptions __x_ABI_CWindows_CUI_CViewManagement_CApplicationViewSwitchingOptions
#endif /* WIDL_using_Windows_UI_ViewManagement */
#endif

#endif /* ____x_ABI_CWindows_CUI_CViewManagement_CApplicationViewSwitchingOptions_ENUM_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CUI_CViewManagement_CApplicationViewSwitchingOptions __x_ABI_CWindows_CUI_CViewManagement_CApplicationViewSwitchingOptions;
#endif /* __cplusplus */

#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CApplicationViewWindowingMode_ENUM_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CApplicationViewWindowingMode_ENUM_DEFINED__
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                enum ApplicationViewWindowingMode {
                    ApplicationViewWindowingMode_Auto = 0,
                    ApplicationViewWindowingMode_PreferredLaunchViewSize = 1,
                    ApplicationViewWindowingMode_FullScreen = 2,
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x70000
                    ApplicationViewWindowingMode_CompactOverlay = 3,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x70000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x70000
                    ApplicationViewWindowingMode_Maximized = 4
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x70000 */
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CUI_CViewManagement_CApplicationViewWindowingMode {
    ApplicationViewWindowingMode_Auto = 0,
    ApplicationViewWindowingMode_PreferredLaunchViewSize = 1,
    ApplicationViewWindowingMode_FullScreen = 2,
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x70000
    ApplicationViewWindowingMode_CompactOverlay = 3,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x70000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x70000
    ApplicationViewWindowingMode_Maximized = 4
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x70000 */
};
#ifdef WIDL_using_Windows_UI_ViewManagement
#define ApplicationViewWindowingMode __x_ABI_CWindows_CUI_CViewManagement_CApplicationViewWindowingMode
#endif /* WIDL_using_Windows_UI_ViewManagement */
#endif

#endif /* ____x_ABI_CWindows_CUI_CViewManagement_CApplicationViewWindowingMode_ENUM_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CUI_CViewManagement_CApplicationViewWindowingMode __x_ABI_CWindows_CUI_CViewManagement_CApplicationViewWindowingMode;
#endif /* __cplusplus */

#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CFullScreenSystemOverlayMode_ENUM_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CFullScreenSystemOverlayMode_ENUM_DEFINED__
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                enum FullScreenSystemOverlayMode {
                    FullScreenSystemOverlayMode_Standard = 0,
                    FullScreenSystemOverlayMode_Minimal = 1
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CUI_CViewManagement_CFullScreenSystemOverlayMode {
    FullScreenSystemOverlayMode_Standard = 0,
    FullScreenSystemOverlayMode_Minimal = 1
};
#ifdef WIDL_using_Windows_UI_ViewManagement
#define FullScreenSystemOverlayMode __x_ABI_CWindows_CUI_CViewManagement_CFullScreenSystemOverlayMode
#endif /* WIDL_using_Windows_UI_ViewManagement */
#endif

#endif /* ____x_ABI_CWindows_CUI_CViewManagement_CFullScreenSystemOverlayMode_ENUM_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CUI_CViewManagement_CFullScreenSystemOverlayMode __x_ABI_CWindows_CUI_CViewManagement_CFullScreenSystemOverlayMode;
#endif /* __cplusplus */

#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CHandPreference_ENUM_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CHandPreference_ENUM_DEFINED__
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                enum HandPreference {
                    HandPreference_LeftHanded = 0,
                    HandPreference_RightHanded = 1
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CUI_CViewManagement_CHandPreference {
    HandPreference_LeftHanded = 0,
    HandPreference_RightHanded = 1
};
#ifdef WIDL_using_Windows_UI_ViewManagement
#define HandPreference __x_ABI_CWindows_CUI_CViewManagement_CHandPreference
#endif /* WIDL_using_Windows_UI_ViewManagement */
#endif

#endif /* ____x_ABI_CWindows_CUI_CViewManagement_CHandPreference_ENUM_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CUI_CViewManagement_CHandPreference __x_ABI_CWindows_CUI_CViewManagement_CHandPreference;
#endif /* __cplusplus */

#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CUIColorType_ENUM_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CUIColorType_ENUM_DEFINED__
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                enum UIColorType {
                    UIColorType_Background = 0,
                    UIColorType_Foreground = 1,
                    UIColorType_AccentDark3 = 2,
                    UIColorType_AccentDark2 = 3,
                    UIColorType_AccentDark1 = 4,
                    UIColorType_Accent = 5,
                    UIColorType_AccentLight1 = 6,
                    UIColorType_AccentLight2 = 7,
                    UIColorType_AccentLight3 = 8,
                    UIColorType_Complement = 9
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CUI_CViewManagement_CUIColorType {
    UIColorType_Background = 0,
    UIColorType_Foreground = 1,
    UIColorType_AccentDark3 = 2,
    UIColorType_AccentDark2 = 3,
    UIColorType_AccentDark1 = 4,
    UIColorType_Accent = 5,
    UIColorType_AccentLight1 = 6,
    UIColorType_AccentLight2 = 7,
    UIColorType_AccentLight3 = 8,
    UIColorType_Complement = 9
};
#ifdef WIDL_using_Windows_UI_ViewManagement
#define UIColorType __x_ABI_CWindows_CUI_CViewManagement_CUIColorType
#endif /* WIDL_using_Windows_UI_ViewManagement */
#endif

#endif /* ____x_ABI_CWindows_CUI_CViewManagement_CUIColorType_ENUM_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CUI_CViewManagement_CUIColorType __x_ABI_CWindows_CUI_CViewManagement_CUIColorType;
#endif /* __cplusplus */

#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CUIElementType_ENUM_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CUIElementType_ENUM_DEFINED__
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                enum UIElementType {
                    UIElementType_ActiveCaption = 0,
                    UIElementType_Background = 1,
                    UIElementType_ButtonFace = 2,
                    UIElementType_ButtonText = 3,
                    UIElementType_CaptionText = 4,
                    UIElementType_GrayText = 5,
                    UIElementType_Highlight = 6,
                    UIElementType_HighlightText = 7,
                    UIElementType_Hotlight = 8,
                    UIElementType_InactiveCaption = 9,
                    UIElementType_InactiveCaptionText = 10,
                    UIElementType_Window = 11,
                    UIElementType_WindowText = 12,
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
                    UIElementType_AccentColor = 1000,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
                    UIElementType_TextHigh = 1001,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
                    UIElementType_TextMedium = 1002,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
                    UIElementType_TextLow = 1003,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
                    UIElementType_TextContrastWithHigh = 1004,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
                    UIElementType_NonTextHigh = 1005,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
                    UIElementType_NonTextMediumHigh = 1006,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
                    UIElementType_NonTextMedium = 1007,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
                    UIElementType_NonTextMediumLow = 1008,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
                    UIElementType_NonTextLow = 1009,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
                    UIElementType_PageBackground = 1010,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
                    UIElementType_PopupBackground = 1011,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
                    UIElementType_OverlayOutsidePopup = 1012
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CUI_CViewManagement_CUIElementType {
    UIElementType_ActiveCaption = 0,
    UIElementType_Background = 1,
    UIElementType_ButtonFace = 2,
    UIElementType_ButtonText = 3,
    UIElementType_CaptionText = 4,
    UIElementType_GrayText = 5,
    UIElementType_Highlight = 6,
    UIElementType_HighlightText = 7,
    UIElementType_Hotlight = 8,
    UIElementType_InactiveCaption = 9,
    UIElementType_InactiveCaptionText = 10,
    UIElementType_Window = 11,
    UIElementType_WindowText = 12,
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
    UIElementType_AccentColor = 1000,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
    UIElementType_TextHigh = 1001,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
    UIElementType_TextMedium = 1002,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
    UIElementType_TextLow = 1003,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
    UIElementType_TextContrastWithHigh = 1004,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
    UIElementType_NonTextHigh = 1005,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
    UIElementType_NonTextMediumHigh = 1006,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
    UIElementType_NonTextMedium = 1007,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
    UIElementType_NonTextMediumLow = 1008,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
    UIElementType_NonTextLow = 1009,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
    UIElementType_PageBackground = 1010,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
    UIElementType_PopupBackground = 1011,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
    UIElementType_OverlayOutsidePopup = 1012
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
};
#ifdef WIDL_using_Windows_UI_ViewManagement
#define UIElementType __x_ABI_CWindows_CUI_CViewManagement_CUIElementType
#endif /* WIDL_using_Windows_UI_ViewManagement */
#endif

#endif /* ____x_ABI_CWindows_CUI_CViewManagement_CUIElementType_ENUM_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CUI_CViewManagement_CUIElementType __x_ABI_CWindows_CUI_CViewManagement_CUIElementType;
#endif /* __cplusplus */

#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CUserInteractionMode_ENUM_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CUserInteractionMode_ENUM_DEFINED__
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                enum UserInteractionMode {
                    UserInteractionMode_Mouse = 0,
                    UserInteractionMode_Touch = 1
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CUI_CViewManagement_CUserInteractionMode {
    UserInteractionMode_Mouse = 0,
    UserInteractionMode_Touch = 1
};
#ifdef WIDL_using_Windows_UI_ViewManagement
#define UserInteractionMode __x_ABI_CWindows_CUI_CViewManagement_CUserInteractionMode
#endif /* WIDL_using_Windows_UI_ViewManagement */
#endif

#endif /* ____x_ABI_CWindows_CUI_CViewManagement_CUserInteractionMode_ENUM_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CUI_CViewManagement_CUserInteractionMode __x_ABI_CWindows_CUI_CViewManagement_CUserInteractionMode;
#endif /* __cplusplus */

#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CViewSizePreference_ENUM_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CViewSizePreference_ENUM_DEFINED__
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                enum ViewSizePreference {
                    ViewSizePreference_Default = 0,
                    ViewSizePreference_UseLess = 1,
                    ViewSizePreference_UseHalf = 2,
                    ViewSizePreference_UseMore = 3,
                    ViewSizePreference_UseMinimum = 4,
                    ViewSizePreference_UseNone = 5,
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000
                    ViewSizePreference_Custom = 6
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000 */
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CUI_CViewManagement_CViewSizePreference {
    ViewSizePreference_Default = 0,
    ViewSizePreference_UseLess = 1,
    ViewSizePreference_UseHalf = 2,
    ViewSizePreference_UseMore = 3,
    ViewSizePreference_UseMinimum = 4,
    ViewSizePreference_UseNone = 5,
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000
    ViewSizePreference_Custom = 6
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000 */
};
#ifdef WIDL_using_Windows_UI_ViewManagement
#define ViewSizePreference __x_ABI_CWindows_CUI_CViewManagement_CViewSizePreference
#endif /* WIDL_using_Windows_UI_ViewManagement */
#endif

#endif /* ____x_ABI_CWindows_CUI_CViewManagement_CViewSizePreference_ENUM_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CUI_CViewManagement_CViewSizePreference __x_ABI_CWindows_CUI_CViewManagement_CViewSizePreference;
#endif /* __cplusplus */

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIAccessibilitySettings_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIAccessibilitySettings_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CViewManagement_CIAccessibilitySettings __x_ABI_CWindows_CUI_CViewManagement_CIAccessibilitySettings;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CViewManagement_CIAccessibilitySettings ABI::Windows::UI::ViewManagement::IAccessibilitySettings
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                interface IAccessibilitySettings;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationView_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationView_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView ABI::Windows::UI::ViewManagement::IApplicationView
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                interface IApplicationView;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationView2_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationView2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView2 __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView2 ABI::Windows::UI::ViewManagement::IApplicationView2
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                interface IApplicationView2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationView3_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationView3_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView3 __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView3;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView3 ABI::Windows::UI::ViewManagement::IApplicationView3
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                interface IApplicationView3;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationView4_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationView4_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView4 __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView4;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView4 ABI::Windows::UI::ViewManagement::IApplicationView4
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                interface IApplicationView4;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationView7_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationView7_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView7 __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView7;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView7 ABI::Windows::UI::ViewManagement::IApplicationView7
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                interface IApplicationView7;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationView9_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationView9_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView9 __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView9;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView9 ABI::Windows::UI::ViewManagement::IApplicationView9
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                interface IApplicationView9;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs ABI::Windows::UI::ViewManagement::IApplicationViewConsolidatedEventArgs
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                interface IApplicationViewConsolidatedEventArgs;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs2_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs2 __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs2 ABI::Windows::UI::ViewManagement::IApplicationViewConsolidatedEventArgs2
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                interface IApplicationViewConsolidatedEventArgs2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewFullscreenStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewFullscreenStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewFullscreenStatics __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewFullscreenStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewFullscreenStatics ABI::Windows::UI::ViewManagement::IApplicationViewFullscreenStatics
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                interface IApplicationViewFullscreenStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewInteropStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewInteropStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewInteropStatics __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewInteropStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewInteropStatics ABI::Windows::UI::ViewManagement::IApplicationViewInteropStatics
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                interface IApplicationViewInteropStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScaling_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScaling_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScaling __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScaling;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScaling ABI::Windows::UI::ViewManagement::IApplicationViewScaling
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                interface IApplicationViewScaling;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScalingStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScalingStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScalingStatics __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScalingStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScalingStatics ABI::Windows::UI::ViewManagement::IApplicationViewScalingStatics
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                interface IApplicationViewScalingStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics ABI::Windows::UI::ViewManagement::IApplicationViewStatics
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                interface IApplicationViewStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics2_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics2 __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics2 ABI::Windows::UI::ViewManagement::IApplicationViewStatics2
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                interface IApplicationViewStatics2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics3_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics3_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics3 __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics3;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics3 ABI::Windows::UI::ViewManagement::IApplicationViewStatics3
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                interface IApplicationViewStatics3;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics4_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics4_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics4 __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics4;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics4 ABI::Windows::UI::ViewManagement::IApplicationViewStatics4
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                interface IApplicationViewStatics4;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics ABI::Windows::UI::ViewManagement::IApplicationViewSwitcherStatics
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                interface IApplicationViewSwitcherStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics2_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics2 __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics2 ABI::Windows::UI::ViewManagement::IApplicationViewSwitcherStatics2
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                interface IApplicationViewSwitcherStatics2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics3_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics3_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics3 __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics3;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics3 ABI::Windows::UI::ViewManagement::IApplicationViewSwitcherStatics3
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                interface IApplicationViewSwitcherStatics3;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar ABI::Windows::UI::ViewManagement::IApplicationViewTitleBar
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                interface IApplicationViewTitleBar;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContext_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContext_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContext __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContext;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContext ABI::Windows::UI::ViewManagement::IApplicationViewTransferContext
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                interface IApplicationViewTransferContext;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContextStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContextStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContextStatics __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContextStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContextStatics ABI::Windows::UI::ViewManagement::IApplicationViewTransferContextStatics
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                interface IApplicationViewTransferContextStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewWithContext_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewWithContext_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewWithContext __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewWithContext;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewWithContext ABI::Windows::UI::ViewManagement::IApplicationViewWithContext
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                interface IApplicationViewWithContext;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIUISettings_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIUISettings_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CViewManagement_CIUISettings __x_ABI_CWindows_CUI_CViewManagement_CIUISettings;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettings ABI::Windows::UI::ViewManagement::IUISettings
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                interface IUISettings;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIUISettings2_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIUISettings2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CViewManagement_CIUISettings2 __x_ABI_CWindows_CUI_CViewManagement_CIUISettings2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettings2 ABI::Windows::UI::ViewManagement::IUISettings2
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                interface IUISettings2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIUISettings3_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIUISettings3_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CViewManagement_CIUISettings3 __x_ABI_CWindows_CUI_CViewManagement_CIUISettings3;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettings3 ABI::Windows::UI::ViewManagement::IUISettings3
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                interface IUISettings3;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIUISettings4_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIUISettings4_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CViewManagement_CIUISettings4 __x_ABI_CWindows_CUI_CViewManagement_CIUISettings4;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettings4 ABI::Windows::UI::ViewManagement::IUISettings4
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                interface IUISettings4;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIUISettings5_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIUISettings5_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CViewManagement_CIUISettings5 __x_ABI_CWindows_CUI_CViewManagement_CIUISettings5;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettings5 ABI::Windows::UI::ViewManagement::IUISettings5
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                interface IUISettings5;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIUISettings6_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIUISettings6_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CViewManagement_CIUISettings6 __x_ABI_CWindows_CUI_CViewManagement_CIUISettings6;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettings6 ABI::Windows::UI::ViewManagement::IUISettings6
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                interface IUISettings6;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIUISettingsAnimationsEnabledChangedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIUISettingsAnimationsEnabledChangedEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CViewManagement_CIUISettingsAnimationsEnabledChangedEventArgs __x_ABI_CWindows_CUI_CViewManagement_CIUISettingsAnimationsEnabledChangedEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettingsAnimationsEnabledChangedEventArgs ABI::Windows::UI::ViewManagement::IUISettingsAnimationsEnabledChangedEventArgs
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                interface IUISettingsAnimationsEnabledChangedEventArgs;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIUISettingsAutoHideScrollBarsChangedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIUISettingsAutoHideScrollBarsChangedEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CViewManagement_CIUISettingsAutoHideScrollBarsChangedEventArgs __x_ABI_CWindows_CUI_CViewManagement_CIUISettingsAutoHideScrollBarsChangedEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettingsAutoHideScrollBarsChangedEventArgs ABI::Windows::UI::ViewManagement::IUISettingsAutoHideScrollBarsChangedEventArgs
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                interface IUISettingsAutoHideScrollBarsChangedEventArgs;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIUISettingsMessageDurationChangedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIUISettingsMessageDurationChangedEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CViewManagement_CIUISettingsMessageDurationChangedEventArgs __x_ABI_CWindows_CUI_CViewManagement_CIUISettingsMessageDurationChangedEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettingsMessageDurationChangedEventArgs ABI::Windows::UI::ViewManagement::IUISettingsMessageDurationChangedEventArgs
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                interface IUISettingsMessageDurationChangedEventArgs;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettings_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettings_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettings __x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettings;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettings ABI::Windows::UI::ViewManagement::IUIViewSettings
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                interface IUIViewSettings;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettingsStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettingsStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettingsStatics __x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettingsStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettingsStatics ABI::Windows::UI::ViewManagement::IUIViewSettingsStatics
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                interface IUIViewSettingsStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferences_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferences_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferences __x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferences;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferences ABI::Windows::UI::ViewManagement::IViewModePreferences
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                interface IViewModePreferences;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferencesStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferencesStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferencesStatics __x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferencesStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferencesStatics ABI::Windows::UI::ViewManagement::IViewModePreferencesStatics
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                interface IViewModePreferencesStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIInputPane_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIInputPane_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CViewManagement_CIInputPane __x_ABI_CWindows_CUI_CViewManagement_CIInputPane;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CViewManagement_CIInputPane ABI::Windows::UI::ViewManagement::IInputPane
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                interface IInputPane;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIInputPane2_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIInputPane2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CViewManagement_CIInputPane2 __x_ABI_CWindows_CUI_CViewManagement_CIInputPane2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CViewManagement_CIInputPane2 ABI::Windows::UI::ViewManagement::IInputPane2
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                interface IInputPane2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIInputPaneControl_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIInputPaneControl_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneControl __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneControl;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneControl ABI::Windows::UI::ViewManagement::IInputPaneControl
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                interface IInputPaneControl;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIInputPaneVisibilityEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIInputPaneVisibilityEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneVisibilityEventArgs __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneVisibilityEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneVisibilityEventArgs ABI::Windows::UI::ViewManagement::IInputPaneVisibilityEventArgs
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                interface IInputPaneVisibilityEventArgs;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStatics __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStatics ABI::Windows::UI::ViewManagement::IInputPaneStatics
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                interface IInputPaneStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStatics2_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStatics2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStatics2 __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStatics2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStatics2 ABI::Windows::UI::ViewManagement::IInputPaneStatics2
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                interface IInputPaneStatics2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____FIReference_1_UIElementType_FWD_DEFINED__
#define ____FIReference_1_UIElementType_FWD_DEFINED__
typedef interface __FIReference_1_UIElementType __FIReference_1_UIElementType;
#ifdef __cplusplus
#define __FIReference_1_UIElementType ABI::Windows::Foundation::IReference<ABI::Windows::UI::ViewManagement::UIElementType >
#endif /* __cplusplus */
#endif

#if !defined(WINDOWS_UI_VIEWMANAGEMENT_VIEWMANAGEMENTVIEWSCALINGCONTRACT_VERSION)
#define WINDOWS_UI_VIEWMANAGEMENT_VIEWMANAGEMENTVIEWSCALINGCONTRACT_VERSION 0x10000
#endif // defined(WINDOWS_UI_VIEWMANAGEMENT_VIEWMANAGEMENTVIEWSCALINGCONTRACT_VERSION)

/*****************************************************************************
 * IAccessibilitySettings interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIAccessibilitySettings_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIAccessibilitySettings_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CViewManagement_CIAccessibilitySettings, 0xfe0e8147, 0xc4c0, 0x4562, 0xb9,0x62, 0x13,0x27,0xb5,0x2a,0xd5,0xb9);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                MIDL_INTERFACE("fe0e8147-c4c0-4562-b962-1327b52ad5b9")
                IAccessibilitySettings : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_HighContrast(
                        boolean *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_HighContrastScheme(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE add_HighContrastChanged(
                        ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::UI::ViewManagement::AccessibilitySettings*,IInspectable* > *handler,
                        EventRegistrationToken *cookie) = 0;

                    virtual HRESULT STDMETHODCALLTYPE remove_HighContrastChanged(
                        EventRegistrationToken cookie) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CViewManagement_CIAccessibilitySettings, 0xfe0e8147, 0xc4c0, 0x4562, 0xb9,0x62, 0x13,0x27,0xb5,0x2a,0xd5,0xb9)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CViewManagement_CIAccessibilitySettingsVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IAccessibilitySettings methods ***/
    HRESULT (STDMETHODCALLTYPE *get_HighContrast)(
        __x_ABI_CWindows_CUI_CViewManagement_CIAccessibilitySettings *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *get_HighContrastScheme)(
        __x_ABI_CWindows_CUI_CViewManagement_CIAccessibilitySettings *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *add_HighContrastChanged)(
        __x_ABI_CWindows_CUI_CViewManagement_CIAccessibilitySettings *This,
        __FITypedEventHandler_2_Windows__CUI__CViewManagement__CAccessibilitySettings_IInspectable *handler,
        EventRegistrationToken *cookie);

    HRESULT (STDMETHODCALLTYPE *remove_HighContrastChanged)(
        __x_ABI_CWindows_CUI_CViewManagement_CIAccessibilitySettings *This,
        EventRegistrationToken cookie);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CViewManagement_CIAccessibilitySettingsVtbl;

interface __x_ABI_CWindows_CUI_CViewManagement_CIAccessibilitySettings {
    CONST_VTBL __x_ABI_CWindows_CUI_CViewManagement_CIAccessibilitySettingsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIAccessibilitySettings_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CViewManagement_CIAccessibilitySettings_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CViewManagement_CIAccessibilitySettings_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIAccessibilitySettings_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CViewManagement_CIAccessibilitySettings_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CViewManagement_CIAccessibilitySettings_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IAccessibilitySettings methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIAccessibilitySettings_get_HighContrast(This,value) (This)->lpVtbl->get_HighContrast(This,value)
#define __x_ABI_CWindows_CUI_CViewManagement_CIAccessibilitySettings_get_HighContrastScheme(This,value) (This)->lpVtbl->get_HighContrastScheme(This,value)
#define __x_ABI_CWindows_CUI_CViewManagement_CIAccessibilitySettings_add_HighContrastChanged(This,handler,cookie) (This)->lpVtbl->add_HighContrastChanged(This,handler,cookie)
#define __x_ABI_CWindows_CUI_CViewManagement_CIAccessibilitySettings_remove_HighContrastChanged(This,cookie) (This)->lpVtbl->remove_HighContrastChanged(This,cookie)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIAccessibilitySettings_QueryInterface(__x_ABI_CWindows_CUI_CViewManagement_CIAccessibilitySettings* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CViewManagement_CIAccessibilitySettings_AddRef(__x_ABI_CWindows_CUI_CViewManagement_CIAccessibilitySettings* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CViewManagement_CIAccessibilitySettings_Release(__x_ABI_CWindows_CUI_CViewManagement_CIAccessibilitySettings* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIAccessibilitySettings_GetIids(__x_ABI_CWindows_CUI_CViewManagement_CIAccessibilitySettings* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIAccessibilitySettings_GetRuntimeClassName(__x_ABI_CWindows_CUI_CViewManagement_CIAccessibilitySettings* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIAccessibilitySettings_GetTrustLevel(__x_ABI_CWindows_CUI_CViewManagement_CIAccessibilitySettings* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IAccessibilitySettings methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIAccessibilitySettings_get_HighContrast(__x_ABI_CWindows_CUI_CViewManagement_CIAccessibilitySettings* This,boolean *value) {
    return This->lpVtbl->get_HighContrast(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIAccessibilitySettings_get_HighContrastScheme(__x_ABI_CWindows_CUI_CViewManagement_CIAccessibilitySettings* This,HSTRING *value) {
    return This->lpVtbl->get_HighContrastScheme(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIAccessibilitySettings_add_HighContrastChanged(__x_ABI_CWindows_CUI_CViewManagement_CIAccessibilitySettings* This,__FITypedEventHandler_2_Windows__CUI__CViewManagement__CAccessibilitySettings_IInspectable *handler,EventRegistrationToken *cookie) {
    return This->lpVtbl->add_HighContrastChanged(This,handler,cookie);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIAccessibilitySettings_remove_HighContrastChanged(__x_ABI_CWindows_CUI_CViewManagement_CIAccessibilitySettings* This,EventRegistrationToken cookie) {
    return This->lpVtbl->remove_HighContrastChanged(This,cookie);
}
#endif
#ifdef WIDL_using_Windows_UI_ViewManagement
#define IID_IAccessibilitySettings IID___x_ABI_CWindows_CUI_CViewManagement_CIAccessibilitySettings
#define IAccessibilitySettingsVtbl __x_ABI_CWindows_CUI_CViewManagement_CIAccessibilitySettingsVtbl
#define IAccessibilitySettings __x_ABI_CWindows_CUI_CViewManagement_CIAccessibilitySettings
#define IAccessibilitySettings_QueryInterface __x_ABI_CWindows_CUI_CViewManagement_CIAccessibilitySettings_QueryInterface
#define IAccessibilitySettings_AddRef __x_ABI_CWindows_CUI_CViewManagement_CIAccessibilitySettings_AddRef
#define IAccessibilitySettings_Release __x_ABI_CWindows_CUI_CViewManagement_CIAccessibilitySettings_Release
#define IAccessibilitySettings_GetIids __x_ABI_CWindows_CUI_CViewManagement_CIAccessibilitySettings_GetIids
#define IAccessibilitySettings_GetRuntimeClassName __x_ABI_CWindows_CUI_CViewManagement_CIAccessibilitySettings_GetRuntimeClassName
#define IAccessibilitySettings_GetTrustLevel __x_ABI_CWindows_CUI_CViewManagement_CIAccessibilitySettings_GetTrustLevel
#define IAccessibilitySettings_get_HighContrast __x_ABI_CWindows_CUI_CViewManagement_CIAccessibilitySettings_get_HighContrast
#define IAccessibilitySettings_get_HighContrastScheme __x_ABI_CWindows_CUI_CViewManagement_CIAccessibilitySettings_get_HighContrastScheme
#define IAccessibilitySettings_add_HighContrastChanged __x_ABI_CWindows_CUI_CViewManagement_CIAccessibilitySettings_add_HighContrastChanged
#define IAccessibilitySettings_remove_HighContrastChanged __x_ABI_CWindows_CUI_CViewManagement_CIAccessibilitySettings_remove_HighContrastChanged
#endif /* WIDL_using_Windows_UI_ViewManagement */
#endif

#endif

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

/*****************************************************************************
 * IApplicationView interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationView_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationView_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CViewManagement_CIApplicationView, 0xd222d519, 0x4361, 0x451e, 0x96,0xc4, 0x60,0xf4,0xf9,0x74,0x2d,0xb0);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                MIDL_INTERFACE("d222d519-4361-451e-96c4-60f4f9742db0")
                IApplicationView : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_Orientation(
                        ABI::Windows::UI::ViewManagement::ApplicationViewOrientation *value) = 0;

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

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

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

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

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

                    virtual HRESULT STDMETHODCALLTYPE put_IsScreenCaptureEnabled(
                        boolean value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_Title(
                        HSTRING value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Title(
                        HSTRING *value) = 0;

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

                    virtual HRESULT STDMETHODCALLTYPE add_Consolidated(
                        ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::UI::ViewManagement::ApplicationView*,ABI::Windows::UI::ViewManagement::ApplicationViewConsolidatedEventArgs* > *handler,
                        EventRegistrationToken *token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE remove_Consolidated(
                        EventRegistrationToken token) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationView, 0xd222d519, 0x4361, 0x451e, 0x96,0xc4, 0x60,0xf4,0xf9,0x74,0x2d,0xb0)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IApplicationView methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Orientation)(
        __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView *This,
        __x_ABI_CWindows_CUI_CViewManagement_CApplicationViewOrientation *value);

    HRESULT (STDMETHODCALLTYPE *get_AdjacentToLeftDisplayEdge)(
        __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *get_AdjacentToRightDisplayEdge)(
        __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *get_IsFullScreen)(
        __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *get_IsOnLockScreen)(
        __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *get_IsScreenCaptureEnabled)(
        __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *put_IsScreenCaptureEnabled)(
        __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView *This,
        boolean value);

    HRESULT (STDMETHODCALLTYPE *put_Title)(
        __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView *This,
        HSTRING value);

    HRESULT (STDMETHODCALLTYPE *get_Title)(
        __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_Id)(
        __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView *This,
        INT32 *value);

    HRESULT (STDMETHODCALLTYPE *add_Consolidated)(
        __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView *This,
        __FITypedEventHandler_2_Windows__CUI__CViewManagement__CApplicationView_Windows__CUI__CViewManagement__CApplicationViewConsolidatedEventArgs *handler,
        EventRegistrationToken *token);

    HRESULT (STDMETHODCALLTYPE *remove_Consolidated)(
        __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView *This,
        EventRegistrationToken token);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewVtbl;

interface __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView {
    CONST_VTBL __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IApplicationView methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView_get_Orientation(This,value) (This)->lpVtbl->get_Orientation(This,value)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView_get_AdjacentToLeftDisplayEdge(This,value) (This)->lpVtbl->get_AdjacentToLeftDisplayEdge(This,value)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView_get_AdjacentToRightDisplayEdge(This,value) (This)->lpVtbl->get_AdjacentToRightDisplayEdge(This,value)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView_get_IsFullScreen(This,value) (This)->lpVtbl->get_IsFullScreen(This,value)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView_get_IsOnLockScreen(This,value) (This)->lpVtbl->get_IsOnLockScreen(This,value)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView_get_IsScreenCaptureEnabled(This,value) (This)->lpVtbl->get_IsScreenCaptureEnabled(This,value)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView_put_IsScreenCaptureEnabled(This,value) (This)->lpVtbl->put_IsScreenCaptureEnabled(This,value)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView_put_Title(This,value) (This)->lpVtbl->put_Title(This,value)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView_get_Title(This,value) (This)->lpVtbl->get_Title(This,value)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView_get_Id(This,value) (This)->lpVtbl->get_Id(This,value)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView_add_Consolidated(This,handler,token) (This)->lpVtbl->add_Consolidated(This,handler,token)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView_remove_Consolidated(This,token) (This)->lpVtbl->remove_Consolidated(This,token)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView_QueryInterface(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationView* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView_AddRef(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationView* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView_Release(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationView* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView_GetIids(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationView* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView_GetRuntimeClassName(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationView* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView_GetTrustLevel(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationView* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IApplicationView methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView_get_Orientation(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationView* This,__x_ABI_CWindows_CUI_CViewManagement_CApplicationViewOrientation *value) {
    return This->lpVtbl->get_Orientation(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView_get_AdjacentToLeftDisplayEdge(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationView* This,boolean *value) {
    return This->lpVtbl->get_AdjacentToLeftDisplayEdge(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView_get_AdjacentToRightDisplayEdge(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationView* This,boolean *value) {
    return This->lpVtbl->get_AdjacentToRightDisplayEdge(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView_get_IsFullScreen(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationView* This,boolean *value) {
    return This->lpVtbl->get_IsFullScreen(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView_get_IsOnLockScreen(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationView* This,boolean *value) {
    return This->lpVtbl->get_IsOnLockScreen(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView_get_IsScreenCaptureEnabled(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationView* This,boolean *value) {
    return This->lpVtbl->get_IsScreenCaptureEnabled(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView_put_IsScreenCaptureEnabled(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationView* This,boolean value) {
    return This->lpVtbl->put_IsScreenCaptureEnabled(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView_put_Title(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationView* This,HSTRING value) {
    return This->lpVtbl->put_Title(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView_get_Title(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationView* This,HSTRING *value) {
    return This->lpVtbl->get_Title(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView_get_Id(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationView* This,INT32 *value) {
    return This->lpVtbl->get_Id(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView_add_Consolidated(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationView* This,__FITypedEventHandler_2_Windows__CUI__CViewManagement__CApplicationView_Windows__CUI__CViewManagement__CApplicationViewConsolidatedEventArgs *handler,EventRegistrationToken *token) {
    return This->lpVtbl->add_Consolidated(This,handler,token);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView_remove_Consolidated(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationView* This,EventRegistrationToken token) {
    return This->lpVtbl->remove_Consolidated(This,token);
}
#endif
#ifdef WIDL_using_Windows_UI_ViewManagement
#define IID_IApplicationView IID___x_ABI_CWindows_CUI_CViewManagement_CIApplicationView
#define IApplicationViewVtbl __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewVtbl
#define IApplicationView __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView
#define IApplicationView_QueryInterface __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView_QueryInterface
#define IApplicationView_AddRef __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView_AddRef
#define IApplicationView_Release __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView_Release
#define IApplicationView_GetIids __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView_GetIids
#define IApplicationView_GetRuntimeClassName __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView_GetRuntimeClassName
#define IApplicationView_GetTrustLevel __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView_GetTrustLevel
#define IApplicationView_get_Orientation __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView_get_Orientation
#define IApplicationView_get_AdjacentToLeftDisplayEdge __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView_get_AdjacentToLeftDisplayEdge
#define IApplicationView_get_AdjacentToRightDisplayEdge __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView_get_AdjacentToRightDisplayEdge
#define IApplicationView_get_IsFullScreen __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView_get_IsFullScreen
#define IApplicationView_get_IsOnLockScreen __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView_get_IsOnLockScreen
#define IApplicationView_get_IsScreenCaptureEnabled __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView_get_IsScreenCaptureEnabled
#define IApplicationView_put_IsScreenCaptureEnabled __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView_put_IsScreenCaptureEnabled
#define IApplicationView_put_Title __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView_put_Title
#define IApplicationView_get_Title __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView_get_Title
#define IApplicationView_get_Id __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView_get_Id
#define IApplicationView_add_Consolidated __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView_add_Consolidated
#define IApplicationView_remove_Consolidated __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView_remove_Consolidated
#endif /* WIDL_using_Windows_UI_ViewManagement */
#endif

#endif

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

/*****************************************************************************
 * IApplicationView2 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationView2_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationView2_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CViewManagement_CIApplicationView2, 0xe876b196, 0xa545, 0x40dc, 0xb5,0x94, 0x45,0x0c,0xba,0x68,0xcc,0x00);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                MIDL_INTERFACE("e876b196-a545-40dc-b594-450cba68cc00")
                IApplicationView2 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_SuppressSystemOverlays(
                        boolean *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_SuppressSystemOverlays(
                        boolean value) = 0;

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

                    virtual HRESULT STDMETHODCALLTYPE add_VisibleBoundsChanged(
                        ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::UI::ViewManagement::ApplicationView*,IInspectable* > *handler,
                        EventRegistrationToken *token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE remove_VisibleBoundsChanged(
                        EventRegistrationToken token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE SetDesiredBoundsMode(
                        ABI::Windows::UI::ViewManagement::ApplicationViewBoundsMode mode,
                        boolean *success) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_DesiredBoundsMode(
                        ABI::Windows::UI::ViewManagement::ApplicationViewBoundsMode *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationView2, 0xe876b196, 0xa545, 0x40dc, 0xb5,0x94, 0x45,0x0c,0xba,0x68,0xcc,0x00)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView2Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IApplicationView2 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_SuppressSystemOverlays)(
        __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView2 *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *put_SuppressSystemOverlays)(
        __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView2 *This,
        boolean value);

    HRESULT (STDMETHODCALLTYPE *get_VisibleBounds)(
        __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView2 *This,
        __x_ABI_CWindows_CFoundation_CRect *value);

    HRESULT (STDMETHODCALLTYPE *add_VisibleBoundsChanged)(
        __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView2 *This,
        __FITypedEventHandler_2_Windows__CUI__CViewManagement__CApplicationView_IInspectable *handler,
        EventRegistrationToken *token);

    HRESULT (STDMETHODCALLTYPE *remove_VisibleBoundsChanged)(
        __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView2 *This,
        EventRegistrationToken token);

    HRESULT (STDMETHODCALLTYPE *SetDesiredBoundsMode)(
        __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView2 *This,
        __x_ABI_CWindows_CUI_CViewManagement_CApplicationViewBoundsMode mode,
        boolean *success);

    HRESULT (STDMETHODCALLTYPE *get_DesiredBoundsMode)(
        __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView2 *This,
        __x_ABI_CWindows_CUI_CViewManagement_CApplicationViewBoundsMode *value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView2Vtbl;

interface __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView2 {
    CONST_VTBL __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView2_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView2_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView2_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView2_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IApplicationView2 methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView2_get_SuppressSystemOverlays(This,value) (This)->lpVtbl->get_SuppressSystemOverlays(This,value)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView2_put_SuppressSystemOverlays(This,value) (This)->lpVtbl->put_SuppressSystemOverlays(This,value)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView2_get_VisibleBounds(This,value) (This)->lpVtbl->get_VisibleBounds(This,value)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView2_add_VisibleBoundsChanged(This,handler,token) (This)->lpVtbl->add_VisibleBoundsChanged(This,handler,token)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView2_remove_VisibleBoundsChanged(This,token) (This)->lpVtbl->remove_VisibleBoundsChanged(This,token)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView2_SetDesiredBoundsMode(This,mode,success) (This)->lpVtbl->SetDesiredBoundsMode(This,mode,success)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView2_get_DesiredBoundsMode(This,value) (This)->lpVtbl->get_DesiredBoundsMode(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView2_QueryInterface(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationView2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView2_AddRef(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationView2* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView2_Release(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationView2* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView2_GetIids(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationView2* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView2_GetRuntimeClassName(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationView2* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView2_GetTrustLevel(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationView2* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IApplicationView2 methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView2_get_SuppressSystemOverlays(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationView2* This,boolean *value) {
    return This->lpVtbl->get_SuppressSystemOverlays(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView2_put_SuppressSystemOverlays(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationView2* This,boolean value) {
    return This->lpVtbl->put_SuppressSystemOverlays(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView2_get_VisibleBounds(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationView2* This,__x_ABI_CWindows_CFoundation_CRect *value) {
    return This->lpVtbl->get_VisibleBounds(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView2_add_VisibleBoundsChanged(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationView2* This,__FITypedEventHandler_2_Windows__CUI__CViewManagement__CApplicationView_IInspectable *handler,EventRegistrationToken *token) {
    return This->lpVtbl->add_VisibleBoundsChanged(This,handler,token);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView2_remove_VisibleBoundsChanged(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationView2* This,EventRegistrationToken token) {
    return This->lpVtbl->remove_VisibleBoundsChanged(This,token);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView2_SetDesiredBoundsMode(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationView2* This,__x_ABI_CWindows_CUI_CViewManagement_CApplicationViewBoundsMode mode,boolean *success) {
    return This->lpVtbl->SetDesiredBoundsMode(This,mode,success);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView2_get_DesiredBoundsMode(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationView2* This,__x_ABI_CWindows_CUI_CViewManagement_CApplicationViewBoundsMode *value) {
    return This->lpVtbl->get_DesiredBoundsMode(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_ViewManagement
#define IID_IApplicationView2 IID___x_ABI_CWindows_CUI_CViewManagement_CIApplicationView2
#define IApplicationView2Vtbl __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView2Vtbl
#define IApplicationView2 __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView2
#define IApplicationView2_QueryInterface __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView2_QueryInterface
#define IApplicationView2_AddRef __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView2_AddRef
#define IApplicationView2_Release __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView2_Release
#define IApplicationView2_GetIids __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView2_GetIids
#define IApplicationView2_GetRuntimeClassName __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView2_GetRuntimeClassName
#define IApplicationView2_GetTrustLevel __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView2_GetTrustLevel
#define IApplicationView2_get_SuppressSystemOverlays __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView2_get_SuppressSystemOverlays
#define IApplicationView2_put_SuppressSystemOverlays __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView2_put_SuppressSystemOverlays
#define IApplicationView2_get_VisibleBounds __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView2_get_VisibleBounds
#define IApplicationView2_add_VisibleBoundsChanged __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView2_add_VisibleBoundsChanged
#define IApplicationView2_remove_VisibleBoundsChanged __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView2_remove_VisibleBoundsChanged
#define IApplicationView2_SetDesiredBoundsMode __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView2_SetDesiredBoundsMode
#define IApplicationView2_get_DesiredBoundsMode __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView2_get_DesiredBoundsMode
#endif /* WIDL_using_Windows_UI_ViewManagement */
#endif

#endif

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

/*****************************************************************************
 * IApplicationView3 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationView3_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationView3_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CViewManagement_CIApplicationView3, 0x903c9ce5, 0x793a, 0x4fdf, 0xa2,0xb2, 0xaf,0x1a,0xc2,0x1e,0x31,0x08);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                MIDL_INTERFACE("903c9ce5-793a-4fdf-a2b2-af1ac21e3108")
                IApplicationView3 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_TitleBar(
                        ABI::Windows::UI::ViewManagement::IApplicationViewTitleBar **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_FullScreenSystemOverlayMode(
                        ABI::Windows::UI::ViewManagement::FullScreenSystemOverlayMode *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_FullScreenSystemOverlayMode(
                        ABI::Windows::UI::ViewManagement::FullScreenSystemOverlayMode value) = 0;

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

                    virtual HRESULT STDMETHODCALLTYPE TryEnterFullScreenMode(
                        boolean *success) = 0;

                    virtual HRESULT STDMETHODCALLTYPE ExitFullScreenMode(
                        ) = 0;

                    virtual HRESULT STDMETHODCALLTYPE ShowStandardSystemOverlays(
                        ) = 0;

                    virtual HRESULT STDMETHODCALLTYPE TryResizeView(
                        ABI::Windows::Foundation::Size value,
                        boolean *success) = 0;

                    virtual HRESULT STDMETHODCALLTYPE SetPreferredMinSize(
                        ABI::Windows::Foundation::Size size) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationView3, 0x903c9ce5, 0x793a, 0x4fdf, 0xa2,0xb2, 0xaf,0x1a,0xc2,0x1e,0x31,0x08)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView3Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IApplicationView3 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_TitleBar)(
        __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView3 *This,
        __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar **value);

    HRESULT (STDMETHODCALLTYPE *get_FullScreenSystemOverlayMode)(
        __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView3 *This,
        __x_ABI_CWindows_CUI_CViewManagement_CFullScreenSystemOverlayMode *value);

    HRESULT (STDMETHODCALLTYPE *put_FullScreenSystemOverlayMode)(
        __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView3 *This,
        __x_ABI_CWindows_CUI_CViewManagement_CFullScreenSystemOverlayMode value);

    HRESULT (STDMETHODCALLTYPE *get_IsFullScreenMode)(
        __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView3 *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *TryEnterFullScreenMode)(
        __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView3 *This,
        boolean *success);

    HRESULT (STDMETHODCALLTYPE *ExitFullScreenMode)(
        __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView3 *This);

    HRESULT (STDMETHODCALLTYPE *ShowStandardSystemOverlays)(
        __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView3 *This);

    HRESULT (STDMETHODCALLTYPE *TryResizeView)(
        __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView3 *This,
        __x_ABI_CWindows_CFoundation_CSize value,
        boolean *success);

    HRESULT (STDMETHODCALLTYPE *SetPreferredMinSize)(
        __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView3 *This,
        __x_ABI_CWindows_CFoundation_CSize size);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView3Vtbl;

interface __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView3 {
    CONST_VTBL __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView3_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView3_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView3_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView3_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IApplicationView3 methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView3_get_TitleBar(This,value) (This)->lpVtbl->get_TitleBar(This,value)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView3_get_FullScreenSystemOverlayMode(This,value) (This)->lpVtbl->get_FullScreenSystemOverlayMode(This,value)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView3_put_FullScreenSystemOverlayMode(This,value) (This)->lpVtbl->put_FullScreenSystemOverlayMode(This,value)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView3_get_IsFullScreenMode(This,value) (This)->lpVtbl->get_IsFullScreenMode(This,value)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView3_TryEnterFullScreenMode(This,success) (This)->lpVtbl->TryEnterFullScreenMode(This,success)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView3_ExitFullScreenMode(This) (This)->lpVtbl->ExitFullScreenMode(This)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView3_ShowStandardSystemOverlays(This) (This)->lpVtbl->ShowStandardSystemOverlays(This)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView3_TryResizeView(This,value,success) (This)->lpVtbl->TryResizeView(This,value,success)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView3_SetPreferredMinSize(This,size) (This)->lpVtbl->SetPreferredMinSize(This,size)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView3_QueryInterface(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationView3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView3_AddRef(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationView3* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView3_Release(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationView3* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView3_GetIids(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationView3* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView3_GetRuntimeClassName(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationView3* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView3_GetTrustLevel(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationView3* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IApplicationView3 methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView3_get_TitleBar(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationView3* This,__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar **value) {
    return This->lpVtbl->get_TitleBar(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView3_get_FullScreenSystemOverlayMode(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationView3* This,__x_ABI_CWindows_CUI_CViewManagement_CFullScreenSystemOverlayMode *value) {
    return This->lpVtbl->get_FullScreenSystemOverlayMode(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView3_put_FullScreenSystemOverlayMode(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationView3* This,__x_ABI_CWindows_CUI_CViewManagement_CFullScreenSystemOverlayMode value) {
    return This->lpVtbl->put_FullScreenSystemOverlayMode(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView3_get_IsFullScreenMode(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationView3* This,boolean *value) {
    return This->lpVtbl->get_IsFullScreenMode(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView3_TryEnterFullScreenMode(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationView3* This,boolean *success) {
    return This->lpVtbl->TryEnterFullScreenMode(This,success);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView3_ExitFullScreenMode(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationView3* This) {
    return This->lpVtbl->ExitFullScreenMode(This);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView3_ShowStandardSystemOverlays(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationView3* This) {
    return This->lpVtbl->ShowStandardSystemOverlays(This);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView3_TryResizeView(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationView3* This,__x_ABI_CWindows_CFoundation_CSize value,boolean *success) {
    return This->lpVtbl->TryResizeView(This,value,success);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView3_SetPreferredMinSize(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationView3* This,__x_ABI_CWindows_CFoundation_CSize size) {
    return This->lpVtbl->SetPreferredMinSize(This,size);
}
#endif
#ifdef WIDL_using_Windows_UI_ViewManagement
#define IID_IApplicationView3 IID___x_ABI_CWindows_CUI_CViewManagement_CIApplicationView3
#define IApplicationView3Vtbl __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView3Vtbl
#define IApplicationView3 __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView3
#define IApplicationView3_QueryInterface __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView3_QueryInterface
#define IApplicationView3_AddRef __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView3_AddRef
#define IApplicationView3_Release __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView3_Release
#define IApplicationView3_GetIids __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView3_GetIids
#define IApplicationView3_GetRuntimeClassName __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView3_GetRuntimeClassName
#define IApplicationView3_GetTrustLevel __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView3_GetTrustLevel
#define IApplicationView3_get_TitleBar __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView3_get_TitleBar
#define IApplicationView3_get_FullScreenSystemOverlayMode __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView3_get_FullScreenSystemOverlayMode
#define IApplicationView3_put_FullScreenSystemOverlayMode __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView3_put_FullScreenSystemOverlayMode
#define IApplicationView3_get_IsFullScreenMode __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView3_get_IsFullScreenMode
#define IApplicationView3_TryEnterFullScreenMode __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView3_TryEnterFullScreenMode
#define IApplicationView3_ExitFullScreenMode __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView3_ExitFullScreenMode
#define IApplicationView3_ShowStandardSystemOverlays __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView3_ShowStandardSystemOverlays
#define IApplicationView3_TryResizeView __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView3_TryResizeView
#define IApplicationView3_SetPreferredMinSize __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView3_SetPreferredMinSize
#endif /* WIDL_using_Windows_UI_ViewManagement */
#endif

#endif

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

/*****************************************************************************
 * IApplicationView4 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000
#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationView4_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationView4_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CViewManagement_CIApplicationView4, 0x15e5cbec, 0x9e0f, 0x46b5, 0xbc,0x3f, 0x9b,0xf6,0x53,0xe7,0x4b,0x5e);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                MIDL_INTERFACE("15e5cbec-9e0f-46b5-bc3f-9bf653e74b5e")
                IApplicationView4 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_ViewMode(
                        ABI::Windows::UI::ViewManagement::ApplicationViewMode *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE IsViewModeSupported(
                        ABI::Windows::UI::ViewManagement::ApplicationViewMode mode,
                        boolean *is_mode_supported) = 0;

                    virtual HRESULT STDMETHODCALLTYPE TryEnterViewModeAsync(
                        ABI::Windows::UI::ViewManagement::ApplicationViewMode mode,
                        ABI::Windows::Foundation::IAsyncOperation<boolean > **operation) = 0;

                    virtual HRESULT STDMETHODCALLTYPE TryEnterViewModeWithPreferencesAsync(
                        ABI::Windows::UI::ViewManagement::ApplicationViewMode mode,
                        ABI::Windows::UI::ViewManagement::IViewModePreferences *preferences,
                        ABI::Windows::Foundation::IAsyncOperation<boolean > **operation) = 0;

                    virtual HRESULT STDMETHODCALLTYPE TryConsolidateAsync(
                        ABI::Windows::Foundation::IAsyncOperation<boolean > **operation) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationView4, 0x15e5cbec, 0x9e0f, 0x46b5, 0xbc,0x3f, 0x9b,0xf6,0x53,0xe7,0x4b,0x5e)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView4Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IApplicationView4 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_ViewMode)(
        __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView4 *This,
        __x_ABI_CWindows_CUI_CViewManagement_CApplicationViewMode *value);

    HRESULT (STDMETHODCALLTYPE *IsViewModeSupported)(
        __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView4 *This,
        __x_ABI_CWindows_CUI_CViewManagement_CApplicationViewMode mode,
        boolean *is_mode_supported);

    HRESULT (STDMETHODCALLTYPE *TryEnterViewModeAsync)(
        __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView4 *This,
        __x_ABI_CWindows_CUI_CViewManagement_CApplicationViewMode mode,
        __FIAsyncOperation_1_boolean **operation);

    HRESULT (STDMETHODCALLTYPE *TryEnterViewModeWithPreferencesAsync)(
        __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView4 *This,
        __x_ABI_CWindows_CUI_CViewManagement_CApplicationViewMode mode,
        __x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferences *preferences,
        __FIAsyncOperation_1_boolean **operation);

    HRESULT (STDMETHODCALLTYPE *TryConsolidateAsync)(
        __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView4 *This,
        __FIAsyncOperation_1_boolean **operation);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView4Vtbl;

interface __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView4 {
    CONST_VTBL __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView4Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView4_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView4_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView4_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView4_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView4_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView4_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IApplicationView4 methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView4_get_ViewMode(This,value) (This)->lpVtbl->get_ViewMode(This,value)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView4_IsViewModeSupported(This,mode,is_mode_supported) (This)->lpVtbl->IsViewModeSupported(This,mode,is_mode_supported)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView4_TryEnterViewModeAsync(This,mode,operation) (This)->lpVtbl->TryEnterViewModeAsync(This,mode,operation)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView4_TryEnterViewModeWithPreferencesAsync(This,mode,preferences,operation) (This)->lpVtbl->TryEnterViewModeWithPreferencesAsync(This,mode,preferences,operation)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView4_TryConsolidateAsync(This,operation) (This)->lpVtbl->TryConsolidateAsync(This,operation)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView4_QueryInterface(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationView4* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView4_AddRef(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationView4* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView4_Release(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationView4* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView4_GetIids(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationView4* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView4_GetRuntimeClassName(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationView4* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView4_GetTrustLevel(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationView4* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IApplicationView4 methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView4_get_ViewMode(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationView4* This,__x_ABI_CWindows_CUI_CViewManagement_CApplicationViewMode *value) {
    return This->lpVtbl->get_ViewMode(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView4_IsViewModeSupported(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationView4* This,__x_ABI_CWindows_CUI_CViewManagement_CApplicationViewMode mode,boolean *is_mode_supported) {
    return This->lpVtbl->IsViewModeSupported(This,mode,is_mode_supported);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView4_TryEnterViewModeAsync(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationView4* This,__x_ABI_CWindows_CUI_CViewManagement_CApplicationViewMode mode,__FIAsyncOperation_1_boolean **operation) {
    return This->lpVtbl->TryEnterViewModeAsync(This,mode,operation);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView4_TryEnterViewModeWithPreferencesAsync(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationView4* This,__x_ABI_CWindows_CUI_CViewManagement_CApplicationViewMode mode,__x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferences *preferences,__FIAsyncOperation_1_boolean **operation) {
    return This->lpVtbl->TryEnterViewModeWithPreferencesAsync(This,mode,preferences,operation);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView4_TryConsolidateAsync(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationView4* This,__FIAsyncOperation_1_boolean **operation) {
    return This->lpVtbl->TryConsolidateAsync(This,operation);
}
#endif
#ifdef WIDL_using_Windows_UI_ViewManagement
#define IID_IApplicationView4 IID___x_ABI_CWindows_CUI_CViewManagement_CIApplicationView4
#define IApplicationView4Vtbl __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView4Vtbl
#define IApplicationView4 __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView4
#define IApplicationView4_QueryInterface __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView4_QueryInterface
#define IApplicationView4_AddRef __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView4_AddRef
#define IApplicationView4_Release __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView4_Release
#define IApplicationView4_GetIids __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView4_GetIids
#define IApplicationView4_GetRuntimeClassName __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView4_GetRuntimeClassName
#define IApplicationView4_GetTrustLevel __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView4_GetTrustLevel
#define IApplicationView4_get_ViewMode __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView4_get_ViewMode
#define IApplicationView4_IsViewModeSupported __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView4_IsViewModeSupported
#define IApplicationView4_TryEnterViewModeAsync __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView4_TryEnterViewModeAsync
#define IApplicationView4_TryEnterViewModeWithPreferencesAsync __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView4_TryEnterViewModeWithPreferencesAsync
#define IApplicationView4_TryConsolidateAsync __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView4_TryConsolidateAsync
#endif /* WIDL_using_Windows_UI_ViewManagement */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationView4_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000 */

/*****************************************************************************
 * IApplicationView7 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000
#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationView7_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationView7_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CViewManagement_CIApplicationView7, 0xa0369647, 0x5faf, 0x5aa6, 0x9c,0x38, 0xbe,0xfb,0xb1,0x2a,0x07,0x1e);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                MIDL_INTERFACE("a0369647-5faf-5aa6-9c38-befbb12a071e")
                IApplicationView7 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_PersistedStateId(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_PersistedStateId(
                        HSTRING value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationView7, 0xa0369647, 0x5faf, 0x5aa6, 0x9c,0x38, 0xbe,0xfb,0xb1,0x2a,0x07,0x1e)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView7Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IApplicationView7 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_PersistedStateId)(
        __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView7 *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *put_PersistedStateId)(
        __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView7 *This,
        HSTRING value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView7Vtbl;

interface __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView7 {
    CONST_VTBL __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView7Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView7_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView7_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView7_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView7_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView7_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView7_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IApplicationView7 methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView7_get_PersistedStateId(This,value) (This)->lpVtbl->get_PersistedStateId(This,value)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView7_put_PersistedStateId(This,value) (This)->lpVtbl->put_PersistedStateId(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView7_QueryInterface(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationView7* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView7_AddRef(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationView7* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView7_Release(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationView7* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView7_GetIids(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationView7* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView7_GetRuntimeClassName(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationView7* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView7_GetTrustLevel(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationView7* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IApplicationView7 methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView7_get_PersistedStateId(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationView7* This,HSTRING *value) {
    return This->lpVtbl->get_PersistedStateId(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView7_put_PersistedStateId(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationView7* This,HSTRING value) {
    return This->lpVtbl->put_PersistedStateId(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_ViewManagement
#define IID_IApplicationView7 IID___x_ABI_CWindows_CUI_CViewManagement_CIApplicationView7
#define IApplicationView7Vtbl __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView7Vtbl
#define IApplicationView7 __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView7
#define IApplicationView7_QueryInterface __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView7_QueryInterface
#define IApplicationView7_AddRef __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView7_AddRef
#define IApplicationView7_Release __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView7_Release
#define IApplicationView7_GetIids __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView7_GetIids
#define IApplicationView7_GetRuntimeClassName __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView7_GetRuntimeClassName
#define IApplicationView7_GetTrustLevel __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView7_GetTrustLevel
#define IApplicationView7_get_PersistedStateId __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView7_get_PersistedStateId
#define IApplicationView7_put_PersistedStateId __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView7_put_PersistedStateId
#endif /* WIDL_using_Windows_UI_ViewManagement */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationView7_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000 */

/*****************************************************************************
 * IApplicationView9 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000
#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationView9_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationView9_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CViewManagement_CIApplicationView9, 0x9c6516f9, 0x021a, 0x5f01, 0x93,0xe5, 0x9b,0xda,0xd2,0x64,0x75,0x74);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                MIDL_INTERFACE("9c6516f9-021a-5f01-93e5-9bdad2647574")
                IApplicationView9 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_WindowingEnvironment(
                        ABI::Windows::UI::WindowManagement::IWindowingEnvironment **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE GetDisplayRegions(
                        ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::WindowManagement::DisplayRegion* > **result) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationView9, 0x9c6516f9, 0x021a, 0x5f01, 0x93,0xe5, 0x9b,0xda,0xd2,0x64,0x75,0x74)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView9Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IApplicationView9 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_WindowingEnvironment)(
        __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView9 *This,
        __x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironment **value);

    HRESULT (STDMETHODCALLTYPE *GetDisplayRegions)(
        __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView9 *This,
        __FIVectorView_1_Windows__CUI__CWindowManagement__CDisplayRegion **result);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView9Vtbl;

interface __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView9 {
    CONST_VTBL __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView9Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView9_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView9_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView9_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView9_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView9_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView9_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IApplicationView9 methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView9_get_WindowingEnvironment(This,value) (This)->lpVtbl->get_WindowingEnvironment(This,value)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView9_GetDisplayRegions(This,result) (This)->lpVtbl->GetDisplayRegions(This,result)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView9_QueryInterface(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationView9* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView9_AddRef(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationView9* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView9_Release(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationView9* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView9_GetIids(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationView9* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView9_GetRuntimeClassName(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationView9* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView9_GetTrustLevel(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationView9* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IApplicationView9 methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView9_get_WindowingEnvironment(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationView9* This,__x_ABI_CWindows_CUI_CWindowManagement_CIWindowingEnvironment **value) {
    return This->lpVtbl->get_WindowingEnvironment(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView9_GetDisplayRegions(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationView9* This,__FIVectorView_1_Windows__CUI__CWindowManagement__CDisplayRegion **result) {
    return This->lpVtbl->GetDisplayRegions(This,result);
}
#endif
#ifdef WIDL_using_Windows_UI_ViewManagement
#define IID_IApplicationView9 IID___x_ABI_CWindows_CUI_CViewManagement_CIApplicationView9
#define IApplicationView9Vtbl __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView9Vtbl
#define IApplicationView9 __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView9
#define IApplicationView9_QueryInterface __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView9_QueryInterface
#define IApplicationView9_AddRef __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView9_AddRef
#define IApplicationView9_Release __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView9_Release
#define IApplicationView9_GetIids __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView9_GetIids
#define IApplicationView9_GetRuntimeClassName __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView9_GetRuntimeClassName
#define IApplicationView9_GetTrustLevel __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView9_GetTrustLevel
#define IApplicationView9_get_WindowingEnvironment __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView9_get_WindowingEnvironment
#define IApplicationView9_GetDisplayRegions __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView9_GetDisplayRegions
#endif /* WIDL_using_Windows_UI_ViewManagement */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationView9_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000 */

/*****************************************************************************
 * IApplicationViewConsolidatedEventArgs interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs, 0x514449ec, 0x7ea2, 0x4de7, 0xa6,0xa6, 0x7d,0xfb,0xaa,0xeb,0xb6,0xfb);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                MIDL_INTERFACE("514449ec-7ea2-4de7-a6a6-7dfbaaebb6fb")
                IApplicationViewConsolidatedEventArgs : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_IsUserInitiated(
                        boolean *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs, 0x514449ec, 0x7ea2, 0x4de7, 0xa6,0xa6, 0x7d,0xfb,0xaa,0xeb,0xb6,0xfb)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgsVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IApplicationViewConsolidatedEventArgs methods ***/
    HRESULT (STDMETHODCALLTYPE *get_IsUserInitiated)(
        __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs *This,
        boolean *value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgsVtbl;

interface __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs {
    CONST_VTBL __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IApplicationViewConsolidatedEventArgs methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs_get_IsUserInitiated(This,value) (This)->lpVtbl->get_IsUserInitiated(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs_QueryInterface(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs_AddRef(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs_Release(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs_GetIids(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs_GetRuntimeClassName(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs_GetTrustLevel(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IApplicationViewConsolidatedEventArgs methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs_get_IsUserInitiated(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs* This,boolean *value) {
    return This->lpVtbl->get_IsUserInitiated(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_ViewManagement
#define IID_IApplicationViewConsolidatedEventArgs IID___x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs
#define IApplicationViewConsolidatedEventArgsVtbl __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgsVtbl
#define IApplicationViewConsolidatedEventArgs __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs
#define IApplicationViewConsolidatedEventArgs_QueryInterface __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs_QueryInterface
#define IApplicationViewConsolidatedEventArgs_AddRef __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs_AddRef
#define IApplicationViewConsolidatedEventArgs_Release __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs_Release
#define IApplicationViewConsolidatedEventArgs_GetIids __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs_GetIids
#define IApplicationViewConsolidatedEventArgs_GetRuntimeClassName __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs_GetRuntimeClassName
#define IApplicationViewConsolidatedEventArgs_GetTrustLevel __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs_GetTrustLevel
#define IApplicationViewConsolidatedEventArgs_get_IsUserInitiated __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs_get_IsUserInitiated
#endif /* WIDL_using_Windows_UI_ViewManagement */
#endif

#endif

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

/*****************************************************************************
 * IApplicationViewConsolidatedEventArgs2 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000
#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs2_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs2_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs2, 0x1c199ecc, 0x6dc1, 0x40f4, 0xaf,0xee, 0x07,0xd9,0xea,0x29,0x64,0x30);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                MIDL_INTERFACE("1c199ecc-6dc1-40f4-afee-07d9ea296430")
                IApplicationViewConsolidatedEventArgs2 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_IsAppInitiated(
                        boolean *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs2, 0x1c199ecc, 0x6dc1, 0x40f4, 0xaf,0xee, 0x07,0xd9,0xea,0x29,0x64,0x30)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs2Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IApplicationViewConsolidatedEventArgs2 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_IsAppInitiated)(
        __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs2 *This,
        boolean *value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs2Vtbl;

interface __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs2 {
    CONST_VTBL __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs2_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs2_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs2_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs2_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IApplicationViewConsolidatedEventArgs2 methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs2_get_IsAppInitiated(This,value) (This)->lpVtbl->get_IsAppInitiated(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs2_QueryInterface(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs2_AddRef(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs2* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs2_Release(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs2* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs2_GetIids(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs2* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs2_GetRuntimeClassName(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs2* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs2_GetTrustLevel(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs2* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IApplicationViewConsolidatedEventArgs2 methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs2_get_IsAppInitiated(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs2* This,boolean *value) {
    return This->lpVtbl->get_IsAppInitiated(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_ViewManagement
#define IID_IApplicationViewConsolidatedEventArgs2 IID___x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs2
#define IApplicationViewConsolidatedEventArgs2Vtbl __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs2Vtbl
#define IApplicationViewConsolidatedEventArgs2 __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs2
#define IApplicationViewConsolidatedEventArgs2_QueryInterface __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs2_QueryInterface
#define IApplicationViewConsolidatedEventArgs2_AddRef __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs2_AddRef
#define IApplicationViewConsolidatedEventArgs2_Release __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs2_Release
#define IApplicationViewConsolidatedEventArgs2_GetIids __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs2_GetIids
#define IApplicationViewConsolidatedEventArgs2_GetRuntimeClassName __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs2_GetRuntimeClassName
#define IApplicationViewConsolidatedEventArgs2_GetTrustLevel __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs2_GetTrustLevel
#define IApplicationViewConsolidatedEventArgs2_get_IsAppInitiated __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs2_get_IsAppInitiated
#endif /* WIDL_using_Windows_UI_ViewManagement */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs2_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000 */

/*****************************************************************************
 * IApplicationViewFullscreenStatics interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewFullscreenStatics_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewFullscreenStatics_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewFullscreenStatics, 0xbc792ebd, 0x64fe, 0x4b65, 0xa0,0xc0, 0x90,0x1c,0xe2,0xb6,0x86,0x36);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                MIDL_INTERFACE("bc792ebd-64fe-4b65-a0c0-901ce2b68636")
                IApplicationViewFullscreenStatics : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE TryUnsnapToFullscreen(
                        boolean *success) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewFullscreenStatics, 0xbc792ebd, 0x64fe, 0x4b65, 0xa0,0xc0, 0x90,0x1c,0xe2,0xb6,0x86,0x36)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewFullscreenStaticsVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IApplicationViewFullscreenStatics methods ***/
    HRESULT (STDMETHODCALLTYPE *TryUnsnapToFullscreen)(
        __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewFullscreenStatics *This,
        boolean *success);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewFullscreenStaticsVtbl;

interface __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewFullscreenStatics {
    CONST_VTBL __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewFullscreenStaticsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewFullscreenStatics_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewFullscreenStatics_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewFullscreenStatics_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewFullscreenStatics_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewFullscreenStatics_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewFullscreenStatics_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IApplicationViewFullscreenStatics methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewFullscreenStatics_TryUnsnapToFullscreen(This,success) (This)->lpVtbl->TryUnsnapToFullscreen(This,success)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewFullscreenStatics_QueryInterface(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewFullscreenStatics* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewFullscreenStatics_AddRef(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewFullscreenStatics* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewFullscreenStatics_Release(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewFullscreenStatics* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewFullscreenStatics_GetIids(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewFullscreenStatics* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewFullscreenStatics_GetRuntimeClassName(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewFullscreenStatics* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewFullscreenStatics_GetTrustLevel(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewFullscreenStatics* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IApplicationViewFullscreenStatics methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewFullscreenStatics_TryUnsnapToFullscreen(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewFullscreenStatics* This,boolean *success) {
    return This->lpVtbl->TryUnsnapToFullscreen(This,success);
}
#endif
#ifdef WIDL_using_Windows_UI_ViewManagement
#define IID_IApplicationViewFullscreenStatics IID___x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewFullscreenStatics
#define IApplicationViewFullscreenStaticsVtbl __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewFullscreenStaticsVtbl
#define IApplicationViewFullscreenStatics __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewFullscreenStatics
#define IApplicationViewFullscreenStatics_QueryInterface __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewFullscreenStatics_QueryInterface
#define IApplicationViewFullscreenStatics_AddRef __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewFullscreenStatics_AddRef
#define IApplicationViewFullscreenStatics_Release __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewFullscreenStatics_Release
#define IApplicationViewFullscreenStatics_GetIids __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewFullscreenStatics_GetIids
#define IApplicationViewFullscreenStatics_GetRuntimeClassName __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewFullscreenStatics_GetRuntimeClassName
#define IApplicationViewFullscreenStatics_GetTrustLevel __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewFullscreenStatics_GetTrustLevel
#define IApplicationViewFullscreenStatics_TryUnsnapToFullscreen __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewFullscreenStatics_TryUnsnapToFullscreen
#endif /* WIDL_using_Windows_UI_ViewManagement */
#endif

#endif

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

/*****************************************************************************
 * IApplicationViewInteropStatics interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewInteropStatics_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewInteropStatics_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewInteropStatics, 0xc446fb5d, 0x4793, 0x4896, 0xa8,0xe2, 0xbe,0x57,0xa8,0xbb,0x0f,0x50);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                MIDL_INTERFACE("c446fb5d-4793-4896-a8e2-be57a8bb0f50")
                IApplicationViewInteropStatics : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE GetApplicationViewIdForWindow(
                        ABI::Windows::UI::Core::ICoreWindow *window,
                        INT32 *id) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewInteropStatics, 0xc446fb5d, 0x4793, 0x4896, 0xa8,0xe2, 0xbe,0x57,0xa8,0xbb,0x0f,0x50)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewInteropStaticsVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IApplicationViewInteropStatics methods ***/
    HRESULT (STDMETHODCALLTYPE *GetApplicationViewIdForWindow)(
        __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewInteropStatics *This,
        __x_ABI_CWindows_CUI_CCore_CICoreWindow *window,
        INT32 *id);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewInteropStaticsVtbl;

interface __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewInteropStatics {
    CONST_VTBL __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewInteropStaticsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewInteropStatics_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewInteropStatics_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewInteropStatics_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewInteropStatics_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewInteropStatics_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewInteropStatics_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IApplicationViewInteropStatics methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewInteropStatics_GetApplicationViewIdForWindow(This,window,id) (This)->lpVtbl->GetApplicationViewIdForWindow(This,window,id)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewInteropStatics_QueryInterface(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewInteropStatics* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewInteropStatics_AddRef(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewInteropStatics* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewInteropStatics_Release(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewInteropStatics* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewInteropStatics_GetIids(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewInteropStatics* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewInteropStatics_GetRuntimeClassName(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewInteropStatics* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewInteropStatics_GetTrustLevel(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewInteropStatics* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IApplicationViewInteropStatics methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewInteropStatics_GetApplicationViewIdForWindow(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewInteropStatics* This,__x_ABI_CWindows_CUI_CCore_CICoreWindow *window,INT32 *id) {
    return This->lpVtbl->GetApplicationViewIdForWindow(This,window,id);
}
#endif
#ifdef WIDL_using_Windows_UI_ViewManagement
#define IID_IApplicationViewInteropStatics IID___x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewInteropStatics
#define IApplicationViewInteropStaticsVtbl __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewInteropStaticsVtbl
#define IApplicationViewInteropStatics __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewInteropStatics
#define IApplicationViewInteropStatics_QueryInterface __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewInteropStatics_QueryInterface
#define IApplicationViewInteropStatics_AddRef __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewInteropStatics_AddRef
#define IApplicationViewInteropStatics_Release __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewInteropStatics_Release
#define IApplicationViewInteropStatics_GetIids __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewInteropStatics_GetIids
#define IApplicationViewInteropStatics_GetRuntimeClassName __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewInteropStatics_GetRuntimeClassName
#define IApplicationViewInteropStatics_GetTrustLevel __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewInteropStatics_GetTrustLevel
#define IApplicationViewInteropStatics_GetApplicationViewIdForWindow __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewInteropStatics_GetApplicationViewIdForWindow
#endif /* WIDL_using_Windows_UI_ViewManagement */
#endif

#endif

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

/*****************************************************************************
 * IApplicationViewScaling interface
 */
#if WINDOWS_UI_VIEWMANAGEMENT_VIEWMANAGEMENTVIEWSCALINGCONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScaling_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScaling_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScaling, 0x1d0ddc23, 0x23f3, 0x4b2d, 0x84,0xfe, 0x74,0xbf,0x37,0xb4,0x8b,0x66);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                MIDL_INTERFACE("1d0ddc23-23f3-4b2d-84fe-74bf37b48b66")
                IApplicationViewScaling : public IInspectable
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScaling, 0x1d0ddc23, 0x23f3, 0x4b2d, 0x84,0xfe, 0x74,0xbf,0x37,0xb4,0x8b,0x66)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScalingVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    END_INTERFACE
} __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScalingVtbl;

interface __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScaling {
    CONST_VTBL __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScalingVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScaling_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScaling_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScaling_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScaling_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScaling_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScaling_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScaling_QueryInterface(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScaling* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScaling_AddRef(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScaling* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScaling_Release(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScaling* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScaling_GetIids(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScaling* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScaling_GetRuntimeClassName(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScaling* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScaling_GetTrustLevel(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScaling* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
#endif
#ifdef WIDL_using_Windows_UI_ViewManagement
#define IID_IApplicationViewScaling IID___x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScaling
#define IApplicationViewScalingVtbl __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScalingVtbl
#define IApplicationViewScaling __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScaling
#define IApplicationViewScaling_QueryInterface __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScaling_QueryInterface
#define IApplicationViewScaling_AddRef __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScaling_AddRef
#define IApplicationViewScaling_Release __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScaling_Release
#define IApplicationViewScaling_GetIids __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScaling_GetIids
#define IApplicationViewScaling_GetRuntimeClassName __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScaling_GetRuntimeClassName
#define IApplicationViewScaling_GetTrustLevel __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScaling_GetTrustLevel
#endif /* WIDL_using_Windows_UI_ViewManagement */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScaling_INTERFACE_DEFINED__ */
#endif /* WINDOWS_UI_VIEWMANAGEMENT_VIEWMANAGEMENTVIEWSCALINGCONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IApplicationViewScalingStatics interface
 */
#if WINDOWS_UI_VIEWMANAGEMENT_VIEWMANAGEMENTVIEWSCALINGCONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScalingStatics_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScalingStatics_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScalingStatics, 0xb08fecf0, 0xb946, 0x45c8, 0xa5,0xe3, 0x71,0xf5,0xaa,0x78,0xf8,0x61);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                MIDL_INTERFACE("b08fecf0-b946-45c8-a5e3-71f5aa78f861")
                IApplicationViewScalingStatics : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_DisableLayoutScaling(
                        boolean *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE TrySetDisableLayoutScaling(
                        boolean disabled,
                        boolean *success) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScalingStatics, 0xb08fecf0, 0xb946, 0x45c8, 0xa5,0xe3, 0x71,0xf5,0xaa,0x78,0xf8,0x61)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScalingStaticsVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IApplicationViewScalingStatics methods ***/
    HRESULT (STDMETHODCALLTYPE *get_DisableLayoutScaling)(
        __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScalingStatics *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *TrySetDisableLayoutScaling)(
        __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScalingStatics *This,
        boolean disabled,
        boolean *success);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScalingStaticsVtbl;

interface __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScalingStatics {
    CONST_VTBL __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScalingStaticsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScalingStatics_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScalingStatics_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScalingStatics_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScalingStatics_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScalingStatics_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScalingStatics_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IApplicationViewScalingStatics methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScalingStatics_get_DisableLayoutScaling(This,value) (This)->lpVtbl->get_DisableLayoutScaling(This,value)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScalingStatics_TrySetDisableLayoutScaling(This,disabled,success) (This)->lpVtbl->TrySetDisableLayoutScaling(This,disabled,success)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScalingStatics_QueryInterface(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScalingStatics* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScalingStatics_AddRef(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScalingStatics* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScalingStatics_Release(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScalingStatics* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScalingStatics_GetIids(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScalingStatics* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScalingStatics_GetRuntimeClassName(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScalingStatics* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScalingStatics_GetTrustLevel(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScalingStatics* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IApplicationViewScalingStatics methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScalingStatics_get_DisableLayoutScaling(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScalingStatics* This,boolean *value) {
    return This->lpVtbl->get_DisableLayoutScaling(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScalingStatics_TrySetDisableLayoutScaling(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScalingStatics* This,boolean disabled,boolean *success) {
    return This->lpVtbl->TrySetDisableLayoutScaling(This,disabled,success);
}
#endif
#ifdef WIDL_using_Windows_UI_ViewManagement
#define IID_IApplicationViewScalingStatics IID___x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScalingStatics
#define IApplicationViewScalingStaticsVtbl __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScalingStaticsVtbl
#define IApplicationViewScalingStatics __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScalingStatics
#define IApplicationViewScalingStatics_QueryInterface __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScalingStatics_QueryInterface
#define IApplicationViewScalingStatics_AddRef __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScalingStatics_AddRef
#define IApplicationViewScalingStatics_Release __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScalingStatics_Release
#define IApplicationViewScalingStatics_GetIids __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScalingStatics_GetIids
#define IApplicationViewScalingStatics_GetRuntimeClassName __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScalingStatics_GetRuntimeClassName
#define IApplicationViewScalingStatics_GetTrustLevel __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScalingStatics_GetTrustLevel
#define IApplicationViewScalingStatics_get_DisableLayoutScaling __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScalingStatics_get_DisableLayoutScaling
#define IApplicationViewScalingStatics_TrySetDisableLayoutScaling __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScalingStatics_TrySetDisableLayoutScaling
#endif /* WIDL_using_Windows_UI_ViewManagement */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewScalingStatics_INTERFACE_DEFINED__ */
#endif /* WINDOWS_UI_VIEWMANAGEMENT_VIEWMANAGEMENTVIEWSCALINGCONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IApplicationViewStatics interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics, 0x010a6306, 0xc433, 0x44e5, 0xa9,0xf2, 0xbd,0x84,0xd4,0x03,0x0a,0x95);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                MIDL_INTERFACE("010a6306-c433-44e5-a9f2-bd84d4030a95")
                IApplicationViewStatics : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_Value(
                        ABI::Windows::UI::ViewManagement::ApplicationViewState *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE TryUnsnap(
                        boolean *success) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics, 0x010a6306, 0xc433, 0x44e5, 0xa9,0xf2, 0xbd,0x84,0xd4,0x03,0x0a,0x95)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStaticsVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IApplicationViewStatics methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Value)(
        __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics *This,
        __x_ABI_CWindows_CUI_CViewManagement_CApplicationViewState *value);

    HRESULT (STDMETHODCALLTYPE *TryUnsnap)(
        __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics *This,
        boolean *success);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStaticsVtbl;

interface __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics {
    CONST_VTBL __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStaticsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IApplicationViewStatics methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics_get_Value(This,value) (This)->lpVtbl->get_Value(This,value)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics_TryUnsnap(This,success) (This)->lpVtbl->TryUnsnap(This,success)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics_QueryInterface(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics_AddRef(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics_Release(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics_GetIids(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics_GetRuntimeClassName(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics_GetTrustLevel(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IApplicationViewStatics methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics_get_Value(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics* This,__x_ABI_CWindows_CUI_CViewManagement_CApplicationViewState *value) {
    return This->lpVtbl->get_Value(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics_TryUnsnap(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics* This,boolean *success) {
    return This->lpVtbl->TryUnsnap(This,success);
}
#endif
#ifdef WIDL_using_Windows_UI_ViewManagement
#define IID_IApplicationViewStatics IID___x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics
#define IApplicationViewStaticsVtbl __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStaticsVtbl
#define IApplicationViewStatics __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics
#define IApplicationViewStatics_QueryInterface __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics_QueryInterface
#define IApplicationViewStatics_AddRef __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics_AddRef
#define IApplicationViewStatics_Release __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics_Release
#define IApplicationViewStatics_GetIids __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics_GetIids
#define IApplicationViewStatics_GetRuntimeClassName __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics_GetRuntimeClassName
#define IApplicationViewStatics_GetTrustLevel __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics_GetTrustLevel
#define IApplicationViewStatics_get_Value __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics_get_Value
#define IApplicationViewStatics_TryUnsnap __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics_TryUnsnap
#endif /* WIDL_using_Windows_UI_ViewManagement */
#endif

#endif

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

/*****************************************************************************
 * IApplicationViewStatics2 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics2_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics2_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics2, 0xaf338ae5, 0xcf64, 0x423c, 0x85,0xe5, 0xf3,0xe7,0x24,0x48,0xfb,0x23);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                MIDL_INTERFACE("af338ae5-cf64-423c-85e5-f3e72448fb23")
                IApplicationViewStatics2 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE GetForCurrentView(
                        ABI::Windows::UI::ViewManagement::IApplicationView **current) = 0;

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

                    virtual HRESULT STDMETHODCALLTYPE put_TerminateAppOnFinalViewClose(
                        boolean value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics2, 0xaf338ae5, 0xcf64, 0x423c, 0x85,0xe5, 0xf3,0xe7,0x24,0x48,0xfb,0x23)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics2Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IApplicationViewStatics2 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetForCurrentView)(
        __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics2 *This,
        __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView **current);

    HRESULT (STDMETHODCALLTYPE *get_TerminateAppOnFinalViewClose)(
        __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics2 *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *put_TerminateAppOnFinalViewClose)(
        __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics2 *This,
        boolean value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics2Vtbl;

interface __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics2 {
    CONST_VTBL __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics2_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics2_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics2_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics2_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IApplicationViewStatics2 methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics2_GetForCurrentView(This,current) (This)->lpVtbl->GetForCurrentView(This,current)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics2_get_TerminateAppOnFinalViewClose(This,value) (This)->lpVtbl->get_TerminateAppOnFinalViewClose(This,value)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics2_put_TerminateAppOnFinalViewClose(This,value) (This)->lpVtbl->put_TerminateAppOnFinalViewClose(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics2_QueryInterface(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics2_AddRef(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics2* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics2_Release(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics2* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics2_GetIids(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics2* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics2_GetRuntimeClassName(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics2* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics2_GetTrustLevel(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics2* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IApplicationViewStatics2 methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics2_GetForCurrentView(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics2* This,__x_ABI_CWindows_CUI_CViewManagement_CIApplicationView **current) {
    return This->lpVtbl->GetForCurrentView(This,current);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics2_get_TerminateAppOnFinalViewClose(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics2* This,boolean *value) {
    return This->lpVtbl->get_TerminateAppOnFinalViewClose(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics2_put_TerminateAppOnFinalViewClose(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics2* This,boolean value) {
    return This->lpVtbl->put_TerminateAppOnFinalViewClose(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_ViewManagement
#define IID_IApplicationViewStatics2 IID___x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics2
#define IApplicationViewStatics2Vtbl __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics2Vtbl
#define IApplicationViewStatics2 __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics2
#define IApplicationViewStatics2_QueryInterface __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics2_QueryInterface
#define IApplicationViewStatics2_AddRef __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics2_AddRef
#define IApplicationViewStatics2_Release __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics2_Release
#define IApplicationViewStatics2_GetIids __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics2_GetIids
#define IApplicationViewStatics2_GetRuntimeClassName __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics2_GetRuntimeClassName
#define IApplicationViewStatics2_GetTrustLevel __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics2_GetTrustLevel
#define IApplicationViewStatics2_GetForCurrentView __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics2_GetForCurrentView
#define IApplicationViewStatics2_get_TerminateAppOnFinalViewClose __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics2_get_TerminateAppOnFinalViewClose
#define IApplicationViewStatics2_put_TerminateAppOnFinalViewClose __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics2_put_TerminateAppOnFinalViewClose
#endif /* WIDL_using_Windows_UI_ViewManagement */
#endif

#endif

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

/*****************************************************************************
 * IApplicationViewStatics3 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics3_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics3_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics3, 0xa28d7594, 0x8c41, 0x4e13, 0x97,0x19, 0x51,0x64,0x79,0x6f,0xe4,0xc7);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                MIDL_INTERFACE("a28d7594-8c41-4e13-9719-5164796fe4c7")
                IApplicationViewStatics3 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_PreferredLaunchWindowingMode(
                        ABI::Windows::UI::ViewManagement::ApplicationViewWindowingMode *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_PreferredLaunchWindowingMode(
                        ABI::Windows::UI::ViewManagement::ApplicationViewWindowingMode value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_PreferredLaunchViewSize(
                        ABI::Windows::Foundation::Size *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_PreferredLaunchViewSize(
                        ABI::Windows::Foundation::Size value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics3, 0xa28d7594, 0x8c41, 0x4e13, 0x97,0x19, 0x51,0x64,0x79,0x6f,0xe4,0xc7)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics3Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IApplicationViewStatics3 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_PreferredLaunchWindowingMode)(
        __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics3 *This,
        __x_ABI_CWindows_CUI_CViewManagement_CApplicationViewWindowingMode *value);

    HRESULT (STDMETHODCALLTYPE *put_PreferredLaunchWindowingMode)(
        __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics3 *This,
        __x_ABI_CWindows_CUI_CViewManagement_CApplicationViewWindowingMode value);

    HRESULT (STDMETHODCALLTYPE *get_PreferredLaunchViewSize)(
        __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics3 *This,
        __x_ABI_CWindows_CFoundation_CSize *value);

    HRESULT (STDMETHODCALLTYPE *put_PreferredLaunchViewSize)(
        __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics3 *This,
        __x_ABI_CWindows_CFoundation_CSize value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics3Vtbl;

interface __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics3 {
    CONST_VTBL __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics3_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics3_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics3_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics3_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IApplicationViewStatics3 methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics3_get_PreferredLaunchWindowingMode(This,value) (This)->lpVtbl->get_PreferredLaunchWindowingMode(This,value)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics3_put_PreferredLaunchWindowingMode(This,value) (This)->lpVtbl->put_PreferredLaunchWindowingMode(This,value)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics3_get_PreferredLaunchViewSize(This,value) (This)->lpVtbl->get_PreferredLaunchViewSize(This,value)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics3_put_PreferredLaunchViewSize(This,value) (This)->lpVtbl->put_PreferredLaunchViewSize(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics3_QueryInterface(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics3_AddRef(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics3* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics3_Release(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics3* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics3_GetIids(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics3* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics3_GetRuntimeClassName(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics3* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics3_GetTrustLevel(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics3* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IApplicationViewStatics3 methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics3_get_PreferredLaunchWindowingMode(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics3* This,__x_ABI_CWindows_CUI_CViewManagement_CApplicationViewWindowingMode *value) {
    return This->lpVtbl->get_PreferredLaunchWindowingMode(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics3_put_PreferredLaunchWindowingMode(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics3* This,__x_ABI_CWindows_CUI_CViewManagement_CApplicationViewWindowingMode value) {
    return This->lpVtbl->put_PreferredLaunchWindowingMode(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics3_get_PreferredLaunchViewSize(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics3* This,__x_ABI_CWindows_CFoundation_CSize *value) {
    return This->lpVtbl->get_PreferredLaunchViewSize(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics3_put_PreferredLaunchViewSize(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics3* This,__x_ABI_CWindows_CFoundation_CSize value) {
    return This->lpVtbl->put_PreferredLaunchViewSize(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_ViewManagement
#define IID_IApplicationViewStatics3 IID___x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics3
#define IApplicationViewStatics3Vtbl __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics3Vtbl
#define IApplicationViewStatics3 __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics3
#define IApplicationViewStatics3_QueryInterface __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics3_QueryInterface
#define IApplicationViewStatics3_AddRef __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics3_AddRef
#define IApplicationViewStatics3_Release __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics3_Release
#define IApplicationViewStatics3_GetIids __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics3_GetIids
#define IApplicationViewStatics3_GetRuntimeClassName __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics3_GetRuntimeClassName
#define IApplicationViewStatics3_GetTrustLevel __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics3_GetTrustLevel
#define IApplicationViewStatics3_get_PreferredLaunchWindowingMode __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics3_get_PreferredLaunchWindowingMode
#define IApplicationViewStatics3_put_PreferredLaunchWindowingMode __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics3_put_PreferredLaunchWindowingMode
#define IApplicationViewStatics3_get_PreferredLaunchViewSize __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics3_get_PreferredLaunchViewSize
#define IApplicationViewStatics3_put_PreferredLaunchViewSize __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics3_put_PreferredLaunchViewSize
#endif /* WIDL_using_Windows_UI_ViewManagement */
#endif

#endif

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

/*****************************************************************************
 * IApplicationViewStatics4 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000
#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics4_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics4_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics4, 0x08fd8d33, 0x2611, 0x5336, 0xa3,0x15, 0xd9,0x8e,0x63,0x66,0xc9,0xdb);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                MIDL_INTERFACE("08fd8d33-2611-5336-a315-d98e6366c9db")
                IApplicationViewStatics4 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE ClearAllPersistedState(
                        ) = 0;

                    virtual HRESULT STDMETHODCALLTYPE ClearPersistedState(
                        HSTRING key) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics4, 0x08fd8d33, 0x2611, 0x5336, 0xa3,0x15, 0xd9,0x8e,0x63,0x66,0xc9,0xdb)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics4Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IApplicationViewStatics4 methods ***/
    HRESULT (STDMETHODCALLTYPE *ClearAllPersistedState)(
        __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics4 *This);

    HRESULT (STDMETHODCALLTYPE *ClearPersistedState)(
        __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics4 *This,
        HSTRING key);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics4Vtbl;

interface __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics4 {
    CONST_VTBL __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics4Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics4_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics4_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics4_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics4_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics4_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics4_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IApplicationViewStatics4 methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics4_ClearAllPersistedState(This) (This)->lpVtbl->ClearAllPersistedState(This)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics4_ClearPersistedState(This,key) (This)->lpVtbl->ClearPersistedState(This,key)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics4_QueryInterface(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics4* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics4_AddRef(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics4* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics4_Release(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics4* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics4_GetIids(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics4* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics4_GetRuntimeClassName(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics4* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics4_GetTrustLevel(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics4* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IApplicationViewStatics4 methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics4_ClearAllPersistedState(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics4* This) {
    return This->lpVtbl->ClearAllPersistedState(This);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics4_ClearPersistedState(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics4* This,HSTRING key) {
    return This->lpVtbl->ClearPersistedState(This,key);
}
#endif
#ifdef WIDL_using_Windows_UI_ViewManagement
#define IID_IApplicationViewStatics4 IID___x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics4
#define IApplicationViewStatics4Vtbl __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics4Vtbl
#define IApplicationViewStatics4 __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics4
#define IApplicationViewStatics4_QueryInterface __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics4_QueryInterface
#define IApplicationViewStatics4_AddRef __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics4_AddRef
#define IApplicationViewStatics4_Release __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics4_Release
#define IApplicationViewStatics4_GetIids __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics4_GetIids
#define IApplicationViewStatics4_GetRuntimeClassName __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics4_GetRuntimeClassName
#define IApplicationViewStatics4_GetTrustLevel __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics4_GetTrustLevel
#define IApplicationViewStatics4_ClearAllPersistedState __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics4_ClearAllPersistedState
#define IApplicationViewStatics4_ClearPersistedState __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics4_ClearPersistedState
#endif /* WIDL_using_Windows_UI_ViewManagement */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewStatics4_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000 */

/*****************************************************************************
 * IApplicationViewSwitcherStatics interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics, 0x975f2f1e, 0xe656, 0x4c5e, 0xa0,0xa1, 0x71,0x7c,0x6f,0xfa,0x7d,0x64);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                MIDL_INTERFACE("975f2f1e-e656-4c5e-a0a1-717c6ffa7d64")
                IApplicationViewSwitcherStatics : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE DisableShowingMainViewOnActivation(
                        ) = 0;

                    virtual HRESULT STDMETHODCALLTYPE TryShowAsStandaloneAsync(
                        INT32 view_id,
                        ABI::Windows::Foundation::IAsyncOperation<boolean > **operation) = 0;

                    virtual HRESULT STDMETHODCALLTYPE TryShowAsStandaloneWithSizePreferenceAsync(
                        INT32 view_id,
                        ABI::Windows::UI::ViewManagement::ViewSizePreference preference,
                        ABI::Windows::Foundation::IAsyncOperation<boolean > **operation) = 0;

                    virtual HRESULT STDMETHODCALLTYPE TryShowAsStandaloneWithAnchorViewAndSizePreferenceAsync(
                        INT32 view_id,
                        ABI::Windows::UI::ViewManagement::ViewSizePreference size_preference,
                        INT32 anchor_view_id,
                        ABI::Windows::UI::ViewManagement::ViewSizePreference anchor_size_preference,
                        ABI::Windows::Foundation::IAsyncOperation<boolean > **operation) = 0;

                    virtual HRESULT STDMETHODCALLTYPE SwitchAsync(
                        INT32 view_id,
                        ABI::Windows::Foundation::IAsyncAction **operation) = 0;

                    virtual HRESULT STDMETHODCALLTYPE SwitchFromViewAsync(
                        INT32 to_view_id,
                        INT32 from_view_id,
                        ABI::Windows::Foundation::IAsyncAction **operation) = 0;

                    virtual HRESULT STDMETHODCALLTYPE SwitchFromViewWithOptionsAsync(
                        INT32 to_view_id,
                        INT32 from_view_id,
                        ABI::Windows::UI::ViewManagement::ApplicationViewSwitchingOptions options,
                        ABI::Windows::Foundation::IAsyncAction **operation) = 0;

                    virtual HRESULT STDMETHODCALLTYPE PrepareForCustomAnimatedSwitchAsync(
                        INT32 to_view_id,
                        INT32 from_view_id,
                        ABI::Windows::UI::ViewManagement::ApplicationViewSwitchingOptions options,
                        ABI::Windows::Foundation::IAsyncOperation<boolean > **operation) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics, 0x975f2f1e, 0xe656, 0x4c5e, 0xa0,0xa1, 0x71,0x7c,0x6f,0xfa,0x7d,0x64)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStaticsVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IApplicationViewSwitcherStatics methods ***/
    HRESULT (STDMETHODCALLTYPE *DisableShowingMainViewOnActivation)(
        __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics *This);

    HRESULT (STDMETHODCALLTYPE *TryShowAsStandaloneAsync)(
        __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics *This,
        INT32 view_id,
        __FIAsyncOperation_1_boolean **operation);

    HRESULT (STDMETHODCALLTYPE *TryShowAsStandaloneWithSizePreferenceAsync)(
        __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics *This,
        INT32 view_id,
        __x_ABI_CWindows_CUI_CViewManagement_CViewSizePreference preference,
        __FIAsyncOperation_1_boolean **operation);

    HRESULT (STDMETHODCALLTYPE *TryShowAsStandaloneWithAnchorViewAndSizePreferenceAsync)(
        __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics *This,
        INT32 view_id,
        __x_ABI_CWindows_CUI_CViewManagement_CViewSizePreference size_preference,
        INT32 anchor_view_id,
        __x_ABI_CWindows_CUI_CViewManagement_CViewSizePreference anchor_size_preference,
        __FIAsyncOperation_1_boolean **operation);

    HRESULT (STDMETHODCALLTYPE *SwitchAsync)(
        __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics *This,
        INT32 view_id,
        __x_ABI_CWindows_CFoundation_CIAsyncAction **operation);

    HRESULT (STDMETHODCALLTYPE *SwitchFromViewAsync)(
        __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics *This,
        INT32 to_view_id,
        INT32 from_view_id,
        __x_ABI_CWindows_CFoundation_CIAsyncAction **operation);

    HRESULT (STDMETHODCALLTYPE *SwitchFromViewWithOptionsAsync)(
        __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics *This,
        INT32 to_view_id,
        INT32 from_view_id,
        __x_ABI_CWindows_CUI_CViewManagement_CApplicationViewSwitchingOptions options,
        __x_ABI_CWindows_CFoundation_CIAsyncAction **operation);

    HRESULT (STDMETHODCALLTYPE *PrepareForCustomAnimatedSwitchAsync)(
        __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics *This,
        INT32 to_view_id,
        INT32 from_view_id,
        __x_ABI_CWindows_CUI_CViewManagement_CApplicationViewSwitchingOptions options,
        __FIAsyncOperation_1_boolean **operation);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStaticsVtbl;

interface __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics {
    CONST_VTBL __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStaticsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IApplicationViewSwitcherStatics methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics_DisableShowingMainViewOnActivation(This) (This)->lpVtbl->DisableShowingMainViewOnActivation(This)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics_TryShowAsStandaloneAsync(This,view_id,operation) (This)->lpVtbl->TryShowAsStandaloneAsync(This,view_id,operation)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics_TryShowAsStandaloneWithSizePreferenceAsync(This,view_id,preference,operation) (This)->lpVtbl->TryShowAsStandaloneWithSizePreferenceAsync(This,view_id,preference,operation)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics_TryShowAsStandaloneWithAnchorViewAndSizePreferenceAsync(This,view_id,size_preference,anchor_view_id,anchor_size_preference,operation) (This)->lpVtbl->TryShowAsStandaloneWithAnchorViewAndSizePreferenceAsync(This,view_id,size_preference,anchor_view_id,anchor_size_preference,operation)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics_SwitchAsync(This,view_id,operation) (This)->lpVtbl->SwitchAsync(This,view_id,operation)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics_SwitchFromViewAsync(This,to_view_id,from_view_id,operation) (This)->lpVtbl->SwitchFromViewAsync(This,to_view_id,from_view_id,operation)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics_SwitchFromViewWithOptionsAsync(This,to_view_id,from_view_id,options,operation) (This)->lpVtbl->SwitchFromViewWithOptionsAsync(This,to_view_id,from_view_id,options,operation)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics_PrepareForCustomAnimatedSwitchAsync(This,to_view_id,from_view_id,options,operation) (This)->lpVtbl->PrepareForCustomAnimatedSwitchAsync(This,to_view_id,from_view_id,options,operation)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics_QueryInterface(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics_AddRef(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics_Release(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics_GetIids(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics_GetRuntimeClassName(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics_GetTrustLevel(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IApplicationViewSwitcherStatics methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics_DisableShowingMainViewOnActivation(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics* This) {
    return This->lpVtbl->DisableShowingMainViewOnActivation(This);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics_TryShowAsStandaloneAsync(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics* This,INT32 view_id,__FIAsyncOperation_1_boolean **operation) {
    return This->lpVtbl->TryShowAsStandaloneAsync(This,view_id,operation);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics_TryShowAsStandaloneWithSizePreferenceAsync(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics* This,INT32 view_id,__x_ABI_CWindows_CUI_CViewManagement_CViewSizePreference preference,__FIAsyncOperation_1_boolean **operation) {
    return This->lpVtbl->TryShowAsStandaloneWithSizePreferenceAsync(This,view_id,preference,operation);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics_TryShowAsStandaloneWithAnchorViewAndSizePreferenceAsync(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics* This,INT32 view_id,__x_ABI_CWindows_CUI_CViewManagement_CViewSizePreference size_preference,INT32 anchor_view_id,__x_ABI_CWindows_CUI_CViewManagement_CViewSizePreference anchor_size_preference,__FIAsyncOperation_1_boolean **operation) {
    return This->lpVtbl->TryShowAsStandaloneWithAnchorViewAndSizePreferenceAsync(This,view_id,size_preference,anchor_view_id,anchor_size_preference,operation);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics_SwitchAsync(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics* This,INT32 view_id,__x_ABI_CWindows_CFoundation_CIAsyncAction **operation) {
    return This->lpVtbl->SwitchAsync(This,view_id,operation);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics_SwitchFromViewAsync(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics* This,INT32 to_view_id,INT32 from_view_id,__x_ABI_CWindows_CFoundation_CIAsyncAction **operation) {
    return This->lpVtbl->SwitchFromViewAsync(This,to_view_id,from_view_id,operation);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics_SwitchFromViewWithOptionsAsync(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics* This,INT32 to_view_id,INT32 from_view_id,__x_ABI_CWindows_CUI_CViewManagement_CApplicationViewSwitchingOptions options,__x_ABI_CWindows_CFoundation_CIAsyncAction **operation) {
    return This->lpVtbl->SwitchFromViewWithOptionsAsync(This,to_view_id,from_view_id,options,operation);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics_PrepareForCustomAnimatedSwitchAsync(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics* This,INT32 to_view_id,INT32 from_view_id,__x_ABI_CWindows_CUI_CViewManagement_CApplicationViewSwitchingOptions options,__FIAsyncOperation_1_boolean **operation) {
    return This->lpVtbl->PrepareForCustomAnimatedSwitchAsync(This,to_view_id,from_view_id,options,operation);
}
#endif
#ifdef WIDL_using_Windows_UI_ViewManagement
#define IID_IApplicationViewSwitcherStatics IID___x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics
#define IApplicationViewSwitcherStaticsVtbl __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStaticsVtbl
#define IApplicationViewSwitcherStatics __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics
#define IApplicationViewSwitcherStatics_QueryInterface __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics_QueryInterface
#define IApplicationViewSwitcherStatics_AddRef __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics_AddRef
#define IApplicationViewSwitcherStatics_Release __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics_Release
#define IApplicationViewSwitcherStatics_GetIids __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics_GetIids
#define IApplicationViewSwitcherStatics_GetRuntimeClassName __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics_GetRuntimeClassName
#define IApplicationViewSwitcherStatics_GetTrustLevel __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics_GetTrustLevel
#define IApplicationViewSwitcherStatics_DisableShowingMainViewOnActivation __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics_DisableShowingMainViewOnActivation
#define IApplicationViewSwitcherStatics_TryShowAsStandaloneAsync __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics_TryShowAsStandaloneAsync
#define IApplicationViewSwitcherStatics_TryShowAsStandaloneWithSizePreferenceAsync __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics_TryShowAsStandaloneWithSizePreferenceAsync
#define IApplicationViewSwitcherStatics_TryShowAsStandaloneWithAnchorViewAndSizePreferenceAsync __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics_TryShowAsStandaloneWithAnchorViewAndSizePreferenceAsync
#define IApplicationViewSwitcherStatics_SwitchAsync __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics_SwitchAsync
#define IApplicationViewSwitcherStatics_SwitchFromViewAsync __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics_SwitchFromViewAsync
#define IApplicationViewSwitcherStatics_SwitchFromViewWithOptionsAsync __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics_SwitchFromViewWithOptionsAsync
#define IApplicationViewSwitcherStatics_PrepareForCustomAnimatedSwitchAsync __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics_PrepareForCustomAnimatedSwitchAsync
#endif /* WIDL_using_Windows_UI_ViewManagement */
#endif

#endif

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

/*****************************************************************************
 * IApplicationViewSwitcherStatics2 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics2_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics2_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics2, 0x60e995cd, 0x4fc2, 0x48c4, 0xb8,0xe3, 0x39,0x5f,0x2b,0x9f,0x0f,0xc1);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                MIDL_INTERFACE("60e995cd-4fc2-48c4-b8e3-395f2b9f0fc1")
                IApplicationViewSwitcherStatics2 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE DisableSystemViewActivationPolicy(
                        ) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics2, 0x60e995cd, 0x4fc2, 0x48c4, 0xb8,0xe3, 0x39,0x5f,0x2b,0x9f,0x0f,0xc1)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics2Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IApplicationViewSwitcherStatics2 methods ***/
    HRESULT (STDMETHODCALLTYPE *DisableSystemViewActivationPolicy)(
        __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics2 *This);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics2Vtbl;

interface __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics2 {
    CONST_VTBL __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics2_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics2_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics2_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics2_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IApplicationViewSwitcherStatics2 methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics2_DisableSystemViewActivationPolicy(This) (This)->lpVtbl->DisableSystemViewActivationPolicy(This)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics2_QueryInterface(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics2_AddRef(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics2* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics2_Release(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics2* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics2_GetIids(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics2* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics2_GetRuntimeClassName(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics2* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics2_GetTrustLevel(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics2* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IApplicationViewSwitcherStatics2 methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics2_DisableSystemViewActivationPolicy(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics2* This) {
    return This->lpVtbl->DisableSystemViewActivationPolicy(This);
}
#endif
#ifdef WIDL_using_Windows_UI_ViewManagement
#define IID_IApplicationViewSwitcherStatics2 IID___x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics2
#define IApplicationViewSwitcherStatics2Vtbl __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics2Vtbl
#define IApplicationViewSwitcherStatics2 __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics2
#define IApplicationViewSwitcherStatics2_QueryInterface __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics2_QueryInterface
#define IApplicationViewSwitcherStatics2_AddRef __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics2_AddRef
#define IApplicationViewSwitcherStatics2_Release __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics2_Release
#define IApplicationViewSwitcherStatics2_GetIids __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics2_GetIids
#define IApplicationViewSwitcherStatics2_GetRuntimeClassName __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics2_GetRuntimeClassName
#define IApplicationViewSwitcherStatics2_GetTrustLevel __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics2_GetTrustLevel
#define IApplicationViewSwitcherStatics2_DisableSystemViewActivationPolicy __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics2_DisableSystemViewActivationPolicy
#endif /* WIDL_using_Windows_UI_ViewManagement */
#endif

#endif

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

/*****************************************************************************
 * IApplicationViewSwitcherStatics3 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000
#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics3_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics3_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics3, 0x92059420, 0x80a7, 0x486d, 0xb2,0x1f, 0xc7,0xa4,0xa2,0x42,0xa3,0x83);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                MIDL_INTERFACE("92059420-80a7-486d-b21f-c7a4a242a383")
                IApplicationViewSwitcherStatics3 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE TryShowAsViewModeAsync(
                        INT32 view_id,
                        ABI::Windows::UI::ViewManagement::ApplicationViewMode mode,
                        ABI::Windows::Foundation::IAsyncOperation<boolean > **operation) = 0;

                    virtual HRESULT STDMETHODCALLTYPE TryShowAsViewModeWithPreferencesAsync(
                        INT32 view_id,
                        ABI::Windows::UI::ViewManagement::ApplicationViewMode mode,
                        ABI::Windows::UI::ViewManagement::IViewModePreferences *preferences,
                        ABI::Windows::Foundation::IAsyncOperation<boolean > **operation) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics3, 0x92059420, 0x80a7, 0x486d, 0xb2,0x1f, 0xc7,0xa4,0xa2,0x42,0xa3,0x83)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics3Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IApplicationViewSwitcherStatics3 methods ***/
    HRESULT (STDMETHODCALLTYPE *TryShowAsViewModeAsync)(
        __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics3 *This,
        INT32 view_id,
        __x_ABI_CWindows_CUI_CViewManagement_CApplicationViewMode mode,
        __FIAsyncOperation_1_boolean **operation);

    HRESULT (STDMETHODCALLTYPE *TryShowAsViewModeWithPreferencesAsync)(
        __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics3 *This,
        INT32 view_id,
        __x_ABI_CWindows_CUI_CViewManagement_CApplicationViewMode mode,
        __x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferences *preferences,
        __FIAsyncOperation_1_boolean **operation);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics3Vtbl;

interface __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics3 {
    CONST_VTBL __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics3_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics3_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics3_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics3_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IApplicationViewSwitcherStatics3 methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics3_TryShowAsViewModeAsync(This,view_id,mode,operation) (This)->lpVtbl->TryShowAsViewModeAsync(This,view_id,mode,operation)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics3_TryShowAsViewModeWithPreferencesAsync(This,view_id,mode,preferences,operation) (This)->lpVtbl->TryShowAsViewModeWithPreferencesAsync(This,view_id,mode,preferences,operation)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics3_QueryInterface(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics3_AddRef(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics3* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics3_Release(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics3* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics3_GetIids(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics3* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics3_GetRuntimeClassName(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics3* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics3_GetTrustLevel(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics3* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IApplicationViewSwitcherStatics3 methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics3_TryShowAsViewModeAsync(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics3* This,INT32 view_id,__x_ABI_CWindows_CUI_CViewManagement_CApplicationViewMode mode,__FIAsyncOperation_1_boolean **operation) {
    return This->lpVtbl->TryShowAsViewModeAsync(This,view_id,mode,operation);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics3_TryShowAsViewModeWithPreferencesAsync(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics3* This,INT32 view_id,__x_ABI_CWindows_CUI_CViewManagement_CApplicationViewMode mode,__x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferences *preferences,__FIAsyncOperation_1_boolean **operation) {
    return This->lpVtbl->TryShowAsViewModeWithPreferencesAsync(This,view_id,mode,preferences,operation);
}
#endif
#ifdef WIDL_using_Windows_UI_ViewManagement
#define IID_IApplicationViewSwitcherStatics3 IID___x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics3
#define IApplicationViewSwitcherStatics3Vtbl __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics3Vtbl
#define IApplicationViewSwitcherStatics3 __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics3
#define IApplicationViewSwitcherStatics3_QueryInterface __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics3_QueryInterface
#define IApplicationViewSwitcherStatics3_AddRef __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics3_AddRef
#define IApplicationViewSwitcherStatics3_Release __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics3_Release
#define IApplicationViewSwitcherStatics3_GetIids __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics3_GetIids
#define IApplicationViewSwitcherStatics3_GetRuntimeClassName __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics3_GetRuntimeClassName
#define IApplicationViewSwitcherStatics3_GetTrustLevel __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics3_GetTrustLevel
#define IApplicationViewSwitcherStatics3_TryShowAsViewModeAsync __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics3_TryShowAsViewModeAsync
#define IApplicationViewSwitcherStatics3_TryShowAsViewModeWithPreferencesAsync __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics3_TryShowAsViewModeWithPreferencesAsync
#endif /* WIDL_using_Windows_UI_ViewManagement */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewSwitcherStatics3_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000 */

/*****************************************************************************
 * IApplicationViewTitleBar interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar, 0x00924ac0, 0x932b, 0x4a6b, 0x9c,0x4b, 0xdc,0x38,0xc8,0x24,0x78,0xce);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                MIDL_INTERFACE("00924ac0-932b-4a6b-9c4b-dc38c82478ce")
                IApplicationViewTitleBar : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE put_ForegroundColor(
                        ABI::Windows::Foundation::IReference<ABI::Windows::UI::Color > *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_ForegroundColor(
                        ABI::Windows::Foundation::IReference<ABI::Windows::UI::Color > **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_BackgroundColor(
                        ABI::Windows::Foundation::IReference<ABI::Windows::UI::Color > *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_BackgroundColor(
                        ABI::Windows::Foundation::IReference<ABI::Windows::UI::Color > **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_ButtonForegroundColor(
                        ABI::Windows::Foundation::IReference<ABI::Windows::UI::Color > *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_ButtonForegroundColor(
                        ABI::Windows::Foundation::IReference<ABI::Windows::UI::Color > **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_ButtonBackgroundColor(
                        ABI::Windows::Foundation::IReference<ABI::Windows::UI::Color > *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_ButtonBackgroundColor(
                        ABI::Windows::Foundation::IReference<ABI::Windows::UI::Color > **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_ButtonHoverForegroundColor(
                        ABI::Windows::Foundation::IReference<ABI::Windows::UI::Color > *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_ButtonHoverForegroundColor(
                        ABI::Windows::Foundation::IReference<ABI::Windows::UI::Color > **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_ButtonHoverBackgroundColor(
                        ABI::Windows::Foundation::IReference<ABI::Windows::UI::Color > *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_ButtonHoverBackgroundColor(
                        ABI::Windows::Foundation::IReference<ABI::Windows::UI::Color > **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_ButtonPressedForegroundColor(
                        ABI::Windows::Foundation::IReference<ABI::Windows::UI::Color > *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_ButtonPressedForegroundColor(
                        ABI::Windows::Foundation::IReference<ABI::Windows::UI::Color > **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_ButtonPressedBackgroundColor(
                        ABI::Windows::Foundation::IReference<ABI::Windows::UI::Color > *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_ButtonPressedBackgroundColor(
                        ABI::Windows::Foundation::IReference<ABI::Windows::UI::Color > **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_InactiveForegroundColor(
                        ABI::Windows::Foundation::IReference<ABI::Windows::UI::Color > *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_InactiveForegroundColor(
                        ABI::Windows::Foundation::IReference<ABI::Windows::UI::Color > **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_InactiveBackgroundColor(
                        ABI::Windows::Foundation::IReference<ABI::Windows::UI::Color > *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_InactiveBackgroundColor(
                        ABI::Windows::Foundation::IReference<ABI::Windows::UI::Color > **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_ButtonInactiveForegroundColor(
                        ABI::Windows::Foundation::IReference<ABI::Windows::UI::Color > *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_ButtonInactiveForegroundColor(
                        ABI::Windows::Foundation::IReference<ABI::Windows::UI::Color > **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_ButtonInactiveBackgroundColor(
                        ABI::Windows::Foundation::IReference<ABI::Windows::UI::Color > *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_ButtonInactiveBackgroundColor(
                        ABI::Windows::Foundation::IReference<ABI::Windows::UI::Color > **value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar, 0x00924ac0, 0x932b, 0x4a6b, 0x9c,0x4b, 0xdc,0x38,0xc8,0x24,0x78,0xce)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBarVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IApplicationViewTitleBar methods ***/
    HRESULT (STDMETHODCALLTYPE *put_ForegroundColor)(
        __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar *This,
        __FIReference_1_Color *value);

    HRESULT (STDMETHODCALLTYPE *get_ForegroundColor)(
        __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar *This,
        __FIReference_1_Color **value);

    HRESULT (STDMETHODCALLTYPE *put_BackgroundColor)(
        __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar *This,
        __FIReference_1_Color *value);

    HRESULT (STDMETHODCALLTYPE *get_BackgroundColor)(
        __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar *This,
        __FIReference_1_Color **value);

    HRESULT (STDMETHODCALLTYPE *put_ButtonForegroundColor)(
        __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar *This,
        __FIReference_1_Color *value);

    HRESULT (STDMETHODCALLTYPE *get_ButtonForegroundColor)(
        __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar *This,
        __FIReference_1_Color **value);

    HRESULT (STDMETHODCALLTYPE *put_ButtonBackgroundColor)(
        __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar *This,
        __FIReference_1_Color *value);

    HRESULT (STDMETHODCALLTYPE *get_ButtonBackgroundColor)(
        __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar *This,
        __FIReference_1_Color **value);

    HRESULT (STDMETHODCALLTYPE *put_ButtonHoverForegroundColor)(
        __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar *This,
        __FIReference_1_Color *value);

    HRESULT (STDMETHODCALLTYPE *get_ButtonHoverForegroundColor)(
        __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar *This,
        __FIReference_1_Color **value);

    HRESULT (STDMETHODCALLTYPE *put_ButtonHoverBackgroundColor)(
        __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar *This,
        __FIReference_1_Color *value);

    HRESULT (STDMETHODCALLTYPE *get_ButtonHoverBackgroundColor)(
        __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar *This,
        __FIReference_1_Color **value);

    HRESULT (STDMETHODCALLTYPE *put_ButtonPressedForegroundColor)(
        __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar *This,
        __FIReference_1_Color *value);

    HRESULT (STDMETHODCALLTYPE *get_ButtonPressedForegroundColor)(
        __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar *This,
        __FIReference_1_Color **value);

    HRESULT (STDMETHODCALLTYPE *put_ButtonPressedBackgroundColor)(
        __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar *This,
        __FIReference_1_Color *value);

    HRESULT (STDMETHODCALLTYPE *get_ButtonPressedBackgroundColor)(
        __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar *This,
        __FIReference_1_Color **value);

    HRESULT (STDMETHODCALLTYPE *put_InactiveForegroundColor)(
        __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar *This,
        __FIReference_1_Color *value);

    HRESULT (STDMETHODCALLTYPE *get_InactiveForegroundColor)(
        __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar *This,
        __FIReference_1_Color **value);

    HRESULT (STDMETHODCALLTYPE *put_InactiveBackgroundColor)(
        __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar *This,
        __FIReference_1_Color *value);

    HRESULT (STDMETHODCALLTYPE *get_InactiveBackgroundColor)(
        __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar *This,
        __FIReference_1_Color **value);

    HRESULT (STDMETHODCALLTYPE *put_ButtonInactiveForegroundColor)(
        __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar *This,
        __FIReference_1_Color *value);

    HRESULT (STDMETHODCALLTYPE *get_ButtonInactiveForegroundColor)(
        __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar *This,
        __FIReference_1_Color **value);

    HRESULT (STDMETHODCALLTYPE *put_ButtonInactiveBackgroundColor)(
        __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar *This,
        __FIReference_1_Color *value);

    HRESULT (STDMETHODCALLTYPE *get_ButtonInactiveBackgroundColor)(
        __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar *This,
        __FIReference_1_Color **value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBarVtbl;

interface __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar {
    CONST_VTBL __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBarVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IApplicationViewTitleBar methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar_put_ForegroundColor(This,value) (This)->lpVtbl->put_ForegroundColor(This,value)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar_get_ForegroundColor(This,value) (This)->lpVtbl->get_ForegroundColor(This,value)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar_put_BackgroundColor(This,value) (This)->lpVtbl->put_BackgroundColor(This,value)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar_get_BackgroundColor(This,value) (This)->lpVtbl->get_BackgroundColor(This,value)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar_put_ButtonForegroundColor(This,value) (This)->lpVtbl->put_ButtonForegroundColor(This,value)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar_get_ButtonForegroundColor(This,value) (This)->lpVtbl->get_ButtonForegroundColor(This,value)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar_put_ButtonBackgroundColor(This,value) (This)->lpVtbl->put_ButtonBackgroundColor(This,value)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar_get_ButtonBackgroundColor(This,value) (This)->lpVtbl->get_ButtonBackgroundColor(This,value)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar_put_ButtonHoverForegroundColor(This,value) (This)->lpVtbl->put_ButtonHoverForegroundColor(This,value)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar_get_ButtonHoverForegroundColor(This,value) (This)->lpVtbl->get_ButtonHoverForegroundColor(This,value)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar_put_ButtonHoverBackgroundColor(This,value) (This)->lpVtbl->put_ButtonHoverBackgroundColor(This,value)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar_get_ButtonHoverBackgroundColor(This,value) (This)->lpVtbl->get_ButtonHoverBackgroundColor(This,value)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar_put_ButtonPressedForegroundColor(This,value) (This)->lpVtbl->put_ButtonPressedForegroundColor(This,value)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar_get_ButtonPressedForegroundColor(This,value) (This)->lpVtbl->get_ButtonPressedForegroundColor(This,value)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar_put_ButtonPressedBackgroundColor(This,value) (This)->lpVtbl->put_ButtonPressedBackgroundColor(This,value)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar_get_ButtonPressedBackgroundColor(This,value) (This)->lpVtbl->get_ButtonPressedBackgroundColor(This,value)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar_put_InactiveForegroundColor(This,value) (This)->lpVtbl->put_InactiveForegroundColor(This,value)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar_get_InactiveForegroundColor(This,value) (This)->lpVtbl->get_InactiveForegroundColor(This,value)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar_put_InactiveBackgroundColor(This,value) (This)->lpVtbl->put_InactiveBackgroundColor(This,value)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar_get_InactiveBackgroundColor(This,value) (This)->lpVtbl->get_InactiveBackgroundColor(This,value)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar_put_ButtonInactiveForegroundColor(This,value) (This)->lpVtbl->put_ButtonInactiveForegroundColor(This,value)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar_get_ButtonInactiveForegroundColor(This,value) (This)->lpVtbl->get_ButtonInactiveForegroundColor(This,value)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar_put_ButtonInactiveBackgroundColor(This,value) (This)->lpVtbl->put_ButtonInactiveBackgroundColor(This,value)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar_get_ButtonInactiveBackgroundColor(This,value) (This)->lpVtbl->get_ButtonInactiveBackgroundColor(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar_QueryInterface(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar_AddRef(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar_Release(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar_GetIids(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar_GetRuntimeClassName(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar_GetTrustLevel(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IApplicationViewTitleBar methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar_put_ForegroundColor(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar* This,__FIReference_1_Color *value) {
    return This->lpVtbl->put_ForegroundColor(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar_get_ForegroundColor(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar* This,__FIReference_1_Color **value) {
    return This->lpVtbl->get_ForegroundColor(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar_put_BackgroundColor(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar* This,__FIReference_1_Color *value) {
    return This->lpVtbl->put_BackgroundColor(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar_get_BackgroundColor(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar* This,__FIReference_1_Color **value) {
    return This->lpVtbl->get_BackgroundColor(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar_put_ButtonForegroundColor(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar* This,__FIReference_1_Color *value) {
    return This->lpVtbl->put_ButtonForegroundColor(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar_get_ButtonForegroundColor(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar* This,__FIReference_1_Color **value) {
    return This->lpVtbl->get_ButtonForegroundColor(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar_put_ButtonBackgroundColor(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar* This,__FIReference_1_Color *value) {
    return This->lpVtbl->put_ButtonBackgroundColor(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar_get_ButtonBackgroundColor(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar* This,__FIReference_1_Color **value) {
    return This->lpVtbl->get_ButtonBackgroundColor(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar_put_ButtonHoverForegroundColor(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar* This,__FIReference_1_Color *value) {
    return This->lpVtbl->put_ButtonHoverForegroundColor(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar_get_ButtonHoverForegroundColor(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar* This,__FIReference_1_Color **value) {
    return This->lpVtbl->get_ButtonHoverForegroundColor(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar_put_ButtonHoverBackgroundColor(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar* This,__FIReference_1_Color *value) {
    return This->lpVtbl->put_ButtonHoverBackgroundColor(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar_get_ButtonHoverBackgroundColor(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar* This,__FIReference_1_Color **value) {
    return This->lpVtbl->get_ButtonHoverBackgroundColor(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar_put_ButtonPressedForegroundColor(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar* This,__FIReference_1_Color *value) {
    return This->lpVtbl->put_ButtonPressedForegroundColor(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar_get_ButtonPressedForegroundColor(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar* This,__FIReference_1_Color **value) {
    return This->lpVtbl->get_ButtonPressedForegroundColor(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar_put_ButtonPressedBackgroundColor(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar* This,__FIReference_1_Color *value) {
    return This->lpVtbl->put_ButtonPressedBackgroundColor(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar_get_ButtonPressedBackgroundColor(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar* This,__FIReference_1_Color **value) {
    return This->lpVtbl->get_ButtonPressedBackgroundColor(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar_put_InactiveForegroundColor(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar* This,__FIReference_1_Color *value) {
    return This->lpVtbl->put_InactiveForegroundColor(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar_get_InactiveForegroundColor(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar* This,__FIReference_1_Color **value) {
    return This->lpVtbl->get_InactiveForegroundColor(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar_put_InactiveBackgroundColor(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar* This,__FIReference_1_Color *value) {
    return This->lpVtbl->put_InactiveBackgroundColor(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar_get_InactiveBackgroundColor(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar* This,__FIReference_1_Color **value) {
    return This->lpVtbl->get_InactiveBackgroundColor(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar_put_ButtonInactiveForegroundColor(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar* This,__FIReference_1_Color *value) {
    return This->lpVtbl->put_ButtonInactiveForegroundColor(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar_get_ButtonInactiveForegroundColor(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar* This,__FIReference_1_Color **value) {
    return This->lpVtbl->get_ButtonInactiveForegroundColor(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar_put_ButtonInactiveBackgroundColor(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar* This,__FIReference_1_Color *value) {
    return This->lpVtbl->put_ButtonInactiveBackgroundColor(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar_get_ButtonInactiveBackgroundColor(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar* This,__FIReference_1_Color **value) {
    return This->lpVtbl->get_ButtonInactiveBackgroundColor(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_ViewManagement
#define IID_IApplicationViewTitleBar IID___x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar
#define IApplicationViewTitleBarVtbl __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBarVtbl
#define IApplicationViewTitleBar __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar
#define IApplicationViewTitleBar_QueryInterface __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar_QueryInterface
#define IApplicationViewTitleBar_AddRef __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar_AddRef
#define IApplicationViewTitleBar_Release __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar_Release
#define IApplicationViewTitleBar_GetIids __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar_GetIids
#define IApplicationViewTitleBar_GetRuntimeClassName __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar_GetRuntimeClassName
#define IApplicationViewTitleBar_GetTrustLevel __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar_GetTrustLevel
#define IApplicationViewTitleBar_put_ForegroundColor __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar_put_ForegroundColor
#define IApplicationViewTitleBar_get_ForegroundColor __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar_get_ForegroundColor
#define IApplicationViewTitleBar_put_BackgroundColor __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar_put_BackgroundColor
#define IApplicationViewTitleBar_get_BackgroundColor __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar_get_BackgroundColor
#define IApplicationViewTitleBar_put_ButtonForegroundColor __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar_put_ButtonForegroundColor
#define IApplicationViewTitleBar_get_ButtonForegroundColor __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar_get_ButtonForegroundColor
#define IApplicationViewTitleBar_put_ButtonBackgroundColor __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar_put_ButtonBackgroundColor
#define IApplicationViewTitleBar_get_ButtonBackgroundColor __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar_get_ButtonBackgroundColor
#define IApplicationViewTitleBar_put_ButtonHoverForegroundColor __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar_put_ButtonHoverForegroundColor
#define IApplicationViewTitleBar_get_ButtonHoverForegroundColor __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar_get_ButtonHoverForegroundColor
#define IApplicationViewTitleBar_put_ButtonHoverBackgroundColor __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar_put_ButtonHoverBackgroundColor
#define IApplicationViewTitleBar_get_ButtonHoverBackgroundColor __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar_get_ButtonHoverBackgroundColor
#define IApplicationViewTitleBar_put_ButtonPressedForegroundColor __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar_put_ButtonPressedForegroundColor
#define IApplicationViewTitleBar_get_ButtonPressedForegroundColor __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar_get_ButtonPressedForegroundColor
#define IApplicationViewTitleBar_put_ButtonPressedBackgroundColor __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar_put_ButtonPressedBackgroundColor
#define IApplicationViewTitleBar_get_ButtonPressedBackgroundColor __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar_get_ButtonPressedBackgroundColor
#define IApplicationViewTitleBar_put_InactiveForegroundColor __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar_put_InactiveForegroundColor
#define IApplicationViewTitleBar_get_InactiveForegroundColor __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar_get_InactiveForegroundColor
#define IApplicationViewTitleBar_put_InactiveBackgroundColor __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar_put_InactiveBackgroundColor
#define IApplicationViewTitleBar_get_InactiveBackgroundColor __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar_get_InactiveBackgroundColor
#define IApplicationViewTitleBar_put_ButtonInactiveForegroundColor __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar_put_ButtonInactiveForegroundColor
#define IApplicationViewTitleBar_get_ButtonInactiveForegroundColor __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar_get_ButtonInactiveForegroundColor
#define IApplicationViewTitleBar_put_ButtonInactiveBackgroundColor __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar_put_ButtonInactiveBackgroundColor
#define IApplicationViewTitleBar_get_ButtonInactiveBackgroundColor __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTitleBar_get_ButtonInactiveBackgroundColor
#endif /* WIDL_using_Windows_UI_ViewManagement */
#endif

#endif

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

/*****************************************************************************
 * IApplicationViewTransferContext interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContext_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContext_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContext, 0x8574bc63, 0x3c17, 0x408e, 0x94,0x08, 0x8a,0x1a,0x9e,0xa8,0x1b,0xfa);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                MIDL_INTERFACE("8574bc63-3c17-408e-9408-8a1a9ea81bfa")
                IApplicationViewTransferContext : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_ViewId(
                        INT32 *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_ViewId(
                        INT32 value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContext, 0x8574bc63, 0x3c17, 0x408e, 0x94,0x08, 0x8a,0x1a,0x9e,0xa8,0x1b,0xfa)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContextVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IApplicationViewTransferContext methods ***/
    HRESULT (STDMETHODCALLTYPE *get_ViewId)(
        __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContext *This,
        INT32 *value);

    HRESULT (STDMETHODCALLTYPE *put_ViewId)(
        __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContext *This,
        INT32 value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContextVtbl;

interface __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContext {
    CONST_VTBL __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContextVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContext_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContext_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContext_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContext_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContext_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContext_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IApplicationViewTransferContext methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContext_get_ViewId(This,value) (This)->lpVtbl->get_ViewId(This,value)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContext_put_ViewId(This,value) (This)->lpVtbl->put_ViewId(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContext_QueryInterface(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContext* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContext_AddRef(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContext* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContext_Release(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContext* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContext_GetIids(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContext* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContext_GetRuntimeClassName(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContext* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContext_GetTrustLevel(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContext* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IApplicationViewTransferContext methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContext_get_ViewId(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContext* This,INT32 *value) {
    return This->lpVtbl->get_ViewId(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContext_put_ViewId(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContext* This,INT32 value) {
    return This->lpVtbl->put_ViewId(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_ViewManagement
#define IID_IApplicationViewTransferContext IID___x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContext
#define IApplicationViewTransferContextVtbl __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContextVtbl
#define IApplicationViewTransferContext __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContext
#define IApplicationViewTransferContext_QueryInterface __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContext_QueryInterface
#define IApplicationViewTransferContext_AddRef __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContext_AddRef
#define IApplicationViewTransferContext_Release __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContext_Release
#define IApplicationViewTransferContext_GetIids __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContext_GetIids
#define IApplicationViewTransferContext_GetRuntimeClassName __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContext_GetRuntimeClassName
#define IApplicationViewTransferContext_GetTrustLevel __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContext_GetTrustLevel
#define IApplicationViewTransferContext_get_ViewId __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContext_get_ViewId
#define IApplicationViewTransferContext_put_ViewId __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContext_put_ViewId
#endif /* WIDL_using_Windows_UI_ViewManagement */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContext_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*****************************************************************************
 * IApplicationViewTransferContextStatics interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContextStatics_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContextStatics_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContextStatics, 0x15a89d92, 0xdd79, 0x4b0b, 0xbc,0x47, 0xd5,0xf1,0x95,0xf1,0x46,0x61);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                MIDL_INTERFACE("15a89d92-dd79-4b0b-bc47-d5f195f14661")
                IApplicationViewTransferContextStatics : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_DataPackageFormatId(
                        HSTRING *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContextStatics, 0x15a89d92, 0xdd79, 0x4b0b, 0xbc,0x47, 0xd5,0xf1,0x95,0xf1,0x46,0x61)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContextStaticsVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IApplicationViewTransferContextStatics methods ***/
    HRESULT (STDMETHODCALLTYPE *get_DataPackageFormatId)(
        __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContextStatics *This,
        HSTRING *value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContextStaticsVtbl;

interface __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContextStatics {
    CONST_VTBL __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContextStaticsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContextStatics_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContextStatics_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContextStatics_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContextStatics_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContextStatics_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContextStatics_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IApplicationViewTransferContextStatics methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContextStatics_get_DataPackageFormatId(This,value) (This)->lpVtbl->get_DataPackageFormatId(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContextStatics_QueryInterface(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContextStatics* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContextStatics_AddRef(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContextStatics* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContextStatics_Release(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContextStatics* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContextStatics_GetIids(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContextStatics* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContextStatics_GetRuntimeClassName(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContextStatics* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContextStatics_GetTrustLevel(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContextStatics* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IApplicationViewTransferContextStatics methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContextStatics_get_DataPackageFormatId(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContextStatics* This,HSTRING *value) {
    return This->lpVtbl->get_DataPackageFormatId(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_ViewManagement
#define IID_IApplicationViewTransferContextStatics IID___x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContextStatics
#define IApplicationViewTransferContextStaticsVtbl __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContextStaticsVtbl
#define IApplicationViewTransferContextStatics __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContextStatics
#define IApplicationViewTransferContextStatics_QueryInterface __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContextStatics_QueryInterface
#define IApplicationViewTransferContextStatics_AddRef __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContextStatics_AddRef
#define IApplicationViewTransferContextStatics_Release __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContextStatics_Release
#define IApplicationViewTransferContextStatics_GetIids __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContextStatics_GetIids
#define IApplicationViewTransferContextStatics_GetRuntimeClassName __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContextStatics_GetRuntimeClassName
#define IApplicationViewTransferContextStatics_GetTrustLevel __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContextStatics_GetTrustLevel
#define IApplicationViewTransferContextStatics_get_DataPackageFormatId __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContextStatics_get_DataPackageFormatId
#endif /* WIDL_using_Windows_UI_ViewManagement */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewTransferContextStatics_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*****************************************************************************
 * IApplicationViewWithContext interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000
#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewWithContext_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewWithContext_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewWithContext, 0xbd55d512, 0x9dc1, 0x44fc, 0x85,0x01, 0x66,0x66,0x25,0xdf,0x60,0xdc);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                MIDL_INTERFACE("bd55d512-9dc1-44fc-8501-666625df60dc")
                IApplicationViewWithContext : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_UIContext(
                        ABI::Windows::UI::IUIContext **value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewWithContext, 0xbd55d512, 0x9dc1, 0x44fc, 0x85,0x01, 0x66,0x66,0x25,0xdf,0x60,0xdc)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewWithContextVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IApplicationViewWithContext methods ***/
    HRESULT (STDMETHODCALLTYPE *get_UIContext)(
        __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewWithContext *This,
        __x_ABI_CWindows_CUI_CIUIContext **value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewWithContextVtbl;

interface __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewWithContext {
    CONST_VTBL __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewWithContextVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewWithContext_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewWithContext_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewWithContext_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewWithContext_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewWithContext_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewWithContext_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IApplicationViewWithContext methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewWithContext_get_UIContext(This,value) (This)->lpVtbl->get_UIContext(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewWithContext_QueryInterface(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewWithContext* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewWithContext_AddRef(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewWithContext* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewWithContext_Release(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewWithContext* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewWithContext_GetIids(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewWithContext* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewWithContext_GetRuntimeClassName(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewWithContext* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewWithContext_GetTrustLevel(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewWithContext* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IApplicationViewWithContext methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewWithContext_get_UIContext(__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewWithContext* This,__x_ABI_CWindows_CUI_CIUIContext **value) {
    return This->lpVtbl->get_UIContext(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_ViewManagement
#define IID_IApplicationViewWithContext IID___x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewWithContext
#define IApplicationViewWithContextVtbl __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewWithContextVtbl
#define IApplicationViewWithContext __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewWithContext
#define IApplicationViewWithContext_QueryInterface __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewWithContext_QueryInterface
#define IApplicationViewWithContext_AddRef __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewWithContext_AddRef
#define IApplicationViewWithContext_Release __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewWithContext_Release
#define IApplicationViewWithContext_GetIids __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewWithContext_GetIids
#define IApplicationViewWithContext_GetRuntimeClassName __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewWithContext_GetRuntimeClassName
#define IApplicationViewWithContext_GetTrustLevel __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewWithContext_GetTrustLevel
#define IApplicationViewWithContext_get_UIContext __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewWithContext_get_UIContext
#endif /* WIDL_using_Windows_UI_ViewManagement */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewWithContext_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000 */

/*****************************************************************************
 * IUISettings interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIUISettings_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIUISettings_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CViewManagement_CIUISettings, 0x85361600, 0x1c63, 0x4627, 0xbc,0xb1, 0x3a,0x89,0xe0,0xbc,0x9c,0x55);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                MIDL_INTERFACE("85361600-1c63-4627-bcb1-3a89e0bc9c55")
                IUISettings : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_HandPreference(
                        ABI::Windows::UI::ViewManagement::HandPreference *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_CursorSize(
                        ABI::Windows::Foundation::Size *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_ScrollBarSize(
                        ABI::Windows::Foundation::Size *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_ScrollBarArrowSize(
                        ABI::Windows::Foundation::Size *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_ScrollBarThumbBoxSize(
                        ABI::Windows::Foundation::Size *value) = 0;

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

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

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

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

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

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

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

                    virtual HRESULT STDMETHODCALLTYPE UIElementColor(
                        ABI::Windows::UI::ViewManagement::UIElementType element,
                        ABI::Windows::UI::Color *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CViewManagement_CIUISettings, 0x85361600, 0x1c63, 0x4627, 0xbc,0xb1, 0x3a,0x89,0xe0,0xbc,0x9c,0x55)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CViewManagement_CIUISettingsVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IUISettings methods ***/
    HRESULT (STDMETHODCALLTYPE *get_HandPreference)(
        __x_ABI_CWindows_CUI_CViewManagement_CIUISettings *This,
        __x_ABI_CWindows_CUI_CViewManagement_CHandPreference *value);

    HRESULT (STDMETHODCALLTYPE *get_CursorSize)(
        __x_ABI_CWindows_CUI_CViewManagement_CIUISettings *This,
        __x_ABI_CWindows_CFoundation_CSize *value);

    HRESULT (STDMETHODCALLTYPE *get_ScrollBarSize)(
        __x_ABI_CWindows_CUI_CViewManagement_CIUISettings *This,
        __x_ABI_CWindows_CFoundation_CSize *value);

    HRESULT (STDMETHODCALLTYPE *get_ScrollBarArrowSize)(
        __x_ABI_CWindows_CUI_CViewManagement_CIUISettings *This,
        __x_ABI_CWindows_CFoundation_CSize *value);

    HRESULT (STDMETHODCALLTYPE *get_ScrollBarThumbBoxSize)(
        __x_ABI_CWindows_CUI_CViewManagement_CIUISettings *This,
        __x_ABI_CWindows_CFoundation_CSize *value);

    HRESULT (STDMETHODCALLTYPE *get_MessageDuration)(
        __x_ABI_CWindows_CUI_CViewManagement_CIUISettings *This,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *get_AnimationsEnabled)(
        __x_ABI_CWindows_CUI_CViewManagement_CIUISettings *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *get_CaretBrowsingEnabled)(
        __x_ABI_CWindows_CUI_CViewManagement_CIUISettings *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *get_CaretBlinkRate)(
        __x_ABI_CWindows_CUI_CViewManagement_CIUISettings *This,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *get_CaretWidth)(
        __x_ABI_CWindows_CUI_CViewManagement_CIUISettings *This,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *get_DoubleClickTime)(
        __x_ABI_CWindows_CUI_CViewManagement_CIUISettings *This,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *get_MouseHoverTime)(
        __x_ABI_CWindows_CUI_CViewManagement_CIUISettings *This,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *UIElementColor)(
        __x_ABI_CWindows_CUI_CViewManagement_CIUISettings *This,
        __x_ABI_CWindows_CUI_CViewManagement_CUIElementType element,
        __x_ABI_CWindows_CUI_CColor *value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CViewManagement_CIUISettingsVtbl;

interface __x_ABI_CWindows_CUI_CViewManagement_CIUISettings {
    CONST_VTBL __x_ABI_CWindows_CUI_CViewManagement_CIUISettingsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettings_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettings_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettings_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettings_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettings_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettings_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IUISettings methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettings_get_HandPreference(This,value) (This)->lpVtbl->get_HandPreference(This,value)
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettings_get_CursorSize(This,value) (This)->lpVtbl->get_CursorSize(This,value)
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettings_get_ScrollBarSize(This,value) (This)->lpVtbl->get_ScrollBarSize(This,value)
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettings_get_ScrollBarArrowSize(This,value) (This)->lpVtbl->get_ScrollBarArrowSize(This,value)
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettings_get_ScrollBarThumbBoxSize(This,value) (This)->lpVtbl->get_ScrollBarThumbBoxSize(This,value)
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettings_get_MessageDuration(This,value) (This)->lpVtbl->get_MessageDuration(This,value)
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettings_get_AnimationsEnabled(This,value) (This)->lpVtbl->get_AnimationsEnabled(This,value)
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettings_get_CaretBrowsingEnabled(This,value) (This)->lpVtbl->get_CaretBrowsingEnabled(This,value)
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettings_get_CaretBlinkRate(This,value) (This)->lpVtbl->get_CaretBlinkRate(This,value)
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettings_get_CaretWidth(This,value) (This)->lpVtbl->get_CaretWidth(This,value)
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettings_get_DoubleClickTime(This,value) (This)->lpVtbl->get_DoubleClickTime(This,value)
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettings_get_MouseHoverTime(This,value) (This)->lpVtbl->get_MouseHoverTime(This,value)
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettings_UIElementColor(This,element,value) (This)->lpVtbl->UIElementColor(This,element,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIUISettings_QueryInterface(__x_ABI_CWindows_CUI_CViewManagement_CIUISettings* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CViewManagement_CIUISettings_AddRef(__x_ABI_CWindows_CUI_CViewManagement_CIUISettings* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CViewManagement_CIUISettings_Release(__x_ABI_CWindows_CUI_CViewManagement_CIUISettings* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIUISettings_GetIids(__x_ABI_CWindows_CUI_CViewManagement_CIUISettings* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIUISettings_GetRuntimeClassName(__x_ABI_CWindows_CUI_CViewManagement_CIUISettings* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIUISettings_GetTrustLevel(__x_ABI_CWindows_CUI_CViewManagement_CIUISettings* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IUISettings methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIUISettings_get_HandPreference(__x_ABI_CWindows_CUI_CViewManagement_CIUISettings* This,__x_ABI_CWindows_CUI_CViewManagement_CHandPreference *value) {
    return This->lpVtbl->get_HandPreference(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIUISettings_get_CursorSize(__x_ABI_CWindows_CUI_CViewManagement_CIUISettings* This,__x_ABI_CWindows_CFoundation_CSize *value) {
    return This->lpVtbl->get_CursorSize(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIUISettings_get_ScrollBarSize(__x_ABI_CWindows_CUI_CViewManagement_CIUISettings* This,__x_ABI_CWindows_CFoundation_CSize *value) {
    return This->lpVtbl->get_ScrollBarSize(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIUISettings_get_ScrollBarArrowSize(__x_ABI_CWindows_CUI_CViewManagement_CIUISettings* This,__x_ABI_CWindows_CFoundation_CSize *value) {
    return This->lpVtbl->get_ScrollBarArrowSize(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIUISettings_get_ScrollBarThumbBoxSize(__x_ABI_CWindows_CUI_CViewManagement_CIUISettings* This,__x_ABI_CWindows_CFoundation_CSize *value) {
    return This->lpVtbl->get_ScrollBarThumbBoxSize(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIUISettings_get_MessageDuration(__x_ABI_CWindows_CUI_CViewManagement_CIUISettings* This,UINT32 *value) {
    return This->lpVtbl->get_MessageDuration(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIUISettings_get_AnimationsEnabled(__x_ABI_CWindows_CUI_CViewManagement_CIUISettings* This,boolean *value) {
    return This->lpVtbl->get_AnimationsEnabled(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIUISettings_get_CaretBrowsingEnabled(__x_ABI_CWindows_CUI_CViewManagement_CIUISettings* This,boolean *value) {
    return This->lpVtbl->get_CaretBrowsingEnabled(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIUISettings_get_CaretBlinkRate(__x_ABI_CWindows_CUI_CViewManagement_CIUISettings* This,UINT32 *value) {
    return This->lpVtbl->get_CaretBlinkRate(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIUISettings_get_CaretWidth(__x_ABI_CWindows_CUI_CViewManagement_CIUISettings* This,UINT32 *value) {
    return This->lpVtbl->get_CaretWidth(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIUISettings_get_DoubleClickTime(__x_ABI_CWindows_CUI_CViewManagement_CIUISettings* This,UINT32 *value) {
    return This->lpVtbl->get_DoubleClickTime(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIUISettings_get_MouseHoverTime(__x_ABI_CWindows_CUI_CViewManagement_CIUISettings* This,UINT32 *value) {
    return This->lpVtbl->get_MouseHoverTime(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIUISettings_UIElementColor(__x_ABI_CWindows_CUI_CViewManagement_CIUISettings* This,__x_ABI_CWindows_CUI_CViewManagement_CUIElementType element,__x_ABI_CWindows_CUI_CColor *value) {
    return This->lpVtbl->UIElementColor(This,element,value);
}
#endif
#ifdef WIDL_using_Windows_UI_ViewManagement
#define IID_IUISettings IID___x_ABI_CWindows_CUI_CViewManagement_CIUISettings
#define IUISettingsVtbl __x_ABI_CWindows_CUI_CViewManagement_CIUISettingsVtbl
#define IUISettings __x_ABI_CWindows_CUI_CViewManagement_CIUISettings
#define IUISettings_QueryInterface __x_ABI_CWindows_CUI_CViewManagement_CIUISettings_QueryInterface
#define IUISettings_AddRef __x_ABI_CWindows_CUI_CViewManagement_CIUISettings_AddRef
#define IUISettings_Release __x_ABI_CWindows_CUI_CViewManagement_CIUISettings_Release
#define IUISettings_GetIids __x_ABI_CWindows_CUI_CViewManagement_CIUISettings_GetIids
#define IUISettings_GetRuntimeClassName __x_ABI_CWindows_CUI_CViewManagement_CIUISettings_GetRuntimeClassName
#define IUISettings_GetTrustLevel __x_ABI_CWindows_CUI_CViewManagement_CIUISettings_GetTrustLevel
#define IUISettings_get_HandPreference __x_ABI_CWindows_CUI_CViewManagement_CIUISettings_get_HandPreference
#define IUISettings_get_CursorSize __x_ABI_CWindows_CUI_CViewManagement_CIUISettings_get_CursorSize
#define IUISettings_get_ScrollBarSize __x_ABI_CWindows_CUI_CViewManagement_CIUISettings_get_ScrollBarSize
#define IUISettings_get_ScrollBarArrowSize __x_ABI_CWindows_CUI_CViewManagement_CIUISettings_get_ScrollBarArrowSize
#define IUISettings_get_ScrollBarThumbBoxSize __x_ABI_CWindows_CUI_CViewManagement_CIUISettings_get_ScrollBarThumbBoxSize
#define IUISettings_get_MessageDuration __x_ABI_CWindows_CUI_CViewManagement_CIUISettings_get_MessageDuration
#define IUISettings_get_AnimationsEnabled __x_ABI_CWindows_CUI_CViewManagement_CIUISettings_get_AnimationsEnabled
#define IUISettings_get_CaretBrowsingEnabled __x_ABI_CWindows_CUI_CViewManagement_CIUISettings_get_CaretBrowsingEnabled
#define IUISettings_get_CaretBlinkRate __x_ABI_CWindows_CUI_CViewManagement_CIUISettings_get_CaretBlinkRate
#define IUISettings_get_CaretWidth __x_ABI_CWindows_CUI_CViewManagement_CIUISettings_get_CaretWidth
#define IUISettings_get_DoubleClickTime __x_ABI_CWindows_CUI_CViewManagement_CIUISettings_get_DoubleClickTime
#define IUISettings_get_MouseHoverTime __x_ABI_CWindows_CUI_CViewManagement_CIUISettings_get_MouseHoverTime
#define IUISettings_UIElementColor __x_ABI_CWindows_CUI_CViewManagement_CIUISettings_UIElementColor
#endif /* WIDL_using_Windows_UI_ViewManagement */
#endif

#endif

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

/*****************************************************************************
 * IUISettings2 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIUISettings2_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIUISettings2_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CViewManagement_CIUISettings2, 0xbad82401, 0x2721, 0x44f9, 0xbb,0x91, 0x2b,0xb2,0x28,0xbe,0x44,0x2f);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                MIDL_INTERFACE("bad82401-2721-44f9-bb91-2bb228be442f")
                IUISettings2 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_TextScaleFactor(
                        DOUBLE *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE add_TextScaleFactorChanged(
                        ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::UI::ViewManagement::UISettings*,IInspectable* > *handler,
                        EventRegistrationToken *cookie) = 0;

                    virtual HRESULT STDMETHODCALLTYPE remove_TextScaleFactorChanged(
                        EventRegistrationToken cookie) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CViewManagement_CIUISettings2, 0xbad82401, 0x2721, 0x44f9, 0xbb,0x91, 0x2b,0xb2,0x28,0xbe,0x44,0x2f)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CViewManagement_CIUISettings2Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IUISettings2 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_TextScaleFactor)(
        __x_ABI_CWindows_CUI_CViewManagement_CIUISettings2 *This,
        DOUBLE *value);

    HRESULT (STDMETHODCALLTYPE *add_TextScaleFactorChanged)(
        __x_ABI_CWindows_CUI_CViewManagement_CIUISettings2 *This,
        __FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_IInspectable *handler,
        EventRegistrationToken *cookie);

    HRESULT (STDMETHODCALLTYPE *remove_TextScaleFactorChanged)(
        __x_ABI_CWindows_CUI_CViewManagement_CIUISettings2 *This,
        EventRegistrationToken cookie);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CViewManagement_CIUISettings2Vtbl;

interface __x_ABI_CWindows_CUI_CViewManagement_CIUISettings2 {
    CONST_VTBL __x_ABI_CWindows_CUI_CViewManagement_CIUISettings2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettings2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettings2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettings2_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettings2_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettings2_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettings2_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IUISettings2 methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettings2_get_TextScaleFactor(This,value) (This)->lpVtbl->get_TextScaleFactor(This,value)
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettings2_add_TextScaleFactorChanged(This,handler,cookie) (This)->lpVtbl->add_TextScaleFactorChanged(This,handler,cookie)
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettings2_remove_TextScaleFactorChanged(This,cookie) (This)->lpVtbl->remove_TextScaleFactorChanged(This,cookie)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIUISettings2_QueryInterface(__x_ABI_CWindows_CUI_CViewManagement_CIUISettings2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CViewManagement_CIUISettings2_AddRef(__x_ABI_CWindows_CUI_CViewManagement_CIUISettings2* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CViewManagement_CIUISettings2_Release(__x_ABI_CWindows_CUI_CViewManagement_CIUISettings2* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIUISettings2_GetIids(__x_ABI_CWindows_CUI_CViewManagement_CIUISettings2* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIUISettings2_GetRuntimeClassName(__x_ABI_CWindows_CUI_CViewManagement_CIUISettings2* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIUISettings2_GetTrustLevel(__x_ABI_CWindows_CUI_CViewManagement_CIUISettings2* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IUISettings2 methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIUISettings2_get_TextScaleFactor(__x_ABI_CWindows_CUI_CViewManagement_CIUISettings2* This,DOUBLE *value) {
    return This->lpVtbl->get_TextScaleFactor(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIUISettings2_add_TextScaleFactorChanged(__x_ABI_CWindows_CUI_CViewManagement_CIUISettings2* This,__FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_IInspectable *handler,EventRegistrationToken *cookie) {
    return This->lpVtbl->add_TextScaleFactorChanged(This,handler,cookie);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIUISettings2_remove_TextScaleFactorChanged(__x_ABI_CWindows_CUI_CViewManagement_CIUISettings2* This,EventRegistrationToken cookie) {
    return This->lpVtbl->remove_TextScaleFactorChanged(This,cookie);
}
#endif
#ifdef WIDL_using_Windows_UI_ViewManagement
#define IID_IUISettings2 IID___x_ABI_CWindows_CUI_CViewManagement_CIUISettings2
#define IUISettings2Vtbl __x_ABI_CWindows_CUI_CViewManagement_CIUISettings2Vtbl
#define IUISettings2 __x_ABI_CWindows_CUI_CViewManagement_CIUISettings2
#define IUISettings2_QueryInterface __x_ABI_CWindows_CUI_CViewManagement_CIUISettings2_QueryInterface
#define IUISettings2_AddRef __x_ABI_CWindows_CUI_CViewManagement_CIUISettings2_AddRef
#define IUISettings2_Release __x_ABI_CWindows_CUI_CViewManagement_CIUISettings2_Release
#define IUISettings2_GetIids __x_ABI_CWindows_CUI_CViewManagement_CIUISettings2_GetIids
#define IUISettings2_GetRuntimeClassName __x_ABI_CWindows_CUI_CViewManagement_CIUISettings2_GetRuntimeClassName
#define IUISettings2_GetTrustLevel __x_ABI_CWindows_CUI_CViewManagement_CIUISettings2_GetTrustLevel
#define IUISettings2_get_TextScaleFactor __x_ABI_CWindows_CUI_CViewManagement_CIUISettings2_get_TextScaleFactor
#define IUISettings2_add_TextScaleFactorChanged __x_ABI_CWindows_CUI_CViewManagement_CIUISettings2_add_TextScaleFactorChanged
#define IUISettings2_remove_TextScaleFactorChanged __x_ABI_CWindows_CUI_CViewManagement_CIUISettings2_remove_TextScaleFactorChanged
#endif /* WIDL_using_Windows_UI_ViewManagement */
#endif

#endif

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

/*****************************************************************************
 * IUISettings3 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIUISettings3_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIUISettings3_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CViewManagement_CIUISettings3, 0x03021be4, 0x5254, 0x4781, 0x81,0x94, 0x51,0x68,0xf7,0xd0,0x6d,0x7b);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                MIDL_INTERFACE("03021be4-5254-4781-8194-5168f7d06d7b")
                IUISettings3 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE GetColorValue(
                        ABI::Windows::UI::ViewManagement::UIColorType color,
                        ABI::Windows::UI::Color *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE add_ColorValuesChanged(
                        ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::UI::ViewManagement::UISettings*,IInspectable* > *handler,
                        EventRegistrationToken *cookie) = 0;

                    virtual HRESULT STDMETHODCALLTYPE remove_ColorValuesChanged(
                        EventRegistrationToken cookie) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CViewManagement_CIUISettings3, 0x03021be4, 0x5254, 0x4781, 0x81,0x94, 0x51,0x68,0xf7,0xd0,0x6d,0x7b)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CViewManagement_CIUISettings3Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IUISettings3 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetColorValue)(
        __x_ABI_CWindows_CUI_CViewManagement_CIUISettings3 *This,
        __x_ABI_CWindows_CUI_CViewManagement_CUIColorType color,
        __x_ABI_CWindows_CUI_CColor *value);

    HRESULT (STDMETHODCALLTYPE *add_ColorValuesChanged)(
        __x_ABI_CWindows_CUI_CViewManagement_CIUISettings3 *This,
        __FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_IInspectable *handler,
        EventRegistrationToken *cookie);

    HRESULT (STDMETHODCALLTYPE *remove_ColorValuesChanged)(
        __x_ABI_CWindows_CUI_CViewManagement_CIUISettings3 *This,
        EventRegistrationToken cookie);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CViewManagement_CIUISettings3Vtbl;

interface __x_ABI_CWindows_CUI_CViewManagement_CIUISettings3 {
    CONST_VTBL __x_ABI_CWindows_CUI_CViewManagement_CIUISettings3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettings3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettings3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettings3_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettings3_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettings3_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettings3_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IUISettings3 methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettings3_GetColorValue(This,color,value) (This)->lpVtbl->GetColorValue(This,color,value)
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettings3_add_ColorValuesChanged(This,handler,cookie) (This)->lpVtbl->add_ColorValuesChanged(This,handler,cookie)
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettings3_remove_ColorValuesChanged(This,cookie) (This)->lpVtbl->remove_ColorValuesChanged(This,cookie)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIUISettings3_QueryInterface(__x_ABI_CWindows_CUI_CViewManagement_CIUISettings3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CViewManagement_CIUISettings3_AddRef(__x_ABI_CWindows_CUI_CViewManagement_CIUISettings3* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CViewManagement_CIUISettings3_Release(__x_ABI_CWindows_CUI_CViewManagement_CIUISettings3* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIUISettings3_GetIids(__x_ABI_CWindows_CUI_CViewManagement_CIUISettings3* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIUISettings3_GetRuntimeClassName(__x_ABI_CWindows_CUI_CViewManagement_CIUISettings3* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIUISettings3_GetTrustLevel(__x_ABI_CWindows_CUI_CViewManagement_CIUISettings3* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IUISettings3 methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIUISettings3_GetColorValue(__x_ABI_CWindows_CUI_CViewManagement_CIUISettings3* This,__x_ABI_CWindows_CUI_CViewManagement_CUIColorType color,__x_ABI_CWindows_CUI_CColor *value) {
    return This->lpVtbl->GetColorValue(This,color,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIUISettings3_add_ColorValuesChanged(__x_ABI_CWindows_CUI_CViewManagement_CIUISettings3* This,__FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_IInspectable *handler,EventRegistrationToken *cookie) {
    return This->lpVtbl->add_ColorValuesChanged(This,handler,cookie);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIUISettings3_remove_ColorValuesChanged(__x_ABI_CWindows_CUI_CViewManagement_CIUISettings3* This,EventRegistrationToken cookie) {
    return This->lpVtbl->remove_ColorValuesChanged(This,cookie);
}
#endif
#ifdef WIDL_using_Windows_UI_ViewManagement
#define IID_IUISettings3 IID___x_ABI_CWindows_CUI_CViewManagement_CIUISettings3
#define IUISettings3Vtbl __x_ABI_CWindows_CUI_CViewManagement_CIUISettings3Vtbl
#define IUISettings3 __x_ABI_CWindows_CUI_CViewManagement_CIUISettings3
#define IUISettings3_QueryInterface __x_ABI_CWindows_CUI_CViewManagement_CIUISettings3_QueryInterface
#define IUISettings3_AddRef __x_ABI_CWindows_CUI_CViewManagement_CIUISettings3_AddRef
#define IUISettings3_Release __x_ABI_CWindows_CUI_CViewManagement_CIUISettings3_Release
#define IUISettings3_GetIids __x_ABI_CWindows_CUI_CViewManagement_CIUISettings3_GetIids
#define IUISettings3_GetRuntimeClassName __x_ABI_CWindows_CUI_CViewManagement_CIUISettings3_GetRuntimeClassName
#define IUISettings3_GetTrustLevel __x_ABI_CWindows_CUI_CViewManagement_CIUISettings3_GetTrustLevel
#define IUISettings3_GetColorValue __x_ABI_CWindows_CUI_CViewManagement_CIUISettings3_GetColorValue
#define IUISettings3_add_ColorValuesChanged __x_ABI_CWindows_CUI_CViewManagement_CIUISettings3_add_ColorValuesChanged
#define IUISettings3_remove_ColorValuesChanged __x_ABI_CWindows_CUI_CViewManagement_CIUISettings3_remove_ColorValuesChanged
#endif /* WIDL_using_Windows_UI_ViewManagement */
#endif

#endif

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

/*****************************************************************************
 * IUISettings4 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000
#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIUISettings4_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIUISettings4_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CViewManagement_CIUISettings4, 0x52bb3002, 0x919b, 0x4d6b, 0x9b,0x78, 0x8d,0xd6,0x6f,0xf4,0xb9,0x3b);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                MIDL_INTERFACE("52bb3002-919b-4d6b-9b78-8dd66ff4b93b")
                IUISettings4 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_AdvancedEffectsEnabled(
                        boolean *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE add_AdvancedEffectsEnabledChanged(
                        ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::UI::ViewManagement::UISettings*,IInspectable* > *handler,
                        EventRegistrationToken *cookie) = 0;

                    virtual HRESULT STDMETHODCALLTYPE remove_AdvancedEffectsEnabledChanged(
                        EventRegistrationToken cookie) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CViewManagement_CIUISettings4, 0x52bb3002, 0x919b, 0x4d6b, 0x9b,0x78, 0x8d,0xd6,0x6f,0xf4,0xb9,0x3b)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CViewManagement_CIUISettings4Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IUISettings4 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_AdvancedEffectsEnabled)(
        __x_ABI_CWindows_CUI_CViewManagement_CIUISettings4 *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *add_AdvancedEffectsEnabledChanged)(
        __x_ABI_CWindows_CUI_CViewManagement_CIUISettings4 *This,
        __FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_IInspectable *handler,
        EventRegistrationToken *cookie);

    HRESULT (STDMETHODCALLTYPE *remove_AdvancedEffectsEnabledChanged)(
        __x_ABI_CWindows_CUI_CViewManagement_CIUISettings4 *This,
        EventRegistrationToken cookie);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CViewManagement_CIUISettings4Vtbl;

interface __x_ABI_CWindows_CUI_CViewManagement_CIUISettings4 {
    CONST_VTBL __x_ABI_CWindows_CUI_CViewManagement_CIUISettings4Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettings4_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettings4_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettings4_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettings4_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettings4_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettings4_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IUISettings4 methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettings4_get_AdvancedEffectsEnabled(This,value) (This)->lpVtbl->get_AdvancedEffectsEnabled(This,value)
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettings4_add_AdvancedEffectsEnabledChanged(This,handler,cookie) (This)->lpVtbl->add_AdvancedEffectsEnabledChanged(This,handler,cookie)
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettings4_remove_AdvancedEffectsEnabledChanged(This,cookie) (This)->lpVtbl->remove_AdvancedEffectsEnabledChanged(This,cookie)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIUISettings4_QueryInterface(__x_ABI_CWindows_CUI_CViewManagement_CIUISettings4* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CViewManagement_CIUISettings4_AddRef(__x_ABI_CWindows_CUI_CViewManagement_CIUISettings4* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CViewManagement_CIUISettings4_Release(__x_ABI_CWindows_CUI_CViewManagement_CIUISettings4* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIUISettings4_GetIids(__x_ABI_CWindows_CUI_CViewManagement_CIUISettings4* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIUISettings4_GetRuntimeClassName(__x_ABI_CWindows_CUI_CViewManagement_CIUISettings4* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIUISettings4_GetTrustLevel(__x_ABI_CWindows_CUI_CViewManagement_CIUISettings4* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IUISettings4 methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIUISettings4_get_AdvancedEffectsEnabled(__x_ABI_CWindows_CUI_CViewManagement_CIUISettings4* This,boolean *value) {
    return This->lpVtbl->get_AdvancedEffectsEnabled(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIUISettings4_add_AdvancedEffectsEnabledChanged(__x_ABI_CWindows_CUI_CViewManagement_CIUISettings4* This,__FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_IInspectable *handler,EventRegistrationToken *cookie) {
    return This->lpVtbl->add_AdvancedEffectsEnabledChanged(This,handler,cookie);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIUISettings4_remove_AdvancedEffectsEnabledChanged(__x_ABI_CWindows_CUI_CViewManagement_CIUISettings4* This,EventRegistrationToken cookie) {
    return This->lpVtbl->remove_AdvancedEffectsEnabledChanged(This,cookie);
}
#endif
#ifdef WIDL_using_Windows_UI_ViewManagement
#define IID_IUISettings4 IID___x_ABI_CWindows_CUI_CViewManagement_CIUISettings4
#define IUISettings4Vtbl __x_ABI_CWindows_CUI_CViewManagement_CIUISettings4Vtbl
#define IUISettings4 __x_ABI_CWindows_CUI_CViewManagement_CIUISettings4
#define IUISettings4_QueryInterface __x_ABI_CWindows_CUI_CViewManagement_CIUISettings4_QueryInterface
#define IUISettings4_AddRef __x_ABI_CWindows_CUI_CViewManagement_CIUISettings4_AddRef
#define IUISettings4_Release __x_ABI_CWindows_CUI_CViewManagement_CIUISettings4_Release
#define IUISettings4_GetIids __x_ABI_CWindows_CUI_CViewManagement_CIUISettings4_GetIids
#define IUISettings4_GetRuntimeClassName __x_ABI_CWindows_CUI_CViewManagement_CIUISettings4_GetRuntimeClassName
#define IUISettings4_GetTrustLevel __x_ABI_CWindows_CUI_CViewManagement_CIUISettings4_GetTrustLevel
#define IUISettings4_get_AdvancedEffectsEnabled __x_ABI_CWindows_CUI_CViewManagement_CIUISettings4_get_AdvancedEffectsEnabled
#define IUISettings4_add_AdvancedEffectsEnabledChanged __x_ABI_CWindows_CUI_CViewManagement_CIUISettings4_add_AdvancedEffectsEnabledChanged
#define IUISettings4_remove_AdvancedEffectsEnabledChanged __x_ABI_CWindows_CUI_CViewManagement_CIUISettings4_remove_AdvancedEffectsEnabledChanged
#endif /* WIDL_using_Windows_UI_ViewManagement */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CViewManagement_CIUISettings4_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000 */

/*****************************************************************************
 * IUISettings5 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000
#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIUISettings5_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIUISettings5_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CViewManagement_CIUISettings5, 0x5349d588, 0x0cb5, 0x5f05, 0xbd,0x34, 0x70,0x6b,0x32,0x31,0xf0,0xbd);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                MIDL_INTERFACE("5349d588-0cb5-5f05-bd34-706b3231f0bd")
                IUISettings5 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_AutoHideScrollBars(
                        boolean *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE add_AutoHideScrollBarsChanged(
                        ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::UI::ViewManagement::UISettings*,ABI::Windows::UI::ViewManagement::UISettingsAutoHideScrollBarsChangedEventArgs* > *handler,
                        EventRegistrationToken *token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE remove_AutoHideScrollBarsChanged(
                        EventRegistrationToken token) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CViewManagement_CIUISettings5, 0x5349d588, 0x0cb5, 0x5f05, 0xbd,0x34, 0x70,0x6b,0x32,0x31,0xf0,0xbd)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CViewManagement_CIUISettings5Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IUISettings5 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_AutoHideScrollBars)(
        __x_ABI_CWindows_CUI_CViewManagement_CIUISettings5 *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *add_AutoHideScrollBarsChanged)(
        __x_ABI_CWindows_CUI_CViewManagement_CIUISettings5 *This,
        __FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsAutoHideScrollBarsChangedEventArgs *handler,
        EventRegistrationToken *token);

    HRESULT (STDMETHODCALLTYPE *remove_AutoHideScrollBarsChanged)(
        __x_ABI_CWindows_CUI_CViewManagement_CIUISettings5 *This,
        EventRegistrationToken token);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CViewManagement_CIUISettings5Vtbl;

interface __x_ABI_CWindows_CUI_CViewManagement_CIUISettings5 {
    CONST_VTBL __x_ABI_CWindows_CUI_CViewManagement_CIUISettings5Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettings5_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettings5_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettings5_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettings5_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettings5_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettings5_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IUISettings5 methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettings5_get_AutoHideScrollBars(This,value) (This)->lpVtbl->get_AutoHideScrollBars(This,value)
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettings5_add_AutoHideScrollBarsChanged(This,handler,token) (This)->lpVtbl->add_AutoHideScrollBarsChanged(This,handler,token)
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettings5_remove_AutoHideScrollBarsChanged(This,token) (This)->lpVtbl->remove_AutoHideScrollBarsChanged(This,token)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIUISettings5_QueryInterface(__x_ABI_CWindows_CUI_CViewManagement_CIUISettings5* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CViewManagement_CIUISettings5_AddRef(__x_ABI_CWindows_CUI_CViewManagement_CIUISettings5* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CViewManagement_CIUISettings5_Release(__x_ABI_CWindows_CUI_CViewManagement_CIUISettings5* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIUISettings5_GetIids(__x_ABI_CWindows_CUI_CViewManagement_CIUISettings5* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIUISettings5_GetRuntimeClassName(__x_ABI_CWindows_CUI_CViewManagement_CIUISettings5* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIUISettings5_GetTrustLevel(__x_ABI_CWindows_CUI_CViewManagement_CIUISettings5* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IUISettings5 methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIUISettings5_get_AutoHideScrollBars(__x_ABI_CWindows_CUI_CViewManagement_CIUISettings5* This,boolean *value) {
    return This->lpVtbl->get_AutoHideScrollBars(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIUISettings5_add_AutoHideScrollBarsChanged(__x_ABI_CWindows_CUI_CViewManagement_CIUISettings5* This,__FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsAutoHideScrollBarsChangedEventArgs *handler,EventRegistrationToken *token) {
    return This->lpVtbl->add_AutoHideScrollBarsChanged(This,handler,token);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIUISettings5_remove_AutoHideScrollBarsChanged(__x_ABI_CWindows_CUI_CViewManagement_CIUISettings5* This,EventRegistrationToken token) {
    return This->lpVtbl->remove_AutoHideScrollBarsChanged(This,token);
}
#endif
#ifdef WIDL_using_Windows_UI_ViewManagement
#define IID_IUISettings5 IID___x_ABI_CWindows_CUI_CViewManagement_CIUISettings5
#define IUISettings5Vtbl __x_ABI_CWindows_CUI_CViewManagement_CIUISettings5Vtbl
#define IUISettings5 __x_ABI_CWindows_CUI_CViewManagement_CIUISettings5
#define IUISettings5_QueryInterface __x_ABI_CWindows_CUI_CViewManagement_CIUISettings5_QueryInterface
#define IUISettings5_AddRef __x_ABI_CWindows_CUI_CViewManagement_CIUISettings5_AddRef
#define IUISettings5_Release __x_ABI_CWindows_CUI_CViewManagement_CIUISettings5_Release
#define IUISettings5_GetIids __x_ABI_CWindows_CUI_CViewManagement_CIUISettings5_GetIids
#define IUISettings5_GetRuntimeClassName __x_ABI_CWindows_CUI_CViewManagement_CIUISettings5_GetRuntimeClassName
#define IUISettings5_GetTrustLevel __x_ABI_CWindows_CUI_CViewManagement_CIUISettings5_GetTrustLevel
#define IUISettings5_get_AutoHideScrollBars __x_ABI_CWindows_CUI_CViewManagement_CIUISettings5_get_AutoHideScrollBars
#define IUISettings5_add_AutoHideScrollBarsChanged __x_ABI_CWindows_CUI_CViewManagement_CIUISettings5_add_AutoHideScrollBarsChanged
#define IUISettings5_remove_AutoHideScrollBarsChanged __x_ABI_CWindows_CUI_CViewManagement_CIUISettings5_remove_AutoHideScrollBarsChanged
#endif /* WIDL_using_Windows_UI_ViewManagement */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CViewManagement_CIUISettings5_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000 */

/*****************************************************************************
 * IUISettings6 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0xa0000
#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIUISettings6_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIUISettings6_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CViewManagement_CIUISettings6, 0xaef19bd7, 0xfe31, 0x5a04, 0xad,0xa4, 0x46,0x9a,0xae,0xc6,0xdf,0xa9);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                MIDL_INTERFACE("aef19bd7-fe31-5a04-ada4-469aaec6dfa9")
                IUISettings6 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE add_AnimationsEnabledChanged(
                        ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::UI::ViewManagement::UISettings*,ABI::Windows::UI::ViewManagement::UISettingsAnimationsEnabledChangedEventArgs* > *handler,
                        EventRegistrationToken *token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE remove_AnimationsEnabledChanged(
                        EventRegistrationToken token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE add_MessageDurationChanged(
                        ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::UI::ViewManagement::UISettings*,ABI::Windows::UI::ViewManagement::UISettingsMessageDurationChangedEventArgs* > *handler,
                        EventRegistrationToken *token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE remove_MessageDurationChanged(
                        EventRegistrationToken token) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CViewManagement_CIUISettings6, 0xaef19bd7, 0xfe31, 0x5a04, 0xad,0xa4, 0x46,0x9a,0xae,0xc6,0xdf,0xa9)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CViewManagement_CIUISettings6Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IUISettings6 methods ***/
    HRESULT (STDMETHODCALLTYPE *add_AnimationsEnabledChanged)(
        __x_ABI_CWindows_CUI_CViewManagement_CIUISettings6 *This,
        __FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsAnimationsEnabledChangedEventArgs *handler,
        EventRegistrationToken *token);

    HRESULT (STDMETHODCALLTYPE *remove_AnimationsEnabledChanged)(
        __x_ABI_CWindows_CUI_CViewManagement_CIUISettings6 *This,
        EventRegistrationToken token);

    HRESULT (STDMETHODCALLTYPE *add_MessageDurationChanged)(
        __x_ABI_CWindows_CUI_CViewManagement_CIUISettings6 *This,
        __FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsMessageDurationChangedEventArgs *handler,
        EventRegistrationToken *token);

    HRESULT (STDMETHODCALLTYPE *remove_MessageDurationChanged)(
        __x_ABI_CWindows_CUI_CViewManagement_CIUISettings6 *This,
        EventRegistrationToken token);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CViewManagement_CIUISettings6Vtbl;

interface __x_ABI_CWindows_CUI_CViewManagement_CIUISettings6 {
    CONST_VTBL __x_ABI_CWindows_CUI_CViewManagement_CIUISettings6Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettings6_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettings6_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettings6_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettings6_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettings6_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettings6_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IUISettings6 methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettings6_add_AnimationsEnabledChanged(This,handler,token) (This)->lpVtbl->add_AnimationsEnabledChanged(This,handler,token)
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettings6_remove_AnimationsEnabledChanged(This,token) (This)->lpVtbl->remove_AnimationsEnabledChanged(This,token)
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettings6_add_MessageDurationChanged(This,handler,token) (This)->lpVtbl->add_MessageDurationChanged(This,handler,token)
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettings6_remove_MessageDurationChanged(This,token) (This)->lpVtbl->remove_MessageDurationChanged(This,token)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIUISettings6_QueryInterface(__x_ABI_CWindows_CUI_CViewManagement_CIUISettings6* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CViewManagement_CIUISettings6_AddRef(__x_ABI_CWindows_CUI_CViewManagement_CIUISettings6* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CViewManagement_CIUISettings6_Release(__x_ABI_CWindows_CUI_CViewManagement_CIUISettings6* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIUISettings6_GetIids(__x_ABI_CWindows_CUI_CViewManagement_CIUISettings6* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIUISettings6_GetRuntimeClassName(__x_ABI_CWindows_CUI_CViewManagement_CIUISettings6* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIUISettings6_GetTrustLevel(__x_ABI_CWindows_CUI_CViewManagement_CIUISettings6* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IUISettings6 methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIUISettings6_add_AnimationsEnabledChanged(__x_ABI_CWindows_CUI_CViewManagement_CIUISettings6* This,__FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsAnimationsEnabledChangedEventArgs *handler,EventRegistrationToken *token) {
    return This->lpVtbl->add_AnimationsEnabledChanged(This,handler,token);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIUISettings6_remove_AnimationsEnabledChanged(__x_ABI_CWindows_CUI_CViewManagement_CIUISettings6* This,EventRegistrationToken token) {
    return This->lpVtbl->remove_AnimationsEnabledChanged(This,token);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIUISettings6_add_MessageDurationChanged(__x_ABI_CWindows_CUI_CViewManagement_CIUISettings6* This,__FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsMessageDurationChangedEventArgs *handler,EventRegistrationToken *token) {
    return This->lpVtbl->add_MessageDurationChanged(This,handler,token);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIUISettings6_remove_MessageDurationChanged(__x_ABI_CWindows_CUI_CViewManagement_CIUISettings6* This,EventRegistrationToken token) {
    return This->lpVtbl->remove_MessageDurationChanged(This,token);
}
#endif
#ifdef WIDL_using_Windows_UI_ViewManagement
#define IID_IUISettings6 IID___x_ABI_CWindows_CUI_CViewManagement_CIUISettings6
#define IUISettings6Vtbl __x_ABI_CWindows_CUI_CViewManagement_CIUISettings6Vtbl
#define IUISettings6 __x_ABI_CWindows_CUI_CViewManagement_CIUISettings6
#define IUISettings6_QueryInterface __x_ABI_CWindows_CUI_CViewManagement_CIUISettings6_QueryInterface
#define IUISettings6_AddRef __x_ABI_CWindows_CUI_CViewManagement_CIUISettings6_AddRef
#define IUISettings6_Release __x_ABI_CWindows_CUI_CViewManagement_CIUISettings6_Release
#define IUISettings6_GetIids __x_ABI_CWindows_CUI_CViewManagement_CIUISettings6_GetIids
#define IUISettings6_GetRuntimeClassName __x_ABI_CWindows_CUI_CViewManagement_CIUISettings6_GetRuntimeClassName
#define IUISettings6_GetTrustLevel __x_ABI_CWindows_CUI_CViewManagement_CIUISettings6_GetTrustLevel
#define IUISettings6_add_AnimationsEnabledChanged __x_ABI_CWindows_CUI_CViewManagement_CIUISettings6_add_AnimationsEnabledChanged
#define IUISettings6_remove_AnimationsEnabledChanged __x_ABI_CWindows_CUI_CViewManagement_CIUISettings6_remove_AnimationsEnabledChanged
#define IUISettings6_add_MessageDurationChanged __x_ABI_CWindows_CUI_CViewManagement_CIUISettings6_add_MessageDurationChanged
#define IUISettings6_remove_MessageDurationChanged __x_ABI_CWindows_CUI_CViewManagement_CIUISettings6_remove_MessageDurationChanged
#endif /* WIDL_using_Windows_UI_ViewManagement */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CViewManagement_CIUISettings6_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0xa0000 */

/*****************************************************************************
 * IUISettingsAnimationsEnabledChangedEventArgs interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0xa0000
#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIUISettingsAnimationsEnabledChangedEventArgs_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIUISettingsAnimationsEnabledChangedEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CViewManagement_CIUISettingsAnimationsEnabledChangedEventArgs, 0x0c7b4b3d, 0x2ea1, 0x533e, 0x89,0x4d, 0x41,0x5b,0xc5,0x24,0x3c,0x29);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                MIDL_INTERFACE("0c7b4b3d-2ea1-533e-894d-415bc5243c29")
                IUISettingsAnimationsEnabledChangedEventArgs : public IInspectable
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CViewManagement_CIUISettingsAnimationsEnabledChangedEventArgs, 0x0c7b4b3d, 0x2ea1, 0x533e, 0x89,0x4d, 0x41,0x5b,0xc5,0x24,0x3c,0x29)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CViewManagement_CIUISettingsAnimationsEnabledChangedEventArgsVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    END_INTERFACE
} __x_ABI_CWindows_CUI_CViewManagement_CIUISettingsAnimationsEnabledChangedEventArgsVtbl;

interface __x_ABI_CWindows_CUI_CViewManagement_CIUISettingsAnimationsEnabledChangedEventArgs {
    CONST_VTBL __x_ABI_CWindows_CUI_CViewManagement_CIUISettingsAnimationsEnabledChangedEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettingsAnimationsEnabledChangedEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettingsAnimationsEnabledChangedEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettingsAnimationsEnabledChangedEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettingsAnimationsEnabledChangedEventArgs_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettingsAnimationsEnabledChangedEventArgs_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettingsAnimationsEnabledChangedEventArgs_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIUISettingsAnimationsEnabledChangedEventArgs_QueryInterface(__x_ABI_CWindows_CUI_CViewManagement_CIUISettingsAnimationsEnabledChangedEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CViewManagement_CIUISettingsAnimationsEnabledChangedEventArgs_AddRef(__x_ABI_CWindows_CUI_CViewManagement_CIUISettingsAnimationsEnabledChangedEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CViewManagement_CIUISettingsAnimationsEnabledChangedEventArgs_Release(__x_ABI_CWindows_CUI_CViewManagement_CIUISettingsAnimationsEnabledChangedEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIUISettingsAnimationsEnabledChangedEventArgs_GetIids(__x_ABI_CWindows_CUI_CViewManagement_CIUISettingsAnimationsEnabledChangedEventArgs* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIUISettingsAnimationsEnabledChangedEventArgs_GetRuntimeClassName(__x_ABI_CWindows_CUI_CViewManagement_CIUISettingsAnimationsEnabledChangedEventArgs* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIUISettingsAnimationsEnabledChangedEventArgs_GetTrustLevel(__x_ABI_CWindows_CUI_CViewManagement_CIUISettingsAnimationsEnabledChangedEventArgs* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
#endif
#ifdef WIDL_using_Windows_UI_ViewManagement
#define IID_IUISettingsAnimationsEnabledChangedEventArgs IID___x_ABI_CWindows_CUI_CViewManagement_CIUISettingsAnimationsEnabledChangedEventArgs
#define IUISettingsAnimationsEnabledChangedEventArgsVtbl __x_ABI_CWindows_CUI_CViewManagement_CIUISettingsAnimationsEnabledChangedEventArgsVtbl
#define IUISettingsAnimationsEnabledChangedEventArgs __x_ABI_CWindows_CUI_CViewManagement_CIUISettingsAnimationsEnabledChangedEventArgs
#define IUISettingsAnimationsEnabledChangedEventArgs_QueryInterface __x_ABI_CWindows_CUI_CViewManagement_CIUISettingsAnimationsEnabledChangedEventArgs_QueryInterface
#define IUISettingsAnimationsEnabledChangedEventArgs_AddRef __x_ABI_CWindows_CUI_CViewManagement_CIUISettingsAnimationsEnabledChangedEventArgs_AddRef
#define IUISettingsAnimationsEnabledChangedEventArgs_Release __x_ABI_CWindows_CUI_CViewManagement_CIUISettingsAnimationsEnabledChangedEventArgs_Release
#define IUISettingsAnimationsEnabledChangedEventArgs_GetIids __x_ABI_CWindows_CUI_CViewManagement_CIUISettingsAnimationsEnabledChangedEventArgs_GetIids
#define IUISettingsAnimationsEnabledChangedEventArgs_GetRuntimeClassName __x_ABI_CWindows_CUI_CViewManagement_CIUISettingsAnimationsEnabledChangedEventArgs_GetRuntimeClassName
#define IUISettingsAnimationsEnabledChangedEventArgs_GetTrustLevel __x_ABI_CWindows_CUI_CViewManagement_CIUISettingsAnimationsEnabledChangedEventArgs_GetTrustLevel
#endif /* WIDL_using_Windows_UI_ViewManagement */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CViewManagement_CIUISettingsAnimationsEnabledChangedEventArgs_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0xa0000 */

/*****************************************************************************
 * IUISettingsAutoHideScrollBarsChangedEventArgs interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000
#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIUISettingsAutoHideScrollBarsChangedEventArgs_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIUISettingsAutoHideScrollBarsChangedEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CViewManagement_CIUISettingsAutoHideScrollBarsChangedEventArgs, 0x87afd4b2, 0x9146, 0x5f02, 0x8f,0x6b, 0x06,0xd4,0x54,0x17,0x4c,0x0f);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                MIDL_INTERFACE("87afd4b2-9146-5f02-8f6b-06d454174c0f")
                IUISettingsAutoHideScrollBarsChangedEventArgs : public IInspectable
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CViewManagement_CIUISettingsAutoHideScrollBarsChangedEventArgs, 0x87afd4b2, 0x9146, 0x5f02, 0x8f,0x6b, 0x06,0xd4,0x54,0x17,0x4c,0x0f)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CViewManagement_CIUISettingsAutoHideScrollBarsChangedEventArgsVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    END_INTERFACE
} __x_ABI_CWindows_CUI_CViewManagement_CIUISettingsAutoHideScrollBarsChangedEventArgsVtbl;

interface __x_ABI_CWindows_CUI_CViewManagement_CIUISettingsAutoHideScrollBarsChangedEventArgs {
    CONST_VTBL __x_ABI_CWindows_CUI_CViewManagement_CIUISettingsAutoHideScrollBarsChangedEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettingsAutoHideScrollBarsChangedEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettingsAutoHideScrollBarsChangedEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettingsAutoHideScrollBarsChangedEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettingsAutoHideScrollBarsChangedEventArgs_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettingsAutoHideScrollBarsChangedEventArgs_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettingsAutoHideScrollBarsChangedEventArgs_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIUISettingsAutoHideScrollBarsChangedEventArgs_QueryInterface(__x_ABI_CWindows_CUI_CViewManagement_CIUISettingsAutoHideScrollBarsChangedEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CViewManagement_CIUISettingsAutoHideScrollBarsChangedEventArgs_AddRef(__x_ABI_CWindows_CUI_CViewManagement_CIUISettingsAutoHideScrollBarsChangedEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CViewManagement_CIUISettingsAutoHideScrollBarsChangedEventArgs_Release(__x_ABI_CWindows_CUI_CViewManagement_CIUISettingsAutoHideScrollBarsChangedEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIUISettingsAutoHideScrollBarsChangedEventArgs_GetIids(__x_ABI_CWindows_CUI_CViewManagement_CIUISettingsAutoHideScrollBarsChangedEventArgs* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIUISettingsAutoHideScrollBarsChangedEventArgs_GetRuntimeClassName(__x_ABI_CWindows_CUI_CViewManagement_CIUISettingsAutoHideScrollBarsChangedEventArgs* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIUISettingsAutoHideScrollBarsChangedEventArgs_GetTrustLevel(__x_ABI_CWindows_CUI_CViewManagement_CIUISettingsAutoHideScrollBarsChangedEventArgs* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
#endif
#ifdef WIDL_using_Windows_UI_ViewManagement
#define IID_IUISettingsAutoHideScrollBarsChangedEventArgs IID___x_ABI_CWindows_CUI_CViewManagement_CIUISettingsAutoHideScrollBarsChangedEventArgs
#define IUISettingsAutoHideScrollBarsChangedEventArgsVtbl __x_ABI_CWindows_CUI_CViewManagement_CIUISettingsAutoHideScrollBarsChangedEventArgsVtbl
#define IUISettingsAutoHideScrollBarsChangedEventArgs __x_ABI_CWindows_CUI_CViewManagement_CIUISettingsAutoHideScrollBarsChangedEventArgs
#define IUISettingsAutoHideScrollBarsChangedEventArgs_QueryInterface __x_ABI_CWindows_CUI_CViewManagement_CIUISettingsAutoHideScrollBarsChangedEventArgs_QueryInterface
#define IUISettingsAutoHideScrollBarsChangedEventArgs_AddRef __x_ABI_CWindows_CUI_CViewManagement_CIUISettingsAutoHideScrollBarsChangedEventArgs_AddRef
#define IUISettingsAutoHideScrollBarsChangedEventArgs_Release __x_ABI_CWindows_CUI_CViewManagement_CIUISettingsAutoHideScrollBarsChangedEventArgs_Release
#define IUISettingsAutoHideScrollBarsChangedEventArgs_GetIids __x_ABI_CWindows_CUI_CViewManagement_CIUISettingsAutoHideScrollBarsChangedEventArgs_GetIids
#define IUISettingsAutoHideScrollBarsChangedEventArgs_GetRuntimeClassName __x_ABI_CWindows_CUI_CViewManagement_CIUISettingsAutoHideScrollBarsChangedEventArgs_GetRuntimeClassName
#define IUISettingsAutoHideScrollBarsChangedEventArgs_GetTrustLevel __x_ABI_CWindows_CUI_CViewManagement_CIUISettingsAutoHideScrollBarsChangedEventArgs_GetTrustLevel
#endif /* WIDL_using_Windows_UI_ViewManagement */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CViewManagement_CIUISettingsAutoHideScrollBarsChangedEventArgs_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000 */

/*****************************************************************************
 * IUISettingsMessageDurationChangedEventArgs interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0xa0000
#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIUISettingsMessageDurationChangedEventArgs_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIUISettingsMessageDurationChangedEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CViewManagement_CIUISettingsMessageDurationChangedEventArgs, 0x338aad52, 0x4a5d, 0x5b59, 0x80,0x02, 0xd9,0x30,0xf6,0x08,0xfd,0x6e);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                MIDL_INTERFACE("338aad52-4a5d-5b59-8002-d930f608fd6e")
                IUISettingsMessageDurationChangedEventArgs : public IInspectable
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CViewManagement_CIUISettingsMessageDurationChangedEventArgs, 0x338aad52, 0x4a5d, 0x5b59, 0x80,0x02, 0xd9,0x30,0xf6,0x08,0xfd,0x6e)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CViewManagement_CIUISettingsMessageDurationChangedEventArgsVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    END_INTERFACE
} __x_ABI_CWindows_CUI_CViewManagement_CIUISettingsMessageDurationChangedEventArgsVtbl;

interface __x_ABI_CWindows_CUI_CViewManagement_CIUISettingsMessageDurationChangedEventArgs {
    CONST_VTBL __x_ABI_CWindows_CUI_CViewManagement_CIUISettingsMessageDurationChangedEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettingsMessageDurationChangedEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettingsMessageDurationChangedEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettingsMessageDurationChangedEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettingsMessageDurationChangedEventArgs_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettingsMessageDurationChangedEventArgs_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CViewManagement_CIUISettingsMessageDurationChangedEventArgs_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIUISettingsMessageDurationChangedEventArgs_QueryInterface(__x_ABI_CWindows_CUI_CViewManagement_CIUISettingsMessageDurationChangedEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CViewManagement_CIUISettingsMessageDurationChangedEventArgs_AddRef(__x_ABI_CWindows_CUI_CViewManagement_CIUISettingsMessageDurationChangedEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CViewManagement_CIUISettingsMessageDurationChangedEventArgs_Release(__x_ABI_CWindows_CUI_CViewManagement_CIUISettingsMessageDurationChangedEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIUISettingsMessageDurationChangedEventArgs_GetIids(__x_ABI_CWindows_CUI_CViewManagement_CIUISettingsMessageDurationChangedEventArgs* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIUISettingsMessageDurationChangedEventArgs_GetRuntimeClassName(__x_ABI_CWindows_CUI_CViewManagement_CIUISettingsMessageDurationChangedEventArgs* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIUISettingsMessageDurationChangedEventArgs_GetTrustLevel(__x_ABI_CWindows_CUI_CViewManagement_CIUISettingsMessageDurationChangedEventArgs* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
#endif
#ifdef WIDL_using_Windows_UI_ViewManagement
#define IID_IUISettingsMessageDurationChangedEventArgs IID___x_ABI_CWindows_CUI_CViewManagement_CIUISettingsMessageDurationChangedEventArgs
#define IUISettingsMessageDurationChangedEventArgsVtbl __x_ABI_CWindows_CUI_CViewManagement_CIUISettingsMessageDurationChangedEventArgsVtbl
#define IUISettingsMessageDurationChangedEventArgs __x_ABI_CWindows_CUI_CViewManagement_CIUISettingsMessageDurationChangedEventArgs
#define IUISettingsMessageDurationChangedEventArgs_QueryInterface __x_ABI_CWindows_CUI_CViewManagement_CIUISettingsMessageDurationChangedEventArgs_QueryInterface
#define IUISettingsMessageDurationChangedEventArgs_AddRef __x_ABI_CWindows_CUI_CViewManagement_CIUISettingsMessageDurationChangedEventArgs_AddRef
#define IUISettingsMessageDurationChangedEventArgs_Release __x_ABI_CWindows_CUI_CViewManagement_CIUISettingsMessageDurationChangedEventArgs_Release
#define IUISettingsMessageDurationChangedEventArgs_GetIids __x_ABI_CWindows_CUI_CViewManagement_CIUISettingsMessageDurationChangedEventArgs_GetIids
#define IUISettingsMessageDurationChangedEventArgs_GetRuntimeClassName __x_ABI_CWindows_CUI_CViewManagement_CIUISettingsMessageDurationChangedEventArgs_GetRuntimeClassName
#define IUISettingsMessageDurationChangedEventArgs_GetTrustLevel __x_ABI_CWindows_CUI_CViewManagement_CIUISettingsMessageDurationChangedEventArgs_GetTrustLevel
#endif /* WIDL_using_Windows_UI_ViewManagement */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CViewManagement_CIUISettingsMessageDurationChangedEventArgs_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0xa0000 */

/*****************************************************************************
 * IUIViewSettings interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettings_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettings_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettings, 0xc63657f6, 0x8850, 0x470d, 0x88,0xf8, 0x45,0x5e,0x16,0xea,0x2c,0x26);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                MIDL_INTERFACE("c63657f6-8850-470d-88f8-455e16ea2c26")
                IUIViewSettings : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_UserInteractionMode(
                        ABI::Windows::UI::ViewManagement::UserInteractionMode *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettings, 0xc63657f6, 0x8850, 0x470d, 0x88,0xf8, 0x45,0x5e,0x16,0xea,0x2c,0x26)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettingsVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IUIViewSettings methods ***/
    HRESULT (STDMETHODCALLTYPE *get_UserInteractionMode)(
        __x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettings *This,
        __x_ABI_CWindows_CUI_CViewManagement_CUserInteractionMode *value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettingsVtbl;

interface __x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettings {
    CONST_VTBL __x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettingsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettings_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettings_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettings_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettings_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettings_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettings_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IUIViewSettings methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettings_get_UserInteractionMode(This,value) (This)->lpVtbl->get_UserInteractionMode(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettings_QueryInterface(__x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettings* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettings_AddRef(__x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettings* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettings_Release(__x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettings* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettings_GetIids(__x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettings* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettings_GetRuntimeClassName(__x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettings* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettings_GetTrustLevel(__x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettings* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IUIViewSettings methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettings_get_UserInteractionMode(__x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettings* This,__x_ABI_CWindows_CUI_CViewManagement_CUserInteractionMode *value) {
    return This->lpVtbl->get_UserInteractionMode(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_ViewManagement
#define IID_IUIViewSettings IID___x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettings
#define IUIViewSettingsVtbl __x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettingsVtbl
#define IUIViewSettings __x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettings
#define IUIViewSettings_QueryInterface __x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettings_QueryInterface
#define IUIViewSettings_AddRef __x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettings_AddRef
#define IUIViewSettings_Release __x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettings_Release
#define IUIViewSettings_GetIids __x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettings_GetIids
#define IUIViewSettings_GetRuntimeClassName __x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettings_GetRuntimeClassName
#define IUIViewSettings_GetTrustLevel __x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettings_GetTrustLevel
#define IUIViewSettings_get_UserInteractionMode __x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettings_get_UserInteractionMode
#endif /* WIDL_using_Windows_UI_ViewManagement */
#endif

#endif

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

/*****************************************************************************
 * IUIViewSettingsStatics interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettingsStatics_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettingsStatics_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettingsStatics, 0x595c97a5, 0xf8f6, 0x41cf, 0xb0,0xfb, 0xaa,0xcd,0xb8,0x1f,0xd5,0xf6);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                MIDL_INTERFACE("595c97a5-f8f6-41cf-b0fb-aacdb81fd5f6")
                IUIViewSettingsStatics : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE GetForCurrentView(
                        ABI::Windows::UI::ViewManagement::IUIViewSettings **current) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettingsStatics, 0x595c97a5, 0xf8f6, 0x41cf, 0xb0,0xfb, 0xaa,0xcd,0xb8,0x1f,0xd5,0xf6)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettingsStaticsVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IUIViewSettingsStatics methods ***/
    HRESULT (STDMETHODCALLTYPE *GetForCurrentView)(
        __x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettingsStatics *This,
        __x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettings **current);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettingsStaticsVtbl;

interface __x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettingsStatics {
    CONST_VTBL __x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettingsStaticsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettingsStatics_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettingsStatics_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettingsStatics_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettingsStatics_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettingsStatics_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettingsStatics_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IUIViewSettingsStatics methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettingsStatics_GetForCurrentView(This,current) (This)->lpVtbl->GetForCurrentView(This,current)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettingsStatics_QueryInterface(__x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettingsStatics* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettingsStatics_AddRef(__x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettingsStatics* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettingsStatics_Release(__x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettingsStatics* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettingsStatics_GetIids(__x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettingsStatics* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettingsStatics_GetRuntimeClassName(__x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettingsStatics* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettingsStatics_GetTrustLevel(__x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettingsStatics* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IUIViewSettingsStatics methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettingsStatics_GetForCurrentView(__x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettingsStatics* This,__x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettings **current) {
    return This->lpVtbl->GetForCurrentView(This,current);
}
#endif
#ifdef WIDL_using_Windows_UI_ViewManagement
#define IID_IUIViewSettingsStatics IID___x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettingsStatics
#define IUIViewSettingsStaticsVtbl __x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettingsStaticsVtbl
#define IUIViewSettingsStatics __x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettingsStatics
#define IUIViewSettingsStatics_QueryInterface __x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettingsStatics_QueryInterface
#define IUIViewSettingsStatics_AddRef __x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettingsStatics_AddRef
#define IUIViewSettingsStatics_Release __x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettingsStatics_Release
#define IUIViewSettingsStatics_GetIids __x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettingsStatics_GetIids
#define IUIViewSettingsStatics_GetRuntimeClassName __x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettingsStatics_GetRuntimeClassName
#define IUIViewSettingsStatics_GetTrustLevel __x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettingsStatics_GetTrustLevel
#define IUIViewSettingsStatics_GetForCurrentView __x_ABI_CWindows_CUI_CViewManagement_CIUIViewSettingsStatics_GetForCurrentView
#endif /* WIDL_using_Windows_UI_ViewManagement */
#endif

#endif

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

/*****************************************************************************
 * IInputPane interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIInputPane_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIInputPane_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CViewManagement_CIInputPane, 0x640ada70, 0x06f3, 0x4c87, 0xa6,0x78, 0x98,0x29,0xc9,0x12,0x7c,0x28);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                MIDL_INTERFACE("640ada70-06f3-4c87-a678-9829c9127c28")
                IInputPane : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE add_Showing(
                        ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::UI::ViewManagement::InputPane*,ABI::Windows::UI::ViewManagement::InputPaneVisibilityEventArgs* > *handler,
                        EventRegistrationToken *token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE remove_Showing(
                        EventRegistrationToken token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE add_Hiding(
                        ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::UI::ViewManagement::InputPane*,ABI::Windows::UI::ViewManagement::InputPaneVisibilityEventArgs* > *handler,
                        EventRegistrationToken *token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE remove_Hiding(
                        EventRegistrationToken token) = 0;

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

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CViewManagement_CIInputPane, 0x640ada70, 0x06f3, 0x4c87, 0xa6,0x78, 0x98,0x29,0xc9,0x12,0x7c,0x28)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IInputPane methods ***/
    HRESULT (STDMETHODCALLTYPE *add_Showing)(
        __x_ABI_CWindows_CUI_CViewManagement_CIInputPane *This,
        __FITypedEventHandler_2_Windows__CUI__CViewManagement__CInputPane_Windows__CUI__CViewManagement__CInputPaneVisibilityEventArgs *handler,
        EventRegistrationToken *token);

    HRESULT (STDMETHODCALLTYPE *remove_Showing)(
        __x_ABI_CWindows_CUI_CViewManagement_CIInputPane *This,
        EventRegistrationToken token);

    HRESULT (STDMETHODCALLTYPE *add_Hiding)(
        __x_ABI_CWindows_CUI_CViewManagement_CIInputPane *This,
        __FITypedEventHandler_2_Windows__CUI__CViewManagement__CInputPane_Windows__CUI__CViewManagement__CInputPaneVisibilityEventArgs *handler,
        EventRegistrationToken *token);

    HRESULT (STDMETHODCALLTYPE *remove_Hiding)(
        __x_ABI_CWindows_CUI_CViewManagement_CIInputPane *This,
        EventRegistrationToken token);

    HRESULT (STDMETHODCALLTYPE *get_OccludedRect)(
        __x_ABI_CWindows_CUI_CViewManagement_CIInputPane *This,
        __x_ABI_CWindows_CFoundation_CRect *value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneVtbl;

interface __x_ABI_CWindows_CUI_CViewManagement_CIInputPane {
    CONST_VTBL __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIInputPane_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CViewManagement_CIInputPane_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CViewManagement_CIInputPane_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIInputPane_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CViewManagement_CIInputPane_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CViewManagement_CIInputPane_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IInputPane methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIInputPane_add_Showing(This,handler,token) (This)->lpVtbl->add_Showing(This,handler,token)
#define __x_ABI_CWindows_CUI_CViewManagement_CIInputPane_remove_Showing(This,token) (This)->lpVtbl->remove_Showing(This,token)
#define __x_ABI_CWindows_CUI_CViewManagement_CIInputPane_add_Hiding(This,handler,token) (This)->lpVtbl->add_Hiding(This,handler,token)
#define __x_ABI_CWindows_CUI_CViewManagement_CIInputPane_remove_Hiding(This,token) (This)->lpVtbl->remove_Hiding(This,token)
#define __x_ABI_CWindows_CUI_CViewManagement_CIInputPane_get_OccludedRect(This,value) (This)->lpVtbl->get_OccludedRect(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIInputPane_QueryInterface(__x_ABI_CWindows_CUI_CViewManagement_CIInputPane* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CViewManagement_CIInputPane_AddRef(__x_ABI_CWindows_CUI_CViewManagement_CIInputPane* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CViewManagement_CIInputPane_Release(__x_ABI_CWindows_CUI_CViewManagement_CIInputPane* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIInputPane_GetIids(__x_ABI_CWindows_CUI_CViewManagement_CIInputPane* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIInputPane_GetRuntimeClassName(__x_ABI_CWindows_CUI_CViewManagement_CIInputPane* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIInputPane_GetTrustLevel(__x_ABI_CWindows_CUI_CViewManagement_CIInputPane* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IInputPane methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIInputPane_add_Showing(__x_ABI_CWindows_CUI_CViewManagement_CIInputPane* This,__FITypedEventHandler_2_Windows__CUI__CViewManagement__CInputPane_Windows__CUI__CViewManagement__CInputPaneVisibilityEventArgs *handler,EventRegistrationToken *token) {
    return This->lpVtbl->add_Showing(This,handler,token);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIInputPane_remove_Showing(__x_ABI_CWindows_CUI_CViewManagement_CIInputPane* This,EventRegistrationToken token) {
    return This->lpVtbl->remove_Showing(This,token);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIInputPane_add_Hiding(__x_ABI_CWindows_CUI_CViewManagement_CIInputPane* This,__FITypedEventHandler_2_Windows__CUI__CViewManagement__CInputPane_Windows__CUI__CViewManagement__CInputPaneVisibilityEventArgs *handler,EventRegistrationToken *token) {
    return This->lpVtbl->add_Hiding(This,handler,token);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIInputPane_remove_Hiding(__x_ABI_CWindows_CUI_CViewManagement_CIInputPane* This,EventRegistrationToken token) {
    return This->lpVtbl->remove_Hiding(This,token);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIInputPane_get_OccludedRect(__x_ABI_CWindows_CUI_CViewManagement_CIInputPane* This,__x_ABI_CWindows_CFoundation_CRect *value) {
    return This->lpVtbl->get_OccludedRect(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_ViewManagement
#define IID_IInputPane IID___x_ABI_CWindows_CUI_CViewManagement_CIInputPane
#define IInputPaneVtbl __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneVtbl
#define IInputPane __x_ABI_CWindows_CUI_CViewManagement_CIInputPane
#define IInputPane_QueryInterface __x_ABI_CWindows_CUI_CViewManagement_CIInputPane_QueryInterface
#define IInputPane_AddRef __x_ABI_CWindows_CUI_CViewManagement_CIInputPane_AddRef
#define IInputPane_Release __x_ABI_CWindows_CUI_CViewManagement_CIInputPane_Release
#define IInputPane_GetIids __x_ABI_CWindows_CUI_CViewManagement_CIInputPane_GetIids
#define IInputPane_GetRuntimeClassName __x_ABI_CWindows_CUI_CViewManagement_CIInputPane_GetRuntimeClassName
#define IInputPane_GetTrustLevel __x_ABI_CWindows_CUI_CViewManagement_CIInputPane_GetTrustLevel
#define IInputPane_add_Showing __x_ABI_CWindows_CUI_CViewManagement_CIInputPane_add_Showing
#define IInputPane_remove_Showing __x_ABI_CWindows_CUI_CViewManagement_CIInputPane_remove_Showing
#define IInputPane_add_Hiding __x_ABI_CWindows_CUI_CViewManagement_CIInputPane_add_Hiding
#define IInputPane_remove_Hiding __x_ABI_CWindows_CUI_CViewManagement_CIInputPane_remove_Hiding
#define IInputPane_get_OccludedRect __x_ABI_CWindows_CUI_CViewManagement_CIInputPane_get_OccludedRect
#endif /* WIDL_using_Windows_UI_ViewManagement */
#endif

#endif

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

/*****************************************************************************
 * IInputPane2 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIInputPane2_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIInputPane2_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CViewManagement_CIInputPane2, 0x8a6b3f26, 0x7090, 0x4793, 0x94,0x4c, 0xc3,0xf2,0xcd,0xe2,0x62,0x76);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                MIDL_INTERFACE("8a6b3f26-7090-4793-944c-c3f2cde26276")
                IInputPane2 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE TryShow(
                        boolean *result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE TryHide(
                        boolean *result) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CViewManagement_CIInputPane2, 0x8a6b3f26, 0x7090, 0x4793, 0x94,0x4c, 0xc3,0xf2,0xcd,0xe2,0x62,0x76)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CViewManagement_CIInputPane2Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IInputPane2 methods ***/
    HRESULT (STDMETHODCALLTYPE *TryShow)(
        __x_ABI_CWindows_CUI_CViewManagement_CIInputPane2 *This,
        boolean *result);

    HRESULT (STDMETHODCALLTYPE *TryHide)(
        __x_ABI_CWindows_CUI_CViewManagement_CIInputPane2 *This,
        boolean *result);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CViewManagement_CIInputPane2Vtbl;

interface __x_ABI_CWindows_CUI_CViewManagement_CIInputPane2 {
    CONST_VTBL __x_ABI_CWindows_CUI_CViewManagement_CIInputPane2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIInputPane2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CViewManagement_CIInputPane2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CViewManagement_CIInputPane2_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIInputPane2_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CViewManagement_CIInputPane2_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CViewManagement_CIInputPane2_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IInputPane2 methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIInputPane2_TryShow(This,result) (This)->lpVtbl->TryShow(This,result)
#define __x_ABI_CWindows_CUI_CViewManagement_CIInputPane2_TryHide(This,result) (This)->lpVtbl->TryHide(This,result)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIInputPane2_QueryInterface(__x_ABI_CWindows_CUI_CViewManagement_CIInputPane2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CViewManagement_CIInputPane2_AddRef(__x_ABI_CWindows_CUI_CViewManagement_CIInputPane2* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CViewManagement_CIInputPane2_Release(__x_ABI_CWindows_CUI_CViewManagement_CIInputPane2* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIInputPane2_GetIids(__x_ABI_CWindows_CUI_CViewManagement_CIInputPane2* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIInputPane2_GetRuntimeClassName(__x_ABI_CWindows_CUI_CViewManagement_CIInputPane2* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIInputPane2_GetTrustLevel(__x_ABI_CWindows_CUI_CViewManagement_CIInputPane2* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IInputPane2 methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIInputPane2_TryShow(__x_ABI_CWindows_CUI_CViewManagement_CIInputPane2* This,boolean *result) {
    return This->lpVtbl->TryShow(This,result);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIInputPane2_TryHide(__x_ABI_CWindows_CUI_CViewManagement_CIInputPane2* This,boolean *result) {
    return This->lpVtbl->TryHide(This,result);
}
#endif
#ifdef WIDL_using_Windows_UI_ViewManagement
#define IID_IInputPane2 IID___x_ABI_CWindows_CUI_CViewManagement_CIInputPane2
#define IInputPane2Vtbl __x_ABI_CWindows_CUI_CViewManagement_CIInputPane2Vtbl
#define IInputPane2 __x_ABI_CWindows_CUI_CViewManagement_CIInputPane2
#define IInputPane2_QueryInterface __x_ABI_CWindows_CUI_CViewManagement_CIInputPane2_QueryInterface
#define IInputPane2_AddRef __x_ABI_CWindows_CUI_CViewManagement_CIInputPane2_AddRef
#define IInputPane2_Release __x_ABI_CWindows_CUI_CViewManagement_CIInputPane2_Release
#define IInputPane2_GetIids __x_ABI_CWindows_CUI_CViewManagement_CIInputPane2_GetIids
#define IInputPane2_GetRuntimeClassName __x_ABI_CWindows_CUI_CViewManagement_CIInputPane2_GetRuntimeClassName
#define IInputPane2_GetTrustLevel __x_ABI_CWindows_CUI_CViewManagement_CIInputPane2_GetTrustLevel
#define IInputPane2_TryShow __x_ABI_CWindows_CUI_CViewManagement_CIInputPane2_TryShow
#define IInputPane2_TryHide __x_ABI_CWindows_CUI_CViewManagement_CIInputPane2_TryHide
#endif /* WIDL_using_Windows_UI_ViewManagement */
#endif

#endif

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

/*****************************************************************************
 * IInputPaneControl interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIInputPaneControl_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIInputPaneControl_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CViewManagement_CIInputPaneControl, 0x088bb24f, 0x962f, 0x489d, 0xaa,0x6e, 0xc6,0xbe,0x1a,0x0a,0x6e,0x52);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                MIDL_INTERFACE("088bb24f-962f-489d-aa6e-c6be1a0a6e52")
                IInputPaneControl : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_Visible(
                        boolean *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_Visible(
                        boolean value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CViewManagement_CIInputPaneControl, 0x088bb24f, 0x962f, 0x489d, 0xaa,0x6e, 0xc6,0xbe,0x1a,0x0a,0x6e,0x52)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneControlVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IInputPaneControl methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Visible)(
        __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneControl *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *put_Visible)(
        __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneControl *This,
        boolean value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneControlVtbl;

interface __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneControl {
    CONST_VTBL __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneControlVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneControl_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneControl_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneControl_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneControl_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneControl_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneControl_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IInputPaneControl methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneControl_get_Visible(This,value) (This)->lpVtbl->get_Visible(This,value)
#define __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneControl_put_Visible(This,value) (This)->lpVtbl->put_Visible(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneControl_QueryInterface(__x_ABI_CWindows_CUI_CViewManagement_CIInputPaneControl* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneControl_AddRef(__x_ABI_CWindows_CUI_CViewManagement_CIInputPaneControl* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneControl_Release(__x_ABI_CWindows_CUI_CViewManagement_CIInputPaneControl* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneControl_GetIids(__x_ABI_CWindows_CUI_CViewManagement_CIInputPaneControl* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneControl_GetRuntimeClassName(__x_ABI_CWindows_CUI_CViewManagement_CIInputPaneControl* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneControl_GetTrustLevel(__x_ABI_CWindows_CUI_CViewManagement_CIInputPaneControl* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IInputPaneControl methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneControl_get_Visible(__x_ABI_CWindows_CUI_CViewManagement_CIInputPaneControl* This,boolean *value) {
    return This->lpVtbl->get_Visible(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneControl_put_Visible(__x_ABI_CWindows_CUI_CViewManagement_CIInputPaneControl* This,boolean value) {
    return This->lpVtbl->put_Visible(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_ViewManagement
#define IID_IInputPaneControl IID___x_ABI_CWindows_CUI_CViewManagement_CIInputPaneControl
#define IInputPaneControlVtbl __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneControlVtbl
#define IInputPaneControl __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneControl
#define IInputPaneControl_QueryInterface __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneControl_QueryInterface
#define IInputPaneControl_AddRef __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneControl_AddRef
#define IInputPaneControl_Release __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneControl_Release
#define IInputPaneControl_GetIids __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneControl_GetIids
#define IInputPaneControl_GetRuntimeClassName __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneControl_GetRuntimeClassName
#define IInputPaneControl_GetTrustLevel __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneControl_GetTrustLevel
#define IInputPaneControl_get_Visible __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneControl_get_Visible
#define IInputPaneControl_put_Visible __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneControl_put_Visible
#endif /* WIDL_using_Windows_UI_ViewManagement */
#endif

#endif

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

/*****************************************************************************
 * IInputPaneVisibilityEventArgs interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIInputPaneVisibilityEventArgs_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIInputPaneVisibilityEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CViewManagement_CIInputPaneVisibilityEventArgs, 0xd243e016, 0xd907, 0x4fcc, 0xbb,0x8d, 0xf7,0x7b,0xaa,0x50,0x28,0xf1);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                MIDL_INTERFACE("d243e016-d907-4fcc-bb8d-f77baa5028f1")
                IInputPaneVisibilityEventArgs : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_OccludedRect(
                        ABI::Windows::Foundation::Rect *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_EnsuredFocusedElementInView(
                        boolean value) = 0;

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

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CViewManagement_CIInputPaneVisibilityEventArgs, 0xd243e016, 0xd907, 0x4fcc, 0xbb,0x8d, 0xf7,0x7b,0xaa,0x50,0x28,0xf1)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneVisibilityEventArgsVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IInputPaneVisibilityEventArgs methods ***/
    HRESULT (STDMETHODCALLTYPE *get_OccludedRect)(
        __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneVisibilityEventArgs *This,
        __x_ABI_CWindows_CFoundation_CRect *value);

    HRESULT (STDMETHODCALLTYPE *put_EnsuredFocusedElementInView)(
        __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneVisibilityEventArgs *This,
        boolean value);

    HRESULT (STDMETHODCALLTYPE *get_EnsuredFocusedElementInView)(
        __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneVisibilityEventArgs *This,
        boolean *value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneVisibilityEventArgsVtbl;

interface __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneVisibilityEventArgs {
    CONST_VTBL __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneVisibilityEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneVisibilityEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneVisibilityEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneVisibilityEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneVisibilityEventArgs_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneVisibilityEventArgs_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneVisibilityEventArgs_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IInputPaneVisibilityEventArgs methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneVisibilityEventArgs_get_OccludedRect(This,value) (This)->lpVtbl->get_OccludedRect(This,value)
#define __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneVisibilityEventArgs_put_EnsuredFocusedElementInView(This,value) (This)->lpVtbl->put_EnsuredFocusedElementInView(This,value)
#define __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneVisibilityEventArgs_get_EnsuredFocusedElementInView(This,value) (This)->lpVtbl->get_EnsuredFocusedElementInView(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneVisibilityEventArgs_QueryInterface(__x_ABI_CWindows_CUI_CViewManagement_CIInputPaneVisibilityEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneVisibilityEventArgs_AddRef(__x_ABI_CWindows_CUI_CViewManagement_CIInputPaneVisibilityEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneVisibilityEventArgs_Release(__x_ABI_CWindows_CUI_CViewManagement_CIInputPaneVisibilityEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneVisibilityEventArgs_GetIids(__x_ABI_CWindows_CUI_CViewManagement_CIInputPaneVisibilityEventArgs* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneVisibilityEventArgs_GetRuntimeClassName(__x_ABI_CWindows_CUI_CViewManagement_CIInputPaneVisibilityEventArgs* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneVisibilityEventArgs_GetTrustLevel(__x_ABI_CWindows_CUI_CViewManagement_CIInputPaneVisibilityEventArgs* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IInputPaneVisibilityEventArgs methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneVisibilityEventArgs_get_OccludedRect(__x_ABI_CWindows_CUI_CViewManagement_CIInputPaneVisibilityEventArgs* This,__x_ABI_CWindows_CFoundation_CRect *value) {
    return This->lpVtbl->get_OccludedRect(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneVisibilityEventArgs_put_EnsuredFocusedElementInView(__x_ABI_CWindows_CUI_CViewManagement_CIInputPaneVisibilityEventArgs* This,boolean value) {
    return This->lpVtbl->put_EnsuredFocusedElementInView(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneVisibilityEventArgs_get_EnsuredFocusedElementInView(__x_ABI_CWindows_CUI_CViewManagement_CIInputPaneVisibilityEventArgs* This,boolean *value) {
    return This->lpVtbl->get_EnsuredFocusedElementInView(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_ViewManagement
#define IID_IInputPaneVisibilityEventArgs IID___x_ABI_CWindows_CUI_CViewManagement_CIInputPaneVisibilityEventArgs
#define IInputPaneVisibilityEventArgsVtbl __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneVisibilityEventArgsVtbl
#define IInputPaneVisibilityEventArgs __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneVisibilityEventArgs
#define IInputPaneVisibilityEventArgs_QueryInterface __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneVisibilityEventArgs_QueryInterface
#define IInputPaneVisibilityEventArgs_AddRef __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneVisibilityEventArgs_AddRef
#define IInputPaneVisibilityEventArgs_Release __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneVisibilityEventArgs_Release
#define IInputPaneVisibilityEventArgs_GetIids __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneVisibilityEventArgs_GetIids
#define IInputPaneVisibilityEventArgs_GetRuntimeClassName __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneVisibilityEventArgs_GetRuntimeClassName
#define IInputPaneVisibilityEventArgs_GetTrustLevel __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneVisibilityEventArgs_GetTrustLevel
#define IInputPaneVisibilityEventArgs_get_OccludedRect __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneVisibilityEventArgs_get_OccludedRect
#define IInputPaneVisibilityEventArgs_put_EnsuredFocusedElementInView __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneVisibilityEventArgs_put_EnsuredFocusedElementInView
#define IInputPaneVisibilityEventArgs_get_EnsuredFocusedElementInView __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneVisibilityEventArgs_get_EnsuredFocusedElementInView
#endif /* WIDL_using_Windows_UI_ViewManagement */
#endif

#endif

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

/*****************************************************************************
 * IInputPaneStatics interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStatics_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStatics_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStatics, 0x95f4af3a, 0xef47, 0x424a, 0x97,0x41, 0xfd,0x28,0x15,0xeb,0xa2,0xbd);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                MIDL_INTERFACE("95f4af3a-ef47-424a-9741-fd2815eba2bd")
                IInputPaneStatics : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE GetForCurrentView(
                        ABI::Windows::UI::ViewManagement::IInputPane **input_pane) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStatics, 0x95f4af3a, 0xef47, 0x424a, 0x97,0x41, 0xfd,0x28,0x15,0xeb,0xa2,0xbd)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStaticsVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IInputPaneStatics methods ***/
    HRESULT (STDMETHODCALLTYPE *GetForCurrentView)(
        __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStatics *This,
        __x_ABI_CWindows_CUI_CViewManagement_CIInputPane **input_pane);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStaticsVtbl;

interface __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStatics {
    CONST_VTBL __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStaticsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStatics_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStatics_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStatics_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStatics_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStatics_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStatics_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IInputPaneStatics methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStatics_GetForCurrentView(This,input_pane) (This)->lpVtbl->GetForCurrentView(This,input_pane)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStatics_QueryInterface(__x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStatics* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStatics_AddRef(__x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStatics* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStatics_Release(__x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStatics* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStatics_GetIids(__x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStatics* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStatics_GetRuntimeClassName(__x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStatics* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStatics_GetTrustLevel(__x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStatics* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IInputPaneStatics methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStatics_GetForCurrentView(__x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStatics* This,__x_ABI_CWindows_CUI_CViewManagement_CIInputPane **input_pane) {
    return This->lpVtbl->GetForCurrentView(This,input_pane);
}
#endif
#ifdef WIDL_using_Windows_UI_ViewManagement
#define IID_IInputPaneStatics IID___x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStatics
#define IInputPaneStaticsVtbl __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStaticsVtbl
#define IInputPaneStatics __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStatics
#define IInputPaneStatics_QueryInterface __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStatics_QueryInterface
#define IInputPaneStatics_AddRef __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStatics_AddRef
#define IInputPaneStatics_Release __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStatics_Release
#define IInputPaneStatics_GetIids __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStatics_GetIids
#define IInputPaneStatics_GetRuntimeClassName __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStatics_GetRuntimeClassName
#define IInputPaneStatics_GetTrustLevel __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStatics_GetTrustLevel
#define IInputPaneStatics_GetForCurrentView __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStatics_GetForCurrentView
#endif /* WIDL_using_Windows_UI_ViewManagement */
#endif

#endif

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

/*****************************************************************************
 * IInputPaneStatics2 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000
#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStatics2_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStatics2_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStatics2, 0x1b63529b, 0xd9ec, 0x4531, 0x84,0x45, 0x71,0xba,0xb9,0xfb,0x82,0x8e);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                MIDL_INTERFACE("1b63529b-d9ec-4531-8445-71bab9fb828e")
                IInputPaneStatics2 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE GetForUIContext(
                        ABI::Windows::UI::IUIContext *context,
                        ABI::Windows::UI::ViewManagement::IInputPane **result) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStatics2, 0x1b63529b, 0xd9ec, 0x4531, 0x84,0x45, 0x71,0xba,0xb9,0xfb,0x82,0x8e)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStatics2Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IInputPaneStatics2 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetForUIContext)(
        __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStatics2 *This,
        __x_ABI_CWindows_CUI_CIUIContext *context,
        __x_ABI_CWindows_CUI_CViewManagement_CIInputPane **result);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStatics2Vtbl;

interface __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStatics2 {
    CONST_VTBL __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStatics2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStatics2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStatics2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStatics2_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStatics2_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStatics2_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStatics2_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IInputPaneStatics2 methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStatics2_GetForUIContext(This,context,result) (This)->lpVtbl->GetForUIContext(This,context,result)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStatics2_QueryInterface(__x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStatics2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStatics2_AddRef(__x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStatics2* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStatics2_Release(__x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStatics2* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStatics2_GetIids(__x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStatics2* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStatics2_GetRuntimeClassName(__x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStatics2* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStatics2_GetTrustLevel(__x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStatics2* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IInputPaneStatics2 methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStatics2_GetForUIContext(__x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStatics2* This,__x_ABI_CWindows_CUI_CIUIContext *context,__x_ABI_CWindows_CUI_CViewManagement_CIInputPane **result) {
    return This->lpVtbl->GetForUIContext(This,context,result);
}
#endif
#ifdef WIDL_using_Windows_UI_ViewManagement
#define IID_IInputPaneStatics2 IID___x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStatics2
#define IInputPaneStatics2Vtbl __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStatics2Vtbl
#define IInputPaneStatics2 __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStatics2
#define IInputPaneStatics2_QueryInterface __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStatics2_QueryInterface
#define IInputPaneStatics2_AddRef __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStatics2_AddRef
#define IInputPaneStatics2_Release __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStatics2_Release
#define IInputPaneStatics2_GetIids __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStatics2_GetIids
#define IInputPaneStatics2_GetRuntimeClassName __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStatics2_GetRuntimeClassName
#define IInputPaneStatics2_GetTrustLevel __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStatics2_GetTrustLevel
#define IInputPaneStatics2_GetForUIContext __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStatics2_GetForUIContext
#endif /* WIDL_using_Windows_UI_ViewManagement */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CViewManagement_CIInputPaneStatics2_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000 */

/*****************************************************************************
 * IViewModePreferences interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000
#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferences_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferences_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferences, 0x878fcd3a, 0x0b99, 0x42c9, 0x84,0xd0, 0xd3,0xf1,0xd4,0x03,0x55,0x4b);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                MIDL_INTERFACE("878fcd3a-0b99-42c9-84d0-d3f1d403554b")
                IViewModePreferences : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_ViewSizePreference(
                        ABI::Windows::UI::ViewManagement::ViewSizePreference *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_ViewSizePreference(
                        ABI::Windows::UI::ViewManagement::ViewSizePreference value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_CustomSize(
                        ABI::Windows::Foundation::Size *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_CustomSize(
                        ABI::Windows::Foundation::Size value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferences, 0x878fcd3a, 0x0b99, 0x42c9, 0x84,0xd0, 0xd3,0xf1,0xd4,0x03,0x55,0x4b)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferencesVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IViewModePreferences methods ***/
    HRESULT (STDMETHODCALLTYPE *get_ViewSizePreference)(
        __x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferences *This,
        __x_ABI_CWindows_CUI_CViewManagement_CViewSizePreference *value);

    HRESULT (STDMETHODCALLTYPE *put_ViewSizePreference)(
        __x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferences *This,
        __x_ABI_CWindows_CUI_CViewManagement_CViewSizePreference value);

    HRESULT (STDMETHODCALLTYPE *get_CustomSize)(
        __x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferences *This,
        __x_ABI_CWindows_CFoundation_CSize *value);

    HRESULT (STDMETHODCALLTYPE *put_CustomSize)(
        __x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferences *This,
        __x_ABI_CWindows_CFoundation_CSize value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferencesVtbl;

interface __x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferences {
    CONST_VTBL __x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferencesVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferences_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferences_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferences_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferences_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferences_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferences_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IViewModePreferences methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferences_get_ViewSizePreference(This,value) (This)->lpVtbl->get_ViewSizePreference(This,value)
#define __x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferences_put_ViewSizePreference(This,value) (This)->lpVtbl->put_ViewSizePreference(This,value)
#define __x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferences_get_CustomSize(This,value) (This)->lpVtbl->get_CustomSize(This,value)
#define __x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferences_put_CustomSize(This,value) (This)->lpVtbl->put_CustomSize(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferences_QueryInterface(__x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferences* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferences_AddRef(__x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferences* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferences_Release(__x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferences* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferences_GetIids(__x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferences* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferences_GetRuntimeClassName(__x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferences* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferences_GetTrustLevel(__x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferences* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IViewModePreferences methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferences_get_ViewSizePreference(__x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferences* This,__x_ABI_CWindows_CUI_CViewManagement_CViewSizePreference *value) {
    return This->lpVtbl->get_ViewSizePreference(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferences_put_ViewSizePreference(__x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferences* This,__x_ABI_CWindows_CUI_CViewManagement_CViewSizePreference value) {
    return This->lpVtbl->put_ViewSizePreference(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferences_get_CustomSize(__x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferences* This,__x_ABI_CWindows_CFoundation_CSize *value) {
    return This->lpVtbl->get_CustomSize(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferences_put_CustomSize(__x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferences* This,__x_ABI_CWindows_CFoundation_CSize value) {
    return This->lpVtbl->put_CustomSize(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_ViewManagement
#define IID_IViewModePreferences IID___x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferences
#define IViewModePreferencesVtbl __x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferencesVtbl
#define IViewModePreferences __x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferences
#define IViewModePreferences_QueryInterface __x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferences_QueryInterface
#define IViewModePreferences_AddRef __x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferences_AddRef
#define IViewModePreferences_Release __x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferences_Release
#define IViewModePreferences_GetIids __x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferences_GetIids
#define IViewModePreferences_GetRuntimeClassName __x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferences_GetRuntimeClassName
#define IViewModePreferences_GetTrustLevel __x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferences_GetTrustLevel
#define IViewModePreferences_get_ViewSizePreference __x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferences_get_ViewSizePreference
#define IViewModePreferences_put_ViewSizePreference __x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferences_put_ViewSizePreference
#define IViewModePreferences_get_CustomSize __x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferences_get_CustomSize
#define IViewModePreferences_put_CustomSize __x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferences_put_CustomSize
#endif /* WIDL_using_Windows_UI_ViewManagement */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferences_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000 */

/*****************************************************************************
 * IViewModePreferencesStatics interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000
#ifndef ____x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferencesStatics_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferencesStatics_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferencesStatics, 0x69b60a65, 0x5de5, 0x40d8, 0x83,0x06, 0x38,0x33,0xdf,0x7a,0x22,0x74);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace ViewManagement {
                MIDL_INTERFACE("69b60a65-5de5-40d8-8306-3833df7a2274")
                IViewModePreferencesStatics : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE CreateDefault(
                        ABI::Windows::UI::ViewManagement::ApplicationViewMode mode,
                        ABI::Windows::UI::ViewManagement::IViewModePreferences **result) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferencesStatics, 0x69b60a65, 0x5de5, 0x40d8, 0x83,0x06, 0x38,0x33,0xdf,0x7a,0x22,0x74)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferencesStaticsVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IViewModePreferencesStatics methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateDefault)(
        __x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferencesStatics *This,
        __x_ABI_CWindows_CUI_CViewManagement_CApplicationViewMode mode,
        __x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferences **result);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferencesStaticsVtbl;

interface __x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferencesStatics {
    CONST_VTBL __x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferencesStaticsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferencesStatics_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferencesStatics_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferencesStatics_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferencesStatics_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferencesStatics_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferencesStatics_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IViewModePreferencesStatics methods ***/
#define __x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferencesStatics_CreateDefault(This,mode,result) (This)->lpVtbl->CreateDefault(This,mode,result)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferencesStatics_QueryInterface(__x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferencesStatics* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferencesStatics_AddRef(__x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferencesStatics* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferencesStatics_Release(__x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferencesStatics* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferencesStatics_GetIids(__x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferencesStatics* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferencesStatics_GetRuntimeClassName(__x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferencesStatics* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferencesStatics_GetTrustLevel(__x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferencesStatics* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IViewModePreferencesStatics methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferencesStatics_CreateDefault(__x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferencesStatics* This,__x_ABI_CWindows_CUI_CViewManagement_CApplicationViewMode mode,__x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferences **result) {
    return This->lpVtbl->CreateDefault(This,mode,result);
}
#endif
#ifdef WIDL_using_Windows_UI_ViewManagement
#define IID_IViewModePreferencesStatics IID___x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferencesStatics
#define IViewModePreferencesStaticsVtbl __x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferencesStaticsVtbl
#define IViewModePreferencesStatics __x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferencesStatics
#define IViewModePreferencesStatics_QueryInterface __x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferencesStatics_QueryInterface
#define IViewModePreferencesStatics_AddRef __x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferencesStatics_AddRef
#define IViewModePreferencesStatics_Release __x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferencesStatics_Release
#define IViewModePreferencesStatics_GetIids __x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferencesStatics_GetIids
#define IViewModePreferencesStatics_GetRuntimeClassName __x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferencesStatics_GetRuntimeClassName
#define IViewModePreferencesStatics_GetTrustLevel __x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferencesStatics_GetTrustLevel
#define IViewModePreferencesStatics_CreateDefault __x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferencesStatics_CreateDefault
#endif /* WIDL_using_Windows_UI_ViewManagement */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CViewManagement_CIViewModePreferencesStatics_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000 */

/*
 * Class Windows.UI.ViewManagement.AccessibilitySettings
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_UI_ViewManagement_AccessibilitySettings_DEFINED
#define RUNTIMECLASS_Windows_UI_ViewManagement_AccessibilitySettings_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_ViewManagement_AccessibilitySettings[] = {'W','i','n','d','o','w','s','.','U','I','.','V','i','e','w','M','a','n','a','g','e','m','e','n','t','.','A','c','c','e','s','s','i','b','i','l','i','t','y','S','e','t','t','i','n','g','s',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_ViewManagement_AccessibilitySettings[] = L"Windows.UI.ViewManagement.AccessibilitySettings";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_ViewManagement_AccessibilitySettings[] = {'W','i','n','d','o','w','s','.','U','I','.','V','i','e','w','M','a','n','a','g','e','m','e','n','t','.','A','c','c','e','s','s','i','b','i','l','i','t','y','S','e','t','t','i','n','g','s',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_ViewManagement_AccessibilitySettings_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.UI.ViewManagement.ApplicationView
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_UI_ViewManagement_ApplicationView_DEFINED
#define RUNTIMECLASS_Windows_UI_ViewManagement_ApplicationView_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_ViewManagement_ApplicationView[] = {'W','i','n','d','o','w','s','.','U','I','.','V','i','e','w','M','a','n','a','g','e','m','e','n','t','.','A','p','p','l','i','c','a','t','i','o','n','V','i','e','w',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_ViewManagement_ApplicationView[] = L"Windows.UI.ViewManagement.ApplicationView";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_ViewManagement_ApplicationView[] = {'W','i','n','d','o','w','s','.','U','I','.','V','i','e','w','M','a','n','a','g','e','m','e','n','t','.','A','p','p','l','i','c','a','t','i','o','n','V','i','e','w',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_ViewManagement_ApplicationView_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.UI.ViewManagement.ApplicationViewConsolidatedEventArgs
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_UI_ViewManagement_ApplicationViewConsolidatedEventArgs_DEFINED
#define RUNTIMECLASS_Windows_UI_ViewManagement_ApplicationViewConsolidatedEventArgs_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_ViewManagement_ApplicationViewConsolidatedEventArgs[] = {'W','i','n','d','o','w','s','.','U','I','.','V','i','e','w','M','a','n','a','g','e','m','e','n','t','.','A','p','p','l','i','c','a','t','i','o','n','V','i','e','w','C','o','n','s','o','l','i','d','a','t','e','d','E','v','e','n','t','A','r','g','s',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_ViewManagement_ApplicationViewConsolidatedEventArgs[] = L"Windows.UI.ViewManagement.ApplicationViewConsolidatedEventArgs";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_ViewManagement_ApplicationViewConsolidatedEventArgs[] = {'W','i','n','d','o','w','s','.','U','I','.','V','i','e','w','M','a','n','a','g','e','m','e','n','t','.','A','p','p','l','i','c','a','t','i','o','n','V','i','e','w','C','o','n','s','o','l','i','d','a','t','e','d','E','v','e','n','t','A','r','g','s',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_ViewManagement_ApplicationViewConsolidatedEventArgs_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.UI.ViewManagement.ApplicationViewScaling
 */
#if WINDOWS_UI_VIEWMANAGEMENT_VIEWMANAGEMENTVIEWSCALINGCONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_UI_ViewManagement_ApplicationViewScaling_DEFINED
#define RUNTIMECLASS_Windows_UI_ViewManagement_ApplicationViewScaling_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_ViewManagement_ApplicationViewScaling[] = {'W','i','n','d','o','w','s','.','U','I','.','V','i','e','w','M','a','n','a','g','e','m','e','n','t','.','A','p','p','l','i','c','a','t','i','o','n','V','i','e','w','S','c','a','l','i','n','g',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_ViewManagement_ApplicationViewScaling[] = L"Windows.UI.ViewManagement.ApplicationViewScaling";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_ViewManagement_ApplicationViewScaling[] = {'W','i','n','d','o','w','s','.','U','I','.','V','i','e','w','M','a','n','a','g','e','m','e','n','t','.','A','p','p','l','i','c','a','t','i','o','n','V','i','e','w','S','c','a','l','i','n','g',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_ViewManagement_ApplicationViewScaling_DEFINED */
#endif /* WINDOWS_UI_VIEWMANAGEMENT_VIEWMANAGEMENTVIEWSCALINGCONTRACT_VERSION >= 0x10000 */

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

/*
 * Class Windows.UI.ViewManagement.ApplicationViewTitleBar
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_UI_ViewManagement_ApplicationViewTitleBar_DEFINED
#define RUNTIMECLASS_Windows_UI_ViewManagement_ApplicationViewTitleBar_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_ViewManagement_ApplicationViewTitleBar[] = {'W','i','n','d','o','w','s','.','U','I','.','V','i','e','w','M','a','n','a','g','e','m','e','n','t','.','A','p','p','l','i','c','a','t','i','o','n','V','i','e','w','T','i','t','l','e','B','a','r',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_ViewManagement_ApplicationViewTitleBar[] = L"Windows.UI.ViewManagement.ApplicationViewTitleBar";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_ViewManagement_ApplicationViewTitleBar[] = {'W','i','n','d','o','w','s','.','U','I','.','V','i','e','w','M','a','n','a','g','e','m','e','n','t','.','A','p','p','l','i','c','a','t','i','o','n','V','i','e','w','T','i','t','l','e','B','a','r',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_ViewManagement_ApplicationViewTitleBar_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.UI.ViewManagement.ApplicationViewTransferContext
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef RUNTIMECLASS_Windows_UI_ViewManagement_ApplicationViewTransferContext_DEFINED
#define RUNTIMECLASS_Windows_UI_ViewManagement_ApplicationViewTransferContext_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_ViewManagement_ApplicationViewTransferContext[] = {'W','i','n','d','o','w','s','.','U','I','.','V','i','e','w','M','a','n','a','g','e','m','e','n','t','.','A','p','p','l','i','c','a','t','i','o','n','V','i','e','w','T','r','a','n','s','f','e','r','C','o','n','t','e','x','t',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_ViewManagement_ApplicationViewTransferContext[] = L"Windows.UI.ViewManagement.ApplicationViewTransferContext";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_ViewManagement_ApplicationViewTransferContext[] = {'W','i','n','d','o','w','s','.','U','I','.','V','i','e','w','M','a','n','a','g','e','m','e','n','t','.','A','p','p','l','i','c','a','t','i','o','n','V','i','e','w','T','r','a','n','s','f','e','r','C','o','n','t','e','x','t',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_ViewManagement_ApplicationViewTransferContext_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*
 * Class Windows.UI.ViewManagement.UISettings
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_UI_ViewManagement_UISettings_DEFINED
#define RUNTIMECLASS_Windows_UI_ViewManagement_UISettings_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_ViewManagement_UISettings[] = {'W','i','n','d','o','w','s','.','U','I','.','V','i','e','w','M','a','n','a','g','e','m','e','n','t','.','U','I','S','e','t','t','i','n','g','s',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_ViewManagement_UISettings[] = L"Windows.UI.ViewManagement.UISettings";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_ViewManagement_UISettings[] = {'W','i','n','d','o','w','s','.','U','I','.','V','i','e','w','M','a','n','a','g','e','m','e','n','t','.','U','I','S','e','t','t','i','n','g','s',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_ViewManagement_UISettings_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.UI.ViewManagement.UISettingsAnimationsEnabledChangedEventArgs
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0xa0000
#ifndef RUNTIMECLASS_Windows_UI_ViewManagement_UISettingsAnimationsEnabledChangedEventArgs_DEFINED
#define RUNTIMECLASS_Windows_UI_ViewManagement_UISettingsAnimationsEnabledChangedEventArgs_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_ViewManagement_UISettingsAnimationsEnabledChangedEventArgs[] = {'W','i','n','d','o','w','s','.','U','I','.','V','i','e','w','M','a','n','a','g','e','m','e','n','t','.','U','I','S','e','t','t','i','n','g','s','A','n','i','m','a','t','i','o','n','s','E','n','a','b','l','e','d','C','h','a','n','g','e','d','E','v','e','n','t','A','r','g','s',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_ViewManagement_UISettingsAnimationsEnabledChangedEventArgs[] = L"Windows.UI.ViewManagement.UISettingsAnimationsEnabledChangedEventArgs";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_ViewManagement_UISettingsAnimationsEnabledChangedEventArgs[] = {'W','i','n','d','o','w','s','.','U','I','.','V','i','e','w','M','a','n','a','g','e','m','e','n','t','.','U','I','S','e','t','t','i','n','g','s','A','n','i','m','a','t','i','o','n','s','E','n','a','b','l','e','d','C','h','a','n','g','e','d','E','v','e','n','t','A','r','g','s',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_ViewManagement_UISettingsAnimationsEnabledChangedEventArgs_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0xa0000 */

/*
 * Class Windows.UI.ViewManagement.UISettingsAutoHideScrollBarsChangedEventArgs
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000
#ifndef RUNTIMECLASS_Windows_UI_ViewManagement_UISettingsAutoHideScrollBarsChangedEventArgs_DEFINED
#define RUNTIMECLASS_Windows_UI_ViewManagement_UISettingsAutoHideScrollBarsChangedEventArgs_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_ViewManagement_UISettingsAutoHideScrollBarsChangedEventArgs[] = {'W','i','n','d','o','w','s','.','U','I','.','V','i','e','w','M','a','n','a','g','e','m','e','n','t','.','U','I','S','e','t','t','i','n','g','s','A','u','t','o','H','i','d','e','S','c','r','o','l','l','B','a','r','s','C','h','a','n','g','e','d','E','v','e','n','t','A','r','g','s',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_ViewManagement_UISettingsAutoHideScrollBarsChangedEventArgs[] = L"Windows.UI.ViewManagement.UISettingsAutoHideScrollBarsChangedEventArgs";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_ViewManagement_UISettingsAutoHideScrollBarsChangedEventArgs[] = {'W','i','n','d','o','w','s','.','U','I','.','V','i','e','w','M','a','n','a','g','e','m','e','n','t','.','U','I','S','e','t','t','i','n','g','s','A','u','t','o','H','i','d','e','S','c','r','o','l','l','B','a','r','s','C','h','a','n','g','e','d','E','v','e','n','t','A','r','g','s',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_ViewManagement_UISettingsAutoHideScrollBarsChangedEventArgs_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000 */

/*
 * Class Windows.UI.ViewManagement.UISettingsMessageDurationChangedEventArgs
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0xa0000
#ifndef RUNTIMECLASS_Windows_UI_ViewManagement_UISettingsMessageDurationChangedEventArgs_DEFINED
#define RUNTIMECLASS_Windows_UI_ViewManagement_UISettingsMessageDurationChangedEventArgs_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_ViewManagement_UISettingsMessageDurationChangedEventArgs[] = {'W','i','n','d','o','w','s','.','U','I','.','V','i','e','w','M','a','n','a','g','e','m','e','n','t','.','U','I','S','e','t','t','i','n','g','s','M','e','s','s','a','g','e','D','u','r','a','t','i','o','n','C','h','a','n','g','e','d','E','v','e','n','t','A','r','g','s',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_ViewManagement_UISettingsMessageDurationChangedEventArgs[] = L"Windows.UI.ViewManagement.UISettingsMessageDurationChangedEventArgs";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_ViewManagement_UISettingsMessageDurationChangedEventArgs[] = {'W','i','n','d','o','w','s','.','U','I','.','V','i','e','w','M','a','n','a','g','e','m','e','n','t','.','U','I','S','e','t','t','i','n','g','s','M','e','s','s','a','g','e','D','u','r','a','t','i','o','n','C','h','a','n','g','e','d','E','v','e','n','t','A','r','g','s',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_ViewManagement_UISettingsMessageDurationChangedEventArgs_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0xa0000 */

/*
 * Class Windows.UI.ViewManagement.UIViewSettings
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_UI_ViewManagement_UIViewSettings_DEFINED
#define RUNTIMECLASS_Windows_UI_ViewManagement_UIViewSettings_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_ViewManagement_UIViewSettings[] = {'W','i','n','d','o','w','s','.','U','I','.','V','i','e','w','M','a','n','a','g','e','m','e','n','t','.','U','I','V','i','e','w','S','e','t','t','i','n','g','s',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_ViewManagement_UIViewSettings[] = L"Windows.UI.ViewManagement.UIViewSettings";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_ViewManagement_UIViewSettings[] = {'W','i','n','d','o','w','s','.','U','I','.','V','i','e','w','M','a','n','a','g','e','m','e','n','t','.','U','I','V','i','e','w','S','e','t','t','i','n','g','s',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_ViewManagement_UIViewSettings_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.UI.ViewManagement.InputPane
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_UI_ViewManagement_InputPane_DEFINED
#define RUNTIMECLASS_Windows_UI_ViewManagement_InputPane_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_ViewManagement_InputPane[] = {'W','i','n','d','o','w','s','.','U','I','.','V','i','e','w','M','a','n','a','g','e','m','e','n','t','.','I','n','p','u','t','P','a','n','e',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_ViewManagement_InputPane[] = L"Windows.UI.ViewManagement.InputPane";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_ViewManagement_InputPane[] = {'W','i','n','d','o','w','s','.','U','I','.','V','i','e','w','M','a','n','a','g','e','m','e','n','t','.','I','n','p','u','t','P','a','n','e',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_ViewManagement_InputPane_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.UI.ViewManagement.InputPaneVisibilityEventArgs
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_UI_ViewManagement_InputPaneVisibilityEventArgs_DEFINED
#define RUNTIMECLASS_Windows_UI_ViewManagement_InputPaneVisibilityEventArgs_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_ViewManagement_InputPaneVisibilityEventArgs[] = {'W','i','n','d','o','w','s','.','U','I','.','V','i','e','w','M','a','n','a','g','e','m','e','n','t','.','I','n','p','u','t','P','a','n','e','V','i','s','i','b','i','l','i','t','y','E','v','e','n','t','A','r','g','s',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_ViewManagement_InputPaneVisibilityEventArgs[] = L"Windows.UI.ViewManagement.InputPaneVisibilityEventArgs";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_ViewManagement_InputPaneVisibilityEventArgs[] = {'W','i','n','d','o','w','s','.','U','I','.','V','i','e','w','M','a','n','a','g','e','m','e','n','t','.','I','n','p','u','t','P','a','n','e','V','i','s','i','b','i','l','i','t','y','E','v','e','n','t','A','r','g','s',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_ViewManagement_InputPaneVisibilityEventArgs_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.UI.ViewManagement.ViewModePreferences
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000
#ifndef RUNTIMECLASS_Windows_UI_ViewManagement_ViewModePreferences_DEFINED
#define RUNTIMECLASS_Windows_UI_ViewManagement_ViewModePreferences_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_ViewManagement_ViewModePreferences[] = {'W','i','n','d','o','w','s','.','U','I','.','V','i','e','w','M','a','n','a','g','e','m','e','n','t','.','V','i','e','w','M','o','d','e','P','r','e','f','e','r','e','n','c','e','s',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_ViewManagement_ViewModePreferences[] = L"Windows.UI.ViewManagement.ViewModePreferences";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_ViewManagement_ViewModePreferences[] = {'W','i','n','d','o','w','s','.','U','I','.','V','i','e','w','M','a','n','a','g','e','m','e','n','t','.','V','i','e','w','M','o','d','e','P','r','e','f','e','r','e','n','c','e','s',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_ViewManagement_ViewModePreferences_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000 */

/*****************************************************************************
 * ITypedEventHandler<ABI::Windows::UI::ViewManagement::AccessibilitySettings*,IInspectable* > interface
 */
#ifndef ____FITypedEventHandler_2_Windows__CUI__CViewManagement__CAccessibilitySettings_IInspectable_INTERFACE_DEFINED__
#define ____FITypedEventHandler_2_Windows__CUI__CViewManagement__CAccessibilitySettings_IInspectable_INTERFACE_DEFINED__

DEFINE_GUID(IID___FITypedEventHandler_2_Windows__CUI__CViewManagement__CAccessibilitySettings_IInspectable, 0xf5917e6f, 0x5abf, 0x5e65, 0xb5,0xb4, 0x1b,0x9c,0x8d,0x94,0xe7,0x88);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("f5917e6f-5abf-5e65-b5b4-1b9c8d94e788")
            ITypedEventHandler<ABI::Windows::UI::ViewManagement::AccessibilitySettings*,IInspectable* > : ITypedEventHandler_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::ViewManagement::AccessibilitySettings*, ABI::Windows::UI::ViewManagement::IAccessibilitySettings* >, IInspectable* >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FITypedEventHandler_2_Windows__CUI__CViewManagement__CAccessibilitySettings_IInspectable, 0xf5917e6f, 0x5abf, 0x5e65, 0xb5,0xb4, 0x1b,0x9c,0x8d,0x94,0xe7,0x88)
#endif
#else
typedef struct __FITypedEventHandler_2_Windows__CUI__CViewManagement__CAccessibilitySettings_IInspectableVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ITypedEventHandler<ABI::Windows::UI::ViewManagement::AccessibilitySettings*,IInspectable* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FITypedEventHandler_2_Windows__CUI__CViewManagement__CAccessibilitySettings_IInspectable *This,
        __x_ABI_CWindows_CUI_CViewManagement_CIAccessibilitySettings *sender,
        IInspectable *args);

    END_INTERFACE
} __FITypedEventHandler_2_Windows__CUI__CViewManagement__CAccessibilitySettings_IInspectableVtbl;

interface __FITypedEventHandler_2_Windows__CUI__CViewManagement__CAccessibilitySettings_IInspectable {
    CONST_VTBL __FITypedEventHandler_2_Windows__CUI__CViewManagement__CAccessibilitySettings_IInspectableVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FITypedEventHandler_2_Windows__CUI__CViewManagement__CAccessibilitySettings_IInspectable_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FITypedEventHandler_2_Windows__CUI__CViewManagement__CAccessibilitySettings_IInspectable_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FITypedEventHandler_2_Windows__CUI__CViewManagement__CAccessibilitySettings_IInspectable_Release(This) (This)->lpVtbl->Release(This)
/*** ITypedEventHandler<ABI::Windows::UI::ViewManagement::AccessibilitySettings*,IInspectable* > methods ***/
#define __FITypedEventHandler_2_Windows__CUI__CViewManagement__CAccessibilitySettings_IInspectable_Invoke(This,sender,args) (This)->lpVtbl->Invoke(This,sender,args)
#else
/*** IUnknown methods ***/
static inline HRESULT __FITypedEventHandler_2_Windows__CUI__CViewManagement__CAccessibilitySettings_IInspectable_QueryInterface(__FITypedEventHandler_2_Windows__CUI__CViewManagement__CAccessibilitySettings_IInspectable* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FITypedEventHandler_2_Windows__CUI__CViewManagement__CAccessibilitySettings_IInspectable_AddRef(__FITypedEventHandler_2_Windows__CUI__CViewManagement__CAccessibilitySettings_IInspectable* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FITypedEventHandler_2_Windows__CUI__CViewManagement__CAccessibilitySettings_IInspectable_Release(__FITypedEventHandler_2_Windows__CUI__CViewManagement__CAccessibilitySettings_IInspectable* This) {
    return This->lpVtbl->Release(This);
}
/*** ITypedEventHandler<ABI::Windows::UI::ViewManagement::AccessibilitySettings*,IInspectable* > methods ***/
static inline HRESULT __FITypedEventHandler_2_Windows__CUI__CViewManagement__CAccessibilitySettings_IInspectable_Invoke(__FITypedEventHandler_2_Windows__CUI__CViewManagement__CAccessibilitySettings_IInspectable* This,__x_ABI_CWindows_CUI_CViewManagement_CIAccessibilitySettings *sender,IInspectable *args) {
    return This->lpVtbl->Invoke(This,sender,args);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_ITypedEventHandler_AccessibilitySettings_IInspectable IID___FITypedEventHandler_2_Windows__CUI__CViewManagement__CAccessibilitySettings_IInspectable
#define ITypedEventHandler_AccessibilitySettings_IInspectableVtbl __FITypedEventHandler_2_Windows__CUI__CViewManagement__CAccessibilitySettings_IInspectableVtbl
#define ITypedEventHandler_AccessibilitySettings_IInspectable __FITypedEventHandler_2_Windows__CUI__CViewManagement__CAccessibilitySettings_IInspectable
#define ITypedEventHandler_AccessibilitySettings_IInspectable_QueryInterface __FITypedEventHandler_2_Windows__CUI__CViewManagement__CAccessibilitySettings_IInspectable_QueryInterface
#define ITypedEventHandler_AccessibilitySettings_IInspectable_AddRef __FITypedEventHandler_2_Windows__CUI__CViewManagement__CAccessibilitySettings_IInspectable_AddRef
#define ITypedEventHandler_AccessibilitySettings_IInspectable_Release __FITypedEventHandler_2_Windows__CUI__CViewManagement__CAccessibilitySettings_IInspectable_Release
#define ITypedEventHandler_AccessibilitySettings_IInspectable_Invoke __FITypedEventHandler_2_Windows__CUI__CViewManagement__CAccessibilitySettings_IInspectable_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FITypedEventHandler_2_Windows__CUI__CViewManagement__CAccessibilitySettings_IInspectable_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ITypedEventHandler<ABI::Windows::UI::ViewManagement::ApplicationView*,IInspectable* > interface
 */
#ifndef ____FITypedEventHandler_2_Windows__CUI__CViewManagement__CApplicationView_IInspectable_INTERFACE_DEFINED__
#define ____FITypedEventHandler_2_Windows__CUI__CViewManagement__CApplicationView_IInspectable_INTERFACE_DEFINED__

DEFINE_GUID(IID___FITypedEventHandler_2_Windows__CUI__CViewManagement__CApplicationView_IInspectable, 0x00c1f983, 0xc836, 0x565c, 0x8b,0xbf, 0x70,0x53,0x05,0x5b,0xdb,0x4c);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("00c1f983-c836-565c-8bbf-7053055bdb4c")
            ITypedEventHandler<ABI::Windows::UI::ViewManagement::ApplicationView*,IInspectable* > : ITypedEventHandler_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::ViewManagement::ApplicationView*, ABI::Windows::UI::ViewManagement::IApplicationView* >, IInspectable* >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FITypedEventHandler_2_Windows__CUI__CViewManagement__CApplicationView_IInspectable, 0x00c1f983, 0xc836, 0x565c, 0x8b,0xbf, 0x70,0x53,0x05,0x5b,0xdb,0x4c)
#endif
#else
typedef struct __FITypedEventHandler_2_Windows__CUI__CViewManagement__CApplicationView_IInspectableVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ITypedEventHandler<ABI::Windows::UI::ViewManagement::ApplicationView*,IInspectable* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FITypedEventHandler_2_Windows__CUI__CViewManagement__CApplicationView_IInspectable *This,
        __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView *sender,
        IInspectable *args);

    END_INTERFACE
} __FITypedEventHandler_2_Windows__CUI__CViewManagement__CApplicationView_IInspectableVtbl;

interface __FITypedEventHandler_2_Windows__CUI__CViewManagement__CApplicationView_IInspectable {
    CONST_VTBL __FITypedEventHandler_2_Windows__CUI__CViewManagement__CApplicationView_IInspectableVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FITypedEventHandler_2_Windows__CUI__CViewManagement__CApplicationView_IInspectable_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FITypedEventHandler_2_Windows__CUI__CViewManagement__CApplicationView_IInspectable_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FITypedEventHandler_2_Windows__CUI__CViewManagement__CApplicationView_IInspectable_Release(This) (This)->lpVtbl->Release(This)
/*** ITypedEventHandler<ABI::Windows::UI::ViewManagement::ApplicationView*,IInspectable* > methods ***/
#define __FITypedEventHandler_2_Windows__CUI__CViewManagement__CApplicationView_IInspectable_Invoke(This,sender,args) (This)->lpVtbl->Invoke(This,sender,args)
#else
/*** IUnknown methods ***/
static inline HRESULT __FITypedEventHandler_2_Windows__CUI__CViewManagement__CApplicationView_IInspectable_QueryInterface(__FITypedEventHandler_2_Windows__CUI__CViewManagement__CApplicationView_IInspectable* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FITypedEventHandler_2_Windows__CUI__CViewManagement__CApplicationView_IInspectable_AddRef(__FITypedEventHandler_2_Windows__CUI__CViewManagement__CApplicationView_IInspectable* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FITypedEventHandler_2_Windows__CUI__CViewManagement__CApplicationView_IInspectable_Release(__FITypedEventHandler_2_Windows__CUI__CViewManagement__CApplicationView_IInspectable* This) {
    return This->lpVtbl->Release(This);
}
/*** ITypedEventHandler<ABI::Windows::UI::ViewManagement::ApplicationView*,IInspectable* > methods ***/
static inline HRESULT __FITypedEventHandler_2_Windows__CUI__CViewManagement__CApplicationView_IInspectable_Invoke(__FITypedEventHandler_2_Windows__CUI__CViewManagement__CApplicationView_IInspectable* This,__x_ABI_CWindows_CUI_CViewManagement_CIApplicationView *sender,IInspectable *args) {
    return This->lpVtbl->Invoke(This,sender,args);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_ITypedEventHandler_ApplicationView_IInspectable IID___FITypedEventHandler_2_Windows__CUI__CViewManagement__CApplicationView_IInspectable
#define ITypedEventHandler_ApplicationView_IInspectableVtbl __FITypedEventHandler_2_Windows__CUI__CViewManagement__CApplicationView_IInspectableVtbl
#define ITypedEventHandler_ApplicationView_IInspectable __FITypedEventHandler_2_Windows__CUI__CViewManagement__CApplicationView_IInspectable
#define ITypedEventHandler_ApplicationView_IInspectable_QueryInterface __FITypedEventHandler_2_Windows__CUI__CViewManagement__CApplicationView_IInspectable_QueryInterface
#define ITypedEventHandler_ApplicationView_IInspectable_AddRef __FITypedEventHandler_2_Windows__CUI__CViewManagement__CApplicationView_IInspectable_AddRef
#define ITypedEventHandler_ApplicationView_IInspectable_Release __FITypedEventHandler_2_Windows__CUI__CViewManagement__CApplicationView_IInspectable_Release
#define ITypedEventHandler_ApplicationView_IInspectable_Invoke __FITypedEventHandler_2_Windows__CUI__CViewManagement__CApplicationView_IInspectable_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FITypedEventHandler_2_Windows__CUI__CViewManagement__CApplicationView_IInspectable_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ITypedEventHandler<ABI::Windows::UI::ViewManagement::ApplicationView*,ABI::Windows::UI::ViewManagement::ApplicationViewConsolidatedEventArgs* > interface
 */
#ifndef ____FITypedEventHandler_2_Windows__CUI__CViewManagement__CApplicationView_Windows__CUI__CViewManagement__CApplicationViewConsolidatedEventArgs_INTERFACE_DEFINED__
#define ____FITypedEventHandler_2_Windows__CUI__CViewManagement__CApplicationView_Windows__CUI__CViewManagement__CApplicationViewConsolidatedEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___FITypedEventHandler_2_Windows__CUI__CViewManagement__CApplicationView_Windows__CUI__CViewManagement__CApplicationViewConsolidatedEventArgs, 0x463c606a, 0x8c82, 0x5a29, 0xa2,0xbd, 0x04,0x07,0x81,0xf2,0x53,0x48);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("463c606a-8c82-5a29-a2bd-040781f25348")
            ITypedEventHandler<ABI::Windows::UI::ViewManagement::ApplicationView*,ABI::Windows::UI::ViewManagement::ApplicationViewConsolidatedEventArgs* > : ITypedEventHandler_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::ViewManagement::ApplicationView*, ABI::Windows::UI::ViewManagement::IApplicationView* >, ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::ViewManagement::ApplicationViewConsolidatedEventArgs*, ABI::Windows::UI::ViewManagement::IApplicationViewConsolidatedEventArgs* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FITypedEventHandler_2_Windows__CUI__CViewManagement__CApplicationView_Windows__CUI__CViewManagement__CApplicationViewConsolidatedEventArgs, 0x463c606a, 0x8c82, 0x5a29, 0xa2,0xbd, 0x04,0x07,0x81,0xf2,0x53,0x48)
#endif
#else
typedef struct __FITypedEventHandler_2_Windows__CUI__CViewManagement__CApplicationView_Windows__CUI__CViewManagement__CApplicationViewConsolidatedEventArgsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ITypedEventHandler<ABI::Windows::UI::ViewManagement::ApplicationView*,ABI::Windows::UI::ViewManagement::ApplicationViewConsolidatedEventArgs* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FITypedEventHandler_2_Windows__CUI__CViewManagement__CApplicationView_Windows__CUI__CViewManagement__CApplicationViewConsolidatedEventArgs *This,
        __x_ABI_CWindows_CUI_CViewManagement_CIApplicationView *sender,
        __x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs *args);

    END_INTERFACE
} __FITypedEventHandler_2_Windows__CUI__CViewManagement__CApplicationView_Windows__CUI__CViewManagement__CApplicationViewConsolidatedEventArgsVtbl;

interface __FITypedEventHandler_2_Windows__CUI__CViewManagement__CApplicationView_Windows__CUI__CViewManagement__CApplicationViewConsolidatedEventArgs {
    CONST_VTBL __FITypedEventHandler_2_Windows__CUI__CViewManagement__CApplicationView_Windows__CUI__CViewManagement__CApplicationViewConsolidatedEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FITypedEventHandler_2_Windows__CUI__CViewManagement__CApplicationView_Windows__CUI__CViewManagement__CApplicationViewConsolidatedEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FITypedEventHandler_2_Windows__CUI__CViewManagement__CApplicationView_Windows__CUI__CViewManagement__CApplicationViewConsolidatedEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FITypedEventHandler_2_Windows__CUI__CViewManagement__CApplicationView_Windows__CUI__CViewManagement__CApplicationViewConsolidatedEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** ITypedEventHandler<ABI::Windows::UI::ViewManagement::ApplicationView*,ABI::Windows::UI::ViewManagement::ApplicationViewConsolidatedEventArgs* > methods ***/
#define __FITypedEventHandler_2_Windows__CUI__CViewManagement__CApplicationView_Windows__CUI__CViewManagement__CApplicationViewConsolidatedEventArgs_Invoke(This,sender,args) (This)->lpVtbl->Invoke(This,sender,args)
#else
/*** IUnknown methods ***/
static inline HRESULT __FITypedEventHandler_2_Windows__CUI__CViewManagement__CApplicationView_Windows__CUI__CViewManagement__CApplicationViewConsolidatedEventArgs_QueryInterface(__FITypedEventHandler_2_Windows__CUI__CViewManagement__CApplicationView_Windows__CUI__CViewManagement__CApplicationViewConsolidatedEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FITypedEventHandler_2_Windows__CUI__CViewManagement__CApplicationView_Windows__CUI__CViewManagement__CApplicationViewConsolidatedEventArgs_AddRef(__FITypedEventHandler_2_Windows__CUI__CViewManagement__CApplicationView_Windows__CUI__CViewManagement__CApplicationViewConsolidatedEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FITypedEventHandler_2_Windows__CUI__CViewManagement__CApplicationView_Windows__CUI__CViewManagement__CApplicationViewConsolidatedEventArgs_Release(__FITypedEventHandler_2_Windows__CUI__CViewManagement__CApplicationView_Windows__CUI__CViewManagement__CApplicationViewConsolidatedEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** ITypedEventHandler<ABI::Windows::UI::ViewManagement::ApplicationView*,ABI::Windows::UI::ViewManagement::ApplicationViewConsolidatedEventArgs* > methods ***/
static inline HRESULT __FITypedEventHandler_2_Windows__CUI__CViewManagement__CApplicationView_Windows__CUI__CViewManagement__CApplicationViewConsolidatedEventArgs_Invoke(__FITypedEventHandler_2_Windows__CUI__CViewManagement__CApplicationView_Windows__CUI__CViewManagement__CApplicationViewConsolidatedEventArgs* This,__x_ABI_CWindows_CUI_CViewManagement_CIApplicationView *sender,__x_ABI_CWindows_CUI_CViewManagement_CIApplicationViewConsolidatedEventArgs *args) {
    return This->lpVtbl->Invoke(This,sender,args);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_ITypedEventHandler_ApplicationView_ApplicationViewConsolidatedEventArgs IID___FITypedEventHandler_2_Windows__CUI__CViewManagement__CApplicationView_Windows__CUI__CViewManagement__CApplicationViewConsolidatedEventArgs
#define ITypedEventHandler_ApplicationView_ApplicationViewConsolidatedEventArgsVtbl __FITypedEventHandler_2_Windows__CUI__CViewManagement__CApplicationView_Windows__CUI__CViewManagement__CApplicationViewConsolidatedEventArgsVtbl
#define ITypedEventHandler_ApplicationView_ApplicationViewConsolidatedEventArgs __FITypedEventHandler_2_Windows__CUI__CViewManagement__CApplicationView_Windows__CUI__CViewManagement__CApplicationViewConsolidatedEventArgs
#define ITypedEventHandler_ApplicationView_ApplicationViewConsolidatedEventArgs_QueryInterface __FITypedEventHandler_2_Windows__CUI__CViewManagement__CApplicationView_Windows__CUI__CViewManagement__CApplicationViewConsolidatedEventArgs_QueryInterface
#define ITypedEventHandler_ApplicationView_ApplicationViewConsolidatedEventArgs_AddRef __FITypedEventHandler_2_Windows__CUI__CViewManagement__CApplicationView_Windows__CUI__CViewManagement__CApplicationViewConsolidatedEventArgs_AddRef
#define ITypedEventHandler_ApplicationView_ApplicationViewConsolidatedEventArgs_Release __FITypedEventHandler_2_Windows__CUI__CViewManagement__CApplicationView_Windows__CUI__CViewManagement__CApplicationViewConsolidatedEventArgs_Release
#define ITypedEventHandler_ApplicationView_ApplicationViewConsolidatedEventArgs_Invoke __FITypedEventHandler_2_Windows__CUI__CViewManagement__CApplicationView_Windows__CUI__CViewManagement__CApplicationViewConsolidatedEventArgs_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FITypedEventHandler_2_Windows__CUI__CViewManagement__CApplicationView_Windows__CUI__CViewManagement__CApplicationViewConsolidatedEventArgs_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ITypedEventHandler<ABI::Windows::UI::ViewManagement::UISettings*,IInspectable* > interface
 */
#ifndef ____FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_IInspectable_INTERFACE_DEFINED__
#define ____FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_IInspectable_INTERFACE_DEFINED__

DEFINE_GUID(IID___FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_IInspectable, 0x2dbdba9d, 0x20da, 0x519d, 0x90,0x78, 0x09,0xf8,0x35,0xbc,0x5b,0xc7);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("2dbdba9d-20da-519d-9078-09f835bc5bc7")
            ITypedEventHandler<ABI::Windows::UI::ViewManagement::UISettings*,IInspectable* > : ITypedEventHandler_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::ViewManagement::UISettings*, ABI::Windows::UI::ViewManagement::IUISettings* >, IInspectable* >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_IInspectable, 0x2dbdba9d, 0x20da, 0x519d, 0x90,0x78, 0x09,0xf8,0x35,0xbc,0x5b,0xc7)
#endif
#else
typedef struct __FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_IInspectableVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ITypedEventHandler<ABI::Windows::UI::ViewManagement::UISettings*,IInspectable* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_IInspectable *This,
        __x_ABI_CWindows_CUI_CViewManagement_CIUISettings *sender,
        IInspectable *args);

    END_INTERFACE
} __FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_IInspectableVtbl;

interface __FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_IInspectable {
    CONST_VTBL __FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_IInspectableVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_IInspectable_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_IInspectable_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_IInspectable_Release(This) (This)->lpVtbl->Release(This)
/*** ITypedEventHandler<ABI::Windows::UI::ViewManagement::UISettings*,IInspectable* > methods ***/
#define __FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_IInspectable_Invoke(This,sender,args) (This)->lpVtbl->Invoke(This,sender,args)
#else
/*** IUnknown methods ***/
static inline HRESULT __FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_IInspectable_QueryInterface(__FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_IInspectable* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_IInspectable_AddRef(__FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_IInspectable* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_IInspectable_Release(__FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_IInspectable* This) {
    return This->lpVtbl->Release(This);
}
/*** ITypedEventHandler<ABI::Windows::UI::ViewManagement::UISettings*,IInspectable* > methods ***/
static inline HRESULT __FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_IInspectable_Invoke(__FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_IInspectable* This,__x_ABI_CWindows_CUI_CViewManagement_CIUISettings *sender,IInspectable *args) {
    return This->lpVtbl->Invoke(This,sender,args);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_ITypedEventHandler_UISettings_IInspectable IID___FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_IInspectable
#define ITypedEventHandler_UISettings_IInspectableVtbl __FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_IInspectableVtbl
#define ITypedEventHandler_UISettings_IInspectable __FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_IInspectable
#define ITypedEventHandler_UISettings_IInspectable_QueryInterface __FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_IInspectable_QueryInterface
#define ITypedEventHandler_UISettings_IInspectable_AddRef __FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_IInspectable_AddRef
#define ITypedEventHandler_UISettings_IInspectable_Release __FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_IInspectable_Release
#define ITypedEventHandler_UISettings_IInspectable_Invoke __FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_IInspectable_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_IInspectable_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ITypedEventHandler<ABI::Windows::UI::ViewManagement::UISettings*,ABI::Windows::UI::ViewManagement::UISettingsAnimationsEnabledChangedEventArgs* > interface
 */
#ifndef ____FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsAnimationsEnabledChangedEventArgs_INTERFACE_DEFINED__
#define ____FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsAnimationsEnabledChangedEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsAnimationsEnabledChangedEventArgs, 0xdeff0f90, 0x59e1, 0x5859, 0xa2,0x45, 0x3d,0x27,0x50,0x81,0xc2,0xad);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("deff0f90-59e1-5859-a245-3d275081c2ad")
            ITypedEventHandler<ABI::Windows::UI::ViewManagement::UISettings*,ABI::Windows::UI::ViewManagement::UISettingsAnimationsEnabledChangedEventArgs* > : ITypedEventHandler_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::ViewManagement::UISettings*, ABI::Windows::UI::ViewManagement::IUISettings* >, ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::ViewManagement::UISettingsAnimationsEnabledChangedEventArgs*, ABI::Windows::UI::ViewManagement::IUISettingsAnimationsEnabledChangedEventArgs* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsAnimationsEnabledChangedEventArgs, 0xdeff0f90, 0x59e1, 0x5859, 0xa2,0x45, 0x3d,0x27,0x50,0x81,0xc2,0xad)
#endif
#else
typedef struct __FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsAnimationsEnabledChangedEventArgsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ITypedEventHandler<ABI::Windows::UI::ViewManagement::UISettings*,ABI::Windows::UI::ViewManagement::UISettingsAnimationsEnabledChangedEventArgs* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsAnimationsEnabledChangedEventArgs *This,
        __x_ABI_CWindows_CUI_CViewManagement_CIUISettings *sender,
        __x_ABI_CWindows_CUI_CViewManagement_CIUISettingsAnimationsEnabledChangedEventArgs *args);

    END_INTERFACE
} __FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsAnimationsEnabledChangedEventArgsVtbl;

interface __FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsAnimationsEnabledChangedEventArgs {
    CONST_VTBL __FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsAnimationsEnabledChangedEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsAnimationsEnabledChangedEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsAnimationsEnabledChangedEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsAnimationsEnabledChangedEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** ITypedEventHandler<ABI::Windows::UI::ViewManagement::UISettings*,ABI::Windows::UI::ViewManagement::UISettingsAnimationsEnabledChangedEventArgs* > methods ***/
#define __FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsAnimationsEnabledChangedEventArgs_Invoke(This,sender,args) (This)->lpVtbl->Invoke(This,sender,args)
#else
/*** IUnknown methods ***/
static inline HRESULT __FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsAnimationsEnabledChangedEventArgs_QueryInterface(__FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsAnimationsEnabledChangedEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsAnimationsEnabledChangedEventArgs_AddRef(__FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsAnimationsEnabledChangedEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsAnimationsEnabledChangedEventArgs_Release(__FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsAnimationsEnabledChangedEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** ITypedEventHandler<ABI::Windows::UI::ViewManagement::UISettings*,ABI::Windows::UI::ViewManagement::UISettingsAnimationsEnabledChangedEventArgs* > methods ***/
static inline HRESULT __FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsAnimationsEnabledChangedEventArgs_Invoke(__FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsAnimationsEnabledChangedEventArgs* This,__x_ABI_CWindows_CUI_CViewManagement_CIUISettings *sender,__x_ABI_CWindows_CUI_CViewManagement_CIUISettingsAnimationsEnabledChangedEventArgs *args) {
    return This->lpVtbl->Invoke(This,sender,args);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_ITypedEventHandler_UISettings_UISettingsAnimationsEnabledChangedEventArgs IID___FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsAnimationsEnabledChangedEventArgs
#define ITypedEventHandler_UISettings_UISettingsAnimationsEnabledChangedEventArgsVtbl __FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsAnimationsEnabledChangedEventArgsVtbl
#define ITypedEventHandler_UISettings_UISettingsAnimationsEnabledChangedEventArgs __FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsAnimationsEnabledChangedEventArgs
#define ITypedEventHandler_UISettings_UISettingsAnimationsEnabledChangedEventArgs_QueryInterface __FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsAnimationsEnabledChangedEventArgs_QueryInterface
#define ITypedEventHandler_UISettings_UISettingsAnimationsEnabledChangedEventArgs_AddRef __FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsAnimationsEnabledChangedEventArgs_AddRef
#define ITypedEventHandler_UISettings_UISettingsAnimationsEnabledChangedEventArgs_Release __FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsAnimationsEnabledChangedEventArgs_Release
#define ITypedEventHandler_UISettings_UISettingsAnimationsEnabledChangedEventArgs_Invoke __FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsAnimationsEnabledChangedEventArgs_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsAnimationsEnabledChangedEventArgs_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ITypedEventHandler<ABI::Windows::UI::ViewManagement::UISettings*,ABI::Windows::UI::ViewManagement::UISettingsAutoHideScrollBarsChangedEventArgs* > interface
 */
#ifndef ____FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsAutoHideScrollBarsChangedEventArgs_INTERFACE_DEFINED__
#define ____FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsAutoHideScrollBarsChangedEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsAutoHideScrollBarsChangedEventArgs, 0x808aef30, 0x2660, 0x51b0, 0x9c,0x11, 0xf7,0x5d,0xd4,0x20,0x06,0xb4);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("808aef30-2660-51b0-9c11-f75dd42006b4")
            ITypedEventHandler<ABI::Windows::UI::ViewManagement::UISettings*,ABI::Windows::UI::ViewManagement::UISettingsAutoHideScrollBarsChangedEventArgs* > : ITypedEventHandler_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::ViewManagement::UISettings*, ABI::Windows::UI::ViewManagement::IUISettings* >, ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::ViewManagement::UISettingsAutoHideScrollBarsChangedEventArgs*, ABI::Windows::UI::ViewManagement::IUISettingsAutoHideScrollBarsChangedEventArgs* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsAutoHideScrollBarsChangedEventArgs, 0x808aef30, 0x2660, 0x51b0, 0x9c,0x11, 0xf7,0x5d,0xd4,0x20,0x06,0xb4)
#endif
#else
typedef struct __FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsAutoHideScrollBarsChangedEventArgsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ITypedEventHandler<ABI::Windows::UI::ViewManagement::UISettings*,ABI::Windows::UI::ViewManagement::UISettingsAutoHideScrollBarsChangedEventArgs* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsAutoHideScrollBarsChangedEventArgs *This,
        __x_ABI_CWindows_CUI_CViewManagement_CIUISettings *sender,
        __x_ABI_CWindows_CUI_CViewManagement_CIUISettingsAutoHideScrollBarsChangedEventArgs *args);

    END_INTERFACE
} __FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsAutoHideScrollBarsChangedEventArgsVtbl;

interface __FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsAutoHideScrollBarsChangedEventArgs {
    CONST_VTBL __FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsAutoHideScrollBarsChangedEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsAutoHideScrollBarsChangedEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsAutoHideScrollBarsChangedEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsAutoHideScrollBarsChangedEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** ITypedEventHandler<ABI::Windows::UI::ViewManagement::UISettings*,ABI::Windows::UI::ViewManagement::UISettingsAutoHideScrollBarsChangedEventArgs* > methods ***/
#define __FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsAutoHideScrollBarsChangedEventArgs_Invoke(This,sender,args) (This)->lpVtbl->Invoke(This,sender,args)
#else
/*** IUnknown methods ***/
static inline HRESULT __FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsAutoHideScrollBarsChangedEventArgs_QueryInterface(__FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsAutoHideScrollBarsChangedEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsAutoHideScrollBarsChangedEventArgs_AddRef(__FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsAutoHideScrollBarsChangedEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsAutoHideScrollBarsChangedEventArgs_Release(__FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsAutoHideScrollBarsChangedEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** ITypedEventHandler<ABI::Windows::UI::ViewManagement::UISettings*,ABI::Windows::UI::ViewManagement::UISettingsAutoHideScrollBarsChangedEventArgs* > methods ***/
static inline HRESULT __FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsAutoHideScrollBarsChangedEventArgs_Invoke(__FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsAutoHideScrollBarsChangedEventArgs* This,__x_ABI_CWindows_CUI_CViewManagement_CIUISettings *sender,__x_ABI_CWindows_CUI_CViewManagement_CIUISettingsAutoHideScrollBarsChangedEventArgs *args) {
    return This->lpVtbl->Invoke(This,sender,args);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_ITypedEventHandler_UISettings_UISettingsAutoHideScrollBarsChangedEventArgs IID___FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsAutoHideScrollBarsChangedEventArgs
#define ITypedEventHandler_UISettings_UISettingsAutoHideScrollBarsChangedEventArgsVtbl __FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsAutoHideScrollBarsChangedEventArgsVtbl
#define ITypedEventHandler_UISettings_UISettingsAutoHideScrollBarsChangedEventArgs __FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsAutoHideScrollBarsChangedEventArgs
#define ITypedEventHandler_UISettings_UISettingsAutoHideScrollBarsChangedEventArgs_QueryInterface __FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsAutoHideScrollBarsChangedEventArgs_QueryInterface
#define ITypedEventHandler_UISettings_UISettingsAutoHideScrollBarsChangedEventArgs_AddRef __FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsAutoHideScrollBarsChangedEventArgs_AddRef
#define ITypedEventHandler_UISettings_UISettingsAutoHideScrollBarsChangedEventArgs_Release __FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsAutoHideScrollBarsChangedEventArgs_Release
#define ITypedEventHandler_UISettings_UISettingsAutoHideScrollBarsChangedEventArgs_Invoke __FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsAutoHideScrollBarsChangedEventArgs_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsAutoHideScrollBarsChangedEventArgs_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ITypedEventHandler<ABI::Windows::UI::ViewManagement::UISettings*,ABI::Windows::UI::ViewManagement::UISettingsMessageDurationChangedEventArgs* > interface
 */
#ifndef ____FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsMessageDurationChangedEventArgs_INTERFACE_DEFINED__
#define ____FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsMessageDurationChangedEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsMessageDurationChangedEventArgs, 0xec807b08, 0x1ac6, 0x5b37, 0x9a,0xf7, 0x1a,0xaf,0x1c,0x93,0x57,0x7e);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("ec807b08-1ac6-5b37-9af7-1aaf1c93577e")
            ITypedEventHandler<ABI::Windows::UI::ViewManagement::UISettings*,ABI::Windows::UI::ViewManagement::UISettingsMessageDurationChangedEventArgs* > : ITypedEventHandler_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::ViewManagement::UISettings*, ABI::Windows::UI::ViewManagement::IUISettings* >, ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::ViewManagement::UISettingsMessageDurationChangedEventArgs*, ABI::Windows::UI::ViewManagement::IUISettingsMessageDurationChangedEventArgs* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsMessageDurationChangedEventArgs, 0xec807b08, 0x1ac6, 0x5b37, 0x9a,0xf7, 0x1a,0xaf,0x1c,0x93,0x57,0x7e)
#endif
#else
typedef struct __FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsMessageDurationChangedEventArgsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ITypedEventHandler<ABI::Windows::UI::ViewManagement::UISettings*,ABI::Windows::UI::ViewManagement::UISettingsMessageDurationChangedEventArgs* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsMessageDurationChangedEventArgs *This,
        __x_ABI_CWindows_CUI_CViewManagement_CIUISettings *sender,
        __x_ABI_CWindows_CUI_CViewManagement_CIUISettingsMessageDurationChangedEventArgs *args);

    END_INTERFACE
} __FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsMessageDurationChangedEventArgsVtbl;

interface __FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsMessageDurationChangedEventArgs {
    CONST_VTBL __FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsMessageDurationChangedEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsMessageDurationChangedEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsMessageDurationChangedEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsMessageDurationChangedEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** ITypedEventHandler<ABI::Windows::UI::ViewManagement::UISettings*,ABI::Windows::UI::ViewManagement::UISettingsMessageDurationChangedEventArgs* > methods ***/
#define __FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsMessageDurationChangedEventArgs_Invoke(This,sender,args) (This)->lpVtbl->Invoke(This,sender,args)
#else
/*** IUnknown methods ***/
static inline HRESULT __FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsMessageDurationChangedEventArgs_QueryInterface(__FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsMessageDurationChangedEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsMessageDurationChangedEventArgs_AddRef(__FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsMessageDurationChangedEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsMessageDurationChangedEventArgs_Release(__FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsMessageDurationChangedEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** ITypedEventHandler<ABI::Windows::UI::ViewManagement::UISettings*,ABI::Windows::UI::ViewManagement::UISettingsMessageDurationChangedEventArgs* > methods ***/
static inline HRESULT __FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsMessageDurationChangedEventArgs_Invoke(__FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsMessageDurationChangedEventArgs* This,__x_ABI_CWindows_CUI_CViewManagement_CIUISettings *sender,__x_ABI_CWindows_CUI_CViewManagement_CIUISettingsMessageDurationChangedEventArgs *args) {
    return This->lpVtbl->Invoke(This,sender,args);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_ITypedEventHandler_UISettings_UISettingsMessageDurationChangedEventArgs IID___FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsMessageDurationChangedEventArgs
#define ITypedEventHandler_UISettings_UISettingsMessageDurationChangedEventArgsVtbl __FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsMessageDurationChangedEventArgsVtbl
#define ITypedEventHandler_UISettings_UISettingsMessageDurationChangedEventArgs __FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsMessageDurationChangedEventArgs
#define ITypedEventHandler_UISettings_UISettingsMessageDurationChangedEventArgs_QueryInterface __FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsMessageDurationChangedEventArgs_QueryInterface
#define ITypedEventHandler_UISettings_UISettingsMessageDurationChangedEventArgs_AddRef __FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsMessageDurationChangedEventArgs_AddRef
#define ITypedEventHandler_UISettings_UISettingsMessageDurationChangedEventArgs_Release __FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsMessageDurationChangedEventArgs_Release
#define ITypedEventHandler_UISettings_UISettingsMessageDurationChangedEventArgs_Invoke __FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsMessageDurationChangedEventArgs_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FITypedEventHandler_2_Windows__CUI__CViewManagement__CUISettings_Windows__CUI__CViewManagement__CUISettingsMessageDurationChangedEventArgs_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ITypedEventHandler<ABI::Windows::UI::ViewManagement::InputPane*,ABI::Windows::UI::ViewManagement::InputPaneVisibilityEventArgs* > interface
 */
#ifndef ____FITypedEventHandler_2_Windows__CUI__CViewManagement__CInputPane_Windows__CUI__CViewManagement__CInputPaneVisibilityEventArgs_INTERFACE_DEFINED__
#define ____FITypedEventHandler_2_Windows__CUI__CViewManagement__CInputPane_Windows__CUI__CViewManagement__CInputPaneVisibilityEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___FITypedEventHandler_2_Windows__CUI__CViewManagement__CInputPane_Windows__CUI__CViewManagement__CInputPaneVisibilityEventArgs, 0xb813d684, 0xd953, 0x5a8a, 0x9b,0x30, 0x78,0xb7,0x9f,0xb9,0x14,0x7b);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("b813d684-d953-5a8a-9b30-78b79fb9147b")
            ITypedEventHandler<ABI::Windows::UI::ViewManagement::InputPane*,ABI::Windows::UI::ViewManagement::InputPaneVisibilityEventArgs* > : ITypedEventHandler_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::ViewManagement::InputPane*, ABI::Windows::UI::ViewManagement::IInputPane* >, ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::ViewManagement::InputPaneVisibilityEventArgs*, ABI::Windows::UI::ViewManagement::IInputPaneVisibilityEventArgs* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FITypedEventHandler_2_Windows__CUI__CViewManagement__CInputPane_Windows__CUI__CViewManagement__CInputPaneVisibilityEventArgs, 0xb813d684, 0xd953, 0x5a8a, 0x9b,0x30, 0x78,0xb7,0x9f,0xb9,0x14,0x7b)
#endif
#else
typedef struct __FITypedEventHandler_2_Windows__CUI__CViewManagement__CInputPane_Windows__CUI__CViewManagement__CInputPaneVisibilityEventArgsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ITypedEventHandler<ABI::Windows::UI::ViewManagement::InputPane*,ABI::Windows::UI::ViewManagement::InputPaneVisibilityEventArgs* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FITypedEventHandler_2_Windows__CUI__CViewManagement__CInputPane_Windows__CUI__CViewManagement__CInputPaneVisibilityEventArgs *This,
        __x_ABI_CWindows_CUI_CViewManagement_CIInputPane *sender,
        __x_ABI_CWindows_CUI_CViewManagement_CIInputPaneVisibilityEventArgs *args);

    END_INTERFACE
} __FITypedEventHandler_2_Windows__CUI__CViewManagement__CInputPane_Windows__CUI__CViewManagement__CInputPaneVisibilityEventArgsVtbl;

interface __FITypedEventHandler_2_Windows__CUI__CViewManagement__CInputPane_Windows__CUI__CViewManagement__CInputPaneVisibilityEventArgs {
    CONST_VTBL __FITypedEventHandler_2_Windows__CUI__CViewManagement__CInputPane_Windows__CUI__CViewManagement__CInputPaneVisibilityEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FITypedEventHandler_2_Windows__CUI__CViewManagement__CInputPane_Windows__CUI__CViewManagement__CInputPaneVisibilityEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FITypedEventHandler_2_Windows__CUI__CViewManagement__CInputPane_Windows__CUI__CViewManagement__CInputPaneVisibilityEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FITypedEventHandler_2_Windows__CUI__CViewManagement__CInputPane_Windows__CUI__CViewManagement__CInputPaneVisibilityEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** ITypedEventHandler<ABI::Windows::UI::ViewManagement::InputPane*,ABI::Windows::UI::ViewManagement::InputPaneVisibilityEventArgs* > methods ***/
#define __FITypedEventHandler_2_Windows__CUI__CViewManagement__CInputPane_Windows__CUI__CViewManagement__CInputPaneVisibilityEventArgs_Invoke(This,sender,args) (This)->lpVtbl->Invoke(This,sender,args)
#else
/*** IUnknown methods ***/
static inline HRESULT __FITypedEventHandler_2_Windows__CUI__CViewManagement__CInputPane_Windows__CUI__CViewManagement__CInputPaneVisibilityEventArgs_QueryInterface(__FITypedEventHandler_2_Windows__CUI__CViewManagement__CInputPane_Windows__CUI__CViewManagement__CInputPaneVisibilityEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FITypedEventHandler_2_Windows__CUI__CViewManagement__CInputPane_Windows__CUI__CViewManagement__CInputPaneVisibilityEventArgs_AddRef(__FITypedEventHandler_2_Windows__CUI__CViewManagement__CInputPane_Windows__CUI__CViewManagement__CInputPaneVisibilityEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FITypedEventHandler_2_Windows__CUI__CViewManagement__CInputPane_Windows__CUI__CViewManagement__CInputPaneVisibilityEventArgs_Release(__FITypedEventHandler_2_Windows__CUI__CViewManagement__CInputPane_Windows__CUI__CViewManagement__CInputPaneVisibilityEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** ITypedEventHandler<ABI::Windows::UI::ViewManagement::InputPane*,ABI::Windows::UI::ViewManagement::InputPaneVisibilityEventArgs* > methods ***/
static inline HRESULT __FITypedEventHandler_2_Windows__CUI__CViewManagement__CInputPane_Windows__CUI__CViewManagement__CInputPaneVisibilityEventArgs_Invoke(__FITypedEventHandler_2_Windows__CUI__CViewManagement__CInputPane_Windows__CUI__CViewManagement__CInputPaneVisibilityEventArgs* This,__x_ABI_CWindows_CUI_CViewManagement_CIInputPane *sender,__x_ABI_CWindows_CUI_CViewManagement_CIInputPaneVisibilityEventArgs *args) {
    return This->lpVtbl->Invoke(This,sender,args);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_ITypedEventHandler_InputPane_InputPaneVisibilityEventArgs IID___FITypedEventHandler_2_Windows__CUI__CViewManagement__CInputPane_Windows__CUI__CViewManagement__CInputPaneVisibilityEventArgs
#define ITypedEventHandler_InputPane_InputPaneVisibilityEventArgsVtbl __FITypedEventHandler_2_Windows__CUI__CViewManagement__CInputPane_Windows__CUI__CViewManagement__CInputPaneVisibilityEventArgsVtbl
#define ITypedEventHandler_InputPane_InputPaneVisibilityEventArgs __FITypedEventHandler_2_Windows__CUI__CViewManagement__CInputPane_Windows__CUI__CViewManagement__CInputPaneVisibilityEventArgs
#define ITypedEventHandler_InputPane_InputPaneVisibilityEventArgs_QueryInterface __FITypedEventHandler_2_Windows__CUI__CViewManagement__CInputPane_Windows__CUI__CViewManagement__CInputPaneVisibilityEventArgs_QueryInterface
#define ITypedEventHandler_InputPane_InputPaneVisibilityEventArgs_AddRef __FITypedEventHandler_2_Windows__CUI__CViewManagement__CInputPane_Windows__CUI__CViewManagement__CInputPaneVisibilityEventArgs_AddRef
#define ITypedEventHandler_InputPane_InputPaneVisibilityEventArgs_Release __FITypedEventHandler_2_Windows__CUI__CViewManagement__CInputPane_Windows__CUI__CViewManagement__CInputPaneVisibilityEventArgs_Release
#define ITypedEventHandler_InputPane_InputPaneVisibilityEventArgs_Invoke __FITypedEventHandler_2_Windows__CUI__CViewManagement__CInputPane_Windows__CUI__CViewManagement__CInputPaneVisibilityEventArgs_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FITypedEventHandler_2_Windows__CUI__CViewManagement__CInputPane_Windows__CUI__CViewManagement__CInputPaneVisibilityEventArgs_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IReference<ABI::Windows::UI::ViewManagement::UIElementType > interface
 */
#ifndef ____FIReference_1_UIElementType_INTERFACE_DEFINED__
#define ____FIReference_1_UIElementType_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIReference_1_UIElementType, 0xe17e08c9, 0x7deb, 0x51d1, 0x84,0x87, 0x33,0x4e,0xb3,0xfe,0x46,0x91);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("e17e08c9-7deb-51d1-8487-334eb3fe4691")
            IReference<ABI::Windows::UI::ViewManagement::UIElementType > : IReference_impl<ABI::Windows::UI::ViewManagement::UIElementType >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIReference_1_UIElementType, 0xe17e08c9, 0x7deb, 0x51d1, 0x84,0x87, 0x33,0x4e,0xb3,0xfe,0x46,0x91)
#endif
#else
typedef struct __FIReference_1_UIElementTypeVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IReference<ABI::Windows::UI::ViewManagement::UIElementType > methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Value)(
        __FIReference_1_UIElementType *This,
        __x_ABI_CWindows_CUI_CViewManagement_CUIElementType *value);

    END_INTERFACE
} __FIReference_1_UIElementTypeVtbl;

interface __FIReference_1_UIElementType {
    CONST_VTBL __FIReference_1_UIElementTypeVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIReference_1_UIElementType_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIReference_1_UIElementType_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIReference_1_UIElementType_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIReference_1_UIElementType_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIReference_1_UIElementType_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIReference_1_UIElementType_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IReference<ABI::Windows::UI::ViewManagement::UIElementType > methods ***/
#define __FIReference_1_UIElementType_get_Value(This,value) (This)->lpVtbl->get_Value(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIReference_1_UIElementType_QueryInterface(__FIReference_1_UIElementType* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIReference_1_UIElementType_AddRef(__FIReference_1_UIElementType* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIReference_1_UIElementType_Release(__FIReference_1_UIElementType* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIReference_1_UIElementType_GetIids(__FIReference_1_UIElementType* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIReference_1_UIElementType_GetRuntimeClassName(__FIReference_1_UIElementType* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIReference_1_UIElementType_GetTrustLevel(__FIReference_1_UIElementType* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IReference<ABI::Windows::UI::ViewManagement::UIElementType > methods ***/
static inline HRESULT __FIReference_1_UIElementType_get_Value(__FIReference_1_UIElementType* This,__x_ABI_CWindows_CUI_CViewManagement_CUIElementType *value) {
    return This->lpVtbl->get_Value(This,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IReference_UIElementType IID___FIReference_1_UIElementType
#define IReference_UIElementTypeVtbl __FIReference_1_UIElementTypeVtbl
#define IReference_UIElementType __FIReference_1_UIElementType
#define IReference_UIElementType_QueryInterface __FIReference_1_UIElementType_QueryInterface
#define IReference_UIElementType_AddRef __FIReference_1_UIElementType_AddRef
#define IReference_UIElementType_Release __FIReference_1_UIElementType_Release
#define IReference_UIElementType_GetIids __FIReference_1_UIElementType_GetIids
#define IReference_UIElementType_GetRuntimeClassName __FIReference_1_UIElementType_GetRuntimeClassName
#define IReference_UIElementType_GetTrustLevel __FIReference_1_UIElementType_GetTrustLevel
#define IReference_UIElementType_get_Value __FIReference_1_UIElementType_get_Value
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIReference_1_UIElementType_INTERFACE_DEFINED__ */

/* Begin additional prototypes for all interfaces */

ULONG           __RPC_USER HSTRING_UserSize     (ULONG *, ULONG, HSTRING *);
unsigned char * __RPC_USER HSTRING_UserMarshal  (ULONG *, unsigned char *, HSTRING *);
unsigned char * __RPC_USER HSTRING_UserUnmarshal(ULONG *, unsigned char *, HSTRING *);
void            __RPC_USER HSTRING_UserFree     (ULONG *, HSTRING *);

/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __windows_ui_viewmanagement_h__ */
