• WinUser.h>>>OnMessage事件


    #include <winapifamily.h>
     
    /****************************************************************************
    *                                                                           *
    * winuser.h -- USER procedure declarations, constant definitions and macros *
    *                                                                           *
    * Copyright (c) Microsoft Corporation. All rights reserved.                 *
    *                                                                           *
    ****************************************************************************/
     
     
     
    #ifndef _WINUSER_
    #define _WINUSER_
     
     
     
    #pragma once
     
    //
    // Define API decoration for direct importing of DLL references.
    //
    #if !defined(WINUSERAPI)
    #if !defined(_USER32_)
    #define WINUSERAPI DECLSPEC_IMPORT
    #else
    #define WINUSERAPI
    #endif
    #endif
     
    #if !defined(WINABLEAPI)
    #if !defined(_USER32_)
    #define WINABLEAPI DECLSPEC_IMPORT
    #else
    #define WINABLEAPI
    #endif
    #endif
     
    #ifdef _MAC
    #include <macwin32.h>
    #endif
     
    #ifdef __cplusplus
    extern "C" {
    #endif /* __cplusplus */
     
    #ifndef WINVER
    #define WINVER  0x0500      /* version 5.0 */
    #endif /* !WINVER */
     
    #include <stdarg.h>
     
    #ifndef NOAPISET
    #include <libloaderapi.h> // LoadString%
    #endif
     
    #ifndef NOUSER
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    typedef HANDLE HDWP;
    typedef VOID MENUTEMPLATEA;
    typedef VOID MENUTEMPLATEW;
    #ifdef UNICODE
    typedef MENUTEMPLATEW MENUTEMPLATE;
    #else
    typedef MENUTEMPLATEA MENUTEMPLATE;
    #endif // UNICODE
    typedef PVOID LPMENUTEMPLATEA;
    typedef PVOID LPMENUTEMPLATEW;
    #ifdef UNICODE
    typedef LPMENUTEMPLATEW LPMENUTEMPLATE;
    #else
    typedef LPMENUTEMPLATEA LPMENUTEMPLATE;
    #endif // UNICODE
     
    typedef LRESULT (CALLBACK* WNDPROC)(HWND, UINT, WPARAM, LPARAM);
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    #ifdef STRICT
     
    #pragma region Application Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)
     
    typedef INT_PTR (CALLBACK* DLGPROC)(HWND, UINT, WPARAM, LPARAM);
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) */
    #pragma endregion
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    typedef VOID (CALLBACK* TIMERPROC)(HWND, UINT, UINT_PTR, DWORD);
    typedef BOOL (CALLBACK* GRAYSTRINGPROC)(HDC, LPARAM, int);
    typedef BOOL (CALLBACK* WNDENUMPROC)(HWND, LPARAM);
    typedef LRESULT (CALLBACK* HOOKPROC)(int code, WPARAM wParam, LPARAM lParam);
    typedef VOID (CALLBACK* SENDASYNCPROC)(HWND, UINT, ULONG_PTR, LRESULT);
     
    typedef BOOL (CALLBACK* PROPENUMPROCA)(HWND, LPCSTR, HANDLE);
    typedef BOOL (CALLBACK* PROPENUMPROCW)(HWND, LPCWSTR, HANDLE);
     
    typedef BOOL (CALLBACK* PROPENUMPROCEXA)(HWND, LPSTR, HANDLE, ULONG_PTR);
    typedef BOOL (CALLBACK* PROPENUMPROCEXW)(HWND, LPWSTR, HANDLE, ULONG_PTR);
     
    typedef int (CALLBACK* EDITWORDBREAKPROCA)(LPSTR lpch, int ichCurrent, int cch, int code);
    typedef int (CALLBACK* EDITWORDBREAKPROCW)(LPWSTR lpch, int ichCurrent, int cch, int code);
     
    #if(WINVER >= 0x0400)
    typedef BOOL (CALLBACK* DRAWSTATEPROC)(HDC hdc, LPARAM lData, WPARAM wData, int cx, int cy);
    #endif /* WINVER >= 0x0400 */
     
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    #else /* !STRICT */
     
    #pragma region Application Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)
     
    typedef FARPROC DLGPROC;
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) */
    #pragma endregion
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    typedef FARPROC TIMERPROC;
    typedef FARPROC GRAYSTRINGPROC;
    typedef FARPROC WNDENUMPROC;
    typedef FARPROC HOOKPROC;
    typedef FARPROC SENDASYNCPROC;
     
    typedef FARPROC EDITWORDBREAKPROCA;
    typedef FARPROC EDITWORDBREAKPROCW;
     
    typedef FARPROC PROPENUMPROCA;
    typedef FARPROC PROPENUMPROCW;
     
    typedef FARPROC PROPENUMPROCEXA;
    typedef FARPROC PROPENUMPROCEXW;
     
    #if(WINVER >= 0x0400)
    typedef FARPROC DRAWSTATEPROC;
    #endif /* WINVER >= 0x0400 */
     
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    #endif /* !STRICT */
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    #ifdef UNICODE
    typedef PROPENUMPROCW        PROPENUMPROC;
    typedef PROPENUMPROCEXW      PROPENUMPROCEX;
    typedef EDITWORDBREAKPROCW   EDITWORDBREAKPROC;
    #else  /* !UNICODE */
    typedef PROPENUMPROCA        PROPENUMPROC;
    typedef PROPENUMPROCEXA      PROPENUMPROCEX;
    typedef EDITWORDBREAKPROCA   EDITWORDBREAKPROC;
    #endif /* UNICODE */
     
    #ifdef STRICT
     
    typedef BOOL (CALLBACK* NAMEENUMPROCA)(LPSTR, LPARAM);
    typedef BOOL (CALLBACK* NAMEENUMPROCW)(LPWSTR, LPARAM);
     
    typedef NAMEENUMPROCA   WINSTAENUMPROCA;
    typedef NAMEENUMPROCA   DESKTOPENUMPROCA;
    typedef NAMEENUMPROCW   WINSTAENUMPROCW;
    typedef NAMEENUMPROCW   DESKTOPENUMPROCW;
     
     
    #else /* !STRICT */
     
    typedef FARPROC NAMEENUMPROCA;
    typedef FARPROC NAMEENUMPROCW;
    typedef FARPROC WINSTAENUMPROCA;
    typedef FARPROC DESKTOPENUMPROCA;
    typedef FARPROC WINSTAENUMPROCW;
    typedef FARPROC DESKTOPENUMPROCW;
     
     
    #endif /* !STRICT */
     
    #ifdef UNICODE
    typedef WINSTAENUMPROCW     WINSTAENUMPROC;
    typedef DESKTOPENUMPROCW    DESKTOPENUMPROC;
     
     
    #else  /* !UNICODE */
    typedef WINSTAENUMPROCA     WINSTAENUMPROC;
    typedef DESKTOPENUMPROCA    DESKTOPENUMPROC;
     
    #endif /* UNICODE */
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    #define IS_INTRESOURCE(_r) ((((ULONG_PTR)(_r)) >> 16) == 0)
    #define MAKEINTRESOURCEA(i) ((LPSTR)((ULONG_PTR)((WORD)(i))))
    #define MAKEINTRESOURCEW(i) ((LPWSTR)((ULONG_PTR)((WORD)(i))))
    #ifdef UNICODE
    #define MAKEINTRESOURCE  MAKEINTRESOURCEW
    #else
    #define MAKEINTRESOURCE  MAKEINTRESOURCEA
    #endif // !UNICODE
     
    #ifndef NORESOURCE
     
    /*
     * Predefined Resource Types
     */
    #define RT_CURSOR           MAKEINTRESOURCE(1)
    #define RT_BITMAP           MAKEINTRESOURCE(2)
    #define RT_ICON             MAKEINTRESOURCE(3)
    #define RT_MENU             MAKEINTRESOURCE(4)
    #define RT_DIALOG           MAKEINTRESOURCE(5)
    #define RT_STRING           MAKEINTRESOURCE(6)
    #define RT_FONTDIR          MAKEINTRESOURCE(7)
    #define RT_FONT             MAKEINTRESOURCE(8)
    #define RT_ACCELERATOR      MAKEINTRESOURCE(9)
    #define RT_RCDATA           MAKEINTRESOURCE(10)
    #define RT_MESSAGETABLE     MAKEINTRESOURCE(11)
     
    #define DIFFERENCE     11
    #define RT_GROUP_CURSOR MAKEINTRESOURCE((ULONG_PTR)(RT_CURSOR) + DIFFERENCE)
    #define RT_GROUP_ICON   MAKEINTRESOURCE((ULONG_PTR)(RT_ICON) + DIFFERENCE)
    #define RT_VERSION      MAKEINTRESOURCE(16)
    #define RT_DLGINCLUDE   MAKEINTRESOURCE(17)
    #if(WINVER >= 0x0400)
    #define RT_PLUGPLAY     MAKEINTRESOURCE(19)
    #define RT_VXD          MAKEINTRESOURCE(20)
    #define RT_ANICURSOR    MAKEINTRESOURCE(21)
    #define RT_ANIICON      MAKEINTRESOURCE(22)
    #endif /* WINVER >= 0x0400 */
    #define RT_HTML         MAKEINTRESOURCE(23)
    #ifdef RC_INVOKED
    #define RT_MANIFEST                        24
    #define CREATEPROCESS_MANIFEST_RESOURCE_ID  1
    #define ISOLATIONAWARE_MANIFEST_RESOURCE_ID 2
    #define ISOLATIONAWARE_NOSTATICIMPORT_MANIFEST_RESOURCE_ID 3
    #define MINIMUM_RESERVED_MANIFEST_RESOURCE_ID 1   /* inclusive */
    #define MAXIMUM_RESERVED_MANIFEST_RESOURCE_ID 16  /* inclusive */
    #else  /* RC_INVOKED */
    #define RT_MANIFEST                        MAKEINTRESOURCE(24)
    #define CREATEPROCESS_MANIFEST_RESOURCE_ID MAKEINTRESOURCE( 1)
    #define ISOLATIONAWARE_MANIFEST_RESOURCE_ID MAKEINTRESOURCE(2)
    #define ISOLATIONAWARE_NOSTATICIMPORT_MANIFEST_RESOURCE_ID MAKEINTRESOURCE(3)
    #define MINIMUM_RESERVED_MANIFEST_RESOURCE_ID MAKEINTRESOURCE( 1 /*inclusive*/)
    #define MAXIMUM_RESERVED_MANIFEST_RESOURCE_ID MAKEINTRESOURCE(16 /*inclusive*/)
    #endif /* RC_INVOKED */
     
     
    #endif /* !NORESOURCE */
     
    #if defined(DEPRECATE_SUPPORTED)
    #pragma warning(push)
    #pragma warning(disable:4995)
    #endif
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    WINUSERAPI
    int
    WINAPI
    wvsprintfA(
        _Out_ LPSTR,
        _In_ _Printf_format_string_ LPCSTR,
        _In_ va_list arglist);
    WINUSERAPI
    int
    WINAPI
    wvsprintfW(
        _Out_ LPWSTR,
        _In_ _Printf_format_string_ LPCWSTR,
        _In_ va_list arglist);
    #ifdef UNICODE
    #define wvsprintf  wvsprintfW
    #else
    #define wvsprintf  wvsprintfA
    #endif // !UNICODE
     
    WINUSERAPI
    int
    WINAPIV
    wsprintfA(
        _Out_ LPSTR,
        _In_ _Printf_format_string_ LPCSTR,
        ...);
    WINUSERAPI
    int
    WINAPIV
    wsprintfW(
        _Out_ LPWSTR,
        _In_ _Printf_format_string_ LPCWSTR,
        ...);
    #ifdef UNICODE
    #define wsprintf  wsprintfW
    #else
    #define wsprintf  wsprintfA
    #endif // !UNICODE
     
    #if defined(DEPRECATE_SUPPORTED)
    #pragma warning(pop)
    #endif
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
     
    /*
     * SPI_SETDESKWALLPAPER defined constants
     */
    #define SETWALLPAPER_DEFAULT    ((LPWSTR)-1)
     
    #ifndef NOSCROLL
     
    /*
     * Scroll Bar Constants
     */
    #define SB_HORZ             0
    #define SB_VERT             1
    #define SB_CTL              2
    #define SB_BOTH             3
     
    /*
     * Scroll Bar Commands
     */
    #define SB_LINEUP           0
    #define SB_LINELEFT         0
    #define SB_LINEDOWN         1
    #define SB_LINERIGHT        1
    #define SB_PAGEUP           2
    #define SB_PAGELEFT         2
    #define SB_PAGEDOWN         3
    #define SB_PAGERIGHT        3
    #define SB_THUMBPOSITION    4
    #define SB_THUMBTRACK       5
    #define SB_TOP              6
    #define SB_LEFT             6
    #define SB_BOTTOM           7
    #define SB_RIGHT            7
    #define SB_ENDSCROLL        8
     
    #endif /* !NOSCROLL */
     
    #ifndef NOSHOWWINDOW
     
     
    /*
     * ShowWindow() Commands
     */
    #define SW_HIDE             0
    #define SW_SHOWNORMAL       1
    #define SW_NORMAL           1
    #define SW_SHOWMINIMIZED    2
    #define SW_SHOWMAXIMIZED    3
    #define SW_MAXIMIZE         3
    #define SW_SHOWNOACTIVATE   4
    #define SW_SHOW             5
    #define SW_MINIMIZE         6
    #define SW_SHOWMINNOACTIVE  7
    #define SW_SHOWNA           8
    #define SW_RESTORE          9
    #define SW_SHOWDEFAULT      10
    #define SW_FORCEMINIMIZE    11
    #define SW_MAX              11
     
     
    /*
     * Old ShowWindow() Commands
     */
    #define HIDE_WINDOW         0
    #define SHOW_OPENWINDOW     1
    #define SHOW_ICONWINDOW     2
    #define SHOW_FULLSCREEN     3
    #define SHOW_OPENNOACTIVATE 4
     
    /*
     * Identifiers for the WM_SHOWWINDOW message
     */
    #define SW_PARENTCLOSING    1
    #define SW_OTHERZOOM        2
    #define SW_PARENTOPENING    3
    #define SW_OTHERUNZOOM      4
     
     
    #endif /* !NOSHOWWINDOW */
     
    #if(WINVER >= 0x0500)
    /*
     * AnimateWindow() Commands
     */
    #define AW_HOR_POSITIVE             0x00000001
    #define AW_HOR_NEGATIVE             0x00000002
    #define AW_VER_POSITIVE             0x00000004
    #define AW_VER_NEGATIVE             0x00000008
    #define AW_CENTER                   0x00000010
    #define AW_HIDE                     0x00010000
    #define AW_ACTIVATE                 0x00020000
    #define AW_SLIDE                    0x00040000
    #define AW_BLEND                    0x00080000
     
    #endif /* WINVER >= 0x0500 */
     
     
    /*
     * WM_KEYUP/DOWN/CHAR HIWORD(lParam) flags
     */
    #define KF_EXTENDED       0x0100
    #define KF_DLGMODE        0x0800
    #define KF_MENUMODE       0x1000
    #define KF_ALTDOWN        0x2000
    #define KF_REPEAT         0x4000
    #define KF_UP             0x8000
     
    #ifndef NOVIRTUALKEYCODES
     
     
    /*
     * Virtual Keys, Standard Set
     */
    #define VK_LBUTTON        0x01
    #define VK_RBUTTON        0x02
    #define VK_CANCEL         0x03
    #define VK_MBUTTON        0x04    /* NOT contiguous with L & RBUTTON */
     
    #if(_WIN32_WINNT >= 0x0500)
    #define VK_XBUTTON1       0x05    /* NOT contiguous with L & RBUTTON */
    #define VK_XBUTTON2       0x06    /* NOT contiguous with L & RBUTTON */
    #endif /* _WIN32_WINNT >= 0x0500 */
     
    /*
     * 0x07 : unassigned
     */
     
    #define VK_BACK           0x08
    #define VK_TAB            0x09
     
    /*
     * 0x0A - 0x0B : reserved
     */
     
    #define VK_CLEAR          0x0C
    #define VK_RETURN         0x0D
     
    #define VK_SHIFT          0x10
    #define VK_CONTROL        0x11
    #define VK_MENU           0x12
    #define VK_PAUSE          0x13
    #define VK_CAPITAL        0x14
     
    #define VK_KANA           0x15
    #define VK_HANGEUL        0x15  /* old name - should be here for compatibility */
    #define VK_HANGUL         0x15
    #define VK_JUNJA          0x17
    #define VK_FINAL          0x18
    #define VK_HANJA          0x19
    #define VK_KANJI          0x19
     
    #define VK_ESCAPE         0x1B
     
    #define VK_CONVERT        0x1C
    #define VK_NONCONVERT     0x1D
    #define VK_ACCEPT         0x1E
    #define VK_MODECHANGE     0x1F
     
    #define VK_SPACE          0x20
    #define VK_PRIOR          0x21
    #define VK_NEXT           0x22
    #define VK_END            0x23
    #define VK_HOME           0x24
    #define VK_LEFT           0x25
    #define VK_UP             0x26
    #define VK_RIGHT          0x27
    #define VK_DOWN           0x28
    #define VK_SELECT         0x29
    #define VK_PRINT          0x2A
    #define VK_EXECUTE        0x2B
    #define VK_SNAPSHOT       0x2C
    #define VK_INSERT         0x2D
    #define VK_DELETE         0x2E
    #define VK_HELP           0x2F
     
    /*
     * VK_0 - VK_9 are the same as ASCII '0' - '9' (0x30 - 0x39)
     * 0x40 : unassigned
     * VK_A - VK_Z are the same as ASCII 'A' - 'Z' (0x41 - 0x5A)
     */
     
    #define VK_LWIN           0x5B
    #define VK_RWIN           0x5C
    #define VK_APPS           0x5D
     
    /*
     * 0x5E : reserved
     */
     
    #define VK_SLEEP          0x5F
     
    #define VK_NUMPAD0        0x60
    #define VK_NUMPAD1        0x61
    #define VK_NUMPAD2        0x62
    #define VK_NUMPAD3        0x63
    #define VK_NUMPAD4        0x64
    #define VK_NUMPAD5        0x65
    #define VK_NUMPAD6        0x66
    #define VK_NUMPAD7        0x67
    #define VK_NUMPAD8        0x68
    #define VK_NUMPAD9        0x69
    #define VK_MULTIPLY       0x6A
    #define VK_ADD            0x6B
    #define VK_SEPARATOR      0x6C
    #define VK_SUBTRACT       0x6D
    #define VK_DECIMAL        0x6E
    #define VK_DIVIDE         0x6F
    #define VK_F1             0x70
    #define VK_F2             0x71
    #define VK_F3             0x72
    #define VK_F4             0x73
    #define VK_F5             0x74
    #define VK_F6             0x75
    #define VK_F7             0x76
    #define VK_F8             0x77
    #define VK_F9             0x78
    #define VK_F10            0x79
    #define VK_F11            0x7A
    #define VK_F12            0x7B
    #define VK_F13            0x7C
    #define VK_F14            0x7D
    #define VK_F15            0x7E
    #define VK_F16            0x7F
    #define VK_F17            0x80
    #define VK_F18            0x81
    #define VK_F19            0x82
    #define VK_F20            0x83
    #define VK_F21            0x84
    #define VK_F22            0x85
    #define VK_F23            0x86
    #define VK_F24            0x87
     
    /*
     * 0x88 - 0x8F : unassigned
     */
     
    #define VK_NUMLOCK        0x90
    #define VK_SCROLL         0x91
     
    /*
     * NEC PC-9800 kbd definitions
     */
    #define VK_OEM_NEC_EQUAL  0x92   // '=' key on numpad
     
    /*
     * Fujitsu/OASYS kbd definitions
     */
    #define VK_OEM_FJ_JISHO   0x92   // 'Dictionary' key
    #define VK_OEM_FJ_MASSHOU 0x93   // 'Unregister word' key
    #define VK_OEM_FJ_TOUROKU 0x94   // 'Register word' key
    #define VK_OEM_FJ_LOYA    0x95   // 'Left OYAYUBI' key
    #define VK_OEM_FJ_ROYA    0x96   // 'Right OYAYUBI' key
     
    /*
     * 0x97 - 0x9F : unassigned
     */
     
    /*
     * VK_L* & VK_R* - left and right Alt, Ctrl and Shift virtual keys.
     * Used only as parameters to GetAsyncKeyState() and GetKeyState().
     * No other API or message will distinguish left and right keys in this way.
     */
    #define VK_LSHIFT         0xA0
    #define VK_RSHIFT         0xA1
    #define VK_LCONTROL       0xA2
    #define VK_RCONTROL       0xA3
    #define VK_LMENU          0xA4
    #define VK_RMENU          0xA5
     
    #if(_WIN32_WINNT >= 0x0500)
    #define VK_BROWSER_BACK        0xA6
    #define VK_BROWSER_FORWARD     0xA7
    #define VK_BROWSER_REFRESH     0xA8
    #define VK_BROWSER_STOP        0xA9
    #define VK_BROWSER_SEARCH      0xAA
    #define VK_BROWSER_FAVORITES   0xAB
    #define VK_BROWSER_HOME        0xAC
     
    #define VK_VOLUME_MUTE         0xAD
    #define VK_VOLUME_DOWN         0xAE
    #define VK_VOLUME_UP           0xAF
    #define VK_MEDIA_NEXT_TRACK    0xB0
    #define VK_MEDIA_PREV_TRACK    0xB1
    #define VK_MEDIA_STOP          0xB2
    #define VK_MEDIA_PLAY_PAUSE    0xB3
    #define VK_LAUNCH_MAIL         0xB4
    #define VK_LAUNCH_MEDIA_SELECT 0xB5
    #define VK_LAUNCH_APP1         0xB6
    #define VK_LAUNCH_APP2         0xB7
     
    #endif /* _WIN32_WINNT >= 0x0500 */
     
    /*
     * 0xB8 - 0xB9 : reserved
     */
     
    #define VK_OEM_1          0xBA   // ';:' for US
    #define VK_OEM_PLUS       0xBB   // '+' any country
    #define VK_OEM_COMMA      0xBC   // ',' any country
    #define VK_OEM_MINUS      0xBD   // '-' any country
    #define VK_OEM_PERIOD     0xBE   // '.' any country
    #define VK_OEM_2          0xBF   // '/?' for US
    #define VK_OEM_3          0xC0   // '`~' for US
     
    /*
     * 0xC1 - 0xD7 : reserved
     */
     
    /*
     * 0xD8 - 0xDA : unassigned
     */
     
    #define VK_OEM_4          0xDB  //  '[{' for US
    #define VK_OEM_5          0xDC  //  '\|' for US
    #define VK_OEM_6          0xDD  //  ']}' for US
    #define VK_OEM_7          0xDE  //  ''"' for US
    #define VK_OEM_8          0xDF
     
    /*
     * 0xE0 : reserved
     */
     
    /*
     * Various extended or enhanced keyboards
     */
    #define VK_OEM_AX         0xE1  //  'AX' key on Japanese AX kbd
    #define VK_OEM_102        0xE2  //  "<>" or "\|" on RT 102-key kbd.
    #define VK_ICO_HELP       0xE3  //  Help key on ICO
    #define VK_ICO_00         0xE4  //  00 key on ICO
     
    #if(WINVER >= 0x0400)
    #define VK_PROCESSKEY     0xE5
    #endif /* WINVER >= 0x0400 */
     
    #define VK_ICO_CLEAR      0xE6
     
     
    #if(_WIN32_WINNT >= 0x0500)
    #define VK_PACKET         0xE7
    #endif /* _WIN32_WINNT >= 0x0500 */
     
    /*
     * 0xE8 : unassigned
     */
     
    /*
     * Nokia/Ericsson definitions
     */
    #define VK_OEM_RESET      0xE9
    #define VK_OEM_JUMP       0xEA
    #define VK_OEM_PA1        0xEB
    #define VK_OEM_PA2        0xEC
    #define VK_OEM_PA3        0xED
    #define VK_OEM_WSCTRL     0xEE
    #define VK_OEM_CUSEL      0xEF
    #define VK_OEM_ATTN       0xF0
    #define VK_OEM_FINISH     0xF1
    #define VK_OEM_COPY       0xF2
    #define VK_OEM_AUTO       0xF3
    #define VK_OEM_ENLW       0xF4
    #define VK_OEM_BACKTAB    0xF5
     
    #define VK_ATTN           0xF6
    #define VK_CRSEL          0xF7
    #define VK_EXSEL          0xF8
    #define VK_EREOF          0xF9
    #define VK_PLAY           0xFA
    #define VK_ZOOM           0xFB
    #define VK_NONAME         0xFC
    #define VK_PA1            0xFD
    #define VK_OEM_CLEAR      0xFE
     
    /*
     * 0xFF : reserved
     */
     
     
    #endif /* !NOVIRTUALKEYCODES */
     
    #ifndef NOWH
     
    /*
     * SetWindowsHook() codes
     */
    #define WH_MIN              (-1)
    #define WH_MSGFILTER        (-1)
    #define WH_JOURNALRECORD    0
    #define WH_JOURNALPLAYBACK  1
    #define WH_KEYBOARD         2
    #define WH_GETMESSAGE       3
    #define WH_CALLWNDPROC      4
    #define WH_CBT              5
    #define WH_SYSMSGFILTER     6
    #define WH_MOUSE            7
    #if defined(_WIN32_WINDOWS)
    #define WH_HARDWARE         8
    #endif
    #define WH_DEBUG            9
    #define WH_SHELL           10
    #define WH_FOREGROUNDIDLE  11
    #if(WINVER >= 0x0400)
    #define WH_CALLWNDPROCRET  12
    #endif /* WINVER >= 0x0400 */
     
    #if (_WIN32_WINNT >= 0x0400)
    #define WH_KEYBOARD_LL     13
    #define WH_MOUSE_LL        14
    #endif // (_WIN32_WINNT >= 0x0400)
     
    #if(WINVER >= 0x0400)
    #if (_WIN32_WINNT >= 0x0400)
    #define WH_MAX             14
    #else
    #define WH_MAX             12
    #endif // (_WIN32_WINNT >= 0x0400)
    #else
    #define WH_MAX             11
    #endif
     
    #define WH_MINHOOK         WH_MIN
    #define WH_MAXHOOK         WH_MAX
     
    /*
     * Hook Codes
     */
    #define HC_ACTION           0
    #define HC_GETNEXT          1
    #define HC_SKIP             2
    #define HC_NOREMOVE         3
    #define HC_NOREM            HC_NOREMOVE
    #define HC_SYSMODALON       4
    #define HC_SYSMODALOFF      5
     
    /*
     * CBT Hook Codes
     */
    #define HCBT_MOVESIZE       0
    #define HCBT_MINMAX         1
    #define HCBT_QS             2
    #define HCBT_CREATEWND      3
    #define HCBT_DESTROYWND     4
    #define HCBT_ACTIVATE       5
    #define HCBT_CLICKSKIPPED   6
    #define HCBT_KEYSKIPPED     7
    #define HCBT_SYSCOMMAND     8
    #define HCBT_SETFOCUS       9
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    /*
     * HCBT_CREATEWND parameters pointed to by lParam
     */
    typedef struct tagCBT_CREATEWNDA
    {
        struct tagCREATESTRUCTA *lpcs;
        HWND           hwndInsertAfter;
    } CBT_CREATEWNDA, *LPCBT_CREATEWNDA;
    /*
     * HCBT_CREATEWND parameters pointed to by lParam
     */
    typedef struct tagCBT_CREATEWNDW
    {
        struct tagCREATESTRUCTW *lpcs;
        HWND           hwndInsertAfter;
    } CBT_CREATEWNDW, *LPCBT_CREATEWNDW;
    #ifdef UNICODE
    typedef CBT_CREATEWNDW CBT_CREATEWND;
    typedef LPCBT_CREATEWNDW LPCBT_CREATEWND;
    #else
    typedef CBT_CREATEWNDA CBT_CREATEWND;
    typedef LPCBT_CREATEWNDA LPCBT_CREATEWND;
    #endif // UNICODE
     
    /*
     * HCBT_ACTIVATE structure pointed to by lParam
     */
    typedef struct tagCBTACTIVATESTRUCT
    {
        BOOL    fMouse;
        HWND    hWndActive;
    } CBTACTIVATESTRUCT, *LPCBTACTIVATESTRUCT;
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    #if(_WIN32_WINNT >= 0x0501)
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    /*
     * WTSSESSION_NOTIFICATION struct pointed by lParam, for WM_WTSSESSION_CHANGE
     */
    typedef struct tagWTSSESSION_NOTIFICATION
    {
        DWORD cbSize;
        DWORD dwSessionId;
     
    } WTSSESSION_NOTIFICATION, *PWTSSESSION_NOTIFICATION;
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    /*
     * codes passed in WPARAM for WM_WTSSESSION_CHANGE
     */
     
    #define WTS_CONSOLE_CONNECT                0x1
    #define WTS_CONSOLE_DISCONNECT             0x2
    #define WTS_REMOTE_CONNECT                 0x3
    #define WTS_REMOTE_DISCONNECT              0x4
    #define WTS_SESSION_LOGON                  0x5
    #define WTS_SESSION_LOGOFF                 0x6
    #define WTS_SESSION_LOCK                   0x7
    #define WTS_SESSION_UNLOCK                 0x8
    #define WTS_SESSION_REMOTE_CONTROL         0x9
    #define WTS_SESSION_CREATE                 0xa
    #define WTS_SESSION_TERMINATE              0xb
     
    #endif /* _WIN32_WINNT >= 0x0501 */
     
    /*
     * WH_MSGFILTER Filter Proc Codes
     */
    #define MSGF_DIALOGBOX      0
    #define MSGF_MESSAGEBOX     1
    #define MSGF_MENU           2
    #define MSGF_SCROLLBAR      5
    #define MSGF_NEXTWINDOW     6
    #define MSGF_MAX            8                       // unused
    #define MSGF_USER           4096
     
    /*
     * Shell support
     */
    #define HSHELL_WINDOWCREATED        1
    #define HSHELL_WINDOWDESTROYED      2
    #define HSHELL_ACTIVATESHELLWINDOW  3
     
    #if(WINVER >= 0x0400)
    #define HSHELL_WINDOWACTIVATED      4
    #define HSHELL_GETMINRECT           5
    #define HSHELL_REDRAW               6
    #define HSHELL_TASKMAN              7
    #define HSHELL_LANGUAGE             8
    #define HSHELL_SYSMENU              9
    #define HSHELL_ENDTASK              10
    #endif /* WINVER >= 0x0400 */
    #if(_WIN32_WINNT >= 0x0500)
    #define HSHELL_ACCESSIBILITYSTATE   11
    #define HSHELL_APPCOMMAND           12
    #endif /* _WIN32_WINNT >= 0x0500 */
     
    #if(_WIN32_WINNT >= 0x0501)
    #define HSHELL_WINDOWREPLACED       13
    #define HSHELL_WINDOWREPLACING      14
    #endif /* _WIN32_WINNT >= 0x0501 */
     
     
    #if(_WIN32_WINNT >= 0x0602)
    #define HSHELL_MONITORCHANGED            16
    #endif /* _WIN32_WINNT >= 0x0602 */
     
     
    #define HSHELL_HIGHBIT            0x8000
    #define HSHELL_FLASH              (HSHELL_REDRAW|HSHELL_HIGHBIT)
    #define HSHELL_RUDEAPPACTIVATED   (HSHELL_WINDOWACTIVATED|HSHELL_HIGHBIT)
     
    #if(_WIN32_WINNT >= 0x0500)
    /* cmd for HSHELL_APPCOMMAND and WM_APPCOMMAND */
    #define APPCOMMAND_BROWSER_BACKWARD       1
    #define APPCOMMAND_BROWSER_FORWARD        2
    #define APPCOMMAND_BROWSER_REFRESH        3
    #define APPCOMMAND_BROWSER_STOP           4
    #define APPCOMMAND_BROWSER_SEARCH         5
    #define APPCOMMAND_BROWSER_FAVORITES      6
    #define APPCOMMAND_BROWSER_HOME           7
    #define APPCOMMAND_VOLUME_MUTE            8
    #define APPCOMMAND_VOLUME_DOWN            9
    #define APPCOMMAND_VOLUME_UP              10
    #define APPCOMMAND_MEDIA_NEXTTRACK        11
    #define APPCOMMAND_MEDIA_PREVIOUSTRACK    12
    #define APPCOMMAND_MEDIA_STOP             13
    #define APPCOMMAND_MEDIA_PLAY_PAUSE       14
    #define APPCOMMAND_LAUNCH_MAIL            15
    #define APPCOMMAND_LAUNCH_MEDIA_SELECT    16
    #define APPCOMMAND_LAUNCH_APP1            17
    #define APPCOMMAND_LAUNCH_APP2            18
    #define APPCOMMAND_BASS_DOWN              19
    #define APPCOMMAND_BASS_BOOST             20
    #define APPCOMMAND_BASS_UP                21
    #define APPCOMMAND_TREBLE_DOWN            22
    #define APPCOMMAND_TREBLE_UP              23
    #if(_WIN32_WINNT >= 0x0501)
    #define APPCOMMAND_MICROPHONE_VOLUME_MUTE 24
    #define APPCOMMAND_MICROPHONE_VOLUME_DOWN 25
    #define APPCOMMAND_MICROPHONE_VOLUME_UP   26
    #define APPCOMMAND_HELP                   27
    #define APPCOMMAND_FIND                   28
    #define APPCOMMAND_NEW                    29
    #define APPCOMMAND_OPEN                   30
    #define APPCOMMAND_CLOSE                  31
    #define APPCOMMAND_SAVE                   32
    #define APPCOMMAND_PRINT                  33
    #define APPCOMMAND_UNDO                   34
    #define APPCOMMAND_REDO                   35
    #define APPCOMMAND_COPY                   36
    #define APPCOMMAND_CUT                    37
    #define APPCOMMAND_PASTE                  38
    #define APPCOMMAND_REPLY_TO_MAIL          39
    #define APPCOMMAND_FORWARD_MAIL           40
    #define APPCOMMAND_SEND_MAIL              41
    #define APPCOMMAND_SPELL_CHECK            42
    #define APPCOMMAND_DICTATE_OR_COMMAND_CONTROL_TOGGLE    43
    #define APPCOMMAND_MIC_ON_OFF_TOGGLE      44
    #define APPCOMMAND_CORRECTION_LIST        45
    #define APPCOMMAND_MEDIA_PLAY             46
    #define APPCOMMAND_MEDIA_PAUSE            47
    #define APPCOMMAND_MEDIA_RECORD           48
    #define APPCOMMAND_MEDIA_FAST_FORWARD     49
    #define APPCOMMAND_MEDIA_REWIND           50
    #define APPCOMMAND_MEDIA_CHANNEL_UP       51
    #define APPCOMMAND_MEDIA_CHANNEL_DOWN     52
    #endif /* _WIN32_WINNT >= 0x0501 */
    #if(_WIN32_WINNT >= 0x0600)
    #define APPCOMMAND_DELETE                 53
    #define APPCOMMAND_DWM_FLIP3D             54
    #endif /* _WIN32_WINNT >= 0x0600 */
     
    #define FAPPCOMMAND_MOUSE 0x8000
    #define FAPPCOMMAND_KEY   0
    #define FAPPCOMMAND_OEM   0x1000
    #define FAPPCOMMAND_MASK  0xF000
     
    #define GET_APPCOMMAND_LPARAM(lParam) ((short)(HIWORD(lParam) & ~FAPPCOMMAND_MASK))
    #define GET_DEVICE_LPARAM(lParam)     ((WORD)(HIWORD(lParam) & FAPPCOMMAND_MASK))
    #define GET_MOUSEORKEY_LPARAM         GET_DEVICE_LPARAM
    #define GET_FLAGS_LPARAM(lParam)      (LOWORD(lParam))
    #define GET_KEYSTATE_LPARAM(lParam)   GET_FLAGS_LPARAM(lParam)
    #endif /* _WIN32_WINNT >= 0x0500 */
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    typedef struct
    {
        HWND    hwnd;
        RECT    rc;
    } SHELLHOOKINFO, *LPSHELLHOOKINFO;
     
    /*
     * Message Structure used in Journaling
     */
    typedef struct tagEVENTMSG {
        UINT    message;
        UINT    paramL;
        UINT    paramH;
        DWORD    time;
        HWND     hwnd;
    } EVENTMSG, *PEVENTMSGMSG, NEAR *NPEVENTMSGMSG, FAR *LPEVENTMSGMSG;
     
    typedef struct tagEVENTMSG *PEVENTMSG, NEAR *NPEVENTMSG, FAR *LPEVENTMSG;
     
    /*
     * Message structure used by WH_CALLWNDPROC
     */
    typedef struct tagCWPSTRUCT {
        LPARAM  lParam;
        WPARAM  wParam;
        UINT    message;
        HWND    hwnd;
    } CWPSTRUCT, *PCWPSTRUCT, NEAR *NPCWPSTRUCT, FAR *LPCWPSTRUCT;
     
    #if(WINVER >= 0x0400)
    /*
     * Message structure used by WH_CALLWNDPROCRET
     */
    typedef struct tagCWPRETSTRUCT {
        LRESULT lResult;
        LPARAM  lParam;
        WPARAM  wParam;
        UINT    message;
        HWND    hwnd;
    } CWPRETSTRUCT, *PCWPRETSTRUCT, NEAR *NPCWPRETSTRUCT, FAR *LPCWPRETSTRUCT;
     
    #endif /* WINVER >= 0x0400 */
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    #if (_WIN32_WINNT >= 0x0400)
     
    /*
     * Low level hook flags
     */
     
    #define LLKHF_EXTENDED       (KF_EXTENDED >> 8) /* 0x00000001 */
    #define LLKHF_INJECTED       0x00000010
    #define LLKHF_ALTDOWN        (KF_ALTDOWN >> 8) /* 0x00000020 */
    #define LLKHF_UP             (KF_UP >> 8)      /* 0x00000080 */
    #define LLKHF_LOWER_IL_INJECTED        0x00000002
     
    #define LLMHF_INJECTED       0x00000001
    #define LLMHF_LOWER_IL_INJECTED        0x00000002
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    /*
     * Structure used by WH_KEYBOARD_LL
     */
    typedef struct tagKBDLLHOOKSTRUCT {
        DWORD   vkCode;
        DWORD   scanCode;
        DWORD   flags;
        DWORD   time;
        ULONG_PTR dwExtraInfo;
    } KBDLLHOOKSTRUCT, FAR *LPKBDLLHOOKSTRUCT, *PKBDLLHOOKSTRUCT;
     
    /*
     * Structure used by WH_MOUSE_LL
     */
    typedef struct tagMSLLHOOKSTRUCT {
        POINT   pt;
        DWORD   mouseData;
        DWORD   flags;
        DWORD   time;
        ULONG_PTR dwExtraInfo;
    } MSLLHOOKSTRUCT, FAR *LPMSLLHOOKSTRUCT, *PMSLLHOOKSTRUCT;
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    #endif // (_WIN32_WINNT >= 0x0400)
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    /*
     * Structure used by WH_DEBUG
     */
    typedef struct tagDEBUGHOOKINFO
    {
        DWORD   idThread;
        DWORD   idThreadInstaller;
        LPARAM  lParam;
        WPARAM  wParam;
        int     code;
    } DEBUGHOOKINFO, *PDEBUGHOOKINFO, NEAR *NPDEBUGHOOKINFO, FAR* LPDEBUGHOOKINFO;
     
    /*
     * Structure used by WH_MOUSE
     */
    typedef struct tagMOUSEHOOKSTRUCT {
        POINT   pt;
        HWND    hwnd;
        UINT    wHitTestCode;
        ULONG_PTR dwExtraInfo;
    } MOUSEHOOKSTRUCT, FAR *LPMOUSEHOOKSTRUCT, *PMOUSEHOOKSTRUCT;
     
    #if(_WIN32_WINNT >= 0x0500)
    #ifdef __cplusplus
    typedef struct tagMOUSEHOOKSTRUCTEX : public tagMOUSEHOOKSTRUCT
    {
        DWORD   mouseData;
    } MOUSEHOOKSTRUCTEX, *LPMOUSEHOOKSTRUCTEX, *PMOUSEHOOKSTRUCTEX;
    #else // ndef __cplusplus
    typedef struct tagMOUSEHOOKSTRUCTEX
    {
        MOUSEHOOKSTRUCT;
        DWORD   mouseData;
    } MOUSEHOOKSTRUCTEX, *LPMOUSEHOOKSTRUCTEX, *PMOUSEHOOKSTRUCTEX;
    #endif
    #endif /* _WIN32_WINNT >= 0x0500 */
     
    #if(WINVER >= 0x0400)
    /*
     * Structure used by WH_HARDWARE
     */
    typedef struct tagHARDWAREHOOKSTRUCT {
        HWND    hwnd;
        UINT    message;
        WPARAM  wParam;
        LPARAM  lParam;
    } HARDWAREHOOKSTRUCT, FAR *LPHARDWAREHOOKSTRUCT, *PHARDWAREHOOKSTRUCT;
    #endif /* WINVER >= 0x0400 */
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    #endif /* !NOWH */
     
    /*
     * Keyboard Layout API
     */
    #define HKL_PREV            0
    #define HKL_NEXT            1
     
     
    #define KLF_ACTIVATE        0x00000001
    #define KLF_SUBSTITUTE_OK   0x00000002
    #define KLF_REORDER         0x00000008
    #if(WINVER >= 0x0400)
    #define KLF_REPLACELANG     0x00000010
    #define KLF_NOTELLSHELL     0x00000080
    #endif /* WINVER >= 0x0400 */
    #define KLF_SETFORPROCESS   0x00000100
    #if(_WIN32_WINNT >= 0x0500)
    #define KLF_SHIFTLOCK       0x00010000
    #define KLF_RESET           0x40000000
    #endif /* _WIN32_WINNT >= 0x0500 */
     
     
    #if(WINVER >= 0x0500)
    /*
     * Bits in wParam of WM_INPUTLANGCHANGEREQUEST message
     */
    #define INPUTLANGCHANGE_SYSCHARSET 0x0001
    #define INPUTLANGCHANGE_FORWARD    0x0002
    #define INPUTLANGCHANGE_BACKWARD   0x0004
    #endif /* WINVER >= 0x0500 */
     
    /*
     * Size of KeyboardLayoutName (number of characters), including nul terminator
     */
    #define KL_NAMELENGTH 9
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    WINUSERAPI
    HKL
    WINAPI
    LoadKeyboardLayoutA(
        _In_ LPCSTR pwszKLID,
        _In_ UINT Flags);
    WINUSERAPI
    HKL
    WINAPI
    LoadKeyboardLayoutW(
        _In_ LPCWSTR pwszKLID,
        _In_ UINT Flags);
    #ifdef UNICODE
    #define LoadKeyboardLayout  LoadKeyboardLayoutW
    #else
    #define LoadKeyboardLayout  LoadKeyboardLayoutA
    #endif // !UNICODE
     
     
    #if(WINVER >= 0x0400)
    WINUSERAPI
    HKL
    WINAPI
    ActivateKeyboardLayout(
        _In_ HKL hkl,
        _In_ UINT Flags);
    #else
    WINUSERAPI
    BOOL
    WINAPI
    ActivateKeyboardLayout(
        _In_ HKL hkl,
        _In_ UINT Flags);
    #endif /* WINVER >= 0x0400 */
     
    #if(WINVER >= 0x0400)
    WINUSERAPI
    int
    WINAPI
    ToUnicodeEx(
        _In_ UINT wVirtKey,
        _In_ UINT wScanCode,
        _In_reads_bytes_(256) CONST BYTE *lpKeyState,
        _Out_writes_(cchBuff) LPWSTR pwszBuff,
        _In_ int cchBuff,
        _In_ UINT wFlags,
        _In_opt_ HKL dwhkl);
    #endif /* WINVER >= 0x0400 */
     
    WINUSERAPI
    BOOL
    WINAPI
    UnloadKeyboardLayout(
        _In_ HKL hkl);
     
    WINUSERAPI
    BOOL
    WINAPI
    GetKeyboardLayoutNameA(
        _Out_writes_(KL_NAMELENGTH) LPSTR pwszKLID);
    WINUSERAPI
    BOOL
    WINAPI
    GetKeyboardLayoutNameW(
        _Out_writes_(KL_NAMELENGTH) LPWSTR pwszKLID);
    #ifdef UNICODE
    #define GetKeyboardLayoutName  GetKeyboardLayoutNameW
    #else
    #define GetKeyboardLayoutName  GetKeyboardLayoutNameA
    #endif // !UNICODE
     
    #if(WINVER >= 0x0400)
    WINUSERAPI
    int
    WINAPI
    GetKeyboardLayoutList(
        _In_ int nBuff,
        _Out_writes_to_opt_(nBuff, return) HKL FAR *lpList);
     
    WINUSERAPI
    HKL
    WINAPI
    GetKeyboardLayout(
        _In_ DWORD idThread);
     
    #endif /* WINVER >= 0x0400 */
     
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    #if(WINVER >= 0x0500)
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    typedef struct tagMOUSEMOVEPOINT {
        int   x;
        int   y;
        DWORD time;
        ULONG_PTR dwExtraInfo;
    } MOUSEMOVEPOINT, *PMOUSEMOVEPOINT, FAR* LPMOUSEMOVEPOINT;
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    /*
     * Values for resolution parameter of GetMouseMovePointsEx
     */
    #define GMMP_USE_DISPLAY_POINTS          1
    #define GMMP_USE_HIGH_RESOLUTION_POINTS  2
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    WINUSERAPI
    int
    WINAPI
    GetMouseMovePointsEx(
        _In_ UINT cbSize,
        _In_ LPMOUSEMOVEPOINT lppt,
        _Out_writes_(nBufPoints) LPMOUSEMOVEPOINT lpptBuf,
        _In_ int nBufPoints,
        _In_ DWORD resolution);
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    #endif /* WINVER >= 0x0500 */
     
    #ifndef NODESKTOP
    /*
     * Desktop-specific access flags
     */
    #define DESKTOP_READOBJECTS         0x0001L
    #define DESKTOP_CREATEWINDOW        0x0002L
    #define DESKTOP_CREATEMENU          0x0004L
    #define DESKTOP_HOOKCONTROL         0x0008L
    #define DESKTOP_JOURNALRECORD       0x0010L
    #define DESKTOP_JOURNALPLAYBACK     0x0020L
    #define DESKTOP_ENUMERATE           0x0040L
    #define DESKTOP_WRITEOBJECTS        0x0080L
    #define DESKTOP_SWITCHDESKTOP       0x0100L
     
    /*
     * Desktop-specific control flags
     */
    #define DF_ALLOWOTHERACCOUNTHOOK    0x0001L
     
    #ifdef _WINGDI_
    #ifndef NOGDI
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    WINUSERAPI
    HDESK
    WINAPI
    CreateDesktopA(
        _In_ LPCSTR lpszDesktop,
        _Reserved_ LPCSTR lpszDevice,
        _Reserved_ DEVMODEA* pDevmode,
        _In_ DWORD dwFlags,
        _In_ ACCESS_MASK dwDesiredAccess,
        _In_opt_ LPSECURITY_ATTRIBUTES lpsa);
    WINUSERAPI
    HDESK
    WINAPI
    CreateDesktopW(
        _In_ LPCWSTR lpszDesktop,
        _Reserved_ LPCWSTR lpszDevice,
        _Reserved_ DEVMODEW* pDevmode,
        _In_ DWORD dwFlags,
        _In_ ACCESS_MASK dwDesiredAccess,
        _In_opt_ LPSECURITY_ATTRIBUTES lpsa);
    #ifdef UNICODE
    #define CreateDesktop  CreateDesktopW
    #else
    #define CreateDesktop  CreateDesktopA
    #endif // !UNICODE
     
    WINUSERAPI
    HDESK
    WINAPI
    CreateDesktopExA(
        _In_ LPCSTR lpszDesktop,
        _Reserved_ LPCSTR lpszDevice,
        _Reserved_ DEVMODEA* pDevmode,
        _In_ DWORD dwFlags,
        _In_ ACCESS_MASK dwDesiredAccess,
        _In_opt_ LPSECURITY_ATTRIBUTES lpsa,
        _In_ ULONG ulHeapSize,
        _Reserved_ PVOID pvoid);
    WINUSERAPI
    HDESK
    WINAPI
    CreateDesktopExW(
        _In_ LPCWSTR lpszDesktop,
        _Reserved_ LPCWSTR lpszDevice,
        _Reserved_ DEVMODEW* pDevmode,
        _In_ DWORD dwFlags,
        _In_ ACCESS_MASK dwDesiredAccess,
        _In_opt_ LPSECURITY_ATTRIBUTES lpsa,
        _In_ ULONG ulHeapSize,
        _Reserved_ PVOID pvoid);
    #ifdef UNICODE
    #define CreateDesktopEx  CreateDesktopExW
    #else
    #define CreateDesktopEx  CreateDesktopExA
    #endif // !UNICODE
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    #endif /* NOGDI */
    #endif /* _WINGDI_ */
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    WINUSERAPI
    HDESK
    WINAPI
    OpenDesktopA(
        _In_ LPCSTR lpszDesktop,
        _In_ DWORD dwFlags,
        _In_ BOOL fInherit,
        _In_ ACCESS_MASK dwDesiredAccess);
    WINUSERAPI
    HDESK
    WINAPI
    OpenDesktopW(
        _In_ LPCWSTR lpszDesktop,
        _In_ DWORD dwFlags,
        _In_ BOOL fInherit,
        _In_ ACCESS_MASK dwDesiredAccess);
    #ifdef UNICODE
    #define OpenDesktop  OpenDesktopW
    #else
    #define OpenDesktop  OpenDesktopA
    #endif // !UNICODE
     
    WINUSERAPI
    HDESK
    WINAPI
    OpenInputDesktop(
        _In_ DWORD dwFlags,
        _In_ BOOL fInherit,
        _In_ ACCESS_MASK dwDesiredAccess);
     
     
    WINUSERAPI
    BOOL
    WINAPI
    EnumDesktopsA(
        _In_opt_ HWINSTA hwinsta,
        _In_ DESKTOPENUMPROCA lpEnumFunc,
        _In_ LPARAM lParam);
    WINUSERAPI
    BOOL
    WINAPI
    EnumDesktopsW(
        _In_opt_ HWINSTA hwinsta,
        _In_ DESKTOPENUMPROCW lpEnumFunc,
        _In_ LPARAM lParam);
    #ifdef UNICODE
    #define EnumDesktops  EnumDesktopsW
    #else
    #define EnumDesktops  EnumDesktopsA
    #endif // !UNICODE
     
    WINUSERAPI
    BOOL
    WINAPI
    EnumDesktopWindows(
        _In_opt_ HDESK hDesktop,
        _In_ WNDENUMPROC lpfn,
        _In_ LPARAM lParam);
     
     
    WINUSERAPI
    BOOL
    WINAPI
    SwitchDesktop(
        _In_ HDESK hDesktop);
     
     
    WINUSERAPI
    BOOL
    WINAPI
    SetThreadDesktop(
         _In_ HDESK hDesktop);
     
    WINUSERAPI
    BOOL
    WINAPI
    CloseDesktop(
        _In_ HDESK hDesktop);
     
    WINUSERAPI
    HDESK
    WINAPI
    GetThreadDesktop(
        _In_ DWORD dwThreadId);
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    #endif  /* !NODESKTOP */
     
    #ifndef NOWINDOWSTATION
    /*
     * Windowstation-specific access flags
     */
    #define WINSTA_ENUMDESKTOPS         0x0001L
    #define WINSTA_READATTRIBUTES       0x0002L
    #define WINSTA_ACCESSCLIPBOARD      0x0004L
    #define WINSTA_CREATEDESKTOP        0x0008L
    #define WINSTA_WRITEATTRIBUTES      0x0010L
    #define WINSTA_ACCESSGLOBALATOMS    0x0020L
    #define WINSTA_EXITWINDOWS          0x0040L
    #define WINSTA_ENUMERATE            0x0100L
    #define WINSTA_READSCREEN           0x0200L
     
    #define WINSTA_ALL_ACCESS           (WINSTA_ENUMDESKTOPS  | WINSTA_READATTRIBUTES  | WINSTA_ACCESSCLIPBOARD | \
                                         WINSTA_CREATEDESKTOP | WINSTA_WRITEATTRIBUTES | WINSTA_ACCESSGLOBALATOMS | \
                                         WINSTA_EXITWINDOWS   | WINSTA_ENUMERATE       | WINSTA_READSCREEN)
     
    /*
     * Windowstation creation flags.
     */
    #define CWF_CREATE_ONLY          0x00000001
     
    /*
     * Windowstation-specific attribute flags
     */
    #define WSF_VISIBLE                 0x0001L
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    WINUSERAPI
    HWINSTA
    WINAPI
    CreateWindowStationA(
        _In_opt_ LPCSTR lpwinsta,
        _In_ DWORD dwFlags,
        _In_ ACCESS_MASK dwDesiredAccess,
        _In_opt_ LPSECURITY_ATTRIBUTES lpsa);
    WINUSERAPI
    HWINSTA
    WINAPI
    CreateWindowStationW(
        _In_opt_ LPCWSTR lpwinsta,
        _In_ DWORD dwFlags,
        _In_ ACCESS_MASK dwDesiredAccess,
        _In_opt_ LPSECURITY_ATTRIBUTES lpsa);
    #ifdef UNICODE
    #define CreateWindowStation  CreateWindowStationW
    #else
    #define CreateWindowStation  CreateWindowStationA
    #endif // !UNICODE
     
    WINUSERAPI
    HWINSTA
    WINAPI
    OpenWindowStationA(
        _In_ LPCSTR lpszWinSta,
        _In_ BOOL fInherit,
        _In_ ACCESS_MASK dwDesiredAccess);
    WINUSERAPI
    HWINSTA
    WINAPI
    OpenWindowStationW(
        _In_ LPCWSTR lpszWinSta,
        _In_ BOOL fInherit,
        _In_ ACCESS_MASK dwDesiredAccess);
    #ifdef UNICODE
    #define OpenWindowStation  OpenWindowStationW
    #else
    #define OpenWindowStation  OpenWindowStationA
    #endif // !UNICODE
     
    WINUSERAPI
    BOOL
    WINAPI
    EnumWindowStationsA(
        _In_ WINSTAENUMPROCA lpEnumFunc,
        _In_ LPARAM lParam);
    WINUSERAPI
    BOOL
    WINAPI
    EnumWindowStationsW(
        _In_ WINSTAENUMPROCW lpEnumFunc,
        _In_ LPARAM lParam);
    #ifdef UNICODE
    #define EnumWindowStations  EnumWindowStationsW
    #else
    #define EnumWindowStations  EnumWindowStationsA
    #endif // !UNICODE
     
    WINUSERAPI
    BOOL
    WINAPI
    CloseWindowStation(
        _In_ HWINSTA hWinSta);
     
    WINUSERAPI
    BOOL
    WINAPI
    SetProcessWindowStation(
        _In_ HWINSTA hWinSta);
     
    WINUSERAPI
    HWINSTA
    WINAPI
    GetProcessWindowStation(
        VOID);
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    #endif  /* !NOWINDOWSTATION */
     
    #ifndef NOSECURITY
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    WINUSERAPI
    BOOL
    WINAPI
    SetUserObjectSecurity(
        _In_ HANDLE hObj,
        _In_ PSECURITY_INFORMATION pSIRequested,
        _In_ PSECURITY_DESCRIPTOR pSID);
     
    WINUSERAPI
    BOOL
    WINAPI
    GetUserObjectSecurity(
        _In_ HANDLE hObj,
        _In_ PSECURITY_INFORMATION pSIRequested,
        _Out_writes_bytes_opt_(nLength) PSECURITY_DESCRIPTOR pSID,
        _In_ DWORD nLength,
        _Out_ LPDWORD lpnLengthNeeded);
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    #define UOI_FLAGS       1
    #define UOI_NAME        2
    #define UOI_TYPE        3
    #define UOI_USER_SID    4
    #if(WINVER >= 0x0600)
    #define UOI_HEAPSIZE    5
    #define UOI_IO          6
    #endif /* WINVER >= 0x0600 */
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    typedef struct tagUSEROBJECTFLAGS {
        BOOL fInherit;
        BOOL fReserved;
        DWORD dwFlags;
    } USEROBJECTFLAGS, *PUSEROBJECTFLAGS;
     
    WINUSERAPI
    BOOL
    WINAPI
    GetUserObjectInformationA(
        _In_ HANDLE hObj,
        _In_ int nIndex,
        _Out_writes_bytes_opt_(nLength) PVOID pvInfo,
        _In_ DWORD nLength,
        _Out_opt_ LPDWORD lpnLengthNeeded);
    WINUSERAPI
    BOOL
    WINAPI
    GetUserObjectInformationW(
        _In_ HANDLE hObj,
        _In_ int nIndex,
        _Out_writes_bytes_opt_(nLength) PVOID pvInfo,
        _In_ DWORD nLength,
        _Out_opt_ LPDWORD lpnLengthNeeded);
    #ifdef UNICODE
    #define GetUserObjectInformation  GetUserObjectInformationW
    #else
    #define GetUserObjectInformation  GetUserObjectInformationA
    #endif // !UNICODE
     
    WINUSERAPI
    BOOL
    WINAPI
    SetUserObjectInformationA(
        _In_ HANDLE hObj,
        _In_ int nIndex,
        _In_reads_bytes_(nLength) PVOID pvInfo,
        _In_ DWORD nLength);
    WINUSERAPI
    BOOL
    WINAPI
    SetUserObjectInformationW(
        _In_ HANDLE hObj,
        _In_ int nIndex,
        _In_reads_bytes_(nLength) PVOID pvInfo,
        _In_ DWORD nLength);
    #ifdef UNICODE
    #define SetUserObjectInformation  SetUserObjectInformationW
    #else
    #define SetUserObjectInformation  SetUserObjectInformationA
    #endif // !UNICODE
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    #endif  /* !NOSECURITY */
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    #if(WINVER >= 0x0400)
    typedef struct tagWNDCLASSEXA {
        UINT        cbSize;
        /* Win 3.x */
        UINT        style;
        WNDPROC     lpfnWndProc;
        int         cbClsExtra;
        int         cbWndExtra;
        HINSTANCE   hInstance;
        HICON       hIcon;
        HCURSOR     hCursor;
        HBRUSH      hbrBackground;
        LPCSTR      lpszMenuName;
        LPCSTR      lpszClassName;
        /* Win 4.0 */
        HICON       hIconSm;
    } WNDCLASSEXA, *PWNDCLASSEXA, NEAR *NPWNDCLASSEXA, FAR *LPWNDCLASSEXA;
    typedef struct tagWNDCLASSEXW {
        UINT        cbSize;
        /* Win 3.x */
        UINT        style;
        WNDPROC     lpfnWndProc;
        int         cbClsExtra;
        int         cbWndExtra;
        HINSTANCE   hInstance;
        HICON       hIcon;
        HCURSOR     hCursor;
        HBRUSH      hbrBackground;
        LPCWSTR     lpszMenuName;
        LPCWSTR     lpszClassName;
        /* Win 4.0 */
        HICON       hIconSm;
    } WNDCLASSEXW, *PWNDCLASSEXW, NEAR *NPWNDCLASSEXW, FAR *LPWNDCLASSEXW;
    #ifdef UNICODE
    typedef WNDCLASSEXW WNDCLASSEX;
    typedef PWNDCLASSEXW PWNDCLASSEX;
    typedef NPWNDCLASSEXW NPWNDCLASSEX;
    typedef LPWNDCLASSEXW LPWNDCLASSEX;
    #else
    typedef WNDCLASSEXA WNDCLASSEX;
    typedef PWNDCLASSEXA PWNDCLASSEX;
    typedef NPWNDCLASSEXA NPWNDCLASSEX;
    typedef LPWNDCLASSEXA LPWNDCLASSEX;
    #endif // UNICODE
    #endif /* WINVER >= 0x0400 */
     
    typedef struct tagWNDCLASSA {
        UINT        style;
        WNDPROC     lpfnWndProc;
        int         cbClsExtra;
        int         cbWndExtra;
        HINSTANCE   hInstance;
        HICON       hIcon;
        HCURSOR     hCursor;
        HBRUSH      hbrBackground;
        LPCSTR      lpszMenuName;
        LPCSTR      lpszClassName;
    } WNDCLASSA, *PWNDCLASSA, NEAR *NPWNDCLASSA, FAR *LPWNDCLASSA;
    typedef struct tagWNDCLASSW {
        UINT        style;
        WNDPROC     lpfnWndProc;
        int         cbClsExtra;
        int         cbWndExtra;
        HINSTANCE   hInstance;
        HICON       hIcon;
        HCURSOR     hCursor;
        HBRUSH      hbrBackground;
        LPCWSTR     lpszMenuName;
        LPCWSTR     lpszClassName;
    } WNDCLASSW, *PWNDCLASSW, NEAR *NPWNDCLASSW, FAR *LPWNDCLASSW;
    #ifdef UNICODE
    typedef WNDCLASSW WNDCLASS;
    typedef PWNDCLASSW PWNDCLASS;
    typedef NPWNDCLASSW NPWNDCLASS;
    typedef LPWNDCLASSW LPWNDCLASS;
    #else
    typedef WNDCLASSA WNDCLASS;
    typedef PWNDCLASSA PWNDCLASS;
    typedef NPWNDCLASSA NPWNDCLASS;
    typedef LPWNDCLASSA LPWNDCLASS;
    #endif // UNICODE
     
    WINUSERAPI
    BOOL
    WINAPI
    IsHungAppWindow(
        _In_ HWND hwnd);
     
     
    #if(WINVER >= 0x0501)
    WINUSERAPI
    VOID
    WINAPI
    DisableProcessWindowsGhosting(
        VOID);
    #endif /* WINVER >= 0x0501 */
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
     
    #ifndef NOMSG
     
    #pragma region Application Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)
     
    /*
     * Message structure
     */
    typedef struct tagMSG {
        HWND        hwnd;
        UINT        message;
        WPARAM      wParam;
        LPARAM      lParam;
        DWORD       time;
        POINT       pt;
    #ifdef _MAC
        DWORD       lPrivate;
    #endif
    } MSG, *PMSG, NEAR *NPMSG, FAR *LPMSG;
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) */
    #pragma endregion
     
    #define POINTSTOPOINT(pt, pts)                          \
            { (pt).x = (LONG)(SHORT)LOWORD(*(LONG*)&pts);   \
              (pt).y = (LONG)(SHORT)HIWORD(*(LONG*)&pts); }
     
    #define POINTTOPOINTS(pt)      (MAKELONG((short)((pt).x), (short)((pt).y)))
    #define MAKEWPARAM(l, h)      ((WPARAM)(DWORD)MAKELONG(l, h))
    #define MAKELPARAM(l, h)      ((LPARAM)(DWORD)MAKELONG(l, h))
    #define MAKELRESULT(l, h)     ((LRESULT)(DWORD)MAKELONG(l, h))
     
     
    #endif /* !NOMSG */
     
    #ifndef NOWINOFFSETS
     
    /*
     * Window field offsets for GetWindowLong()
     */
    #define GWL_WNDPROC         (-4)
    #define GWL_HINSTANCE       (-6)
    #define GWL_HWNDPARENT      (-8)
    #define GWL_STYLE           (-16)
    #define GWL_EXSTYLE         (-20)
    #define GWL_USERDATA        (-21)
    #define GWL_ID              (-12)
     
    #ifdef _WIN64
     
    #undef GWL_WNDPROC
    #undef GWL_HINSTANCE
    #undef GWL_HWNDPARENT
    #undef GWL_USERDATA
     
    #endif /* _WIN64 */
     
    #define GWLP_WNDPROC        (-4)
    #define GWLP_HINSTANCE      (-6)
    #define GWLP_HWNDPARENT     (-8)
    #define GWLP_USERDATA       (-21)
    #define GWLP_ID             (-12)
     
    /*
     * Class field offsets for GetClassLong()
     */
    #define GCL_MENUNAME        (-8)
    #define GCL_HBRBACKGROUND   (-10)
    #define GCL_HCURSOR         (-12)
    #define GCL_HICON           (-14)
    #define GCL_HMODULE         (-16)
    #define GCL_CBWNDEXTRA      (-18)
    #define GCL_CBCLSEXTRA      (-20)
    #define GCL_WNDPROC         (-24)
    #define GCL_STYLE           (-26)
    #define GCW_ATOM            (-32)
     
    #if(WINVER >= 0x0400)
    #define GCL_HICONSM         (-34)
    #endif /* WINVER >= 0x0400 */
     
    #ifdef _WIN64
     
    #undef GCL_MENUNAME
    #undef GCL_HBRBACKGROUND
    #undef GCL_HCURSOR
    #undef GCL_HICON
    #undef GCL_HMODULE
    #undef GCL_WNDPROC
    #undef GCL_HICONSM
     
    #endif /* _WIN64 */
     
    #define GCLP_MENUNAME       (-8)
    #define GCLP_HBRBACKGROUND  (-10)
    #define GCLP_HCURSOR        (-12)
    #define GCLP_HICON          (-14)
    #define GCLP_HMODULE        (-16)
    #define GCLP_WNDPROC        (-24)
    #define GCLP_HICONSM        (-34)
     
    #endif /* !NOWINOFFSETS */
     
    #ifndef NOWINMESSAGES
     
     
    /*
     * Window Messages
     */
     
    #define WM_NULL                         0x0000
    #define WM_CREATE                       0x0001
    #define WM_DESTROY                      0x0002
    #define WM_MOVE                         0x0003
    #define WM_SIZE                         0x0005
     
    #define WM_ACTIVATE                     0x0006
    /*
     * WM_ACTIVATE state values
     */
    #define     WA_INACTIVE     0
    #define     WA_ACTIVE       1
    #define     WA_CLICKACTIVE  2
     
    #define WM_SETFOCUS                     0x0007
    #define WM_KILLFOCUS                    0x0008
    #define WM_ENABLE                       0x000A
    #define WM_SETREDRAW                    0x000B
    #define WM_SETTEXT                      0x000C
    #define WM_GETTEXT                      0x000D
    #define WM_GETTEXTLENGTH                0x000E
    #define WM_PAINT                        0x000F
    #define WM_CLOSE                        0x0010
    #ifndef _WIN32_WCE
    #define WM_QUERYENDSESSION              0x0011
    #define WM_QUERYOPEN                    0x0013
    #define WM_ENDSESSION                   0x0016
    #endif
    #define WM_QUIT                         0x0012
    #define WM_ERASEBKGND                   0x0014
    #define WM_SYSCOLORCHANGE               0x0015
    #define WM_SHOWWINDOW                   0x0018
    #define WM_WININICHANGE                 0x001A
    #if(WINVER >= 0x0400)
    #define WM_SETTINGCHANGE                WM_WININICHANGE
    #endif /* WINVER >= 0x0400 */
     
     
    #define WM_DEVMODECHANGE                0x001B
    #define WM_ACTIVATEAPP                  0x001C
    #define WM_FONTCHANGE                   0x001D
    #define WM_TIMECHANGE                   0x001E
    #define WM_CANCELMODE                   0x001F
    #define WM_SETCURSOR                    0x0020
    #define WM_MOUSEACTIVATE                0x0021
    #define WM_CHILDACTIVATE                0x0022
    #define WM_QUEUESYNC                    0x0023
     
    #define WM_GETMINMAXINFO                0x0024
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    /*
     * Struct pointed to by WM_GETMINMAXINFO lParam
     */
    typedef struct tagMINMAXINFO {
        POINT ptReserved;
        POINT ptMaxSize;
        POINT ptMaxPosition;
        POINT ptMinTrackSize;
        POINT ptMaxTrackSize;
    } MINMAXINFO, *PMINMAXINFO, *LPMINMAXINFO;
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    #define WM_PAINTICON                    0x0026
    #define WM_ICONERASEBKGND               0x0027
    #define WM_NEXTDLGCTL                   0x0028
    #define WM_SPOOLERSTATUS                0x002A
    #define WM_DRAWITEM                     0x002B
    #define WM_MEASUREITEM                  0x002C
    #define WM_DELETEITEM                   0x002D
    #define WM_VKEYTOITEM                   0x002E
    #define WM_CHARTOITEM                   0x002F
    #define WM_SETFONT                      0x0030
    #define WM_GETFONT                      0x0031
    #define WM_SETHOTKEY                    0x0032
    #define WM_GETHOTKEY                    0x0033
    #define WM_QUERYDRAGICON                0x0037
    #define WM_COMPAREITEM                  0x0039
    #if(WINVER >= 0x0500)
    #ifndef _WIN32_WCE
    #define WM_GETOBJECT                    0x003D
    #endif
    #endif /* WINVER >= 0x0500 */
    #define WM_COMPACTING                   0x0041
    #define WM_COMMNOTIFY                   0x0044  /* no longer suported */
    #define WM_WINDOWPOSCHANGING            0x0046
    #define WM_WINDOWPOSCHANGED             0x0047
     
    #define WM_POWER                        0x0048
    /*
     * wParam for WM_POWER window message and DRV_POWER driver notification
     */
    #define PWR_OK              1
    #define PWR_FAIL            (-1)
    #define PWR_SUSPENDREQUEST  1
    #define PWR_SUSPENDRESUME   2
    #define PWR_CRITICALRESUME  3
     
    #define WM_COPYDATA                     0x004A
    #define WM_CANCELJOURNAL                0x004B
     
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    /*
     * lParam of WM_COPYDATA message points to...
     */
    typedef struct tagCOPYDATASTRUCT {
        ULONG_PTR dwData;
        DWORD cbData;
        _Field_size_bytes_(cbData) PVOID lpData;
    } COPYDATASTRUCT, *PCOPYDATASTRUCT;
     
    #if(WINVER >= 0x0400)
    typedef struct tagMDINEXTMENU
    {
        HMENU   hmenuIn;
        HMENU   hmenuNext;
        HWND    hwndNext;
    } MDINEXTMENU, * PMDINEXTMENU, FAR * LPMDINEXTMENU;
    #endif /* WINVER >= 0x0400 */
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
     
    #if(WINVER >= 0x0400)
    #define WM_NOTIFY                       0x004E
    #define WM_INPUTLANGCHANGEREQUEST       0x0050
    #define WM_INPUTLANGCHANGE              0x0051
    #define WM_TCARD                        0x0052
    #define WM_HELP                         0x0053
    #define WM_USERCHANGED                  0x0054
    #define WM_NOTIFYFORMAT                 0x0055
     
    #define NFR_ANSI                             1
    #define NFR_UNICODE                          2
    #define NF_QUERY                             3
    #define NF_REQUERY                           4
     
    #define WM_CONTEXTMENU                  0x007B
    #define WM_STYLECHANGING                0x007C
    #define WM_STYLECHANGED                 0x007D
    #define WM_DISPLAYCHANGE                0x007E
    #define WM_GETICON                      0x007F
    #define WM_SETICON                      0x0080
    #endif /* WINVER >= 0x0400 */
     
    #define WM_NCCREATE                     0x0081
    #define WM_NCDESTROY                    0x0082
    #define WM_NCCALCSIZE                   0x0083
    #define WM_NCHITTEST                    0x0084
    #define WM_NCPAINT                      0x0085
    #define WM_NCACTIVATE                   0x0086
    #define WM_GETDLGCODE                   0x0087
    #ifndef _WIN32_WCE
    #define WM_SYNCPAINT                    0x0088
    #endif
    #define WM_NCMOUSEMOVE                  0x00A0
    #define WM_NCLBUTTONDOWN                0x00A1
    #define WM_NCLBUTTONUP                  0x00A2
    #define WM_NCLBUTTONDBLCLK              0x00A3
    #define WM_NCRBUTTONDOWN                0x00A4
    #define WM_NCRBUTTONUP                  0x00A5
    #define WM_NCRBUTTONDBLCLK              0x00A6
    #define WM_NCMBUTTONDOWN                0x00A7
    #define WM_NCMBUTTONUP                  0x00A8
    #define WM_NCMBUTTONDBLCLK              0x00A9
     
     
     
    #if(_WIN32_WINNT >= 0x0500)
    #define WM_NCXBUTTONDOWN                0x00AB
    #define WM_NCXBUTTONUP                  0x00AC
    #define WM_NCXBUTTONDBLCLK              0x00AD
    #endif /* _WIN32_WINNT >= 0x0500 */
     
     
    #if(_WIN32_WINNT >= 0x0501)
    #define WM_INPUT_DEVICE_CHANGE          0x00FE
    #endif /* _WIN32_WINNT >= 0x0501 */
     
    #if(_WIN32_WINNT >= 0x0501)
    #define WM_INPUT                        0x00FF
    #endif /* _WIN32_WINNT >= 0x0501 */
     
    #define WM_KEYFIRST                     0x0100
    #define WM_KEYDOWN                      0x0100
    #define WM_KEYUP                        0x0101
    #define WM_CHAR                         0x0102
    #define WM_DEADCHAR                     0x0103
    #define WM_SYSKEYDOWN                   0x0104
    #define WM_SYSKEYUP                     0x0105
    #define WM_SYSCHAR                      0x0106
    #define WM_SYSDEADCHAR                  0x0107
    #if(_WIN32_WINNT >= 0x0501)
    #define WM_UNICHAR                      0x0109
    #define WM_KEYLAST                      0x0109
    #define UNICODE_NOCHAR                  0xFFFF
    #else
    #define WM_KEYLAST                      0x0108
    #endif /* _WIN32_WINNT >= 0x0501 */
     
    #if(WINVER >= 0x0400)
    #define WM_IME_STARTCOMPOSITION         0x010D
    #define WM_IME_ENDCOMPOSITION           0x010E
    #define WM_IME_COMPOSITION              0x010F
    #define WM_IME_KEYLAST                  0x010F
    #endif /* WINVER >= 0x0400 */
     
    #define WM_INITDIALOG                   0x0110
    #define WM_COMMAND                      0x0111
    #define WM_SYSCOMMAND                   0x0112
    #define WM_TIMER                        0x0113
    #define WM_HSCROLL                      0x0114
    #define WM_VSCROLL                      0x0115
    #define WM_INITMENU                     0x0116
    #define WM_INITMENUPOPUP                0x0117
    #if(WINVER >= 0x0601)
    #define WM_GESTURE                      0x0119
    #define WM_GESTURENOTIFY                0x011A
    #endif /* WINVER >= 0x0601 */
    #define WM_MENUSELECT                   0x011F
    #define WM_MENUCHAR                     0x0120
    #define WM_ENTERIDLE                    0x0121
    #if(WINVER >= 0x0500)
    #ifndef _WIN32_WCE
    #define WM_MENURBUTTONUP                0x0122
    #define WM_MENUDRAG                     0x0123
    #define WM_MENUGETOBJECT                0x0124
    #define WM_UNINITMENUPOPUP              0x0125
    #define WM_MENUCOMMAND                  0x0126
     
    #ifndef _WIN32_WCE
    #if(_WIN32_WINNT >= 0x0500)
    #define WM_CHANGEUISTATE                0x0127
    #define WM_UPDATEUISTATE                0x0128
    #define WM_QUERYUISTATE                 0x0129
     
    /*
     * LOWORD(wParam) values in WM_*UISTATE*
     */
    #define UIS_SET                         1
    #define UIS_CLEAR                       2
    #define UIS_INITIALIZE                  3
     
    /*
     * HIWORD(wParam) values in WM_*UISTATE*
     */
    #define UISF_HIDEFOCUS                  0x1
    #define UISF_HIDEACCEL                  0x2
    #if(_WIN32_WINNT >= 0x0501)
    #define UISF_ACTIVE                     0x4
    #endif /* _WIN32_WINNT >= 0x0501 */
    #endif /* _WIN32_WINNT >= 0x0500 */
    #endif
     
    #endif
    #endif /* WINVER >= 0x0500 */
     
    #define WM_CTLCOLORMSGBOX               0x0132
    #define WM_CTLCOLOREDIT                 0x0133
    #define WM_CTLCOLORLISTBOX              0x0134
    #define WM_CTLCOLORBTN                  0x0135
    #define WM_CTLCOLORDLG                  0x0136
    #define WM_CTLCOLORSCROLLBAR            0x0137
    #define WM_CTLCOLORSTATIC               0x0138
    #define MN_GETHMENU                     0x01E1
     
    #define WM_MOUSEFIRST                   0x0200
    #define WM_MOUSEMOVE                    0x0200
    #define WM_LBUTTONDOWN                  0x0201
    #define WM_LBUTTONUP                    0x0202
    #define WM_LBUTTONDBLCLK                0x0203
    #define WM_RBUTTONDOWN                  0x0204
    #define WM_RBUTTONUP                    0x0205
    #define WM_RBUTTONDBLCLK                0x0206
    #define WM_MBUTTONDOWN                  0x0207
    #define WM_MBUTTONUP                    0x0208
    #define WM_MBUTTONDBLCLK                0x0209
    #if (_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)
    #define WM_MOUSEWHEEL                   0x020A
    #endif
    #if (_WIN32_WINNT >= 0x0500)
    #define WM_XBUTTONDOWN                  0x020B
    #define WM_XBUTTONUP                    0x020C
    #define WM_XBUTTONDBLCLK                0x020D
    #endif
    #if (_WIN32_WINNT >= 0x0600)
    #define WM_MOUSEHWHEEL                  0x020E
    #endif
     
    #if (_WIN32_WINNT >= 0x0600)
    #define WM_MOUSELAST                    0x020E
    #elif (_WIN32_WINNT >= 0x0500)
    #define WM_MOUSELAST                    0x020D
    #elif (_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)
    #define WM_MOUSELAST                    0x020A
    #else
    #define WM_MOUSELAST                    0x0209
    #endif /* (_WIN32_WINNT >= 0x0600) */
     
     
    #if(_WIN32_WINNT >= 0x0400)
    /* Value for rolling one detent */
    #define WHEEL_DELTA                     120
    #define GET_WHEEL_DELTA_WPARAM(wParam)  ((short)HIWORD(wParam))
     
    /* Setting to scroll one page for SPI_GET/SETWHEELSCROLLLINES */
    #define WHEEL_PAGESCROLL                (UINT_MAX)
    #endif /* _WIN32_WINNT >= 0x0400 */
     
    #if(_WIN32_WINNT >= 0x0500)
    #define GET_KEYSTATE_WPARAM(wParam)     (LOWORD(wParam))
    #define GET_NCHITTEST_WPARAM(wParam)    ((short)LOWORD(wParam))
    #define GET_XBUTTON_WPARAM(wParam)      (HIWORD(wParam))
     
    /* XButton values are WORD flags */
    #define XBUTTON1      0x0001
    #define XBUTTON2      0x0002
    /* Were there to be an XBUTTON3, its value would be 0x0004 */
    #endif /* _WIN32_WINNT >= 0x0500 */
     
    #define WM_PARENTNOTIFY                 0x0210
    #define WM_ENTERMENULOOP                0x0211
    #define WM_EXITMENULOOP                 0x0212
     
    #if(WINVER >= 0x0400)
    #define WM_NEXTMENU                     0x0213
    #define WM_SIZING                       0x0214
    #define WM_CAPTURECHANGED               0x0215
    #define WM_MOVING                       0x0216
    #endif /* WINVER >= 0x0400 */
     
    #if(WINVER >= 0x0400)
     
     
    #define WM_POWERBROADCAST               0x0218
     
    #ifndef _WIN32_WCE
    #define PBT_APMQUERYSUSPEND             0x0000
    #define PBT_APMQUERYSTANDBY             0x0001
     
    #define PBT_APMQUERYSUSPENDFAILED       0x0002
    #define PBT_APMQUERYSTANDBYFAILED       0x0003
     
    #define PBT_APMSUSPEND                  0x0004
    #define PBT_APMSTANDBY                  0x0005
     
    #define PBT_APMRESUMECRITICAL           0x0006
    #define PBT_APMRESUMESUSPEND            0x0007
    #define PBT_APMRESUMESTANDBY            0x0008
     
    #define PBTF_APMRESUMEFROMFAILURE       0x00000001
     
    #define PBT_APMBATTERYLOW               0x0009
    #define PBT_APMPOWERSTATUSCHANGE        0x000A
     
    #define PBT_APMOEMEVENT                 0x000B
     
     
    #define PBT_APMRESUMEAUTOMATIC          0x0012
    #if (_WIN32_WINNT >= 0x0502)
    #ifndef PBT_POWERSETTINGCHANGE
    #define PBT_POWERSETTINGCHANGE          0x8013
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    typedef struct {
        GUID PowerSetting;
        DWORD DataLength;
        UCHAR Data[1];
    } POWERBROADCAST_SETTING, *PPOWERBROADCAST_SETTING;
     
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    #endif // PBT_POWERSETTINGCHANGE
     
    #endif // (_WIN32_WINNT >= 0x0502)
    #endif
     
    #endif /* WINVER >= 0x0400 */
     
    #if(WINVER >= 0x0400)
    #define WM_DEVICECHANGE                 0x0219
    #endif /* WINVER >= 0x0400 */
     
    #define WM_MDICREATE                    0x0220
    #define WM_MDIDESTROY                   0x0221
    #define WM_MDIACTIVATE                  0x0222
    #define WM_MDIRESTORE                   0x0223
    #define WM_MDINEXT                      0x0224
    #define WM_MDIMAXIMIZE                  0x0225
    #define WM_MDITILE                      0x0226
    #define WM_MDICASCADE                   0x0227
    #define WM_MDIICONARRANGE               0x0228
    #define WM_MDIGETACTIVE                 0x0229
     
     
    #define WM_MDISETMENU                   0x0230
    #define WM_ENTERSIZEMOVE                0x0231
    #define WM_EXITSIZEMOVE                 0x0232
    #define WM_DROPFILES                    0x0233
    #define WM_MDIREFRESHMENU               0x0234
     
    #if(WINVER >= 0x0602)
    #define WM_POINTERDEVICECHANGE          0x238
    #define WM_POINTERDEVICEINRANGE         0x239
    #define WM_POINTERDEVICEOUTOFRANGE      0x23A
    #endif /* WINVER >= 0x0602 */
     
     
    #if(WINVER >= 0x0601)
    #define WM_TOUCH                        0x0240
    #endif /* WINVER >= 0x0601 */
     
    #if(WINVER >= 0x0602)
    #define WM_NCPOINTERUPDATE              0x0241
    #define WM_NCPOINTERDOWN                0x0242
    #define WM_NCPOINTERUP                  0x0243
    #define WM_POINTERUPDATE                0x0245
    #define WM_POINTERDOWN                  0x0246
    #define WM_POINTERUP                    0x0247
    #define WM_POINTERENTER                 0x0249
    #define WM_POINTERLEAVE                 0x024A
    #define WM_POINTERACTIVATE              0x024B
    #define WM_POINTERCAPTURECHANGED        0x024C
    #define WM_TOUCHHITTESTING              0x024D
    #define WM_POINTERWHEEL                 0x024E
    #define WM_POINTERHWHEEL                0x024F
    #define DM_POINTERHITTEST               0x0250
    #endif /* WINVER >= 0x0602 */
     
     
    #if(WINVER >= 0x0400)
    #define WM_IME_SETCONTEXT               0x0281
    #define WM_IME_NOTIFY                   0x0282
    #define WM_IME_CONTROL                  0x0283
    #define WM_IME_COMPOSITIONFULL          0x0284
    #define WM_IME_SELECT                   0x0285
    #define WM_IME_CHAR                     0x0286
    #endif /* WINVER >= 0x0400 */
    #if(WINVER >= 0x0500)
    #define WM_IME_REQUEST                  0x0288
    #endif /* WINVER >= 0x0500 */
    #if(WINVER >= 0x0400)
    #define WM_IME_KEYDOWN                  0x0290
    #define WM_IME_KEYUP                    0x0291
    #endif /* WINVER >= 0x0400 */
     
    #if((_WIN32_WINNT >= 0x0400) || (WINVER >= 0x0500))
    #define WM_MOUSEHOVER                   0x02A1
    #define WM_MOUSELEAVE                   0x02A3
    #endif
    #if(WINVER >= 0x0500)
    #define WM_NCMOUSEHOVER                 0x02A0
    #define WM_NCMOUSELEAVE                 0x02A2
    #endif /* WINVER >= 0x0500 */
     
    #if(_WIN32_WINNT >= 0x0501)
    #define WM_WTSSESSION_CHANGE            0x02B1
     
    #define WM_TABLET_FIRST                 0x02c0
    #define WM_TABLET_LAST                  0x02df
    #endif /* _WIN32_WINNT >= 0x0501 */
     
    #if(WINVER >= 0x0601)
    #define WM_DPICHANGED                   0x02E0
    #endif /* WINVER >= 0x0601 */
     
    #define WM_CUT                          0x0300
    #define WM_COPY                         0x0301
    #define WM_PASTE                        0x0302
    #define WM_CLEAR                        0x0303
    #define WM_UNDO                         0x0304
    #define WM_RENDERFORMAT                 0x0305
    #define WM_RENDERALLFORMATS             0x0306
    #define WM_DESTROYCLIPBOARD             0x0307
    #define WM_DRAWCLIPBOARD                0x0308
    #define WM_PAINTCLIPBOARD               0x0309
    #define WM_VSCROLLCLIPBOARD             0x030A
    #define WM_SIZECLIPBOARD                0x030B
    #define WM_ASKCBFORMATNAME              0x030C
    #define WM_CHANGECBCHAIN                0x030D
    #define WM_HSCROLLCLIPBOARD             0x030E
    #define WM_QUERYNEWPALETTE              0x030F
    #define WM_PALETTEISCHANGING            0x0310
    #define WM_PALETTECHANGED               0x0311
    #define WM_HOTKEY                       0x0312
     
    #if(WINVER >= 0x0400)
    #define WM_PRINT                        0x0317
    #define WM_PRINTCLIENT                  0x0318
    #endif /* WINVER >= 0x0400 */
     
    #if(_WIN32_WINNT >= 0x0500)
    #define WM_APPCOMMAND                   0x0319
    #endif /* _WIN32_WINNT >= 0x0500 */
     
    #if(_WIN32_WINNT >= 0x0501)
    #define WM_THEMECHANGED                 0x031A
    #endif /* _WIN32_WINNT >= 0x0501 */
     
     
    #if(_WIN32_WINNT >= 0x0501)
    #define WM_CLIPBOARDUPDATE              0x031D
    #endif /* _WIN32_WINNT >= 0x0501 */
     
    #if(_WIN32_WINNT >= 0x0600)
    #define WM_DWMCOMPOSITIONCHANGED        0x031E
    #define WM_DWMNCRENDERINGCHANGED        0x031F
    #define WM_DWMCOLORIZATIONCOLORCHANGED  0x0320
    #define WM_DWMWINDOWMAXIMIZEDCHANGE     0x0321
    #endif /* _WIN32_WINNT >= 0x0600 */
     
    #if(_WIN32_WINNT >= 0x0601)
    #define WM_DWMSENDICONICTHUMBNAIL           0x0323
    #define WM_DWMSENDICONICLIVEPREVIEWBITMAP   0x0326
    #endif /* _WIN32_WINNT >= 0x0601 */
     
     
    #if(WINVER >= 0x0600)
    #define WM_GETTITLEBARINFOEX            0x033F
    #endif /* WINVER >= 0x0600 */
     
    #if(WINVER >= 0x0400)
     
    #define WM_HANDHELDFIRST                0x0358
    #define WM_HANDHELDLAST                 0x035F
     
    #define WM_AFXFIRST                     0x0360
    #define WM_AFXLAST                      0x037F
    #endif /* WINVER >= 0x0400 */
     
    #define WM_PENWINFIRST                  0x0380
    #define WM_PENWINLAST                   0x038F
     
     
    #if(WINVER >= 0x0400)
    #define WM_APP                          0x8000
    #endif /* WINVER >= 0x0400 */
     
     
    /*
     * NOTE: All Message Numbers below 0x0400 are RESERVED.
     *
     * Private Window Messages Start Here:
     */
    #define WM_USER                         0x0400
     
    #if(WINVER >= 0x0400)
     
    /*  wParam for WM_SIZING message  */
    #define WMSZ_LEFT           1
    #define WMSZ_RIGHT          2
    #define WMSZ_TOP            3
    #define WMSZ_TOPLEFT        4
    #define WMSZ_TOPRIGHT       5
    #define WMSZ_BOTTOM         6
    #define WMSZ_BOTTOMLEFT     7
    #define WMSZ_BOTTOMRIGHT    8
    #endif /* WINVER >= 0x0400 */
     
    #ifndef NONCMESSAGES
     
    /*
     * WM_NCHITTEST and MOUSEHOOKSTRUCT Mouse Position Codes
     */
    #define HTERROR             (-2)
    #define HTTRANSPARENT       (-1)
    #define HTNOWHERE           0
    #define HTCLIENT            1
    #define HTCAPTION           2
    #define HTSYSMENU           3
    #define HTGROWBOX           4
    #define HTSIZE              HTGROWBOX
    #define HTMENU              5
    #define HTHSCROLL           6
    #define HTVSCROLL           7
    #define HTMINBUTTON         8
    #define HTMAXBUTTON         9
    #define HTLEFT              10
    #define HTRIGHT             11
    #define HTTOP               12
    #define HTTOPLEFT           13
    #define HTTOPRIGHT          14
    #define HTBOTTOM            15
    #define HTBOTTOMLEFT        16
    #define HTBOTTOMRIGHT       17
    #define HTBORDER            18
    #define HTREDUCE            HTMINBUTTON
    #define HTZOOM              HTMAXBUTTON
    #define HTSIZEFIRST         HTLEFT
    #define HTSIZELAST          HTBOTTOMRIGHT
    #if(WINVER >= 0x0400)
    #define HTOBJECT            19
    #define HTCLOSE             20
    #define HTHELP              21
    #endif /* WINVER >= 0x0400 */
     
     
    /*
     * SendMessageTimeout values
     */
    #define SMTO_NORMAL         0x0000
    #define SMTO_BLOCK          0x0001
    #define SMTO_ABORTIFHUNG    0x0002
    #if(WINVER >= 0x0500)
    #define SMTO_NOTIMEOUTIFNOTHUNG 0x0008
    #endif /* WINVER >= 0x0500 */
    #if(WINVER >= 0x0600)
    #define SMTO_ERRORONEXIT    0x0020
    #endif /* WINVER >= 0x0600 */
    #if(WINVER >= 0x0602)
    #endif /* WINVER >= 0x0602 */
     
    #endif /* !NONCMESSAGES */
     
    /*
     * WM_MOUSEACTIVATE Return Codes
     */
    #define MA_ACTIVATE         1
    #define MA_ACTIVATEANDEAT   2
    #define MA_NOACTIVATE       3
    #define MA_NOACTIVATEANDEAT 4
     
    /*
     * WM_SETICON / WM_GETICON Type Codes
     */
    #define ICON_SMALL          0
    #define ICON_BIG            1
    #if(_WIN32_WINNT >= 0x0501)
    #define ICON_SMALL2         2
    #endif /* _WIN32_WINNT >= 0x0501 */
     
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    WINUSERAPI
    UINT
    WINAPI
    RegisterWindowMessageA(
        _In_ LPCSTR lpString);
    WINUSERAPI
    UINT
    WINAPI
    RegisterWindowMessageW(
        _In_ LPCWSTR lpString);
    #ifdef UNICODE
    #define RegisterWindowMessage  RegisterWindowMessageW
    #else
    #define RegisterWindowMessage  RegisterWindowMessageA
    #endif // !UNICODE
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
     
    /*
     * WM_SIZE message wParam values
     */
    #define SIZE_RESTORED       0
    #define SIZE_MINIMIZED      1
    #define SIZE_MAXIMIZED      2
    #define SIZE_MAXSHOW        3
    #define SIZE_MAXHIDE        4
     
    /*
     * Obsolete constant names
     */
    #define SIZENORMAL          SIZE_RESTORED
    #define SIZEICONIC          SIZE_MINIMIZED
    #define SIZEFULLSCREEN      SIZE_MAXIMIZED
    #define SIZEZOOMSHOW        SIZE_MAXSHOW
    #define SIZEZOOMHIDE        SIZE_MAXHIDE
     
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    /*
     * WM_WINDOWPOSCHANGING/CHANGED struct pointed to by lParam
     */
    typedef struct tagWINDOWPOS {
        HWND    hwnd;
        HWND    hwndInsertAfter;
        int     x;
        int     y;
        int     cx;
        int     cy;
        UINT    flags;
    } WINDOWPOS, *LPWINDOWPOS, *PWINDOWPOS;
     
    /*
     * WM_NCCALCSIZE parameter structure
     */
    typedef struct tagNCCALCSIZE_PARAMS {
        RECT       rgrc[3];
        PWINDOWPOS lppos;
    } NCCALCSIZE_PARAMS, *LPNCCALCSIZE_PARAMS;
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    /*
     * WM_NCCALCSIZE "window valid rect" return values
     */
    #define WVR_ALIGNTOP        0x0010
    #define WVR_ALIGNLEFT       0x0020
    #define WVR_ALIGNBOTTOM     0x0040
    #define WVR_ALIGNRIGHT      0x0080
    #define WVR_HREDRAW         0x0100
    #define WVR_VREDRAW         0x0200
    #define WVR_REDRAW         (WVR_HREDRAW | \
                                WVR_VREDRAW)
    #define WVR_VALIDRECTS      0x0400
     
     
    #ifndef NOKEYSTATES
     
    /*
     * Key State Masks for Mouse Messages
     */
    #define MK_LBUTTON          0x0001
    #define MK_RBUTTON          0x0002
    #define MK_SHIFT            0x0004
    #define MK_CONTROL          0x0008
    #define MK_MBUTTON          0x0010
    #if(_WIN32_WINNT >= 0x0500)
    #define MK_XBUTTON1         0x0020
    #define MK_XBUTTON2         0x0040
    #endif /* _WIN32_WINNT >= 0x0500 */
     
    #endif /* !NOKEYSTATES */
     
     
    #if(_WIN32_WINNT >= 0x0400)
    #ifndef NOTRACKMOUSEEVENT
     
    #define TME_HOVER       0x00000001
    #define TME_LEAVE       0x00000002
    #if(WINVER >= 0x0500)
    #define TME_NONCLIENT   0x00000010
    #endif /* WINVER >= 0x0500 */
    #define TME_QUERY       0x40000000
    #define TME_CANCEL      0x80000000
     
     
    #define HOVER_DEFAULT   0xFFFFFFFF
    #endif /* _WIN32_WINNT >= 0x0400 */
     
    #if(_WIN32_WINNT >= 0x0400)
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    typedef struct tagTRACKMOUSEEVENT {
        DWORD cbSize;
        DWORD dwFlags;
        HWND  hwndTrack;
        DWORD dwHoverTime;
    } TRACKMOUSEEVENT, *LPTRACKMOUSEEVENT;
     
    WINUSERAPI
    BOOL
    WINAPI
    TrackMouseEvent(
        _Inout_ LPTRACKMOUSEEVENT lpEventTrack);
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    #endif /* _WIN32_WINNT >= 0x0400 */
     
    #if(_WIN32_WINNT >= 0x0400)
     
    #endif /* !NOTRACKMOUSEEVENT */
    #endif /* _WIN32_WINNT >= 0x0400 */
     
     
    #endif /* !NOWINMESSAGES */
     
    #ifndef NOWINSTYLES
     
     
    /*
     * Window Styles
     */
    #define WS_OVERLAPPED       0x00000000L
    #define WS_POPUP            0x80000000L
    #define WS_CHILD            0x40000000L
    #define WS_MINIMIZE         0x20000000L
    #define WS_VISIBLE          0x10000000L
    #define WS_DISABLED         0x08000000L
    #define WS_CLIPSIBLINGS     0x04000000L
    #define WS_CLIPCHILDREN     0x02000000L
    #define WS_MAXIMIZE         0x01000000L
    #define WS_CAPTION          0x00C00000L     /* WS_BORDER | WS_DLGFRAME  */
    #define WS_BORDER           0x00800000L
    #define WS_DLGFRAME         0x00400000L
    #define WS_VSCROLL          0x00200000L
    #define WS_HSCROLL          0x00100000L
    #define WS_SYSMENU          0x00080000L
    #define WS_THICKFRAME       0x00040000L
    #define WS_GROUP            0x00020000L
    #define WS_TABSTOP          0x00010000L
     
    #define WS_MINIMIZEBOX      0x00020000L
    #define WS_MAXIMIZEBOX      0x00010000L
     
     
    #define WS_TILED            WS_OVERLAPPED
    #define WS_ICONIC           WS_MINIMIZE
    #define WS_SIZEBOX          WS_THICKFRAME
    #define WS_TILEDWINDOW      WS_OVERLAPPEDWINDOW
     
    /*
     * Common Window Styles
     */
    #define WS_OVERLAPPEDWINDOW (WS_OVERLAPPED     | \
                                 WS_CAPTION        | \
                                 WS_SYSMENU        | \
                                 WS_THICKFRAME     | \
                                 WS_MINIMIZEBOX    | \
                                 WS_MAXIMIZEBOX)
     
    #define WS_POPUPWINDOW      (WS_POPUP          | \
                                 WS_BORDER         | \
                                 WS_SYSMENU)
     
    #define WS_CHILDWINDOW      (WS_CHILD)
     
    /*
     * Extended Window Styles
     */
    #define WS_EX_DLGMODALFRAME     0x00000001L
    #define WS_EX_NOPARENTNOTIFY    0x00000004L
    #define WS_EX_TOPMOST           0x00000008L
    #define WS_EX_ACCEPTFILES       0x00000010L
    #define WS_EX_TRANSPARENT       0x00000020L
    #if(WINVER >= 0x0400)
    #define WS_EX_MDICHILD          0x00000040L
    #define WS_EX_TOOLWINDOW        0x00000080L
    #define WS_EX_WINDOWEDGE        0x00000100L
    #define WS_EX_CLIENTEDGE        0x00000200L
    #define WS_EX_CONTEXTHELP       0x00000400L
     
    #endif /* WINVER >= 0x0400 */
    #if(WINVER >= 0x0400)
     
    #define WS_EX_RIGHT             0x00001000L
    #define WS_EX_LEFT              0x00000000L
    #define WS_EX_RTLREADING        0x00002000L
    #define WS_EX_LTRREADING        0x00000000L
    #define WS_EX_LEFTSCROLLBAR     0x00004000L
    #define WS_EX_RIGHTSCROLLBAR    0x00000000L
     
    #define WS_EX_CONTROLPARENT     0x00010000L
    #define WS_EX_STATICEDGE        0x00020000L
    #define WS_EX_APPWINDOW         0x00040000L
     
     
    #define WS_EX_OVERLAPPEDWINDOW  (WS_EX_WINDOWEDGE | WS_EX_CLIENTEDGE)
    #define WS_EX_PALETTEWINDOW     (WS_EX_WINDOWEDGE | WS_EX_TOOLWINDOW | WS_EX_TOPMOST)
     
    #endif /* WINVER >= 0x0400 */
     
    #if(_WIN32_WINNT >= 0x0500)
    #define WS_EX_LAYERED           0x00080000
     
    #endif /* _WIN32_WINNT >= 0x0500 */
     
     
    #if(WINVER >= 0x0500)
    #define WS_EX_NOINHERITLAYOUT   0x00100000L // Disable inheritence of mirroring by children
    #endif /* WINVER >= 0x0500 */
     
    #if(WINVER >= 0x0602)
    #define WS_EX_NOREDIRECTIONBITMAP 0x00200000L
    #endif /* WINVER >= 0x0602 */
     
    #if(WINVER >= 0x0500)
    #define WS_EX_LAYOUTRTL         0x00400000L // Right to left mirroring
    #endif /* WINVER >= 0x0500 */
     
    #if(_WIN32_WINNT >= 0x0501)
    #define WS_EX_COMPOSITED        0x02000000L
    #endif /* _WIN32_WINNT >= 0x0501 */
    #if(_WIN32_WINNT >= 0x0500)
    #define WS_EX_NOACTIVATE        0x08000000L
    #endif /* _WIN32_WINNT >= 0x0500 */
     
     
    /*
     * Class styles
     */
    #define CS_VREDRAW          0x0001
    #define CS_HREDRAW          0x0002
    #define CS_DBLCLKS          0x0008
    #define CS_OWNDC            0x0020
    #define CS_CLASSDC          0x0040
    #define CS_PARENTDC         0x0080
    #define CS_NOCLOSE          0x0200
    #define CS_SAVEBITS         0x0800
    #define CS_BYTEALIGNCLIENT  0x1000
    #define CS_BYTEALIGNWINDOW  0x2000
    #define CS_GLOBALCLASS      0x4000
     
    #define CS_IME              0x00010000
    #if(_WIN32_WINNT >= 0x0501)
    #define CS_DROPSHADOW       0x00020000
    #endif /* _WIN32_WINNT >= 0x0501 */
     
     
     
    #endif /* !NOWINSTYLES */
    #if(WINVER >= 0x0400)
    /* WM_PRINT flags */
    #define PRF_CHECKVISIBLE    0x00000001L
    #define PRF_NONCLIENT       0x00000002L
    #define PRF_CLIENT          0x00000004L
    #define PRF_ERASEBKGND      0x00000008L
    #define PRF_CHILDREN        0x00000010L
    #define PRF_OWNED           0x00000020L
     
    /* 3D border styles */
    #define BDR_RAISEDOUTER 0x0001
    #define BDR_SUNKENOUTER 0x0002
    #define BDR_RAISEDINNER 0x0004
    #define BDR_SUNKENINNER 0x0008
     
    #define BDR_OUTER       (BDR_RAISEDOUTER | BDR_SUNKENOUTER)
    #define BDR_INNER       (BDR_RAISEDINNER | BDR_SUNKENINNER)
    #define BDR_RAISED      (BDR_RAISEDOUTER | BDR_RAISEDINNER)
    #define BDR_SUNKEN      (BDR_SUNKENOUTER | BDR_SUNKENINNER)
     
     
    #define EDGE_RAISED     (BDR_RAISEDOUTER | BDR_RAISEDINNER)
    #define EDGE_SUNKEN     (BDR_SUNKENOUTER | BDR_SUNKENINNER)
    #define EDGE_ETCHED     (BDR_SUNKENOUTER | BDR_RAISEDINNER)
    #define EDGE_BUMP       (BDR_RAISEDOUTER | BDR_SUNKENINNER)
     
    /* Border flags */
    #define BF_LEFT         0x0001
    #define BF_TOP          0x0002
    #define BF_RIGHT        0x0004
    #define BF_BOTTOM       0x0008
     
    #define BF_TOPLEFT      (BF_TOP | BF_LEFT)
    #define BF_TOPRIGHT     (BF_TOP | BF_RIGHT)
    #define BF_BOTTOMLEFT   (BF_BOTTOM | BF_LEFT)
    #define BF_BOTTOMRIGHT  (BF_BOTTOM | BF_RIGHT)
    #define BF_RECT         (BF_LEFT | BF_TOP | BF_RIGHT | BF_BOTTOM)
     
    #define BF_DIAGONAL     0x0010
     
    // For diagonal lines, the BF_RECT flags specify the end point of the
    // vector bounded by the rectangle parameter.
    #define BF_DIAGONAL_ENDTOPRIGHT     (BF_DIAGONAL | BF_TOP | BF_RIGHT)
    #define BF_DIAGONAL_ENDTOPLEFT      (BF_DIAGONAL | BF_TOP | BF_LEFT)
    #define BF_DIAGONAL_ENDBOTTOMLEFT   (BF_DIAGONAL | BF_BOTTOM | BF_LEFT)
    #define BF_DIAGONAL_ENDBOTTOMRIGHT  (BF_DIAGONAL | BF_BOTTOM | BF_RIGHT)
     
     
    #define BF_MIDDLE       0x0800  /* Fill in the middle */
    #define BF_SOFT         0x1000  /* For softer buttons */
    #define BF_ADJUST       0x2000  /* Calculate the space left over */
    #define BF_FLAT         0x4000  /* For flat rather than 3D borders */
    #define BF_MONO         0x8000  /* For monochrome borders */
     
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    WINUSERAPI
    BOOL
    WINAPI
    DrawEdge(
        _In_ HDC hdc,
        _Inout_ LPRECT qrc,
        _In_ UINT edge,
        _In_ UINT grfFlags);
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    /* flags for DrawFrameControl */
     
    #define DFC_CAPTION             1
    #define DFC_MENU                2
    #define DFC_SCROLL              3
    #define DFC_BUTTON              4
    #if(WINVER >= 0x0500)
    #define DFC_POPUPMENU           5
    #endif /* WINVER >= 0x0500 */
     
    #define DFCS_CAPTIONCLOSE       0x0000
    #define DFCS_CAPTIONMIN         0x0001
    #define DFCS_CAPTIONMAX         0x0002
    #define DFCS_CAPTIONRESTORE     0x0003
    #define DFCS_CAPTIONHELP        0x0004
     
    #define DFCS_MENUARROW          0x0000
    #define DFCS_MENUCHECK          0x0001
    #define DFCS_MENUBULLET         0x0002
    #define DFCS_MENUARROWRIGHT     0x0004
    #define DFCS_SCROLLUP           0x0000
    #define DFCS_SCROLLDOWN         0x0001
    #define DFCS_SCROLLLEFT         0x0002
    #define DFCS_SCROLLRIGHT        0x0003
    #define DFCS_SCROLLCOMBOBOX     0x0005
    #define DFCS_SCROLLSIZEGRIP     0x0008
    #define DFCS_SCROLLSIZEGRIPRIGHT 0x0010
     
    #define DFCS_BUTTONCHECK        0x0000
    #define DFCS_BUTTONRADIOIMAGE   0x0001
    #define DFCS_BUTTONRADIOMASK    0x0002
    #define DFCS_BUTTONRADIO        0x0004
    #define DFCS_BUTTON3STATE       0x0008
    #define DFCS_BUTTONPUSH         0x0010
     
    #define DFCS_INACTIVE           0x0100
    #define DFCS_PUSHED             0x0200
    #define DFCS_CHECKED            0x0400
     
    #if(WINVER >= 0x0500)
    #define DFCS_TRANSPARENT        0x0800
    #define DFCS_HOT                0x1000
    #endif /* WINVER >= 0x0500 */
     
    #define DFCS_ADJUSTRECT         0x2000
    #define DFCS_FLAT               0x4000
    #define DFCS_MONO               0x8000
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    WINUSERAPI
    BOOL
    WINAPI
    DrawFrameControl(
        _In_ HDC,
        _Inout_ LPRECT,
        _In_ UINT,
        _In_ UINT);
     
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
     
    /* flags for DrawCaption */
    #define DC_ACTIVE           0x0001
    #define DC_SMALLCAP         0x0002
    #define DC_ICON             0x0004
    #define DC_TEXT             0x0008
    #define DC_INBUTTON         0x0010
    #if(WINVER >= 0x0500)
    #define DC_GRADIENT         0x0020
    #endif /* WINVER >= 0x0500 */
    #if(_WIN32_WINNT >= 0x0501)
    #define DC_BUTTONS          0x1000
    #endif /* _WIN32_WINNT >= 0x0501 */
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    WINUSERAPI
    BOOL
    WINAPI
    DrawCaption(
        _In_ HWND hwnd,
        _In_ HDC hdc,
        _In_ CONST RECT * lprect,
        _In_ UINT flags);
     
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    #define IDANI_OPEN          1
    #define IDANI_CAPTION       3
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    WINUSERAPI
    BOOL
    WINAPI
    DrawAnimatedRects(
        _In_opt_ HWND hwnd,
        _In_ int idAni,
        _In_ CONST RECT *lprcFrom,
        _In_ CONST RECT *lprcTo);
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    #endif /* WINVER >= 0x0400 */
     
    #ifndef NOCLIPBOARD
     
     
    /*
     * Predefined Clipboard Formats
     */
    #define CF_TEXT             1
    #define CF_BITMAP           2
    #define CF_METAFILEPICT     3
    #define CF_SYLK             4
    #define CF_DIF              5
    #define CF_TIFF             6
    #define CF_OEMTEXT          7
    #define CF_DIB              8
    #define CF_PALETTE          9
    #define CF_PENDATA          10
    #define CF_RIFF             11
    #define CF_WAVE             12
    #define CF_UNICODETEXT      13
    #define CF_ENHMETAFILE      14
    #if(WINVER >= 0x0400)
    #define CF_HDROP            15
    #define CF_LOCALE           16
    #endif /* WINVER >= 0x0400 */
    #if(WINVER >= 0x0500)
    #define CF_DIBV5            17
    #endif /* WINVER >= 0x0500 */
     
    #if(WINVER >= 0x0500)
    #define CF_MAX              18
    #elif(WINVER >= 0x0400)
    #define CF_MAX              17
    #else
    #define CF_MAX              15
    #endif
     
    #define CF_OWNERDISPLAY     0x0080
    #define CF_DSPTEXT          0x0081
    #define CF_DSPBITMAP        0x0082
    #define CF_DSPMETAFILEPICT  0x0083
    #define CF_DSPENHMETAFILE   0x008E
     
    /*
     * "Private" formats don't get GlobalFree()'d
     */
    #define CF_PRIVATEFIRST     0x0200
    #define CF_PRIVATELAST      0x02FF
     
    /*
     * "GDIOBJ" formats do get DeleteObject()'d
     */
    #define CF_GDIOBJFIRST      0x0300
    #define CF_GDIOBJLAST       0x03FF
     
     
    #endif /* !NOCLIPBOARD */
     
    /*
     * Defines for the fVirt field of the Accelerator table structure.
     */
    #define FVIRTKEY  TRUE          /* Assumed to be == TRUE */
    #define FNOINVERT 0x02
    #define FSHIFT    0x04
    #define FCONTROL  0x08
    #define FALT      0x10
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    typedef struct tagACCEL {
    #ifndef _MAC
        BYTE   fVirt;               /* Also called the flags field */
        WORD   key;
        WORD   cmd;
    #else
        WORD   fVirt;               /* Also called the flags field */
        WORD   key;
        DWORD  cmd;
    #endif
    } ACCEL, *LPACCEL;
     
    typedef struct tagPAINTSTRUCT {
        HDC         hdc;
        BOOL        fErase;
        RECT        rcPaint;
        BOOL        fRestore;
        BOOL        fIncUpdate;
        BYTE        rgbReserved[32];
    } PAINTSTRUCT, *PPAINTSTRUCT, *NPPAINTSTRUCT, *LPPAINTSTRUCT;
     
    typedef struct tagCREATESTRUCTA {
        LPVOID      lpCreateParams;
        HINSTANCE   hInstance;
        HMENU       hMenu;
        HWND        hwndParent;
        int         cy;
        int         cx;
        int         y;
        int         x;
        LONG        style;
        LPCSTR      lpszName;
        LPCSTR      lpszClass;
        DWORD       dwExStyle;
    } CREATESTRUCTA, *LPCREATESTRUCTA;
    typedef struct tagCREATESTRUCTW {
        LPVOID      lpCreateParams;
        HINSTANCE   hInstance;
        HMENU       hMenu;
        HWND        hwndParent;
        int         cy;
        int         cx;
        int         y;
        int         x;
        LONG        style;
        LPCWSTR     lpszName;
        LPCWSTR     lpszClass;
        DWORD       dwExStyle;
    } CREATESTRUCTW, *LPCREATESTRUCTW;
    #ifdef UNICODE
    typedef CREATESTRUCTW CREATESTRUCT;
    typedef LPCREATESTRUCTW LPCREATESTRUCT;
    #else
    typedef CREATESTRUCTA CREATESTRUCT;
    typedef LPCREATESTRUCTA LPCREATESTRUCT;
    #endif // UNICODE
     
    typedef struct tagWINDOWPLACEMENT {
        UINT  length;
        UINT  flags;
        UINT  showCmd;
        POINT ptMinPosition;
        POINT ptMaxPosition;
        RECT  rcNormalPosition;
    #ifdef _MAC
        RECT  rcDevice;
    #endif
    } WINDOWPLACEMENT;
    typedef WINDOWPLACEMENT *PWINDOWPLACEMENT, *LPWINDOWPLACEMENT;
     
    #define WPF_SETMINPOSITION          0x0001
    #define WPF_RESTORETOMAXIMIZED      0x0002
    #if(_WIN32_WINNT >= 0x0500)
    #define WPF_ASYNCWINDOWPLACEMENT    0x0004
    #endif /* _WIN32_WINNT >= 0x0500 */
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    #if(WINVER >= 0x0400)
     
    #pragma region Application Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)
     
    typedef struct tagNMHDR
    {
        HWND      hwndFrom;
        UINT_PTR  idFrom;
        UINT      code;         // NM_ code
    }   NMHDR;
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) */
    #pragma endregion
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    typedef NMHDR FAR * LPNMHDR;
     
    typedef struct tagSTYLESTRUCT
    {
        DWORD   styleOld;
        DWORD   styleNew;
    } STYLESTRUCT, * LPSTYLESTRUCT;
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
    #endif /* WINVER >= 0x0400 */
     
     
    /*
     * Owner draw control types
     */
    #define ODT_MENU        1
    #define ODT_LISTBOX     2
    #define ODT_COMBOBOX    3
    #define ODT_BUTTON      4
    #if(WINVER >= 0x0400)
    #define ODT_STATIC      5
    #endif /* WINVER >= 0x0400 */
     
    /*
     * Owner draw actions
     */
    #define ODA_DRAWENTIRE  0x0001
    #define ODA_SELECT      0x0002
    #define ODA_FOCUS       0x0004
     
    /*
     * Owner draw state
     */
    #define ODS_SELECTED    0x0001
    #define ODS_GRAYED      0x0002
    #define ODS_DISABLED    0x0004
    #define ODS_CHECKED     0x0008
    #define ODS_FOCUS       0x0010
    #if(WINVER >= 0x0400)
    #define ODS_DEFAULT         0x0020
    #define ODS_COMBOBOXEDIT    0x1000
    #endif /* WINVER >= 0x0400 */
    #if(WINVER >= 0x0500)
    #define ODS_HOTLIGHT        0x0040
    #define ODS_INACTIVE        0x0080
    #if(_WIN32_WINNT >= 0x0500)
    #define ODS_NOACCEL         0x0100
    #define ODS_NOFOCUSRECT     0x0200
    #endif /* _WIN32_WINNT >= 0x0500 */
    #endif /* WINVER >= 0x0500 */
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    /*
     * MEASUREITEMSTRUCT for ownerdraw
     */
    typedef struct tagMEASUREITEMSTRUCT {
        UINT       CtlType;
        UINT       CtlID;
        UINT       itemID;
        UINT       itemWidth;
        UINT       itemHeight;
        ULONG_PTR  itemData;
    } MEASUREITEMSTRUCT, NEAR *PMEASUREITEMSTRUCT, FAR *LPMEASUREITEMSTRUCT;
     
    /*
     * DRAWITEMSTRUCT for ownerdraw
     */
    typedef struct tagDRAWITEMSTRUCT {
        UINT        CtlType;
        UINT        CtlID;
        UINT        itemID;
        UINT        itemAction;
        UINT        itemState;
        HWND        hwndItem;
        HDC         hDC;
        RECT        rcItem;
        ULONG_PTR   itemData;
    } DRAWITEMSTRUCT, NEAR *PDRAWITEMSTRUCT, FAR *LPDRAWITEMSTRUCT;
     
    /*
     * DELETEITEMSTRUCT for ownerdraw
     */
    typedef struct tagDELETEITEMSTRUCT {
        UINT       CtlType;
        UINT       CtlID;
        UINT       itemID;
        HWND       hwndItem;
        ULONG_PTR  itemData;
    } DELETEITEMSTRUCT, NEAR *PDELETEITEMSTRUCT, FAR *LPDELETEITEMSTRUCT;
     
    /*
     * COMPAREITEMSTUCT for ownerdraw sorting
     */
    typedef struct tagCOMPAREITEMSTRUCT {
        UINT        CtlType;
        UINT        CtlID;
        HWND        hwndItem;
        UINT        itemID1;
        ULONG_PTR   itemData1;
        UINT        itemID2;
        ULONG_PTR   itemData2;
        DWORD       dwLocaleId;
    } COMPAREITEMSTRUCT, NEAR *PCOMPAREITEMSTRUCT, FAR *LPCOMPAREITEMSTRUCT;
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    #ifndef NOMSG
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    /*
     * Message Function Templates
     */
     
    WINUSERAPI
    BOOL
    WINAPI
    GetMessageA(
        _Out_ LPMSG lpMsg,
        _In_opt_ HWND hWnd,
        _In_ UINT wMsgFilterMin,
        _In_ UINT wMsgFilterMax);
    WINUSERAPI
    BOOL
    WINAPI
    GetMessageW(
        _Out_ LPMSG lpMsg,
        _In_opt_ HWND hWnd,
        _In_ UINT wMsgFilterMin,
        _In_ UINT wMsgFilterMax);
    #ifdef UNICODE
    #define GetMessage  GetMessageW
    #else
    #define GetMessage  GetMessageA
    #endif // !UNICODE
     
    #if defined(_M_CEE)
    #undef GetMessage
    __inline
    BOOL
    GetMessage(
        LPMSG lpMsg,
        HWND hWnd,
        UINT wMsgFilterMin,
        UINT wMsgFilterMax
        )
    {
    #ifdef UNICODE
        return GetMessageW(
    #else
        return GetMessageA(
    #endif
            lpMsg,
            hWnd,
            wMsgFilterMin,
            wMsgFilterMax
            );
    }
    #endif  /* _M_CEE */
     
     
    WINUSERAPI
    BOOL
    WINAPI
    TranslateMessage(
        _In_ CONST MSG *lpMsg);
     
    WINUSERAPI
    LRESULT
    WINAPI
    DispatchMessageA(
        _In_ CONST MSG *lpMsg);
    WINUSERAPI
    LRESULT
    WINAPI
    DispatchMessageW(
        _In_ CONST MSG *lpMsg);
    #ifdef UNICODE
    #define DispatchMessage  DispatchMessageW
    #else
    #define DispatchMessage  DispatchMessageA
    #endif // !UNICODE
     
    #if defined(_M_CEE)
    #undef DispatchMessage
    __inline
    LRESULT
    DispatchMessage(
        CONST MSG *lpMsg
        )
    {
    #ifdef UNICODE
        return DispatchMessageW(
    #else
        return DispatchMessageA(
    #endif
            lpMsg
            );
    }
    #endif  /* _M_CEE */
     
    WINUSERAPI
    BOOL
    WINAPI
    SetMessageQueue(
        _In_ int cMessagesMax);
     
    WINUSERAPI
    BOOL
    WINAPI
    PeekMessageA(
        _Out_ LPMSG lpMsg,
        _In_opt_ HWND hWnd,
        _In_ UINT wMsgFilterMin,
        _In_ UINT wMsgFilterMax,
        _In_ UINT wRemoveMsg);
    WINUSERAPI
    BOOL
    WINAPI
    PeekMessageW(
        _Out_ LPMSG lpMsg,
        _In_opt_ HWND hWnd,
        _In_ UINT wMsgFilterMin,
        _In_ UINT wMsgFilterMax,
        _In_ UINT wRemoveMsg);
    #ifdef UNICODE
    #define PeekMessage  PeekMessageW
    #else
    #define PeekMessage  PeekMessageA
    #endif // !UNICODE
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    /*
     * PeekMessage() Options
     */
    #define PM_NOREMOVE         0x0000
    #define PM_REMOVE           0x0001
    #define PM_NOYIELD          0x0002
    #if(WINVER >= 0x0500)
    #define PM_QS_INPUT         (QS_INPUT << 16)
    #define PM_QS_POSTMESSAGE   ((QS_POSTMESSAGE | QS_HOTKEY | QS_TIMER) << 16)
    #define PM_QS_PAINT         (QS_PAINT << 16)
    #define PM_QS_SENDMESSAGE   (QS_SENDMESSAGE << 16)
    #endif /* WINVER >= 0x0500 */
     
     
    #endif /* !NOMSG */
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    WINUSERAPI
    BOOL
    WINAPI
    RegisterHotKey(
        _In_opt_ HWND hWnd,
        _In_ int id,
        _In_ UINT fsModifiers,
        _In_ UINT vk);
     
    WINUSERAPI
    BOOL
    WINAPI
    UnregisterHotKey(
        _In_opt_ HWND hWnd,
        _In_ int id);
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    #define MOD_ALT         0x0001
    #define MOD_CONTROL     0x0002
    #define MOD_SHIFT       0x0004
    #define MOD_WIN         0x0008
    #if(WINVER >= 0x0601)
    #define MOD_NOREPEAT    0x4000
    #endif /* WINVER >= 0x0601 */
     
     
    #define IDHOT_SNAPWINDOW        (-1)    /* SHIFT-PRINTSCRN  */
    #define IDHOT_SNAPDESKTOP       (-2)    /* PRINTSCRN        */
     
    #ifdef WIN_INTERNAL
        #ifndef LSTRING
        #define NOLSTRING
        #endif /* LSTRING */
        #ifndef LFILEIO
        #define NOLFILEIO
        #endif /* LFILEIO */
    #endif /* WIN_INTERNAL */
     
    #if(WINVER >= 0x0400)
    #endif /* WINVER >= 0x0400 */
     
    #if(_WIN32_WINNT >= 0x0400)
    #define ENDSESSION_CLOSEAPP         0x00000001
    #endif /* _WIN32_WINNT >= 0x0400 */
    #if(_WIN32_WINNT >= 0x0400)
    #define ENDSESSION_CRITICAL         0x40000000
    #endif /* _WIN32_WINNT >= 0x0400 */
    #if(_WIN32_WINNT >= 0x0400)
    #define ENDSESSION_LOGOFF           0x80000000
    #endif /* _WIN32_WINNT >= 0x0400 */
     
    #define EWX_LOGOFF                  0x00000000
    #define EWX_SHUTDOWN                0x00000001
    #define EWX_REBOOT                  0x00000002
    #define EWX_FORCE                   0x00000004
    #define EWX_POWEROFF                0x00000008
    #if(_WIN32_WINNT >= 0x0500)
    #define EWX_FORCEIFHUNG             0x00000010
    #endif /* _WIN32_WINNT >= 0x0500 */
    #define EWX_QUICKRESOLVE            0x00000020
    #if(_WIN32_WINNT >= 0x0600)
    #define EWX_RESTARTAPPS             0x00000040
    #endif /* _WIN32_WINNT >= 0x0600 */
    #define EWX_HYBRID_SHUTDOWN         0x00400000
    #define EWX_BOOTOPTIONS             0x01000000
     
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    #define ExitWindows(dwReserved, Code) ExitWindowsEx(EWX_LOGOFF, 0xFFFFFFFF)
     
    _When_((uFlags&(EWX_POWEROFF|EWX_SHUTDOWN|EWX_FORCE))!=0,
        __drv_preferredFunction("InitiateSystemShutdownEx",
            "Legacy API. Rearchitect to avoid Reboot"))
    WINUSERAPI
    BOOL
    WINAPI
    ExitWindowsEx(
        _In_ UINT uFlags,
        _In_ DWORD dwReason);
     
    WINUSERAPI
    BOOL
    WINAPI
    SwapMouseButton(
        _In_ BOOL fSwap);
     
    WINUSERAPI
    DWORD
    WINAPI
    GetMessagePos(
        VOID);
     
    WINUSERAPI
    LONG
    WINAPI
    GetMessageTime(
        VOID);
     
    WINUSERAPI
    LPARAM
    WINAPI
    GetMessageExtraInfo(
        VOID);
     
    #if(_WIN32_WINNT >= 0x0602)
    WINUSERAPI
    DWORD
    WINAPI
    GetUnpredictedMessagePos(
        VOID);
    #endif /* _WIN32_WINNT >= 0x0602 */
     
    #if(_WIN32_WINNT >= 0x0501)
    WINUSERAPI
    BOOL
    WINAPI
    IsWow64Message(
        VOID);
    #endif /* _WIN32_WINNT >= 0x0501 */
     
    #if(WINVER >= 0x0400)
    WINUSERAPI
    LPARAM
    WINAPI
    SetMessageExtraInfo(
        _In_ LPARAM lParam);
    #endif /* WINVER >= 0x0400 */
     
    WINUSERAPI
    LRESULT
    WINAPI
    SendMessageA(
        _In_ HWND hWnd,
        _In_ UINT Msg,
        _Pre_maybenull_ _Post_valid_ WPARAM wParam,
        _Pre_maybenull_ _Post_valid_ LPARAM lParam);
    WINUSERAPI
    LRESULT
    WINAPI
    SendMessageW(
        _In_ HWND hWnd,
        _In_ UINT Msg,
        _Pre_maybenull_ _Post_valid_ WPARAM wParam,
        _Pre_maybenull_ _Post_valid_ LPARAM lParam);
    #ifdef UNICODE
    #define SendMessage  SendMessageW
    #else
    #define SendMessage  SendMessageA
    #endif // !UNICODE
     
    #if defined(_M_CEE)
    #undef SendMessage
    __inline
    LRESULT
    SendMessage(
        HWND hWnd,
        UINT Msg,
        WPARAM wParam,
        LPARAM lParam
        )
    {
    #ifdef UNICODE
        return SendMessageW(
    #else
        return SendMessageA(
    #endif
            hWnd,
            Msg,
            wParam,
            lParam
            );
    }
    #endif  /* _M_CEE */
     
     
     
    WINUSERAPI
    LRESULT
    WINAPI
    SendMessageTimeoutA(
        _In_ HWND hWnd,
        _In_ UINT Msg,
        _In_ WPARAM wParam,
        _In_ LPARAM lParam,
        _In_ UINT fuFlags,
        _In_ UINT uTimeout,
        _Out_opt_ PDWORD_PTR lpdwResult);
    WINUSERAPI
    LRESULT
    WINAPI
    SendMessageTimeoutW(
        _In_ HWND hWnd,
        _In_ UINT Msg,
        _In_ WPARAM wParam,
        _In_ LPARAM lParam,
        _In_ UINT fuFlags,
        _In_ UINT uTimeout,
        _Out_opt_ PDWORD_PTR lpdwResult);
    #ifdef UNICODE
    #define SendMessageTimeout  SendMessageTimeoutW
    #else
    #define SendMessageTimeout  SendMessageTimeoutA
    #endif // !UNICODE
     
    WINUSERAPI
    BOOL
    WINAPI
    SendNotifyMessageA(
        _In_ HWND hWnd,
        _In_ UINT Msg,
        _In_ WPARAM wParam,
        _In_ LPARAM lParam);
    WINUSERAPI
    BOOL
    WINAPI
    SendNotifyMessageW(
        _In_ HWND hWnd,
        _In_ UINT Msg,
        _In_ WPARAM wParam,
        _In_ LPARAM lParam);
    #ifdef UNICODE
    #define SendNotifyMessage  SendNotifyMessageW
    #else
    #define SendNotifyMessage  SendNotifyMessageA
    #endif // !UNICODE
     
    WINUSERAPI
    BOOL
    WINAPI
    SendMessageCallbackA(
        _In_ HWND hWnd,
        _In_ UINT Msg,
        _In_ WPARAM wParam,
        _In_ LPARAM lParam,
        _In_ SENDASYNCPROC lpResultCallBack,
        _In_ ULONG_PTR dwData);
    WINUSERAPI
    BOOL
    WINAPI
    SendMessageCallbackW(
        _In_ HWND hWnd,
        _In_ UINT Msg,
        _In_ WPARAM wParam,
        _In_ LPARAM lParam,
        _In_ SENDASYNCPROC lpResultCallBack,
        _In_ ULONG_PTR dwData);
    #ifdef UNICODE
    #define SendMessageCallback  SendMessageCallbackW
    #else
    #define SendMessageCallback  SendMessageCallbackA
    #endif // !UNICODE
     
    #if(_WIN32_WINNT >= 0x0501)
    typedef struct {
        UINT  cbSize;
        HDESK hdesk;
        HWND  hwnd;
        LUID  luid;
    } BSMINFO, *PBSMINFO;
     
    WINUSERAPI
    long
    WINAPI
    BroadcastSystemMessageExA(
        _In_ DWORD flags,
        _Inout_opt_ LPDWORD lpInfo,
        _In_ UINT Msg,
        _In_ WPARAM wParam,
        _In_ LPARAM lParam,
        _Out_opt_ PBSMINFO pbsmInfo);
    WINUSERAPI
    long
    WINAPI
    BroadcastSystemMessageExW(
        _In_ DWORD flags,
        _Inout_opt_ LPDWORD lpInfo,
        _In_ UINT Msg,
        _In_ WPARAM wParam,
        _In_ LPARAM lParam,
        _Out_opt_ PBSMINFO pbsmInfo);
    #ifdef UNICODE
    #define BroadcastSystemMessageEx  BroadcastSystemMessageExW
    #else
    #define BroadcastSystemMessageEx  BroadcastSystemMessageExA
    #endif // !UNICODE
    #endif /* _WIN32_WINNT >= 0x0501 */
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    #if(WINVER >= 0x0400)
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    #if defined(_WIN32_WINNT)
    WINUSERAPI
    long
    WINAPI
    BroadcastSystemMessageA(
        _In_ DWORD flags,
        _Inout_opt_ LPDWORD lpInfo,
        _In_ UINT Msg,
        _In_ WPARAM wParam,
        _In_ LPARAM lParam);
    WINUSERAPI
    long
    WINAPI
    BroadcastSystemMessageW(
        _In_ DWORD flags,
        _Inout_opt_ LPDWORD lpInfo,
        _In_ UINT Msg,
        _In_ WPARAM wParam,
        _In_ LPARAM lParam);
    #ifdef UNICODE
    #define BroadcastSystemMessage  BroadcastSystemMessageW
    #else
    #define BroadcastSystemMessage  BroadcastSystemMessageA
    #endif // !UNICODE
    #elif defined(_WIN32_WINDOWS)
    // The Win95 version isn't A/W decorated
    WINUSERAPI
    long
    WINAPI
    BroadcastSystemMessage(
        _In_ DWORD flags,
        _Inout_opt_ LPDWORD lpInfo,
        _In_ UINT Msg,
        _In_ WPARAM wParam,
        _In_ LPARAM lParam);
     
    #endif
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    //Broadcast Special Message Recipient list
    #define BSM_ALLCOMPONENTS       0x00000000
    #define BSM_VXDS                0x00000001
    #define BSM_NETDRIVER           0x00000002
    #define BSM_INSTALLABLEDRIVERS  0x00000004
    #define BSM_APPLICATIONS        0x00000008
    #define BSM_ALLDESKTOPS         0x00000010
     
    //Broadcast Special Message Flags
    #define BSF_QUERY               0x00000001
    #define BSF_IGNORECURRENTTASK   0x00000002
    #define BSF_FLUSHDISK           0x00000004
    #define BSF_NOHANG              0x00000008
    #define BSF_POSTMESSAGE         0x00000010
    #define BSF_FORCEIFHUNG         0x00000020
    #define BSF_NOTIMEOUTIFNOTHUNG  0x00000040
    #if(_WIN32_WINNT >= 0x0500)
    #define BSF_ALLOWSFW            0x00000080
    #define BSF_SENDNOTIFYMESSAGE   0x00000100
    #endif /* _WIN32_WINNT >= 0x0500 */
    #if(_WIN32_WINNT >= 0x0501)
    #define BSF_RETURNHDESK         0x00000200
    #define BSF_LUID                0x00000400
    #endif /* _WIN32_WINNT >= 0x0501 */
     
    #define BROADCAST_QUERY_DENY         0x424D5144  // Return this value to deny a query.
    #endif /* WINVER >= 0x0400 */
     
    // RegisterDeviceNotification
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    #if(WINVER >= 0x0500)
    typedef  PVOID           HDEVNOTIFY;
    typedef  HDEVNOTIFY     *PHDEVNOTIFY;
     
    #define DEVICE_NOTIFY_WINDOW_HANDLE          0x00000000
    #define DEVICE_NOTIFY_SERVICE_HANDLE         0x00000001
    #if(_WIN32_WINNT >= 0x0501)
    #define DEVICE_NOTIFY_ALL_INTERFACE_CLASSES  0x00000004
    #endif /* _WIN32_WINNT >= 0x0501 */
     
    WINUSERAPI
    HDEVNOTIFY
    WINAPI
    RegisterDeviceNotificationA(
        _In_ HANDLE hRecipient,
        _In_ LPVOID NotificationFilter,
        _In_ DWORD Flags);
    WINUSERAPI
    HDEVNOTIFY
    WINAPI
    RegisterDeviceNotificationW(
        _In_ HANDLE hRecipient,
        _In_ LPVOID NotificationFilter,
        _In_ DWORD Flags);
    #ifdef UNICODE
    #define RegisterDeviceNotification  RegisterDeviceNotificationW
    #else
    #define RegisterDeviceNotification  RegisterDeviceNotificationA
    #endif // !UNICODE
     
    WINUSERAPI
    BOOL
    WINAPI
    UnregisterDeviceNotification(
        _In_ HDEVNOTIFY Handle
        );
     
    #if (_WIN32_WINNT >= 0x0502)
     
    #if !defined(_HPOWERNOTIFY_DEF_)
     
    #define _HPOWERNOTIFY_DEF_
     
    typedef  PVOID           HPOWERNOTIFY;
    typedef  HPOWERNOTIFY   *PHPOWERNOTIFY;
     
    #endif
     
    WINUSERAPI
    HPOWERNOTIFY
    WINAPI
    RegisterPowerSettingNotification(
        IN HANDLE hRecipient,
        IN LPCGUID PowerSettingGuid,
        IN DWORD Flags
        );
     
    WINUSERAPI
    BOOL
    WINAPI
    UnregisterPowerSettingNotification(
        IN HPOWERNOTIFY Handle
        );
     
    WINUSERAPI
    HPOWERNOTIFY
    WINAPI
    RegisterSuspendResumeNotification (
        IN HANDLE hRecipient,
        IN DWORD Flags
        );
     
    WINUSERAPI
    BOOL
    WINAPI
    UnregisterSuspendResumeNotification (
        IN HPOWERNOTIFY Handle
        );
     
     
    #endif // (_WIN32_WINNT >= 0x0502)
    #endif /* WINVER >= 0x0500 */
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    WINUSERAPI
    BOOL
    WINAPI
    PostMessageA(
        _In_opt_ HWND hWnd,
        _In_ UINT Msg,
        _In_ WPARAM wParam,
        _In_ LPARAM lParam);
    WINUSERAPI
    BOOL
    WINAPI
    PostMessageW(
        _In_opt_ HWND hWnd,
        _In_ UINT Msg,
        _In_ WPARAM wParam,
        _In_ LPARAM lParam);
    #ifdef UNICODE
    #define PostMessage  PostMessageW
    #else
    #define PostMessage  PostMessageA
    #endif // !UNICODE
     
    WINUSERAPI
    BOOL
    WINAPI
    PostThreadMessageA(
        _In_ DWORD idThread,
        _In_ UINT Msg,
        _In_ WPARAM wParam,
        _In_ LPARAM lParam);
    WINUSERAPI
    BOOL
    WINAPI
    PostThreadMessageW(
        _In_ DWORD idThread,
        _In_ UINT Msg,
        _In_ WPARAM wParam,
        _In_ LPARAM lParam);
    #ifdef UNICODE
    #define PostThreadMessage  PostThreadMessageW
    #else
    #define PostThreadMessage  PostThreadMessageA
    #endif // !UNICODE
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    #define PostAppMessageA(idThread, wMsg, wParam, lParam)\
            PostThreadMessageA((DWORD)idThread, wMsg, wParam, lParam)
    #define PostAppMessageW(idThread, wMsg, wParam, lParam)\
            PostThreadMessageW((DWORD)idThread, wMsg, wParam, lParam)
    #ifdef UNICODE
    #define PostAppMessage  PostAppMessageW
    #else
    #define PostAppMessage  PostAppMessageA
    #endif // !UNICODE
     
    /*
     * Special HWND value for use with PostMessage() and SendMessage()
     */
    #define HWND_BROADCAST  ((HWND)0xffff)
     
    #if(WINVER >= 0x0500)
    #define HWND_MESSAGE     ((HWND)-3)
    #endif /* WINVER >= 0x0500 */
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    WINUSERAPI
    BOOL
    WINAPI
    AttachThreadInput(
        _In_ DWORD idAttach,
        _In_ DWORD idAttachTo,
        _In_ BOOL fAttach);
     
     
    WINUSERAPI
    BOOL
    WINAPI
    ReplyMessage(
        _In_ LRESULT lResult);
     
    WINUSERAPI
    BOOL
    WINAPI
    WaitMessage(
        VOID);
     
    #if (_WIN32_WINNT >= 0x602)
    #endif
     
     
    WINUSERAPI
    DWORD
    WINAPI
    WaitForInputIdle(
        _In_ HANDLE hProcess,
        _In_ DWORD dwMilliseconds);
     
    WINUSERAPI
    #ifndef _MAC
    LRESULT
    WINAPI
    #else
    LRESULT
    CALLBACK
    #endif
    DefWindowProcA(
        _In_ HWND hWnd,
        _In_ UINT Msg,
        _In_ WPARAM wParam,
        _In_ LPARAM lParam);
    WINUSERAPI
    #ifndef _MAC
    LRESULT
    WINAPI
    #else
    LRESULT
    CALLBACK
    #endif
    DefWindowProcW(
        _In_ HWND hWnd,
        _In_ UINT Msg,
        _In_ WPARAM wParam,
        _In_ LPARAM lParam);
    #ifdef UNICODE
    #define DefWindowProc  DefWindowProcW
    #else
    #define DefWindowProc  DefWindowProcA
    #endif // !UNICODE
     
    WINUSERAPI
    VOID
    WINAPI
    PostQuitMessage(
        _In_ int nExitCode);
     
    #ifdef STRICT
     
    WINUSERAPI
    LRESULT
    WINAPI
    CallWindowProcA(
        _In_ WNDPROC lpPrevWndFunc,
        _In_ HWND hWnd,
        _In_ UINT Msg,
        _In_ WPARAM wParam,
        _In_ LPARAM lParam);
    WINUSERAPI
    LRESULT
    WINAPI
    CallWindowProcW(
        _In_ WNDPROC lpPrevWndFunc,
        _In_ HWND hWnd,
        _In_ UINT Msg,
        _In_ WPARAM wParam,
        _In_ LPARAM lParam);
    #ifdef UNICODE
    #define CallWindowProc  CallWindowProcW
    #else
    #define CallWindowProc  CallWindowProcA
    #endif // !UNICODE
     
    #else /* !STRICT */
     
    WINUSERAPI
    LRESULT
    WINAPI
    CallWindowProcA(
        _In_ FARPROC lpPrevWndFunc,
        _In_ HWND hWnd,
        _In_ UINT Msg,
        _In_ WPARAM wParam,
        _In_ LPARAM lParam);
    WINUSERAPI
    LRESULT
    WINAPI
    CallWindowProcW(
        _In_ FARPROC lpPrevWndFunc,
        _In_ HWND hWnd,
        _In_ UINT Msg,
        _In_ WPARAM wParam,
        _In_ LPARAM lParam);
    #ifdef UNICODE
    #define CallWindowProc  CallWindowProcW
    #else
    #define CallWindowProc  CallWindowProcA
    #endif // !UNICODE
     
    #endif /* !STRICT */
     
    WINUSERAPI
    BOOL
    WINAPI
    InSendMessage(
        VOID);
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    #if(WINVER >= 0x0500)
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    WINUSERAPI
    DWORD
    WINAPI
    InSendMessageEx(
        _Reserved_ LPVOID lpReserved);
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    /*
     * InSendMessageEx return value
     */
    #define ISMEX_NOSEND      0x00000000
    #define ISMEX_SEND        0x00000001
    #define ISMEX_NOTIFY      0x00000002
    #define ISMEX_CALLBACK    0x00000004
    #define ISMEX_REPLIED     0x00000008
    #endif /* WINVER >= 0x0500 */
     
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    WINUSERAPI
    UINT
    WINAPI
    GetDoubleClickTime(
        VOID);
     
    WINUSERAPI
    BOOL
    WINAPI
    SetDoubleClickTime(
        _In_ UINT);
     
    WINUSERAPI
    ATOM
    WINAPI
    RegisterClassA(
        _In_ CONST WNDCLASSA *lpWndClass);
    WINUSERAPI
    ATOM
    WINAPI
    RegisterClassW(
        _In_ CONST WNDCLASSW *lpWndClass);
    #ifdef UNICODE
    #define RegisterClass  RegisterClassW
    #else
    #define RegisterClass  RegisterClassA
    #endif // !UNICODE
     
    WINUSERAPI
    BOOL
    WINAPI
    UnregisterClassA(
        _In_ LPCSTR lpClassName,
        _In_opt_ HINSTANCE hInstance);
    WINUSERAPI
    BOOL
    WINAPI
    UnregisterClassW(
        _In_ LPCWSTR lpClassName,
        _In_opt_ HINSTANCE hInstance);
    #ifdef UNICODE
    #define UnregisterClass  UnregisterClassW
    #else
    #define UnregisterClass  UnregisterClassA
    #endif // !UNICODE
     
    _Success_(return)
    WINUSERAPI
    BOOL
    WINAPI
    GetClassInfoA(
        _In_opt_ HINSTANCE hInstance,
        _In_ LPCSTR lpClassName,
        _Out_ LPWNDCLASSA lpWndClass);
    _Success_(return)
    WINUSERAPI
    BOOL
    WINAPI
    GetClassInfoW(
        _In_opt_ HINSTANCE hInstance,
        _In_ LPCWSTR lpClassName,
        _Out_ LPWNDCLASSW lpWndClass);
    #ifdef UNICODE
    #define GetClassInfo  GetClassInfoW
    #else
    #define GetClassInfo  GetClassInfoA
    #endif // !UNICODE
     
    #if(WINVER >= 0x0400)
    WINUSERAPI
    ATOM
    WINAPI
    RegisterClassExA(
        _In_ CONST WNDCLASSEXA *);
    WINUSERAPI
    ATOM
    WINAPI
    RegisterClassExW(
        _In_ CONST WNDCLASSEXW *);
    #ifdef UNICODE
    #define RegisterClassEx  RegisterClassExW
    #else
    #define RegisterClassEx  RegisterClassExA
    #endif // !UNICODE
     
    _Success_(return)
    WINUSERAPI
    BOOL
    WINAPI
    GetClassInfoExA(
        _In_opt_ HINSTANCE hInstance,
        _In_ LPCSTR lpszClass,
        _Out_ LPWNDCLASSEXA lpwcx);
    _Success_(return)
    WINUSERAPI
    BOOL
    WINAPI
    GetClassInfoExW(
        _In_opt_ HINSTANCE hInstance,
        _In_ LPCWSTR lpszClass,
        _Out_ LPWNDCLASSEXW lpwcx);
    #ifdef UNICODE
    #define GetClassInfoEx  GetClassInfoExW
    #else
    #define GetClassInfoEx  GetClassInfoExA
    #endif // !UNICODE
     
    #endif /* WINVER >= 0x0400 */
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    #define CW_USEDEFAULT       ((int)0x80000000)
     
    /*
     * Special value for CreateWindow, et al.
     */
    #define HWND_DESKTOP        ((HWND)0)
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    #if(_WIN32_WINNT >= 0x0501)
    typedef BOOLEAN (WINAPI * PREGISTERCLASSNAMEW)(LPCWSTR);
    #endif /* _WIN32_WINNT >= 0x0501 */
     
    WINUSERAPI
    HWND
    WINAPI
    CreateWindowExA(
        _In_ DWORD dwExStyle,
        _In_opt_ LPCSTR lpClassName,
        _In_opt_ LPCSTR lpWindowName,
        _In_ DWORD dwStyle,
        _In_ int X,
        _In_ int Y,
        _In_ int nWidth,
        _In_ int nHeight,
        _In_opt_ HWND hWndParent,
        _In_opt_ HMENU hMenu,
        _In_opt_ HINSTANCE hInstance,
        _In_opt_ LPVOID lpParam);
    WINUSERAPI
    HWND
    WINAPI
    CreateWindowExW(
        _In_ DWORD dwExStyle,
        _In_opt_ LPCWSTR lpClassName,
        _In_opt_ LPCWSTR lpWindowName,
        _In_ DWORD dwStyle,
        _In_ int X,
        _In_ int Y,
        _In_ int nWidth,
        _In_ int nHeight,
        _In_opt_ HWND hWndParent,
        _In_opt_ HMENU hMenu,
        _In_opt_ HINSTANCE hInstance,
        _In_opt_ LPVOID lpParam);
    #ifdef UNICODE
    #define CreateWindowEx  CreateWindowExW
    #else
    #define CreateWindowEx  CreateWindowExA
    #endif // !UNICODE
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    #define CreateWindowA(lpClassName, lpWindowName, dwStyle, x, y,\
    nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam)\
    CreateWindowExA(0L, lpClassName, lpWindowName, dwStyle, x, y,\
    nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam)
    #define CreateWindowW(lpClassName, lpWindowName, dwStyle, x, y,\
    nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam)\
    CreateWindowExW(0L, lpClassName, lpWindowName, dwStyle, x, y,\
    nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam)
    #ifdef UNICODE
    #define CreateWindow  CreateWindowW
    #else
    #define CreateWindow  CreateWindowA
    #endif // !UNICODE
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
     
    WINUSERAPI
    BOOL
    WINAPI
    IsWindow(
        _In_opt_ HWND hWnd);
     
     
    WINUSERAPI
    BOOL
    WINAPI
    IsMenu(
        _In_ HMENU hMenu);
     
    WINUSERAPI
    BOOL
    WINAPI
    IsChild(
        _In_ HWND hWndParent,
        _In_ HWND hWnd);
     
    WINUSERAPI
    BOOL
    WINAPI
    DestroyWindow(
        _In_ HWND hWnd);
     
    WINUSERAPI
    BOOL
    WINAPI
    ShowWindow(
        _In_ HWND hWnd,
        _In_ int nCmdShow);
     
    #if(WINVER >= 0x0500)
    WINUSERAPI
    BOOL
    WINAPI
    AnimateWindow(
        _In_ HWND hWnd,
        _In_ DWORD dwTime,
        _In_ DWORD dwFlags);
    #endif /* WINVER >= 0x0500 */
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    #if(_WIN32_WINNT >= 0x0500)
    #if defined(_WINGDI_) && !defined(NOGDI)
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    WINUSERAPI
    BOOL
    WINAPI
    UpdateLayeredWindow(
        _In_ HWND hWnd,
        _In_opt_ HDC hdcDst,
        _In_opt_ POINT* pptDst,
        _In_opt_ SIZE* psize,
        _In_opt_ HDC hdcSrc,
        _In_opt_ POINT* pptSrc,
        _In_ COLORREF crKey,
        _In_opt_ BLENDFUNCTION* pblend,
        _In_ DWORD dwFlags);
     
    /*
     * Layered Window Update information
     */
    typedef struct tagUPDATELAYEREDWINDOWINFO
    {
        DWORD cbSize;
        HDC hdcDst;
        const POINT* pptDst;
        const SIZE* psize;
        HDC hdcSrc;
        const POINT* pptSrc;
        COLORREF crKey;
        const BLENDFUNCTION* pblend;
        DWORD dwFlags;
        const RECT* prcDirty;
    } UPDATELAYEREDWINDOWINFO, *PUPDATELAYEREDWINDOWINFO;
     
     
    #if (_WIN32_WINNT < 0x0502)
    typedef
    #endif /* _WIN32_WINNT < 0x0502 */
    WINUSERAPI
    BOOL
    WINAPI
    UpdateLayeredWindowIndirect(
        _In_ HWND hWnd,
        _In_ const UPDATELAYEREDWINDOWINFO* pULWInfo);
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    #endif
     
    #if(_WIN32_WINNT >= 0x0501)
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    WINUSERAPI
    BOOL
    WINAPI
    GetLayeredWindowAttributes(
        _In_ HWND hwnd,
        _Out_opt_ COLORREF* pcrKey,
        _Out_opt_ BYTE* pbAlpha,
        _Out_opt_ DWORD* pdwFlags);
     
    #define PW_CLIENTONLY           0x00000001
     
    #if(_WIN32_WINNT >= 0x0603)
    #define PW_RENDERFULLCONTENT    0x00000002
    #endif /* _WIN32_WINNT >= 0x0603 */
     
     
    WINUSERAPI
    BOOL
    WINAPI
    PrintWindow(
        _In_ HWND hwnd,
        _In_ HDC hdcBlt,
        _In_ UINT nFlags);
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    #endif /* _WIN32_WINNT >= 0x0501 */
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    WINUSERAPI
    BOOL
    WINAPI
    SetLayeredWindowAttributes(
        _In_ HWND hwnd,
        _In_ COLORREF crKey,
        _In_ BYTE bAlpha,
        _In_ DWORD dwFlags);
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    #define LWA_COLORKEY            0x00000001
    #define LWA_ALPHA               0x00000002
     
     
    #define ULW_COLORKEY            0x00000001
    #define ULW_ALPHA               0x00000002
    #define ULW_OPAQUE              0x00000004
     
    #define ULW_EX_NORESIZE         0x00000008
     
    #endif /* _WIN32_WINNT >= 0x0500 */
     
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
     
    #if(WINVER >= 0x0400)
    WINUSERAPI
    BOOL
    WINAPI
    ShowWindowAsync(
        _In_  HWND hWnd,
        _In_  int nCmdShow);
    #endif /* WINVER >= 0x0400 */
     
    WINUSERAPI
    BOOL
    WINAPI
    FlashWindow(
        _In_  HWND hWnd,
        _In_  BOOL bInvert);
     
    #if(WINVER >= 0x0500)
    typedef struct {
        UINT  cbSize;
        HWND  hwnd;
        DWORD dwFlags;
        UINT  uCount;
        DWORD dwTimeout;
    } FLASHWINFO, *PFLASHWINFO;
     
    WINUSERAPI
    BOOL
    WINAPI
    FlashWindowEx(
        _In_ PFLASHWINFO pfwi);
     
    #define FLASHW_STOP         0
    #define FLASHW_CAPTION      0x00000001
    #define FLASHW_TRAY         0x00000002
    #define FLASHW_ALL          (FLASHW_CAPTION | FLASHW_TRAY)
    #define FLASHW_TIMER        0x00000004
    #define FLASHW_TIMERNOFG    0x0000000C
     
    #endif /* WINVER >= 0x0500 */
     
    WINUSERAPI
    BOOL
    WINAPI
    ShowOwnedPopups(
        _In_  HWND hWnd,
        _In_  BOOL fShow);
     
    WINUSERAPI
    BOOL
    WINAPI
    OpenIcon(
        _In_  HWND hWnd);
     
    WINUSERAPI
    BOOL
    WINAPI
    CloseWindow(
        _In_  HWND hWnd);
     
    WINUSERAPI
    BOOL
    WINAPI
    MoveWindow(
        _In_ HWND hWnd,
        _In_ int X,
        _In_ int Y,
        _In_ int nWidth,
        _In_ int nHeight,
        _In_ BOOL bRepaint);
     
    WINUSERAPI
    BOOL
    WINAPI
    SetWindowPos(
        _In_ HWND hWnd,
        _In_opt_ HWND hWndInsertAfter,
        _In_ int X,
        _In_ int Y,
        _In_ int cx,
        _In_ int cy,
        _In_ UINT uFlags);
     
    WINUSERAPI
    BOOL
    WINAPI
    GetWindowPlacement(
        _In_ HWND hWnd,
        _Inout_ WINDOWPLACEMENT *lpwndpl);
     
    WINUSERAPI
    BOOL
    WINAPI
    SetWindowPlacement(
        _In_ HWND hWnd,
        _In_ CONST WINDOWPLACEMENT *lpwndpl);
     
    #if(_WIN32_WINNT >= 0x0601)
    #define WDA_NONE        0x00000000
    #define WDA_MONITOR     0x00000001
     
     
    WINUSERAPI
    BOOL
    WINAPI
    GetWindowDisplayAffinity(
        _In_ HWND hWnd,
        _Out_ DWORD* pdwAffinity);
     
    WINUSERAPI
    BOOL
    WINAPI
    SetWindowDisplayAffinity(
        _In_ HWND hWnd,
        _In_ DWORD dwAffinity);
     
    #endif /* _WIN32_WINNT >= 0x0601 */
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    #ifndef NODEFERWINDOWPOS
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    WINUSERAPI
    HDWP
    WINAPI
    BeginDeferWindowPos(
        _In_ int nNumWindows);
     
    WINUSERAPI
    HDWP
    WINAPI
    DeferWindowPos(
        _In_ HDWP hWinPosInfo,
        _In_ HWND hWnd,
        _In_opt_ HWND hWndInsertAfter,
        _In_ int x,
        _In_ int y,
        _In_ int cx,
        _In_ int cy,
        _In_ UINT uFlags);
     
     
    WINUSERAPI
    BOOL
    WINAPI
    EndDeferWindowPos(
        _In_ HDWP hWinPosInfo);
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    #endif /* !NODEFERWINDOWPOS */
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    WINUSERAPI
    BOOL
    WINAPI
    IsWindowVisible(
        _In_ HWND hWnd);
     
    WINUSERAPI
    BOOL
    WINAPI
    IsIconic(
        _In_ HWND hWnd);
     
    WINUSERAPI
    BOOL
    WINAPI
    AnyPopup(
        VOID);
     
    WINUSERAPI
    BOOL
    WINAPI
    BringWindowToTop(
        _In_ HWND hWnd);
     
    WINUSERAPI
    BOOL
    WINAPI
    IsZoomed(
        _In_ HWND hWnd);
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    /*
     * SetWindowPos Flags
     */
    #define SWP_NOSIZE          0x0001
    #define SWP_NOMOVE          0x0002
    #define SWP_NOZORDER        0x0004
    #define SWP_NOREDRAW        0x0008
    #define SWP_NOACTIVATE      0x0010
    #define SWP_FRAMECHANGED    0x0020  /* The frame changed: send WM_NCCALCSIZE */
    #define SWP_SHOWWINDOW      0x0040
    #define SWP_HIDEWINDOW      0x0080
    #define SWP_NOCOPYBITS      0x0100
    #define SWP_NOOWNERZORDER   0x0200  /* Don't do owner Z ordering */
    #define SWP_NOSENDCHANGING  0x0400  /* Don't send WM_WINDOWPOSCHANGING */
     
    #define SWP_DRAWFRAME       SWP_FRAMECHANGED
    #define SWP_NOREPOSITION    SWP_NOOWNERZORDER
     
    #if(WINVER >= 0x0400)
    #define SWP_DEFERERASE      0x2000
    #define SWP_ASYNCWINDOWPOS  0x4000
    #endif /* WINVER >= 0x0400 */
     
     
    #define HWND_TOP        ((HWND)0)
    #define HWND_BOTTOM     ((HWND)1)
    #define HWND_TOPMOST    ((HWND)-1)
    #define HWND_NOTOPMOST  ((HWND)-2)
     
    #ifndef NOCTLMGR
     
    /*
     * WARNING:
     * The following structures must NOT be DWORD padded because they are
     * followed by strings, etc that do not have to be DWORD aligned.
     */
    #include <pshpack2.h>
     
    #pragma region Application Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)
     
    /*
     * original NT 32 bit dialog template:
     */
    typedef struct {
        DWORD style;
        DWORD dwExtendedStyle;
        WORD cdit;
        short x;
        short y;
        short cx;
        short cy;
    } DLGTEMPLATE;
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) */
    #pragma endregion
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    typedef DLGTEMPLATE *LPDLGTEMPLATEA;
    typedef DLGTEMPLATE *LPDLGTEMPLATEW;
    #ifdef UNICODE
    typedef LPDLGTEMPLATEW LPDLGTEMPLATE;
    #else
    typedef LPDLGTEMPLATEA LPDLGTEMPLATE;
    #endif // UNICODE
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    #pragma region Application Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)
     
    typedef CONST DLGTEMPLATE *LPCDLGTEMPLATEA;
    typedef CONST DLGTEMPLATE *LPCDLGTEMPLATEW;
    #ifdef UNICODE
    typedef LPCDLGTEMPLATEW LPCDLGTEMPLATE;
    #else
    typedef LPCDLGTEMPLATEA LPCDLGTEMPLATE;
    #endif // UNICODE
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) */
    #pragma endregion
     
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    /*
     * 32 bit Dialog item template.
     */
    typedef struct {
        DWORD style;
        DWORD dwExtendedStyle;
        short x;
        short y;
        short cx;
        short cy;
        WORD id;
    } DLGITEMTEMPLATE;
    typedef DLGITEMTEMPLATE *PDLGITEMTEMPLATEA;
    typedef DLGITEMTEMPLATE *PDLGITEMTEMPLATEW;
    #ifdef UNICODE
    typedef PDLGITEMTEMPLATEW PDLGITEMTEMPLATE;
    #else
    typedef PDLGITEMTEMPLATEA PDLGITEMTEMPLATE;
    #endif // UNICODE
    typedef DLGITEMTEMPLATE *LPDLGITEMTEMPLATEA;
    typedef DLGITEMTEMPLATE *LPDLGITEMTEMPLATEW;
    #ifdef UNICODE
    typedef LPDLGITEMTEMPLATEW LPDLGITEMTEMPLATE;
    #else
    typedef LPDLGITEMTEMPLATEA LPDLGITEMTEMPLATE;
    #endif // UNICODE
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
     
    #include <poppack.h> /* Resume normal packing */
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    WINUSERAPI
    HWND
    WINAPI
    CreateDialogParamA(
        _In_opt_ HINSTANCE hInstance,
        _In_ LPCSTR lpTemplateName,
        _In_opt_ HWND hWndParent,
        _In_opt_ DLGPROC lpDialogFunc,
        _In_ LPARAM dwInitParam);
    WINUSERAPI
    HWND
    WINAPI
    CreateDialogParamW(
        _In_opt_ HINSTANCE hInstance,
        _In_ LPCWSTR lpTemplateName,
        _In_opt_ HWND hWndParent,
        _In_opt_ DLGPROC lpDialogFunc,
        _In_ LPARAM dwInitParam);
    #ifdef UNICODE
    #define CreateDialogParam  CreateDialogParamW
    #else
    #define CreateDialogParam  CreateDialogParamA
    #endif // !UNICODE
     
    WINUSERAPI
    HWND
    WINAPI
    CreateDialogIndirectParamA(
        _In_opt_ HINSTANCE hInstance,
        _In_ LPCDLGTEMPLATEA lpTemplate,
        _In_opt_ HWND hWndParent,
        _In_opt_ DLGPROC lpDialogFunc,
        _In_ LPARAM dwInitParam);
    WINUSERAPI
    HWND
    WINAPI
    CreateDialogIndirectParamW(
        _In_opt_ HINSTANCE hInstance,
        _In_ LPCDLGTEMPLATEW lpTemplate,
        _In_opt_ HWND hWndParent,
        _In_opt_ DLGPROC lpDialogFunc,
        _In_ LPARAM dwInitParam);
    #ifdef UNICODE
    #define CreateDialogIndirectParam  CreateDialogIndirectParamW
    #else
    #define CreateDialogIndirectParam  CreateDialogIndirectParamA
    #endif // !UNICODE
     
    #define CreateDialogA(hInstance, lpName, hWndParent, lpDialogFunc) \
    CreateDialogParamA(hInstance, lpName, hWndParent, lpDialogFunc, 0L)
    #define CreateDialogW(hInstance, lpName, hWndParent, lpDialogFunc) \
    CreateDialogParamW(hInstance, lpName, hWndParent, lpDialogFunc, 0L)
    #ifdef UNICODE
    #define CreateDialog  CreateDialogW
    #else
    #define CreateDialog  CreateDialogA
    #endif // !UNICODE
     
    #define CreateDialogIndirectA(hInstance, lpTemplate, hWndParent, lpDialogFunc) \
    CreateDialogIndirectParamA(hInstance, lpTemplate, hWndParent, lpDialogFunc, 0L)
    #define CreateDialogIndirectW(hInstance, lpTemplate, hWndParent, lpDialogFunc) \
    CreateDialogIndirectParamW(hInstance, lpTemplate, hWndParent, lpDialogFunc, 0L)
    #ifdef UNICODE
    #define CreateDialogIndirect  CreateDialogIndirectW
    #else
    #define CreateDialogIndirect  CreateDialogIndirectA
    #endif // !UNICODE
     
    WINUSERAPI
    INT_PTR
    WINAPI
    DialogBoxParamA(
        _In_opt_ HINSTANCE hInstance,
        _In_ LPCSTR lpTemplateName,
        _In_opt_ HWND hWndParent,
        _In_opt_ DLGPROC lpDialogFunc,
        _In_ LPARAM dwInitParam);
    WINUSERAPI
    INT_PTR
    WINAPI
    DialogBoxParamW(
        _In_opt_ HINSTANCE hInstance,
        _In_ LPCWSTR lpTemplateName,
        _In_opt_ HWND hWndParent,
        _In_opt_ DLGPROC lpDialogFunc,
        _In_ LPARAM dwInitParam);
    #ifdef UNICODE
    #define DialogBoxParam  DialogBoxParamW
    #else
    #define DialogBoxParam  DialogBoxParamA
    #endif // !UNICODE
     
    WINUSERAPI
    INT_PTR
    WINAPI
    DialogBoxIndirectParamA(
        _In_opt_ HINSTANCE hInstance,
        _In_ LPCDLGTEMPLATEA hDialogTemplate,
        _In_opt_ HWND hWndParent,
        _In_opt_ DLGPROC lpDialogFunc,
        _In_ LPARAM dwInitParam);
    WINUSERAPI
    INT_PTR
    WINAPI
    DialogBoxIndirectParamW(
        _In_opt_ HINSTANCE hInstance,
        _In_ LPCDLGTEMPLATEW hDialogTemplate,
        _In_opt_ HWND hWndParent,
        _In_opt_ DLGPROC lpDialogFunc,
        _In_ LPARAM dwInitParam);
    #ifdef UNICODE
    #define DialogBoxIndirectParam  DialogBoxIndirectParamW
    #else
    #define DialogBoxIndirectParam  DialogBoxIndirectParamA
    #endif // !UNICODE
     
    #define DialogBoxA(hInstance, lpTemplate, hWndParent, lpDialogFunc) \
    DialogBoxParamA(hInstance, lpTemplate, hWndParent, lpDialogFunc, 0L)
    #define DialogBoxW(hInstance, lpTemplate, hWndParent, lpDialogFunc) \
    DialogBoxParamW(hInstance, lpTemplate, hWndParent, lpDialogFunc, 0L)
    #ifdef UNICODE
    #define DialogBox  DialogBoxW
    #else
    #define DialogBox  DialogBoxA
    #endif // !UNICODE
     
    #define DialogBoxIndirectA(hInstance, lpTemplate, hWndParent, lpDialogFunc) \
    DialogBoxIndirectParamA(hInstance, lpTemplate, hWndParent, lpDialogFunc, 0L)
    #define DialogBoxIndirectW(hInstance, lpTemplate, hWndParent, lpDialogFunc) \
    DialogBoxIndirectParamW(hInstance, lpTemplate, hWndParent, lpDialogFunc, 0L)
    #ifdef UNICODE
    #define DialogBoxIndirect  DialogBoxIndirectW
    #else
    #define DialogBoxIndirect  DialogBoxIndirectA
    #endif // !UNICODE
     
    WINUSERAPI
    BOOL
    WINAPI
    EndDialog(
        _In_ HWND hDlg,
        _In_ INT_PTR nResult);
     
    WINUSERAPI
    HWND
    WINAPI
    GetDlgItem(
        _In_opt_ HWND hDlg,
        _In_ int nIDDlgItem);
     
    WINUSERAPI
    BOOL
    WINAPI
    SetDlgItemInt(
        _In_ HWND hDlg,
        _In_ int nIDDlgItem,
        _In_ UINT uValue,
        _In_ BOOL bSigned);
     
    WINUSERAPI
    UINT
    WINAPI
    GetDlgItemInt(
        _In_ HWND hDlg,
        _In_ int nIDDlgItem,
        _Out_opt_ BOOL *lpTranslated,
        _In_ BOOL bSigned);
     
    WINUSERAPI
    BOOL
    WINAPI
    SetDlgItemTextA(
        _In_ HWND hDlg,
        _In_ int nIDDlgItem,
        _In_ LPCSTR lpString);
    WINUSERAPI
    BOOL
    WINAPI
    SetDlgItemTextW(
        _In_ HWND hDlg,
        _In_ int nIDDlgItem,
        _In_ LPCWSTR lpString);
    #ifdef UNICODE
    #define SetDlgItemText  SetDlgItemTextW
    #else
    #define SetDlgItemText  SetDlgItemTextA
    #endif // !UNICODE
     
    _Ret_range_(0, cchMax)
    WINUSERAPI
    UINT
    WINAPI
    GetDlgItemTextA(
        _In_ HWND hDlg,
        _In_ int nIDDlgItem,
        _Out_writes_(cchMax) LPSTR lpString,
        _In_ int cchMax);
    _Ret_range_(0, cchMax)
    WINUSERAPI
    UINT
    WINAPI
    GetDlgItemTextW(
        _In_ HWND hDlg,
        _In_ int nIDDlgItem,
        _Out_writes_(cchMax) LPWSTR lpString,
        _In_ int cchMax);
    #ifdef UNICODE
    #define GetDlgItemText  GetDlgItemTextW
    #else
    #define GetDlgItemText  GetDlgItemTextA
    #endif // !UNICODE
     
    WINUSERAPI
    BOOL
    WINAPI
    CheckDlgButton(
        _In_ HWND hDlg,
        _In_ int nIDButton,
        _In_ UINT uCheck);
     
    WINUSERAPI
    BOOL
    WINAPI
    CheckRadioButton(
        _In_ HWND hDlg,
        _In_ int nIDFirstButton,
        _In_ int nIDLastButton,
        _In_ int nIDCheckButton);
     
    WINUSERAPI
    UINT
    WINAPI
    IsDlgButtonChecked(
        _In_ HWND hDlg,
        _In_ int nIDButton);
     
    WINUSERAPI
    LRESULT
    WINAPI
    SendDlgItemMessageA(
        _In_ HWND hDlg,
        _In_ int nIDDlgItem,
        _In_ UINT Msg,
        _In_ WPARAM wParam,
        _In_ LPARAM lParam);
    WINUSERAPI
    LRESULT
    WINAPI
    SendDlgItemMessageW(
        _In_ HWND hDlg,
        _In_ int nIDDlgItem,
        _In_ UINT Msg,
        _In_ WPARAM wParam,
        _In_ LPARAM lParam);
    #ifdef UNICODE
    #define SendDlgItemMessage  SendDlgItemMessageW
    #else
    #define SendDlgItemMessage  SendDlgItemMessageA
    #endif // !UNICODE
     
    WINUSERAPI
    HWND
    WINAPI
    GetNextDlgGroupItem(
        _In_ HWND hDlg,
        _In_opt_ HWND hCtl,
        _In_ BOOL bPrevious);
     
    WINUSERAPI
    HWND
    WINAPI
    GetNextDlgTabItem(
        _In_ HWND hDlg,
        _In_opt_ HWND hCtl,
        _In_ BOOL bPrevious);
     
    WINUSERAPI
    int
    WINAPI
    GetDlgCtrlID(
        _In_ HWND hWnd);
     
    WINUSERAPI
    long
    WINAPI
    GetDialogBaseUnits(VOID);
     
    WINUSERAPI
    #ifndef _MAC
    LRESULT
    WINAPI
    #else
    LRESULT
    CALLBACK
    #endif
    DefDlgProcA(
        _In_ HWND hDlg,
        _In_ UINT Msg,
        _In_ WPARAM wParam,
        _In_ LPARAM lParam);
    WINUSERAPI
    #ifndef _MAC
    LRESULT
    WINAPI
    #else
    LRESULT
    CALLBACK
    #endif
    DefDlgProcW(
        _In_ HWND hDlg,
        _In_ UINT Msg,
        _In_ WPARAM wParam,
        _In_ LPARAM lParam);
    #ifdef UNICODE
    #define DefDlgProc  DefDlgProcW
    #else
    #define DefDlgProc  DefDlgProcA
    #endif // !UNICODE
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    /*
     * Window extra byted needed for private dialog classes.
     */
    #ifndef _MAC
    #define DLGWINDOWEXTRA 30
    #else
    #define DLGWINDOWEXTRA 48
    #endif
     
    #endif /* !NOCTLMGR */
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    #ifndef NOMSG
     
    WINUSERAPI
    BOOL
    WINAPI
    CallMsgFilterA(
        _In_ LPMSG lpMsg,
        _In_ int nCode);
    WINUSERAPI
    BOOL
    WINAPI
    CallMsgFilterW(
        _In_ LPMSG lpMsg,
        _In_ int nCode);
    #ifdef UNICODE
    #define CallMsgFilter  CallMsgFilterW
    #else
    #define CallMsgFilter  CallMsgFilterA
    #endif // !UNICODE
     
    #endif /* !NOMSG */
     
    #ifndef NOCLIPBOARD
     
    /*
     * Clipboard Manager Functions
     */
     
    WINUSERAPI
    BOOL
    WINAPI
    OpenClipboard(
        _In_opt_ HWND hWndNewOwner);
     
    WINUSERAPI
    BOOL
    WINAPI
    CloseClipboard(
        VOID);
     
     
    #if(WINVER >= 0x0500)
     
    WINUSERAPI
    DWORD
    WINAPI
    GetClipboardSequenceNumber(
        VOID);
     
    #endif /* WINVER >= 0x0500 */
     
    WINUSERAPI
    HWND
    WINAPI
    GetClipboardOwner(
        VOID);
     
    WINUSERAPI
    HWND
    WINAPI
    SetClipboardViewer(
        _In_ HWND hWndNewViewer);
     
    WINUSERAPI
    HWND
    WINAPI
    GetClipboardViewer(
        VOID);
     
    WINUSERAPI
    BOOL
    WINAPI
    ChangeClipboardChain(
        _In_ HWND hWndRemove,
        _In_ HWND hWndNewNext);
     
    WINUSERAPI
    HANDLE
    WINAPI
    SetClipboardData(
        _In_ UINT uFormat,
        _In_opt_ HANDLE hMem);
     
    WINUSERAPI
    HANDLE
    WINAPI
    GetClipboardData(
        _In_ UINT uFormat);
     
    WINUSERAPI
    UINT
    WINAPI
    RegisterClipboardFormatA(
        _In_ LPCSTR lpszFormat);
    WINUSERAPI
    UINT
    WINAPI
    RegisterClipboardFormatW(
        _In_ LPCWSTR lpszFormat);
    #ifdef UNICODE
    #define RegisterClipboardFormat  RegisterClipboardFormatW
    #else
    #define RegisterClipboardFormat  RegisterClipboardFormatA
    #endif // !UNICODE
     
    WINUSERAPI
    int
    WINAPI
    CountClipboardFormats(
        VOID);
     
    WINUSERAPI
    UINT
    WINAPI
    EnumClipboardFormats(
        _In_ UINT format);
     
    WINUSERAPI
    int
    WINAPI
    GetClipboardFormatNameA(
        _In_ UINT format,
        _Out_writes_(cchMaxCount) LPSTR lpszFormatName,
        _In_ int cchMaxCount);
    WINUSERAPI
    int
    WINAPI
    GetClipboardFormatNameW(
        _In_ UINT format,
        _Out_writes_(cchMaxCount) LPWSTR lpszFormatName,
        _In_ int cchMaxCount);
    #ifdef UNICODE
    #define GetClipboardFormatName  GetClipboardFormatNameW
    #else
    #define GetClipboardFormatName  GetClipboardFormatNameA
    #endif // !UNICODE
     
    WINUSERAPI
    BOOL
    WINAPI
    EmptyClipboard(
        VOID);
     
    WINUSERAPI
    BOOL
    WINAPI
    IsClipboardFormatAvailable(
        _In_ UINT format);
     
    WINUSERAPI
    int
    WINAPI
    GetPriorityClipboardFormat(
        _In_reads_(cFormats) UINT *paFormatPriorityList,
        _In_ int cFormats);
     
    WINUSERAPI
    HWND
    WINAPI
    GetOpenClipboardWindow(
        VOID);
     
    #if(WINVER >= 0x0600)
    WINUSERAPI
    BOOL
    WINAPI
    AddClipboardFormatListener(
        _In_ HWND hwnd);
     
    WINUSERAPI
    BOOL
    WINAPI
    RemoveClipboardFormatListener(
        _In_ HWND hwnd);
     
    WINUSERAPI
    BOOL
    WINAPI
    GetUpdatedClipboardFormats(
        _Out_writes_(cFormats) PUINT lpuiFormats,
        _In_ UINT cFormats,
        _Out_ PUINT pcFormatsOut);
    #endif /* WINVER >= 0x0600 */
     
    #endif /* !NOCLIPBOARD */
     
    /*
     * Character Translation Routines
     */
     
    WINUSERAPI
    BOOL
    WINAPI
    CharToOemA(
        _In_ LPCSTR pSrc,
        _Out_writes_(_Inexpressible_(strlen(pSrc) + 1)) LPSTR pDst);
    WINUSERAPI
    BOOL
    WINAPI
    CharToOemW(
        _In_ LPCWSTR pSrc,
        _Out_writes_(_Inexpressible_(strlen(pSrc) + 1)) LPSTR pDst);
    #ifdef UNICODE
    #define CharToOem  CharToOemW
    #else
    #define CharToOem  CharToOemA
    #endif // !UNICODE
     
    __drv_preferredFunction("OemToCharBuff","Does not validate buffer size")
    WINUSERAPI
    BOOL
    WINAPI
    OemToCharA(
        _In_ LPCSTR pSrc,
        _Out_writes_(_Inexpressible_(strlen(pSrc) + 1)) LPSTR pDst);
    __drv_preferredFunction("OemToCharBuff","Does not validate buffer size")
    WINUSERAPI
    BOOL
    WINAPI
    OemToCharW(
        _In_ LPCSTR pSrc,
        _Out_writes_(_Inexpressible_(strlen(pSrc) + 1)) LPWSTR pDst);
    #ifdef UNICODE
    #define OemToChar  OemToCharW
    #else
    #define OemToChar  OemToCharA
    #endif // !UNICODE
     
    WINUSERAPI
    BOOL
    WINAPI
    CharToOemBuffA(
        _In_ LPCSTR lpszSrc,
        _Out_writes_(cchDstLength) LPSTR lpszDst,
        _In_ DWORD cchDstLength);
    WINUSERAPI
    BOOL
    WINAPI
    CharToOemBuffW(
        _In_ LPCWSTR lpszSrc,
        _Out_writes_(cchDstLength) LPSTR lpszDst,
        _In_ DWORD cchDstLength);
    #ifdef UNICODE
    #define CharToOemBuff  CharToOemBuffW
    #else
    #define CharToOemBuff  CharToOemBuffA
    #endif // !UNICODE
     
    WINUSERAPI
    BOOL
    WINAPI
    OemToCharBuffA(
        _In_ LPCSTR lpszSrc,
        _Out_writes_(cchDstLength) LPSTR lpszDst,
        _In_ DWORD cchDstLength);
    WINUSERAPI
    BOOL
    WINAPI
    OemToCharBuffW(
        _In_ LPCSTR lpszSrc,
        _Out_writes_(cchDstLength) LPWSTR lpszDst,
        _In_ DWORD cchDstLength);
    #ifdef UNICODE
    #define OemToCharBuff  OemToCharBuffW
    #else
    #define OemToCharBuff  OemToCharBuffA
    #endif // !UNICODE
     
    WINUSERAPI
    LPSTR
    WINAPI
    CharUpperA(
        _Inout_ LPSTR lpsz);
    WINUSERAPI
    LPWSTR
    WINAPI
    CharUpperW(
        _Inout_ LPWSTR lpsz);
    #ifdef UNICODE
    #define CharUpper  CharUpperW
    #else
    #define CharUpper  CharUpperA
    #endif // !UNICODE
     
    WINUSERAPI
    DWORD
    WINAPI
    CharUpperBuffA(
        _Inout_updates_(cchLength) LPSTR lpsz,
        _In_ DWORD cchLength);
    WINUSERAPI
    DWORD
    WINAPI
    CharUpperBuffW(
        _Inout_updates_(cchLength) LPWSTR lpsz,
        _In_ DWORD cchLength);
    #ifdef UNICODE
    #define CharUpperBuff  CharUpperBuffW
    #else
    #define CharUpperBuff  CharUpperBuffA
    #endif // !UNICODE
     
    WINUSERAPI
    LPSTR
    WINAPI
    CharLowerA(
        _Inout_ LPSTR lpsz);
    WINUSERAPI
    LPWSTR
    WINAPI
    CharLowerW(
        _Inout_ LPWSTR lpsz);
    #ifdef UNICODE
    #define CharLower  CharLowerW
    #else
    #define CharLower  CharLowerA
    #endif // !UNICODE
     
    WINUSERAPI
    DWORD
    WINAPI
    CharLowerBuffA(
        _Inout_updates_(cchLength) LPSTR lpsz,
        _In_ DWORD cchLength);
    WINUSERAPI
    DWORD
    WINAPI
    CharLowerBuffW(
        _Inout_updates_(cchLength) LPWSTR lpsz,
        _In_ DWORD cchLength);
    #ifdef UNICODE
    #define CharLowerBuff  CharLowerBuffW
    #else
    #define CharLowerBuff  CharLowerBuffA
    #endif // !UNICODE
     
    WINUSERAPI
    LPSTR
    WINAPI
    CharNextA(
        _In_ LPCSTR lpsz);
    WINUSERAPI
    LPWSTR
    WINAPI
    CharNextW(
        _In_ LPCWSTR lpsz);
    #ifdef UNICODE
    #define CharNext  CharNextW
    #else
    #define CharNext  CharNextA
    #endif // !UNICODE
     
    WINUSERAPI
    LPSTR
    WINAPI
    CharPrevA(
        _In_ LPCSTR lpszStart,
        _In_ LPCSTR lpszCurrent);
    WINUSERAPI
    LPWSTR
    WINAPI
    CharPrevW(
        _In_ LPCWSTR lpszStart,
        _In_ LPCWSTR lpszCurrent);
    #ifdef UNICODE
    #define CharPrev  CharPrevW
    #else
    #define CharPrev  CharPrevA
    #endif // !UNICODE
     
    #if(WINVER >= 0x0400)
    WINUSERAPI
    LPSTR
    WINAPI
    CharNextExA(
         _In_ WORD CodePage,
         _In_ LPCSTR lpCurrentChar,
         _In_ DWORD dwFlags);
     
    WINUSERAPI
    LPSTR
    WINAPI
    CharPrevExA(
         _In_ WORD CodePage,
         _In_ LPCSTR lpStart,
         _In_ LPCSTR lpCurrentChar,
         _In_ DWORD dwFlags);
    #endif /* WINVER >= 0x0400 */
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    /*
     * Compatibility defines for character translation routines
     */
    #define AnsiToOem CharToOemA
    #define OemToAnsi OemToCharA
    #define AnsiToOemBuff CharToOemBuffA
    #define OemToAnsiBuff OemToCharBuffA
    #define AnsiUpper CharUpperA
    #define AnsiUpperBuff CharUpperBuffA
    #define AnsiLower CharLowerA
    #define AnsiLowerBuff CharLowerBuffA
    #define AnsiNext CharNextA
    #define AnsiPrev CharPrevA
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    #ifndef  NOLANGUAGE
    /*
     * Language dependent Routines
     */
     
    WINUSERAPI
    BOOL
    WINAPI
    IsCharAlphaA(
        _In_ CHAR ch);
    WINUSERAPI
    BOOL
    WINAPI
    IsCharAlphaW(
        _In_ WCHAR ch);
    #ifdef UNICODE
    #define IsCharAlpha  IsCharAlphaW
    #else
    #define IsCharAlpha  IsCharAlphaA
    #endif // !UNICODE
     
    WINUSERAPI
    BOOL
    WINAPI
    IsCharAlphaNumericA(
        _In_ CHAR ch);
    WINUSERAPI
    BOOL
    WINAPI
    IsCharAlphaNumericW(
        _In_ WCHAR ch);
    #ifdef UNICODE
    #define IsCharAlphaNumeric  IsCharAlphaNumericW
    #else
    #define IsCharAlphaNumeric  IsCharAlphaNumericA
    #endif // !UNICODE
     
    WINUSERAPI
    BOOL
    WINAPI
    IsCharUpperA(
        _In_ CHAR ch);
    WINUSERAPI
    BOOL
    WINAPI
    IsCharUpperW(
        _In_ WCHAR ch);
    #ifdef UNICODE
    #define IsCharUpper  IsCharUpperW
    #else
    #define IsCharUpper  IsCharUpperA
    #endif // !UNICODE
     
    WINUSERAPI
    BOOL
    WINAPI
    IsCharLowerA(
        _In_ CHAR ch);
    WINUSERAPI
    BOOL
    WINAPI
    IsCharLowerW(
        _In_ WCHAR ch);
    #ifdef UNICODE
    #define IsCharLower  IsCharLowerW
    #else
    #define IsCharLower  IsCharLowerA
    #endif // !UNICODE
     
    #endif  /* !NOLANGUAGE */
     
    WINUSERAPI
    HWND
    WINAPI
    SetFocus(
        _In_opt_ HWND hWnd);
     
    WINUSERAPI
    HWND
    WINAPI
    GetActiveWindow(
        VOID);
     
    WINUSERAPI
    HWND
    WINAPI
    GetFocus(
        VOID);
     
    WINUSERAPI
    UINT
    WINAPI
    GetKBCodePage(
        VOID);
     
    WINUSERAPI
    SHORT
    WINAPI
    GetKeyState(
        _In_ int nVirtKey);
     
    WINUSERAPI
    SHORT
    WINAPI
    GetAsyncKeyState(
        _In_ int vKey);
     
    WINUSERAPI
    _Check_return_
    BOOL
    WINAPI
    GetKeyboardState(
        _Out_writes_(256) PBYTE lpKeyState);
     
    WINUSERAPI
    BOOL
    WINAPI
    SetKeyboardState(
        _In_reads_(256) LPBYTE lpKeyState);
     
    WINUSERAPI
    int
    WINAPI
    GetKeyNameTextA(
        _In_ LONG lParam,
        _Out_writes_(cchSize) LPSTR lpString,
        _In_ int cchSize);
    WINUSERAPI
    int
    WINAPI
    GetKeyNameTextW(
        _In_ LONG lParam,
        _Out_writes_(cchSize) LPWSTR lpString,
        _In_ int cchSize);
    #ifdef UNICODE
    #define GetKeyNameText  GetKeyNameTextW
    #else
    #define GetKeyNameText  GetKeyNameTextA
    #endif // !UNICODE
     
    WINUSERAPI
    int
    WINAPI
    GetKeyboardType(
        _In_ int nTypeFlag);
     
    WINUSERAPI
    int
    WINAPI
    ToAscii(
        _In_ UINT uVirtKey,
        _In_ UINT uScanCode,
        _In_reads_opt_(256) CONST BYTE *lpKeyState,
        _Out_ LPWORD lpChar,
        _In_ UINT uFlags);
     
    #if(WINVER >= 0x0400)
    WINUSERAPI
    int
    WINAPI
    ToAsciiEx(
        _In_ UINT uVirtKey,
        _In_ UINT uScanCode,
        _In_reads_opt_(256) CONST BYTE *lpKeyState,
        _Out_ LPWORD lpChar,
        _In_ UINT uFlags,
        _In_opt_ HKL dwhkl);
    #endif /* WINVER >= 0x0400 */
     
    WINUSERAPI
    int
    WINAPI
    ToUnicode(
        _In_ UINT wVirtKey,
        _In_ UINT wScanCode,
        _In_reads_bytes_opt_(256) CONST BYTE *lpKeyState,
        _Out_writes_(cchBuff) LPWSTR pwszBuff,
        _In_ int cchBuff,
        _In_ UINT wFlags);
     
    WINUSERAPI
    DWORD
    WINAPI
    OemKeyScan(
        _In_ WORD wOemChar);
     
    WINUSERAPI
    SHORT
    WINAPI
    VkKeyScanA(
        _In_ CHAR ch);
    WINUSERAPI
    SHORT
    WINAPI
    VkKeyScanW(
        _In_ WCHAR ch);
    #ifdef UNICODE
    #define VkKeyScan  VkKeyScanW
    #else
    #define VkKeyScan  VkKeyScanA
    #endif // !UNICODE
     
    #if(WINVER >= 0x0400)
    WINUSERAPI
    SHORT
    WINAPI
    VkKeyScanExA(
        _In_ CHAR ch,
        _In_ HKL dwhkl);
    WINUSERAPI
    SHORT
    WINAPI
    VkKeyScanExW(
        _In_ WCHAR ch,
        _In_ HKL dwhkl);
    #ifdef UNICODE
    #define VkKeyScanEx  VkKeyScanExW
    #else
    #define VkKeyScanEx  VkKeyScanExA
    #endif // !UNICODE
    #endif /* WINVER >= 0x0400 */
    #define KEYEVENTF_EXTENDEDKEY 0x0001
    #define KEYEVENTF_KEYUP       0x0002
    #if(_WIN32_WINNT >= 0x0500)
    #define KEYEVENTF_UNICODE     0x0004
    #define KEYEVENTF_SCANCODE    0x0008
    #endif /* _WIN32_WINNT >= 0x0500 */
     
    WINUSERAPI
    VOID
    WINAPI
    keybd_event(
        _In_ BYTE bVk,
        _In_ BYTE bScan,
        _In_ DWORD dwFlags,
        _In_ ULONG_PTR dwExtraInfo);
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    #define MOUSEEVENTF_MOVE        0x0001 /* mouse move */
    #define MOUSEEVENTF_LEFTDOWN    0x0002 /* left button down */
    #define MOUSEEVENTF_LEFTUP      0x0004 /* left button up */
    #define MOUSEEVENTF_RIGHTDOWN   0x0008 /* right button down */
    #define MOUSEEVENTF_RIGHTUP     0x0010 /* right button up */
    #define MOUSEEVENTF_MIDDLEDOWN  0x0020 /* middle button down */
    #define MOUSEEVENTF_MIDDLEUP    0x0040 /* middle button up */
    #define MOUSEEVENTF_XDOWN       0x0080 /* x button down */
    #define MOUSEEVENTF_XUP         0x0100 /* x button down */
    #define MOUSEEVENTF_WHEEL                0x0800 /* wheel button rolled */
    #if (_WIN32_WINNT >= 0x0600)
    #define MOUSEEVENTF_HWHEEL              0x01000 /* hwheel button rolled */
    #endif
    #if(WINVER >= 0x0600)
    #define MOUSEEVENTF_MOVE_NOCOALESCE      0x2000 /* do not coalesce mouse moves */
    #endif /* WINVER >= 0x0600 */
    #define MOUSEEVENTF_VIRTUALDESK          0x4000 /* map to entire virtual desktop */
    #define MOUSEEVENTF_ABSOLUTE             0x8000 /* absolute move */
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    WINUSERAPI
    VOID
    WINAPI
    mouse_event(
        _In_ DWORD dwFlags,
        _In_ DWORD dx,
        _In_ DWORD dy,
        _In_ DWORD dwData,
        _In_ ULONG_PTR dwExtraInfo);
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    #if (_WIN32_WINNT > 0x0400)
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    typedef struct tagMOUSEINPUT {
        LONG    dx;
        LONG    dy;
        DWORD   mouseData;
        DWORD   dwFlags;
        DWORD   time;
        ULONG_PTR dwExtraInfo;
    } MOUSEINPUT, *PMOUSEINPUT, FAR* LPMOUSEINPUT;
     
    typedef struct tagKEYBDINPUT {
        WORD    wVk;
        WORD    wScan;
        DWORD   dwFlags;
        DWORD   time;
        ULONG_PTR dwExtraInfo;
    } KEYBDINPUT, *PKEYBDINPUT, FAR* LPKEYBDINPUT;
     
    typedef struct tagHARDWAREINPUT {
        DWORD   uMsg;
        WORD    wParamL;
        WORD    wParamH;
    } HARDWAREINPUT, *PHARDWAREINPUT, FAR* LPHARDWAREINPUT;
     
    #define INPUT_MOUSE     0
    #define INPUT_KEYBOARD  1
    #define INPUT_HARDWARE  2
     
    typedef struct tagINPUT {
        DWORD   type;
     
        union
        {
            MOUSEINPUT      mi;
            KEYBDINPUT      ki;
            HARDWAREINPUT   hi;
        };
    } INPUT, *PINPUT, FAR* LPINPUT;
     
    WINUSERAPI
    UINT
    WINAPI
    SendInput(
        _In_ UINT cInputs,                     // number of input in the array
        _In_reads_(cInputs) LPINPUT pInputs,  // array of inputs
        _In_ int cbSize);                      // sizeof(INPUT)
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    #endif // (_WIN32_WINNT > 0x0400)
     
    #if(WINVER >= 0x0601)
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    /*
     * Touch Input defines and functions
     */
     
    /*
     * Touch input handle
     */
    DECLARE_HANDLE(HTOUCHINPUT);
     
    typedef struct tagTOUCHINPUT {
        LONG x;
        LONG y;
        HANDLE hSource;
        DWORD dwID;
        DWORD dwFlags;
        DWORD dwMask;
        DWORD dwTime;
        ULONG_PTR dwExtraInfo;
        DWORD cxContact;
        DWORD cyContact;
    } TOUCHINPUT, *PTOUCHINPUT;
    typedef TOUCHINPUT const * PCTOUCHINPUT;
     
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    /*
     * Conversion of touch input coordinates to pixels
     */
    #define TOUCH_COORD_TO_PIXEL(l)         ((l) / 100)
     
    /*
     * Touch input flag values (TOUCHINPUT.dwFlags)
     */
    #define TOUCHEVENTF_MOVE            0x0001
    #define TOUCHEVENTF_DOWN            0x0002
    #define TOUCHEVENTF_UP              0x0004
    #define TOUCHEVENTF_INRANGE         0x0008
    #define TOUCHEVENTF_PRIMARY         0x0010
    #define TOUCHEVENTF_NOCOALESCE      0x0020
    #define TOUCHEVENTF_PEN             0x0040
    #define TOUCHEVENTF_PALM            0x0080
     
    /*
     * Touch input mask values (TOUCHINPUT.dwMask)
     */
    #define TOUCHINPUTMASKF_TIMEFROMSYSTEM  0x0001  // the dwTime field contains a system generated value
    #define TOUCHINPUTMASKF_EXTRAINFO       0x0002  // the dwExtraInfo field is valid
    #define TOUCHINPUTMASKF_CONTACTAREA     0x0004  // the cxContact and cyContact fields are valid
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    WINUSERAPI
    BOOL
    WINAPI
    GetTouchInputInfo(
        _In_ HTOUCHINPUT hTouchInput,               // input event handle; from touch message lParam
        _In_ UINT cInputs,                          // number of elements in the array
        _Out_writes_(cInputs) PTOUCHINPUT pInputs,  // array of touch inputs
        _In_ int cbSize);                           // sizeof(TOUCHINPUT)
     
    WINUSERAPI
    BOOL
    WINAPI
    CloseTouchInputHandle(
        _In_ HTOUCHINPUT hTouchInput);                   // input event handle; from touch message lParam
     
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    /*
     * RegisterTouchWindow flag values
     */
    #define TWF_FINETOUCH       (0x00000001)
    #define TWF_WANTPALM        (0x00000002)
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    WINUSERAPI
    BOOL
    WINAPI
    RegisterTouchWindow(
        _In_ HWND hwnd,
        _In_ ULONG ulFlags);
     
    WINUSERAPI
    BOOL
    WINAPI
    UnregisterTouchWindow(
        _In_ HWND hwnd);
     
    WINUSERAPI
    BOOL
    WINAPI
    IsTouchWindow(
        _In_ HWND hwnd,
        _Out_opt_ PULONG pulFlags);
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    #endif /* WINVER >= 0x0601 */
     
    #if(WINVER >= 0x0602)
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    enum tagPOINTER_INPUT_TYPE {
        PT_POINTER  = 0x00000001,   // Generic pointer
        PT_TOUCH    = 0x00000002,   // Touch
        PT_PEN      = 0x00000003,   // Pen
        PT_MOUSE    = 0x00000004,   // Mouse
    #if(WINVER >= 0x0603)
        PT_TOUCHPAD = 0x00000005,   // Touchpad
    #endif /* WINVER >= 0x0603 */
    };
    typedef DWORD POINTER_INPUT_TYPE;
     
    typedef UINT32 POINTER_FLAGS;
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    #define POINTER_FLAG_NONE               0x00000000 // Default
    #define POINTER_FLAG_NEW                0x00000001 // New pointer
    #define POINTER_FLAG_INRANGE            0x00000002 // Pointer has not departed
    #define POINTER_FLAG_INCONTACT          0x00000004 // Pointer is in contact
    #define POINTER_FLAG_FIRSTBUTTON        0x00000010 // Primary action
    #define POINTER_FLAG_SECONDBUTTON       0x00000020 // Secondary action
    #define POINTER_FLAG_THIRDBUTTON        0x00000040 // Third button
    #define POINTER_FLAG_FOURTHBUTTON       0x00000080 // Fourth button
    #define POINTER_FLAG_FIFTHBUTTON        0x00000100 // Fifth button
    #define POINTER_FLAG_PRIMARY            0x00002000 // Pointer is primary
    #define POINTER_FLAG_CONFIDENCE         0x00004000 // Pointer is considered unlikely to be accidental
    #define POINTER_FLAG_CANCELED           0x00008000 // Pointer is departing in an abnormal manner
    #define POINTER_FLAG_DOWN               0x00010000 // Pointer transitioned to down state (made contact)
    #define POINTER_FLAG_UPDATE             0x00020000 // Pointer update
    #define POINTER_FLAG_UP                 0x00040000 // Pointer transitioned from down state (broke contact)
    #define POINTER_FLAG_WHEEL              0x00080000 // Vertical wheel
    #define POINTER_FLAG_HWHEEL             0x00100000 // Horizontal wheel
    #define POINTER_FLAG_CAPTURECHANGED     0x00200000 // Lost capture
    #define POINTER_FLAG_HASTRANSFORM       0x00400000 // Input has a transform associated with it
     
     
    /*
     * Pointer info key states defintions.
     */
    #define POINTER_MOD_SHIFT   (0x0004)    // Shift key is held down.
    #define POINTER_MOD_CTRL    (0x0008)    // Ctrl key is held down.
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    typedef enum tagPOINTER_BUTTON_CHANGE_TYPE {
        POINTER_CHANGE_NONE,
        POINTER_CHANGE_FIRSTBUTTON_DOWN,
        POINTER_CHANGE_FIRSTBUTTON_UP,
        POINTER_CHANGE_SECONDBUTTON_DOWN,
        POINTER_CHANGE_SECONDBUTTON_UP,
        POINTER_CHANGE_THIRDBUTTON_DOWN,
        POINTER_CHANGE_THIRDBUTTON_UP,
        POINTER_CHANGE_FOURTHBUTTON_DOWN,
        POINTER_CHANGE_FOURTHBUTTON_UP,
        POINTER_CHANGE_FIFTHBUTTON_DOWN,
        POINTER_CHANGE_FIFTHBUTTON_UP,
    } POINTER_BUTTON_CHANGE_TYPE;
     
    typedef struct tagPOINTER_INFO {
        POINTER_INPUT_TYPE    pointerType;
        UINT32          pointerId;
        UINT32          frameId;
        POINTER_FLAGS   pointerFlags;
        HANDLE          sourceDevice;
        HWND            hwndTarget;
        POINT           ptPixelLocation;
        POINT           ptHimetricLocation;
        POINT           ptPixelLocationRaw;
        POINT           ptHimetricLocationRaw;
        DWORD           dwTime;
        UINT32          historyCount;
        INT32           InputData;
        DWORD           dwKeyStates;
        UINT64          PerformanceCount;
        POINTER_BUTTON_CHANGE_TYPE ButtonChangeType;
    } POINTER_INFO;
     
     
    typedef UINT32 TOUCH_FLAGS;
    #define TOUCH_FLAG_NONE                 0x00000000 // Default
     
    typedef UINT32 TOUCH_MASK;
    #define TOUCH_MASK_NONE                 0x00000000 // Default - none of the optional fields are valid
    #define TOUCH_MASK_CONTACTAREA          0x00000001 // The rcContact field is valid
    #define TOUCH_MASK_ORIENTATION          0x00000002 // The orientation field is valid
    #define TOUCH_MASK_PRESSURE             0x00000004 // The pressure field is valid
     
    typedef struct tagPOINTER_TOUCH_INFO {
        POINTER_INFO    pointerInfo;
        TOUCH_FLAGS     touchFlags;
        TOUCH_MASK      touchMask;
        RECT            rcContact;
        RECT            rcContactRaw;
        UINT32          orientation;
        UINT32          pressure;
    } POINTER_TOUCH_INFO;
     
    typedef UINT32 PEN_FLAGS;
    #define PEN_FLAG_NONE                   0x00000000 // Default
    #define PEN_FLAG_BARREL                 0x00000001 // The barrel button is pressed
    #define PEN_FLAG_INVERTED               0x00000002 // The pen is inverted
    #define PEN_FLAG_ERASER                 0x00000004 // The eraser button is pressed
     
    typedef UINT32 PEN_MASK;
    #define PEN_MASK_NONE                   0x00000000 // Default - none of the optional fields are valid
    #define PEN_MASK_PRESSURE               0x00000001 // The pressure field is valid
    #define PEN_MASK_ROTATION               0x00000002 // The rotation field is valid
    #define PEN_MASK_TILT_X                 0x00000004 // The tiltX field is valid
    #define PEN_MASK_TILT_Y                 0x00000008 // The tiltY field is valid
     
    typedef struct tagPOINTER_PEN_INFO {
        POINTER_INFO    pointerInfo;
        PEN_FLAGS       penFlags;
        PEN_MASK        penMask;
        UINT32          pressure;
        UINT32          rotation;
        INT32           tiltX;
        INT32           tiltY;
    } POINTER_PEN_INFO;
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    /*
     * Flags that appear in pointer input message parameters
     */
    #define POINTER_MESSAGE_FLAG_NEW                0x00000001 // New pointer
    #define POINTER_MESSAGE_FLAG_INRANGE            0x00000002 // Pointer has not departed
    #define POINTER_MESSAGE_FLAG_INCONTACT          0x00000004 // Pointer is in contact
    #define POINTER_MESSAGE_FLAG_FIRSTBUTTON        0x00000010 // Primary action
    #define POINTER_MESSAGE_FLAG_SECONDBUTTON       0x00000020 // Secondary action
    #define POINTER_MESSAGE_FLAG_THIRDBUTTON        0x00000040 // Third button
    #define POINTER_MESSAGE_FLAG_FOURTHBUTTON       0x00000080 // Fourth button
    #define POINTER_MESSAGE_FLAG_FIFTHBUTTON        0x00000100 // Fifth button
    #define POINTER_MESSAGE_FLAG_PRIMARY            0x00002000 // Pointer is primary
    #define POINTER_MESSAGE_FLAG_CONFIDENCE         0x00004000 // Pointer is considered unlikely to be accidental
    #define POINTER_MESSAGE_FLAG_CANCELED           0x00008000 // Pointer is departing in an abnormal manner
     
    /*
     * Macros to retrieve information from pointer input message parameters
     */
    #define GET_POINTERID_WPARAM(wParam)                (LOWORD(wParam))
    #define IS_POINTER_FLAG_SET_WPARAM(wParam, flag)    (((DWORD)HIWORD(wParam) & (flag)) == (flag))
    #define IS_POINTER_NEW_WPARAM(wParam)               IS_POINTER_FLAG_SET_WPARAM(wParam, POINTER_MESSAGE_FLAG_NEW)
    #define IS_POINTER_INRANGE_WPARAM(wParam)           IS_POINTER_FLAG_SET_WPARAM(wParam, POINTER_MESSAGE_FLAG_INRANGE)
    #define IS_POINTER_INCONTACT_WPARAM(wParam)         IS_POINTER_FLAG_SET_WPARAM(wParam, POINTER_MESSAGE_FLAG_INCONTACT)
    #define IS_POINTER_FIRSTBUTTON_WPARAM(wParam)       IS_POINTER_FLAG_SET_WPARAM(wParam, POINTER_MESSAGE_FLAG_FIRSTBUTTON)
    #define IS_POINTER_SECONDBUTTON_WPARAM(wParam)      IS_POINTER_FLAG_SET_WPARAM(wParam, POINTER_MESSAGE_FLAG_SECONDBUTTON)
    #define IS_POINTER_THIRDBUTTON_WPARAM(wParam)       IS_POINTER_FLAG_SET_WPARAM(wParam, POINTER_MESSAGE_FLAG_THIRDBUTTON)
    #define IS_POINTER_FOURTHBUTTON_WPARAM(wParam)      IS_POINTER_FLAG_SET_WPARAM(wParam, POINTER_MESSAGE_FLAG_FOURTHBUTTON)
    #define IS_POINTER_FIFTHBUTTON_WPARAM(wParam)       IS_POINTER_FLAG_SET_WPARAM(wParam, POINTER_MESSAGE_FLAG_FIFTHBUTTON)
    #define IS_POINTER_PRIMARY_WPARAM(wParam)           IS_POINTER_FLAG_SET_WPARAM(wParam, POINTER_MESSAGE_FLAG_PRIMARY)
    #define HAS_POINTER_CONFIDENCE_WPARAM(wParam)       IS_POINTER_FLAG_SET_WPARAM(wParam, POINTER_MESSAGE_FLAG_CONFIDENCE)
    #define IS_POINTER_CANCELED_WPARAM(wParam)          IS_POINTER_FLAG_SET_WPARAM(wParam, POINTER_MESSAGE_FLAG_CANCELED)
     
    /*
     * WM_POINTERACTIVATE return codes
     */
    #define PA_ACTIVATE                     MA_ACTIVATE
    #define PA_NOACTIVATE                   MA_NOACTIVATE
     
     
    #define MAX_TOUCH_COUNT 256
     
    #define TOUCH_FEEDBACK_DEFAULT 0x1
    #define TOUCH_FEEDBACK_INDIRECT 0x2
    #define TOUCH_FEEDBACK_NONE 0x3
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    WINUSERAPI
    BOOL
    WINAPI
    InitializeTouchInjection(
        _In_ UINT32 maxCount,
        _In_ DWORD dwMode);
     
    WINUSERAPI
    BOOL
    WINAPI
    InjectTouchInput(
        _In_ UINT32 count,
        _In_reads_(count) CONST POINTER_TOUCH_INFO *contacts);
     
    WINUSERAPI
    BOOL
    WINAPI
    GetPointerType(
        _In_ UINT32 pointerId,
        _Out_ POINTER_INPUT_TYPE *pointerType);
     
    WINUSERAPI
    BOOL
    WINAPI
    GetPointerCursorId(
        _In_ UINT32 pointerId,
        _Out_ UINT32 *cursorId);
     
    WINUSERAPI
    BOOL
    WINAPI
    GetPointerInfo(
        _In_ UINT32 pointerId,
        _Out_writes_(1) POINTER_INFO *pointerInfo);
     
    WINUSERAPI
    BOOL
    WINAPI
    GetPointerInfoHistory(
        _In_ UINT32 pointerId,
        _Inout_ UINT32 *entriesCount,
        _Out_writes_opt_(*entriesCount) POINTER_INFO *pointerInfo);
     
    WINUSERAPI
    BOOL
    WINAPI
    GetPointerFrameInfo(
        _In_ UINT32 pointerId,
        _Inout_ UINT32 *pointerCount,
        _Out_writes_opt_(*pointerCount) POINTER_INFO *pointerInfo);
     
    WINUSERAPI
    BOOL
    WINAPI
    GetPointerFrameInfoHistory(
        _In_ UINT32 pointerId,
        _Inout_ UINT32 *entriesCount,
        _Inout_ UINT32 *pointerCount,
        _Out_writes_opt_(*entriesCount * *pointerCount) POINTER_INFO *pointerInfo);
     
    WINUSERAPI
    BOOL
    WINAPI
    GetPointerTouchInfo(
        _In_ UINT32 pointerId,
        _Out_writes_(1) POINTER_TOUCH_INFO *touchInfo);
     
    WINUSERAPI
    BOOL
    WINAPI
    GetPointerTouchInfoHistory(
        _In_ UINT32 pointerId,
        _Inout_ UINT32 *entriesCount,
        _Out_writes_opt_(*entriesCount) POINTER_TOUCH_INFO *touchInfo);
     
    WINUSERAPI
    BOOL
    WINAPI
    GetPointerFrameTouchInfo(
        _In_ UINT32 pointerId,
        _Inout_ UINT32 *pointerCount,
        _Out_writes_opt_(*pointerCount) POINTER_TOUCH_INFO *touchInfo);
     
    WINUSERAPI
    BOOL
    WINAPI
    GetPointerFrameTouchInfoHistory(
        _In_ UINT32 pointerId,
        _Inout_ UINT32 *entriesCount,
        _Inout_ UINT32 *pointerCount,
        _Out_writes_opt_(*entriesCount * *pointerCount) POINTER_TOUCH_INFO *touchInfo);
     
    WINUSERAPI
    BOOL
    WINAPI
    GetPointerPenInfo(
        _In_ UINT32 pointerId,
        _Out_writes_(1) POINTER_PEN_INFO *penInfo);
     
    WINUSERAPI
    BOOL
    WINAPI
    GetPointerPenInfoHistory(
        _In_ UINT32 pointerId,
        _Inout_ UINT32 *entriesCount,
        _Out_writes_opt_(*entriesCount) POINTER_PEN_INFO *penInfo);
     
    WINUSERAPI
    BOOL
    WINAPI
    GetPointerFramePenInfo(
        _In_ UINT32 pointerId,
        _Inout_ UINT32 *pointerCount,
        _Out_writes_opt_(*pointerCount) POINTER_PEN_INFO *penInfo);
     
    WINUSERAPI
    BOOL
    WINAPI
    GetPointerFramePenInfoHistory(
        _In_ UINT32 pointerId,
        _Inout_ UINT32 *entriesCount,
        _Inout_ UINT32 *pointerCount,
        _Out_writes_opt_(*entriesCount * *pointerCount) POINTER_PEN_INFO *penInfo);
     
    WINUSERAPI
    BOOL
    WINAPI
    SkipPointerFrameMessages(
        _In_ UINT32 pointerId);
     
    WINUSERAPI
    BOOL
    WINAPI
    RegisterPointerInputTarget(
        _In_ HWND hwnd,
        _In_ POINTER_INPUT_TYPE pointerType);
     
    WINUSERAPI
    BOOL
    WINAPI
    UnregisterPointerInputTarget(
        _In_ HWND hwnd,
        _In_ POINTER_INPUT_TYPE pointerType);
     
     
    WINUSERAPI
    BOOL
    WINAPI
    EnableMouseInPointer(
        _In_ BOOL fEnable);
     
    WINUSERAPI
    BOOL
    WINAPI
    IsMouseInPointerEnabled(
        VOID);
     
     
    #define TOUCH_HIT_TESTING_DEFAULT 0x0
    #define TOUCH_HIT_TESTING_CLIENT  0x1
    #define TOUCH_HIT_TESTING_NONE    0x2
     
    WINUSERAPI
    BOOL
    WINAPI
    RegisterTouchHitTestingWindow(
        _In_ HWND hwnd,
        _In_ ULONG value);
     
    typedef struct tagTOUCH_HIT_TESTING_PROXIMITY_EVALUATION
    {
        UINT16 score;
        POINT adjustedPoint;
    } TOUCH_HIT_TESTING_PROXIMITY_EVALUATION, *PTOUCH_HIT_TESTING_PROXIMITY_EVALUATION;
     
    /*
     * WM_TOUCHHITTESTING structure
    */
     
    typedef struct tagTOUCH_HIT_TESTING_INPUT
    {
        UINT32 pointerId;
        POINT point;
        RECT boundingBox;
        RECT nonOccludedBoundingBox;
        UINT32 orientation;
    } TOUCH_HIT_TESTING_INPUT, *PTOUCH_HIT_TESTING_INPUT;
     
     
    #define TOUCH_HIT_TESTING_PROXIMITY_CLOSEST  0x0
    #define TOUCH_HIT_TESTING_PROXIMITY_FARTHEST  0xFFF
     
    WINUSERAPI
    BOOL
    WINAPI
    EvaluateProximityToRect(
        _In_ const RECT *controlBoundingBox,
        _In_ const TOUCH_HIT_TESTING_INPUT *pHitTestingInput,
        _Out_ TOUCH_HIT_TESTING_PROXIMITY_EVALUATION *pProximityEval);
     
    WINUSERAPI
    BOOL
    WINAPI
    EvaluateProximityToPolygon(
        UINT32 numVertices,
        _In_reads_(numVertices) const POINT *controlPolygon,
        _In_ const TOUCH_HIT_TESTING_INPUT *pHitTestingInput,
        _Out_ TOUCH_HIT_TESTING_PROXIMITY_EVALUATION *pProximityEval);
     
    WINUSERAPI
    LRESULT
    WINAPI
    PackTouchHitTestingProximityEvaluation(
        _In_ const TOUCH_HIT_TESTING_INPUT *pHitTestingInput,
        _In_ const TOUCH_HIT_TESTING_PROXIMITY_EVALUATION *pProximityEval);
     
    typedef enum tagFEEDBACK_TYPE {
        FEEDBACK_TOUCH_CONTACTVISUALIZATION = 1,
        FEEDBACK_PEN_BARRELVISUALIZATION    = 2,
        FEEDBACK_PEN_TAP                    = 3,
        FEEDBACK_PEN_DOUBLETAP              = 4,
        FEEDBACK_PEN_PRESSANDHOLD           = 5,
        FEEDBACK_PEN_RIGHTTAP               = 6,
        FEEDBACK_TOUCH_TAP                  = 7,
        FEEDBACK_TOUCH_DOUBLETAP            = 8,
        FEEDBACK_TOUCH_PRESSANDHOLD         = 9,
        FEEDBACK_TOUCH_RIGHTTAP             = 10,
        FEEDBACK_GESTURE_PRESSANDTAP        = 11,
        FEEDBACK_MAX                        = 0xFFFFFFFF
    } FEEDBACK_TYPE;
     
     
    #define GWFS_INCLUDE_ANCESTORS           0x00000001
     
     
    WINUSERAPI
    BOOL
    WINAPI
    GetWindowFeedbackSetting(
        _In_ HWND hwnd,
        _In_ FEEDBACK_TYPE feedback,
        _In_ DWORD dwFlags,
        _Inout_ UINT32* pSize,
        _Out_writes_bytes_opt_(*pSize) VOID* config);
     
    WINUSERAPI
    BOOL
    WINAPI
    SetWindowFeedbackSetting(
        _In_ HWND hwnd,
        _In_ FEEDBACK_TYPE feedback,
        _In_ DWORD dwFlags,
        _In_ UINT32 size,
        _In_reads_bytes_opt_(size) CONST VOID* configuration);
     
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    #endif /* WINVER >= 0x0602 */
     
    #if(WINVER >= 0x0603)
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    typedef struct tagINPUT_TRANSFORM {
        union {
            struct {
                float        _11, _12, _13, _14;
                float        _21, _22, _23, _24;
                float        _31, _32, _33, _34;
                float        _41, _42, _43, _44;
            };
            float m[4][4];
        };
    } INPUT_TRANSFORM;
     
     
    WINUSERAPI
    BOOL
    WINAPI
    GetPointerInputTransform(
        _In_ UINT32 pointerId,
        _In_ UINT32 historyCount,
        _Out_writes_(historyCount) INPUT_TRANSFORM *inputTransform);
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    #endif /* WINVER >= 0x0603 */
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    #if(_WIN32_WINNT >= 0x0500)
    typedef struct tagLASTINPUTINFO {
        UINT cbSize;
        DWORD dwTime;
    } LASTINPUTINFO, * PLASTINPUTINFO;
     
    WINUSERAPI
    BOOL
    WINAPI
    GetLastInputInfo(
        _Out_ PLASTINPUTINFO plii);
    #endif /* _WIN32_WINNT >= 0x0500 */
     
    WINUSERAPI
    UINT
    WINAPI
    MapVirtualKeyA(
        _In_ UINT uCode,
        _In_ UINT uMapType);
    WINUSERAPI
    UINT
    WINAPI
    MapVirtualKeyW(
        _In_ UINT uCode,
        _In_ UINT uMapType);
    #ifdef UNICODE
    #define MapVirtualKey  MapVirtualKeyW
    #else
    #define MapVirtualKey  MapVirtualKeyA
    #endif // !UNICODE
     
    #if(WINVER >= 0x0400)
    WINUSERAPI
    UINT
    WINAPI
    MapVirtualKeyExA(
        _In_ UINT uCode,
        _In_ UINT uMapType,
        _In_opt_ HKL dwhkl);
    WINUSERAPI
    UINT
    WINAPI
    MapVirtualKeyExW(
        _In_ UINT uCode,
        _In_ UINT uMapType,
        _In_opt_ HKL dwhkl);
    #ifdef UNICODE
    #define MapVirtualKeyEx  MapVirtualKeyExW
    #else
    #define MapVirtualKeyEx  MapVirtualKeyExA
    #endif // !UNICODE
     
    #define MAPVK_VK_TO_VSC     (0)
    #define MAPVK_VSC_TO_VK     (1)
    #define MAPVK_VK_TO_CHAR    (2)
    #define MAPVK_VSC_TO_VK_EX  (3)
    #endif /* WINVER >= 0x0400 */
    #if(WINVER >= 0x0600)
    #define MAPVK_VK_TO_VSC_EX  (4)
    #endif /* WINVER >= 0x0600 */
     
    WINUSERAPI
    BOOL
    WINAPI
    GetInputState(
        VOID);
     
    WINUSERAPI
    DWORD
    WINAPI
    GetQueueStatus(
        _In_ UINT flags);
     
     
    WINUSERAPI
    HWND
    WINAPI
    GetCapture(
        VOID);
     
    WINUSERAPI
    HWND
    WINAPI
    SetCapture(
        _In_ HWND hWnd);
     
    WINUSERAPI
    BOOL
    WINAPI
    ReleaseCapture(
        VOID);
     
    WINUSERAPI
    DWORD
    WINAPI
    MsgWaitForMultipleObjects(
        _In_ DWORD nCount,
        _In_reads_opt_(nCount) CONST HANDLE *pHandles,
        _In_ BOOL fWaitAll,
        _In_ DWORD dwMilliseconds,
        _In_ DWORD dwWakeMask);
     
    WINUSERAPI
    DWORD
    WINAPI
    MsgWaitForMultipleObjectsEx(
        _In_ DWORD nCount,
        _In_reads_opt_(nCount) CONST HANDLE *pHandles,
        _In_ DWORD dwMilliseconds,
        _In_ DWORD dwWakeMask,
        _In_ DWORD dwFlags);
     
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    #define MWMO_WAITALL        0x0001
    #define MWMO_ALERTABLE      0x0002
    #define MWMO_INPUTAVAILABLE 0x0004
     
    /*
     * Queue status flags for GetQueueStatus() and MsgWaitForMultipleObjects()
     */
    #define QS_KEY              0x0001
    #define QS_MOUSEMOVE        0x0002
    #define QS_MOUSEBUTTON      0x0004
    #define QS_POSTMESSAGE      0x0008
    #define QS_TIMER            0x0010
    #define QS_PAINT            0x0020
    #define QS_SENDMESSAGE      0x0040
    #define QS_HOTKEY           0x0080
    #define QS_ALLPOSTMESSAGE   0x0100
     
    #if(_WIN32_WINNT >= 0x0501)
    #define QS_RAWINPUT         0x0400
    #endif /* _WIN32_WINNT >= 0x0501 */
     
    #if(_WIN32_WINNT >= 0x0602)
    #define QS_TOUCH            0x0800
    #define QS_POINTER          0x1000
     
    #endif /* _WIN32_WINNT >= 0x0602 */
     
     
    #define QS_MOUSE           (QS_MOUSEMOVE     | \
                                QS_MOUSEBUTTON)
     
    #if (_WIN32_WINNT >= 0x602)
    #define QS_INPUT           (QS_MOUSE         | \
                                QS_KEY           | \
                                QS_RAWINPUT      | \
                                QS_TOUCH         | \
                                QS_POINTER)
     
    #else
    #if (_WIN32_WINNT >= 0x0501)
    #define QS_INPUT           (QS_MOUSE         | \
                                QS_KEY           | \
                                QS_RAWINPUT)
    #else
    #define QS_INPUT           (QS_MOUSE         | \
                                QS_KEY)
    #endif // (_WIN32_WINNT >= 0x0501)
    #endif
     
    #define QS_ALLEVENTS       (QS_INPUT         | \
                                QS_POSTMESSAGE   | \
                                QS_TIMER         | \
                                QS_PAINT         | \
                                QS_HOTKEY)
     
    #define QS_ALLINPUT        (QS_INPUT         | \
                                QS_POSTMESSAGE   | \
                                QS_TIMER         | \
                                QS_PAINT         | \
                                QS_HOTKEY        | \
                                QS_SENDMESSAGE)
     
     
    #define USER_TIMER_MAXIMUM  0x7FFFFFFF
    #define USER_TIMER_MINIMUM  0x0000000A
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    /*
     * Windows Functions
     */
     
    WINUSERAPI
    UINT_PTR
    WINAPI
    SetTimer(
        _In_opt_ HWND hWnd,
        _In_ UINT_PTR nIDEvent,
        _In_ UINT uElapse,
        _In_opt_ TIMERPROC lpTimerFunc);
     
    #if(WINVER >= 0x0601)
     
    #define TIMERV_DEFAULT_COALESCING   (0)
    #define TIMERV_NO_COALESCING        (0xFFFFFFFF)
     
    #define TIMERV_COALESCING_MIN       (1)
    #define TIMERV_COALESCING_MAX       (0x7FFFFFF5)
     
    WINUSERAPI
    UINT_PTR
    WINAPI
    SetCoalescableTimer(
        _In_opt_ HWND hWnd,
        _In_ UINT_PTR nIDEvent,
        _In_ UINT uElapse,
        _In_opt_ TIMERPROC lpTimerFunc,
        _In_ ULONG uToleranceDelay);
     
    #endif /* WINVER >= 0x0601 */
     
    WINUSERAPI
    BOOL
    WINAPI
    KillTimer(
        _In_opt_ HWND hWnd,
        _In_ UINT_PTR uIDEvent);
     
    WINUSERAPI
    BOOL
    WINAPI
    IsWindowUnicode(
        _In_ HWND hWnd);
     
    WINUSERAPI
    BOOL
    WINAPI
    EnableWindow(
        _In_ HWND hWnd,
        _In_ BOOL bEnable);
     
    WINUSERAPI
    BOOL
    WINAPI
    IsWindowEnabled(
        _In_ HWND hWnd);
     
    WINUSERAPI
    HACCEL
    WINAPI
    LoadAcceleratorsA(
        _In_opt_ HINSTANCE hInstance,
        _In_ LPCSTR lpTableName);
    WINUSERAPI
    HACCEL
    WINAPI
    LoadAcceleratorsW(
        _In_opt_ HINSTANCE hInstance,
        _In_ LPCWSTR lpTableName);
    #ifdef UNICODE
    #define LoadAccelerators  LoadAcceleratorsW
    #else
    #define LoadAccelerators  LoadAcceleratorsA
    #endif // !UNICODE
     
    WINUSERAPI
    HACCEL
    WINAPI
    CreateAcceleratorTableA(
        _In_reads_(cAccel) LPACCEL paccel,
        _In_ int cAccel);
    WINUSERAPI
    HACCEL
    WINAPI
    CreateAcceleratorTableW(
        _In_reads_(cAccel) LPACCEL paccel,
        _In_ int cAccel);
    #ifdef UNICODE
    #define CreateAcceleratorTable  CreateAcceleratorTableW
    #else
    #define CreateAcceleratorTable  CreateAcceleratorTableA
    #endif // !UNICODE
     
    WINUSERAPI
    BOOL
    WINAPI
    DestroyAcceleratorTable(
        _In_ HACCEL hAccel);
     
    WINUSERAPI
    int
    WINAPI
    CopyAcceleratorTableA(
        _In_ HACCEL hAccelSrc,
        _Out_writes_to_opt_(cAccelEntries, return) LPACCEL lpAccelDst,
        _In_ int cAccelEntries);
    WINUSERAPI
    int
    WINAPI
    CopyAcceleratorTableW(
        _In_ HACCEL hAccelSrc,
        _Out_writes_to_opt_(cAccelEntries, return) LPACCEL lpAccelDst,
        _In_ int cAccelEntries);
    #ifdef UNICODE
    #define CopyAcceleratorTable  CopyAcceleratorTableW
    #else
    #define CopyAcceleratorTable  CopyAcceleratorTableA
    #endif // !UNICODE
     
    #ifndef NOMSG
     
    WINUSERAPI
    int
    WINAPI
    TranslateAcceleratorA(
        _In_ HWND hWnd,
        _In_ HACCEL hAccTable,
        _In_ LPMSG lpMsg);
    WINUSERAPI
    int
    WINAPI
    TranslateAcceleratorW(
        _In_ HWND hWnd,
        _In_ HACCEL hAccTable,
        _In_ LPMSG lpMsg);
    #ifdef UNICODE
    #define TranslateAccelerator  TranslateAcceleratorW
    #else
    #define TranslateAccelerator  TranslateAcceleratorA
    #endif // !UNICODE
     
    #endif /* !NOMSG */
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    #ifndef NOSYSMETRICS
     
    /*
     * GetSystemMetrics() codes
     */
     
    #define SM_CXSCREEN             0
    #define SM_CYSCREEN             1
    #define SM_CXVSCROLL            2
    #define SM_CYHSCROLL            3
    #define SM_CYCAPTION            4
    #define SM_CXBORDER             5
    #define SM_CYBORDER             6
    #define SM_CXDLGFRAME           7
    #define SM_CYDLGFRAME           8
    #define SM_CYVTHUMB             9
    #define SM_CXHTHUMB             10
    #define SM_CXICON               11
    #define SM_CYICON               12
    #define SM_CXCURSOR             13
    #define SM_CYCURSOR             14
    #define SM_CYMENU               15
    #define SM_CXFULLSCREEN         16
    #define SM_CYFULLSCREEN         17
    #define SM_CYKANJIWINDOW        18
    #define SM_MOUSEPRESENT         19
    #define SM_CYVSCROLL            20
    #define SM_CXHSCROLL            21
    #define SM_DEBUG                22
    #define SM_SWAPBUTTON           23
    #define SM_RESERVED1            24
    #define SM_RESERVED2            25
    #define SM_RESERVED3            26
    #define SM_RESERVED4            27
    #define SM_CXMIN                28
    #define SM_CYMIN                29
    #define SM_CXSIZE               30
    #define SM_CYSIZE               31
    #define SM_CXFRAME              32
    #define SM_CYFRAME              33
    #define SM_CXMINTRACK           34
    #define SM_CYMINTRACK           35
    #define SM_CXDOUBLECLK          36
    #define SM_CYDOUBLECLK          37
    #define SM_CXICONSPACING        38
    #define SM_CYICONSPACING        39
    #define SM_MENUDROPALIGNMENT    40
    #define SM_PENWINDOWS           41
    #define SM_DBCSENABLED          42
    #define SM_CMOUSEBUTTONS        43
     
    #if(WINVER >= 0x0400)
    #define SM_CXFIXEDFRAME           SM_CXDLGFRAME  /* ;win40 name change */
    #define SM_CYFIXEDFRAME           SM_CYDLGFRAME  /* ;win40 name change */
    #define SM_CXSIZEFRAME            SM_CXFRAME     /* ;win40 name change */
    #define SM_CYSIZEFRAME            SM_CYFRAME     /* ;win40 name change */
     
    #define SM_SECURE               44
    #define SM_CXEDGE               45
    #define SM_CYEDGE               46
    #define SM_CXMINSPACING         47
    #define SM_CYMINSPACING         48
    #define SM_CXSMICON             49
    #define SM_CYSMICON             50
    #define SM_CYSMCAPTION          51
    #define SM_CXSMSIZE             52
    #define SM_CYSMSIZE             53
    #define SM_CXMENUSIZE           54
    #define SM_CYMENUSIZE           55
    #define SM_ARRANGE              56
    #define SM_CXMINIMIZED          57
    #define SM_CYMINIMIZED          58
    #define SM_CXMAXTRACK           59
    #define SM_CYMAXTRACK           60
    #define SM_CXMAXIMIZED          61
    #define SM_CYMAXIMIZED          62
    #define SM_NETWORK              63
    #define SM_CLEANBOOT            67
    #define SM_CXDRAG               68
    #define SM_CYDRAG               69
    #endif /* WINVER >= 0x0400 */
    #define SM_SHOWSOUNDS           70
    #if(WINVER >= 0x0400)
    #define SM_CXMENUCHECK          71   /* Use instead of GetMenuCheckMarkDimensions()! */
    #define SM_CYMENUCHECK          72
    #define SM_SLOWMACHINE          73
    #define SM_MIDEASTENABLED       74
    #endif /* WINVER >= 0x0400 */
     
    #if (WINVER >= 0x0500) || (_WIN32_WINNT >= 0x0400)
    #define SM_MOUSEWHEELPRESENT    75
    #endif
    #if(WINVER >= 0x0500)
    #define SM_XVIRTUALSCREEN       76
    #define SM_YVIRTUALSCREEN       77
    #define SM_CXVIRTUALSCREEN      78
    #define SM_CYVIRTUALSCREEN      79
    #define SM_CMONITORS            80
    #define SM_SAMEDISPLAYFORMAT    81
    #endif /* WINVER >= 0x0500 */
    #if(_WIN32_WINNT >= 0x0500)
    #define SM_IMMENABLED           82
    #endif /* _WIN32_WINNT >= 0x0500 */
    #if(_WIN32_WINNT >= 0x0501)
    #define SM_CXFOCUSBORDER        83
    #define SM_CYFOCUSBORDER        84
    #endif /* _WIN32_WINNT >= 0x0501 */
     
    #if(_WIN32_WINNT >= 0x0501)
    #define SM_TABLETPC             86
    #define SM_MEDIACENTER          87
    #define SM_STARTER              88
    #define SM_SERVERR2             89
    #endif /* _WIN32_WINNT >= 0x0501 */
     
    #if(_WIN32_WINNT >= 0x0600)
    #define SM_MOUSEHORIZONTALWHEELPRESENT    91
    #define SM_CXPADDEDBORDER       92
    #endif /* _WIN32_WINNT >= 0x0600 */
     
    #if(WINVER >= 0x0601)
     
    #define SM_DIGITIZER            94
    #define SM_MAXIMUMTOUCHES       95
    #endif /* WINVER >= 0x0601 */
     
    #if (WINVER < 0x0500) && (!defined(_WIN32_WINNT) || (_WIN32_WINNT < 0x0400))
    #define SM_CMETRICS             76
    #elif WINVER == 0x500
    #define SM_CMETRICS             83
    #elif WINVER == 0x501
    #define SM_CMETRICS             91
    #elif WINVER == 0x600
    #define SM_CMETRICS             93
    #else
    #define SM_CMETRICS             97
    #endif
     
    #if(WINVER >= 0x0500)
    #define SM_REMOTESESSION        0x1000
     
     
    #if(_WIN32_WINNT >= 0x0501)
    #define SM_SHUTTINGDOWN           0x2000
    #endif /* _WIN32_WINNT >= 0x0501 */
     
    #if(WINVER >= 0x0501)
    #define SM_REMOTECONTROL          0x2001
    #endif /* WINVER >= 0x0501 */
     
    #if(WINVER >= 0x0501)
    #define SM_CARETBLINKINGENABLED   0x2002
    #endif /* WINVER >= 0x0501 */
     
    #if(WINVER >= 0x0602)
    #define SM_CONVERTIBLESLATEMODE   0x2003
    #define SM_SYSTEMDOCKED           0x2004
    #endif /* WINVER >= 0x0602 */
     
    #endif /* WINVER >= 0x0500 */
     
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    WINUSERAPI
    int
    WINAPI
    GetSystemMetrics(
        _In_ int nIndex);
     
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    #endif /* !NOSYSMETRICS */
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    #ifndef NOMENUS
     
    WINUSERAPI
    HMENU
    WINAPI
    LoadMenuA(
        _In_opt_ HINSTANCE hInstance,
        _In_ LPCSTR lpMenuName);
    WINUSERAPI
    HMENU
    WINAPI
    LoadMenuW(
        _In_opt_ HINSTANCE hInstance,
        _In_ LPCWSTR lpMenuName);
    #ifdef UNICODE
    #define LoadMenu  LoadMenuW
    #else
    #define LoadMenu  LoadMenuA
    #endif // !UNICODE
     
    WINUSERAPI
    HMENU
    WINAPI
    LoadMenuIndirectA(
        _In_ CONST MENUTEMPLATEA *lpMenuTemplate);
    WINUSERAPI
    HMENU
    WINAPI
    LoadMenuIndirectW(
        _In_ CONST MENUTEMPLATEW *lpMenuTemplate);
    #ifdef UNICODE
    #define LoadMenuIndirect  LoadMenuIndirectW
    #else
    #define LoadMenuIndirect  LoadMenuIndirectA
    #endif // !UNICODE
     
    WINUSERAPI
    HMENU
    WINAPI
    GetMenu(
        _In_ HWND hWnd);
     
    WINUSERAPI
    BOOL
    WINAPI
    SetMenu(
        _In_ HWND hWnd,
        _In_opt_ HMENU hMenu);
     
    WINUSERAPI
    BOOL
    WINAPI
    ChangeMenuA(
        _In_ HMENU hMenu,
        _In_ UINT cmd,
        _In_opt_ LPCSTR lpszNewItem,
        _In_ UINT cmdInsert,
        _In_ UINT flags);
    WINUSERAPI
    BOOL
    WINAPI
    ChangeMenuW(
        _In_ HMENU hMenu,
        _In_ UINT cmd,
        _In_opt_ LPCWSTR lpszNewItem,
        _In_ UINT cmdInsert,
        _In_ UINT flags);
    #ifdef UNICODE
    #define ChangeMenu  ChangeMenuW
    #else
    #define ChangeMenu  ChangeMenuA
    #endif // !UNICODE
     
    WINUSERAPI
    BOOL
    WINAPI
    HiliteMenuItem(
        _In_ HWND hWnd,
        _In_ HMENU hMenu,
        _In_ UINT uIDHiliteItem,
        _In_ UINT uHilite);
     
    WINUSERAPI
    int
    WINAPI
    GetMenuStringA(
        _In_ HMENU hMenu,
        _In_ UINT uIDItem,
        _Out_writes_opt_(cchMax) LPSTR lpString,
        _In_ int cchMax,
        _In_ UINT flags);
    WINUSERAPI
    int
    WINAPI
    GetMenuStringW(
        _In_ HMENU hMenu,
        _In_ UINT uIDItem,
        _Out_writes_opt_(cchMax) LPWSTR lpString,
        _In_ int cchMax,
        _In_ UINT flags);
    #ifdef UNICODE
    #define GetMenuString  GetMenuStringW
    #else
    #define GetMenuString  GetMenuStringA
    #endif // !UNICODE
     
    WINUSERAPI
    UINT
    WINAPI
    GetMenuState(
        _In_ HMENU hMenu,
        _In_ UINT uId,
        _In_ UINT uFlags);
     
    WINUSERAPI
    BOOL
    WINAPI
    DrawMenuBar(
        _In_ HWND hWnd);
     
    #if(_WIN32_WINNT >= 0x0501)
    #define PMB_ACTIVE      0x00000001
     
    #endif /* _WIN32_WINNT >= 0x0501 */
     
     
    WINUSERAPI
    HMENU
    WINAPI
    GetSystemMenu(
        _In_ HWND hWnd,
        _In_ BOOL bRevert);
     
     
    WINUSERAPI
    HMENU
    WINAPI
    CreateMenu(
        VOID);
     
    WINUSERAPI
    HMENU
    WINAPI
    CreatePopupMenu(
        VOID);
     
    WINUSERAPI
    BOOL
    WINAPI
    DestroyMenu(
        _In_ HMENU hMenu);
     
    WINUSERAPI
    DWORD
    WINAPI
    CheckMenuItem(
        _In_ HMENU hMenu,
        _In_ UINT uIDCheckItem,
        _In_ UINT uCheck);
     
    WINUSERAPI
    BOOL
    WINAPI
    EnableMenuItem(
        _In_ HMENU hMenu,
        _In_ UINT uIDEnableItem,
        _In_ UINT uEnable);
     
    WINUSERAPI
    HMENU
    WINAPI
    GetSubMenu(
        _In_ HMENU hMenu,
        _In_ int nPos);
     
    WINUSERAPI
    UINT
    WINAPI
    GetMenuItemID(
        _In_ HMENU hMenu,
        _In_ int nPos);
     
    WINUSERAPI
    int
    WINAPI
    GetMenuItemCount(
        _In_opt_ HMENU hMenu);
     
    WINUSERAPI
    BOOL
    WINAPI
    InsertMenuA(
        _In_ HMENU hMenu,
        _In_ UINT uPosition,
        _In_ UINT uFlags,
        _In_ UINT_PTR uIDNewItem,
        _In_opt_ LPCSTR lpNewItem);
    WINUSERAPI
    BOOL
    WINAPI
    InsertMenuW(
        _In_ HMENU hMenu,
        _In_ UINT uPosition,
        _In_ UINT uFlags,
        _In_ UINT_PTR uIDNewItem,
        _In_opt_ LPCWSTR lpNewItem);
    #ifdef UNICODE
    #define InsertMenu  InsertMenuW
    #else
    #define InsertMenu  InsertMenuA
    #endif // !UNICODE
     
    WINUSERAPI
    BOOL
    WINAPI
    AppendMenuA(
        _In_ HMENU hMenu,
        _In_ UINT uFlags,
        _In_ UINT_PTR uIDNewItem,
        _In_opt_ LPCSTR lpNewItem);
    WINUSERAPI
    BOOL
    WINAPI
    AppendMenuW(
        _In_ HMENU hMenu,
        _In_ UINT uFlags,
        _In_ UINT_PTR uIDNewItem,
        _In_opt_ LPCWSTR lpNewItem);
    #ifdef UNICODE
    #define AppendMenu  AppendMenuW
    #else
    #define AppendMenu  AppendMenuA
    #endif // !UNICODE
     
    WINUSERAPI
    BOOL
    WINAPI
    ModifyMenuA(
        _In_ HMENU hMnu,
        _In_ UINT uPosition,
        _In_ UINT uFlags,
        _In_ UINT_PTR uIDNewItem,
        _In_opt_ LPCSTR lpNewItem);
    WINUSERAPI
    BOOL
    WINAPI
    ModifyMenuW(
        _In_ HMENU hMnu,
        _In_ UINT uPosition,
        _In_ UINT uFlags,
        _In_ UINT_PTR uIDNewItem,
        _In_opt_ LPCWSTR lpNewItem);
    #ifdef UNICODE
    #define ModifyMenu  ModifyMenuW
    #else
    #define ModifyMenu  ModifyMenuA
    #endif // !UNICODE
     
    WINUSERAPI
    BOOL
    WINAPI RemoveMenu(
        _In_ HMENU hMenu,
        _In_ UINT uPosition,
        _In_ UINT uFlags);
     
    WINUSERAPI
    BOOL
    WINAPI
    DeleteMenu(
        _In_ HMENU hMenu,
        _In_ UINT uPosition,
        _In_ UINT uFlags);
     
    WINUSERAPI
    BOOL
    WINAPI
    SetMenuItemBitmaps(
        _In_ HMENU hMenu,
        _In_ UINT uPosition,
        _In_ UINT uFlags,
        _In_opt_ HBITMAP hBitmapUnchecked,
        _In_opt_ HBITMAP hBitmapChecked);
     
    WINUSERAPI
    LONG
    WINAPI
    GetMenuCheckMarkDimensions(
        VOID);
     
    WINUSERAPI
    BOOL
    WINAPI
    TrackPopupMenu(
        _In_ HMENU hMenu,
        _In_ UINT uFlags,
        _In_ int x,
        _In_ int y,
        _Reserved_ int nReserved,
        _In_ HWND hWnd,
        _Reserved_ CONST RECT *prcRect);
     
    #if(WINVER >= 0x0400)
    /* return codes for WM_MENUCHAR */
    #define MNC_IGNORE  0
    #define MNC_CLOSE   1
    #define MNC_EXECUTE 2
    #define MNC_SELECT  3
     
    typedef struct tagTPMPARAMS
    {
        UINT    cbSize;     /* Size of structure */
        RECT    rcExclude;  /* Screen coordinates of rectangle to exclude when positioning */
    }   TPMPARAMS;
    typedef TPMPARAMS FAR *LPTPMPARAMS;
     
    WINUSERAPI
    BOOL
    WINAPI
    TrackPopupMenuEx(
        _In_ HMENU hMenu,
        _In_ UINT uFlags,
        _In_ int x,
        _In_ int y,
        _In_ HWND hwnd,
        _In_opt_ LPTPMPARAMS lptpm);
    #endif /* WINVER >= 0x0400 */
     
    #if(_WIN32_WINNT >= 0x0601)
    WINUSERAPI
    BOOL
    WINAPI
    CalculatePopupWindowPosition(
        _In_ const POINT *anchorPoint,
        _In_ const SIZE *windowSize,
        _In_ UINT /* TPM_XXX values */ flags,
        _In_opt_ RECT *excludeRect,
        _Out_ RECT *popupWindowPosition);
     
    #endif /* _WIN32_WINNT >= 0x0601 */
     
    #if(WINVER >= 0x0500)
     
    #define MNS_NOCHECK         0x80000000
    #define MNS_MODELESS        0x40000000
    #define MNS_DRAGDROP        0x20000000
    #define MNS_AUTODISMISS     0x10000000
    #define MNS_NOTIFYBYPOS     0x08000000
    #define MNS_CHECKORBMP      0x04000000
     
    #define MIM_MAXHEIGHT               0x00000001
    #define MIM_BACKGROUND              0x00000002
    #define MIM_HELPID                  0x00000004
    #define MIM_MENUDATA                0x00000008
    #define MIM_STYLE                   0x00000010
    #define MIM_APPLYTOSUBMENUS         0x80000000
     
    typedef struct tagMENUINFO
    {
        DWORD   cbSize;
        DWORD   fMask;
        DWORD   dwStyle;
        UINT    cyMax;
        HBRUSH  hbrBack;
        DWORD   dwContextHelpID;
        ULONG_PTR dwMenuData;
    }   MENUINFO, FAR *LPMENUINFO;
    typedef MENUINFO CONST FAR *LPCMENUINFO;
     
    WINUSERAPI
    BOOL
    WINAPI
    GetMenuInfo(
        _In_ HMENU,
        _Inout_ LPMENUINFO);
     
    WINUSERAPI
    BOOL
    WINAPI
    SetMenuInfo(
        _In_ HMENU,
        _In_ LPCMENUINFO);
     
    WINUSERAPI
    BOOL
    WINAPI
    EndMenu(
            VOID);
     
    /*
     * WM_MENUDRAG return values.
     */
    #define MND_CONTINUE       0
    #define MND_ENDMENU        1
     
    typedef struct tagMENUGETOBJECTINFO
    {
        DWORD dwFlags;
        UINT uPos;
        HMENU hmenu;
        PVOID riid;
        PVOID pvObj;
    } MENUGETOBJECTINFO, * PMENUGETOBJECTINFO;
     
    /*
     * MENUGETOBJECTINFO dwFlags values
     */
    #define MNGOF_TOPGAP         0x00000001
    #define MNGOF_BOTTOMGAP      0x00000002
     
    /*
     * WM_MENUGETOBJECT return values
     */
    #define MNGO_NOINTERFACE     0x00000000
    #define MNGO_NOERROR         0x00000001
    #endif /* WINVER >= 0x0500 */
     
    #if(WINVER >= 0x0400)
    #define MIIM_STATE       0x00000001
    #define MIIM_ID          0x00000002
    #define MIIM_SUBMENU     0x00000004
    #define MIIM_CHECKMARKS  0x00000008
    #define MIIM_TYPE        0x00000010
    #define MIIM_DATA        0x00000020
    #endif /* WINVER >= 0x0400 */
     
    #if(WINVER >= 0x0500)
    #define MIIM_STRING      0x00000040
    #define MIIM_BITMAP      0x00000080
    #define MIIM_FTYPE       0x00000100
     
    #define HBMMENU_CALLBACK            ((HBITMAP) -1)
    #define HBMMENU_SYSTEM              ((HBITMAP)  1)
    #define HBMMENU_MBAR_RESTORE        ((HBITMAP)  2)
    #define HBMMENU_MBAR_MINIMIZE       ((HBITMAP)  3)
    #define HBMMENU_MBAR_CLOSE          ((HBITMAP)  5)
    #define HBMMENU_MBAR_CLOSE_D        ((HBITMAP)  6)
    #define HBMMENU_MBAR_MINIMIZE_D     ((HBITMAP)  7)
    #define HBMMENU_POPUP_CLOSE         ((HBITMAP)  8)
    #define HBMMENU_POPUP_RESTORE       ((HBITMAP)  9)
    #define HBMMENU_POPUP_MAXIMIZE      ((HBITMAP) 10)
    #define HBMMENU_POPUP_MINIMIZE      ((HBITMAP) 11)
    #endif /* WINVER >= 0x0500 */
     
    #if(WINVER >= 0x0400)
    typedef struct tagMENUITEMINFOA
    {
        UINT     cbSize;
        UINT     fMask;
        UINT     fType;         // used if MIIM_TYPE (4.0) or MIIM_FTYPE (>4.0)
        UINT     fState;        // used if MIIM_STATE
        UINT     wID;           // used if MIIM_ID
        HMENU    hSubMenu;      // used if MIIM_SUBMENU
        HBITMAP  hbmpChecked;   // used if MIIM_CHECKMARKS
        HBITMAP  hbmpUnchecked; // used if MIIM_CHECKMARKS
        ULONG_PTR dwItemData;   // used if MIIM_DATA
        LPSTR    dwTypeData;    // used if MIIM_TYPE (4.0) or MIIM_STRING (>4.0)
        UINT     cch;           // used if MIIM_TYPE (4.0) or MIIM_STRING (>4.0)
    #if(WINVER >= 0x0500)
        HBITMAP  hbmpItem;      // used if MIIM_BITMAP
    #endif /* WINVER >= 0x0500 */
    }   MENUITEMINFOA, FAR *LPMENUITEMINFOA;
    typedef struct tagMENUITEMINFOW
    {
        UINT     cbSize;
        UINT     fMask;
        UINT     fType;         // used if MIIM_TYPE (4.0) or MIIM_FTYPE (>4.0)
        UINT     fState;        // used if MIIM_STATE
        UINT     wID;           // used if MIIM_ID
        HMENU    hSubMenu;      // used if MIIM_SUBMENU
        HBITMAP  hbmpChecked;   // used if MIIM_CHECKMARKS
        HBITMAP  hbmpUnchecked; // used if MIIM_CHECKMARKS
        ULONG_PTR dwItemData;   // used if MIIM_DATA
        LPWSTR   dwTypeData;    // used if MIIM_TYPE (4.0) or MIIM_STRING (>4.0)
        UINT     cch;           // used if MIIM_TYPE (4.0) or MIIM_STRING (>4.0)
    #if(WINVER >= 0x0500)
        HBITMAP  hbmpItem;      // used if MIIM_BITMAP
    #endif /* WINVER >= 0x0500 */
    }   MENUITEMINFOW, FAR *LPMENUITEMINFOW;
    #ifdef UNICODE
    typedef MENUITEMINFOW MENUITEMINFO;
    typedef LPMENUITEMINFOW LPMENUITEMINFO;
    #else
    typedef MENUITEMINFOA MENUITEMINFO;
    typedef LPMENUITEMINFOA LPMENUITEMINFO;
    #endif // UNICODE
    typedef MENUITEMINFOA CONST FAR *LPCMENUITEMINFOA;
    typedef MENUITEMINFOW CONST FAR *LPCMENUITEMINFOW;
    #ifdef UNICODE
    typedef LPCMENUITEMINFOW LPCMENUITEMINFO;
    #else
    typedef LPCMENUITEMINFOA LPCMENUITEMINFO;
    #endif // UNICODE
     
     
    WINUSERAPI
    BOOL
    WINAPI
    InsertMenuItemA(
        _In_ HMENU hmenu,
        _In_ UINT item,
        _In_ BOOL fByPosition,
        _In_ LPCMENUITEMINFOA lpmi);
    WINUSERAPI
    BOOL
    WINAPI
    InsertMenuItemW(
        _In_ HMENU hmenu,
        _In_ UINT item,
        _In_ BOOL fByPosition,
        _In_ LPCMENUITEMINFOW lpmi);
    #ifdef UNICODE
    #define InsertMenuItem  InsertMenuItemW
    #else
    #define InsertMenuItem  InsertMenuItemA
    #endif // !UNICODE
     
    WINUSERAPI
    BOOL
    WINAPI
    GetMenuItemInfoA(
        _In_ HMENU hmenu,
        _In_ UINT item,
        _In_ BOOL fByPosition,
        _Inout_ LPMENUITEMINFOA lpmii);
    WINUSERAPI
    BOOL
    WINAPI
    GetMenuItemInfoW(
        _In_ HMENU hmenu,
        _In_ UINT item,
        _In_ BOOL fByPosition,
        _Inout_ LPMENUITEMINFOW lpmii);
    #ifdef UNICODE
    #define GetMenuItemInfo  GetMenuItemInfoW
    #else
    #define GetMenuItemInfo  GetMenuItemInfoA
    #endif // !UNICODE
     
    WINUSERAPI
    BOOL
    WINAPI
    SetMenuItemInfoA(
        _In_ HMENU hmenu,
        _In_ UINT item,
        _In_ BOOL fByPositon,
        _In_ LPCMENUITEMINFOA lpmii);
    WINUSERAPI
    BOOL
    WINAPI
    SetMenuItemInfoW(
        _In_ HMENU hmenu,
        _In_ UINT item,
        _In_ BOOL fByPositon,
        _In_ LPCMENUITEMINFOW lpmii);
    #ifdef UNICODE
    #define SetMenuItemInfo  SetMenuItemInfoW
    #else
    #define SetMenuItemInfo  SetMenuItemInfoA
    #endif // !UNICODE
     
     
    #define GMDI_USEDISABLED    0x0001L
    #define GMDI_GOINTOPOPUPS   0x0002L
     
    WINUSERAPI
    UINT
    WINAPI
    GetMenuDefaultItem(
        _In_ HMENU hMenu,
        _In_ UINT fByPos,
        _In_ UINT gmdiFlags);
     
    WINUSERAPI
    BOOL
    WINAPI
    SetMenuDefaultItem(
        _In_ HMENU hMenu,
        _In_ UINT uItem,
        _In_ UINT fByPos);
     
    WINUSERAPI
    BOOL
    WINAPI
    GetMenuItemRect(
        _In_opt_ HWND hWnd,
        _In_ HMENU hMenu,
        _In_ UINT uItem,
        _Out_ LPRECT lprcItem);
     
    WINUSERAPI
    int
    WINAPI
    MenuItemFromPoint(
        _In_opt_ HWND hWnd,
        _In_ HMENU hMenu,
        _In_ POINT ptScreen);
    #endif /* WINVER >= 0x0400 */
     
    /*
     * Flags for TrackPopupMenu
     */
    #define TPM_LEFTBUTTON  0x0000L
    #define TPM_RIGHTBUTTON 0x0002L
    #define TPM_LEFTALIGN   0x0000L
    #define TPM_CENTERALIGN 0x0004L
    #define TPM_RIGHTALIGN  0x0008L
    #if(WINVER >= 0x0400)
    #define TPM_TOPALIGN        0x0000L
    #define TPM_VCENTERALIGN    0x0010L
    #define TPM_BOTTOMALIGN     0x0020L
     
    #define TPM_HORIZONTAL      0x0000L     /* Horz alignment matters more */
    #define TPM_VERTICAL        0x0040L     /* Vert alignment matters more */
    #define TPM_NONOTIFY        0x0080L     /* Don't send any notification msgs */
    #define TPM_RETURNCMD       0x0100L
    #endif /* WINVER >= 0x0400 */
    #if(WINVER >= 0x0500)
    #define TPM_RECURSE         0x0001L
    #define TPM_HORPOSANIMATION 0x0400L
    #define TPM_HORNEGANIMATION 0x0800L
    #define TPM_VERPOSANIMATION 0x1000L
    #define TPM_VERNEGANIMATION 0x2000L
    #if(_WIN32_WINNT >= 0x0500)
    #define TPM_NOANIMATION     0x4000L
    #endif /* _WIN32_WINNT >= 0x0500 */
    #if(_WIN32_WINNT >= 0x0501)
    #define TPM_LAYOUTRTL       0x8000L
    #endif /* _WIN32_WINNT >= 0x0501 */
    #endif /* WINVER >= 0x0500 */
    #if(_WIN32_WINNT >= 0x0601)
    #define TPM_WORKAREA        0x10000L
    #endif /* _WIN32_WINNT >= 0x0601 */
     
     
    #endif /* !NOMENUS */
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
     
    #if(WINVER >= 0x0400)
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    //
    // Drag-and-drop support
    // Obsolete - use OLE instead
    //
    typedef struct tagDROPSTRUCT
    {
        HWND    hwndSource;
        HWND    hwndSink;
        DWORD   wFmt;
        ULONG_PTR dwData;
        POINT   ptDrop;
        DWORD   dwControlData;
    } DROPSTRUCT, *PDROPSTRUCT, *LPDROPSTRUCT;
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    #define DOF_EXECUTABLE      0x8001      // wFmt flags
    #define DOF_DOCUMENT        0x8002
    #define DOF_DIRECTORY       0x8003
    #define DOF_MULTIPLE        0x8004
    #define DOF_PROGMAN         0x0001
    #define DOF_SHELLDATA       0x0002
     
    #define DO_DROPFILE         0x454C4946L
    #define DO_PRINTFILE        0x544E5250L
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    WINUSERAPI
    DWORD
    WINAPI
    DragObject(
        _In_ HWND hwndParent,
        _In_ HWND hwndFrom,
        _In_ UINT fmt,
        _In_ ULONG_PTR data,
        _In_opt_ HCURSOR hcur);
     
    WINUSERAPI
    BOOL
    WINAPI
    DragDetect(
        _In_ HWND hwnd,
        _In_ POINT pt);
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    #endif /* WINVER >= 0x0400 */
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    WINUSERAPI
    BOOL
    WINAPI
    DrawIcon(
        _In_ HDC hDC,
        _In_ int X,
        _In_ int Y,
        _In_ HICON hIcon);
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    #ifndef NODRAWTEXT
     
    /*
     * DrawText() Format Flags
     */
    #define DT_TOP                      0x00000000
    #define DT_LEFT                     0x00000000
    #define DT_CENTER                   0x00000001
    #define DT_RIGHT                    0x00000002
    #define DT_VCENTER                  0x00000004
    #define DT_BOTTOM                   0x00000008
    #define DT_WORDBREAK                0x00000010
    #define DT_SINGLELINE               0x00000020
    #define DT_EXPANDTABS               0x00000040
    #define DT_TABSTOP                  0x00000080
    #define DT_NOCLIP                   0x00000100
    #define DT_EXTERNALLEADING          0x00000200
    #define DT_CALCRECT                 0x00000400
    #define DT_NOPREFIX                 0x00000800
    #define DT_INTERNAL                 0x00001000
     
    #if(WINVER >= 0x0400)
    #define DT_EDITCONTROL              0x00002000
    #define DT_PATH_ELLIPSIS            0x00004000
    #define DT_END_ELLIPSIS             0x00008000
    #define DT_MODIFYSTRING             0x00010000
    #define DT_RTLREADING               0x00020000
    #define DT_WORD_ELLIPSIS            0x00040000
    #if(WINVER >= 0x0500)
    #define DT_NOFULLWIDTHCHARBREAK     0x00080000
    #if(_WIN32_WINNT >= 0x0500)
    #define DT_HIDEPREFIX               0x00100000
    #define DT_PREFIXONLY               0x00200000
    #endif /* _WIN32_WINNT >= 0x0500 */
    #endif /* WINVER >= 0x0500 */
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    typedef struct tagDRAWTEXTPARAMS
    {
        UINT    cbSize;
        int     iTabLength;
        int     iLeftMargin;
        int     iRightMargin;
        UINT    uiLengthDrawn;
    } DRAWTEXTPARAMS, FAR *LPDRAWTEXTPARAMS;
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    #endif /* WINVER >= 0x0400 */
     
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    #define _In_bypassable_reads_or_z_(size) \
        _When_(((size) == -1) || (_String_length_(_Curr_) <  (size)), _In_z_) \
        _When_(((size) != -1) && (_String_length_(_Curr_) >= (size)), _In_reads_(size))
     
    #define _Inout_grows_updates_bypassable_or_z_(size, grows) \
        _When_(((size) == -1) || (_String_length_(_Curr_) <  (size)), _Pre_z_ _Pre_valid_ _Out_writes_z_(_String_length_(_Curr_) + (grows))) \
        _When_(((size) != -1) && (_String_length_(_Curr_) >= (size)), _Pre_count_(size) _Pre_valid_ _Out_writes_z_((size) + (grows)))
     
    WINUSERAPI
    _Success_(return)
    int
    WINAPI
    DrawTextA(
        _In_ HDC hdc,
        _When_((format & DT_MODIFYSTRING), _At_((LPSTR)lpchText, _Inout_grows_updates_bypassable_or_z_(cchText, 4)))
        _When_((!(format & DT_MODIFYSTRING)), _In_bypassable_reads_or_z_(cchText))
        LPCSTR lpchText,
        _In_ int cchText,
        _Inout_ LPRECT lprc,
        _In_ UINT format);
    WINUSERAPI
    _Success_(return)
    int
    WINAPI
    DrawTextW(
        _In_ HDC hdc,
        _When_((format & DT_MODIFYSTRING), _At_((LPWSTR)lpchText, _Inout_grows_updates_bypassable_or_z_(cchText, 4)))
        _When_((!(format & DT_MODIFYSTRING)), _In_bypassable_reads_or_z_(cchText))
        LPCWSTR lpchText,
        _In_ int cchText,
        _Inout_ LPRECT lprc,
        _In_ UINT format);
    #ifdef UNICODE
    #define DrawText  DrawTextW
    #else
    #define DrawText  DrawTextA
    #endif // !UNICODE
     
    #if defined(_M_CEE)
    #undef DrawText
    __inline
    int
    DrawText(
        HDC hdc,
        LPCTSTR lpchText,
        int cchText,
        LPRECT lprc,
        UINT format
        )
    {
    #ifdef UNICODE
        return DrawTextW(
    #else
        return DrawTextA(
    #endif
            hdc,
        lpchText,
        cchText,
        lprc,
        format
            );
    }
    #endif  /* _M_CEE */
     
     
    #if(WINVER >= 0x0400)
    WINUSERAPI
    _Success_(return)
    int
    WINAPI
    DrawTextExA(
        _In_ HDC hdc,
        _When_((cchText) < -1, _Unreferenced_parameter_)
        _When_((format & DT_MODIFYSTRING), _Inout_grows_updates_bypassable_or_z_(cchText, 4))
        _When_((!(format & DT_MODIFYSTRING)), _At_((LPCSTR)lpchText, _In_bypassable_reads_or_z_(cchText)))
        LPSTR lpchText,
        _In_ int cchText,
        _Inout_ LPRECT lprc,
        _In_ UINT format,
        _In_opt_ LPDRAWTEXTPARAMS lpdtp);
    WINUSERAPI
    _Success_(return)
    int
    WINAPI
    DrawTextExW(
        _In_ HDC hdc,
        _When_((cchText) < -1, _Unreferenced_parameter_)
        _When_((format & DT_MODIFYSTRING), _Inout_grows_updates_bypassable_or_z_(cchText, 4))
        _When_((!(format & DT_MODIFYSTRING)), _At_((LPCWSTR)lpchText, _In_bypassable_reads_or_z_(cchText)))
        LPWSTR lpchText,
        _In_ int cchText,
        _Inout_ LPRECT lprc,
        _In_ UINT format,
        _In_opt_ LPDRAWTEXTPARAMS lpdtp);
    #ifdef UNICODE
    #define DrawTextEx  DrawTextExW
    #else
    #define DrawTextEx  DrawTextExA
    #endif // !UNICODE
    #endif /* WINVER >= 0x0400 */
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    #endif /* !NODRAWTEXT */
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    WINUSERAPI
    BOOL
    WINAPI
    GrayStringA(
        _In_ HDC hDC,
        _In_opt_ HBRUSH hBrush,
        _In_opt_ GRAYSTRINGPROC lpOutputFunc,
        _In_ LPARAM lpData,
        _In_ int nCount,
        _In_ int X,
        _In_ int Y,
        _In_ int nWidth,
        _In_ int nHeight);
    WINUSERAPI
    BOOL
    WINAPI
    GrayStringW(
        _In_ HDC hDC,
        _In_opt_ HBRUSH hBrush,
        _In_opt_ GRAYSTRINGPROC lpOutputFunc,
        _In_ LPARAM lpData,
        _In_ int nCount,
        _In_ int X,
        _In_ int Y,
        _In_ int nWidth,
        _In_ int nHeight);
    #ifdef UNICODE
    #define GrayString  GrayStringW
    #else
    #define GrayString  GrayStringA
    #endif // !UNICODE
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    #if(WINVER >= 0x0400)
    /* Monolithic state-drawing routine */
    /* Image type */
    #define DST_COMPLEX     0x0000
    #define DST_TEXT        0x0001
    #define DST_PREFIXTEXT  0x0002
    #define DST_ICON        0x0003
    #define DST_BITMAP      0x0004
     
    /* State type */
    #define DSS_NORMAL      0x0000
    #define DSS_UNION       0x0010  /* Gray string appearance */
    #define DSS_DISABLED    0x0020
    #define DSS_MONO        0x0080
    #if(_WIN32_WINNT >= 0x0500)
    #define DSS_HIDEPREFIX  0x0200
    #define DSS_PREFIXONLY  0x0400
    #endif /* _WIN32_WINNT >= 0x0500 */
    #define DSS_RIGHT       0x8000
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    WINUSERAPI
    BOOL
    WINAPI
    DrawStateA(
        _In_ HDC hdc,
        _In_opt_ HBRUSH hbrFore,
        _In_opt_ DRAWSTATEPROC qfnCallBack,
        _In_ LPARAM lData,
        _In_ WPARAM wData,
        _In_ int x,
        _In_ int y,
        _In_ int cx,
        _In_ int cy,
        _In_ UINT uFlags);
    WINUSERAPI
    BOOL
    WINAPI
    DrawStateW(
        _In_ HDC hdc,
        _In_opt_ HBRUSH hbrFore,
        _In_opt_ DRAWSTATEPROC qfnCallBack,
        _In_ LPARAM lData,
        _In_ WPARAM wData,
        _In_ int x,
        _In_ int y,
        _In_ int cx,
        _In_ int cy,
        _In_ UINT uFlags);
    #ifdef UNICODE
    #define DrawState  DrawStateW
    #else
    #define DrawState  DrawStateA
    #endif // !UNICODE
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    #endif /* WINVER >= 0x0400 */
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    WINUSERAPI
    LONG
    WINAPI
    TabbedTextOutA(
        _In_ HDC hdc,
        _In_ int x,
        _In_ int y,
        _In_reads_(chCount) LPCSTR lpString,
        _In_ int chCount,
        _In_ int nTabPositions,
        _In_reads_opt_(nTabPositions) CONST INT *lpnTabStopPositions,
        _In_ int nTabOrigin);
    WINUSERAPI
    LONG
    WINAPI
    TabbedTextOutW(
        _In_ HDC hdc,
        _In_ int x,
        _In_ int y,
        _In_reads_(chCount) LPCWSTR lpString,
        _In_ int chCount,
        _In_ int nTabPositions,
        _In_reads_opt_(nTabPositions) CONST INT *lpnTabStopPositions,
        _In_ int nTabOrigin);
    #ifdef UNICODE
    #define TabbedTextOut  TabbedTextOutW
    #else
    #define TabbedTextOut  TabbedTextOutA
    #endif // !UNICODE
     
    WINUSERAPI
    DWORD
    WINAPI
    GetTabbedTextExtentA(
        _In_ HDC hdc,
        _In_reads_(chCount) LPCSTR lpString,
        _In_ int chCount,
        _In_ int nTabPositions,
        _In_reads_opt_(nTabPositions) CONST INT *lpnTabStopPositions);
    WINUSERAPI
    DWORD
    WINAPI
    GetTabbedTextExtentW(
        _In_ HDC hdc,
        _In_reads_(chCount) LPCWSTR lpString,
        _In_ int chCount,
        _In_ int nTabPositions,
        _In_reads_opt_(nTabPositions) CONST INT *lpnTabStopPositions);
    #ifdef UNICODE
    #define GetTabbedTextExtent  GetTabbedTextExtentW
    #else
    #define GetTabbedTextExtent  GetTabbedTextExtentA
    #endif // !UNICODE
     
    WINUSERAPI
    BOOL
    WINAPI
    UpdateWindow(
        _In_ HWND hWnd);
     
    WINUSERAPI
    HWND
    WINAPI
    SetActiveWindow(
        _In_ HWND hWnd);
     
     
    WINUSERAPI
    HWND
    WINAPI
    GetForegroundWindow(
        VOID);
     
    #if(WINVER >= 0x0400)
    WINUSERAPI
    BOOL
    WINAPI
    PaintDesktop(
        _In_ HDC hdc);
     
    WINUSERAPI
    VOID
    WINAPI
    SwitchToThisWindow(
        _In_ HWND hwnd,
        _In_ BOOL fUnknown);
    #endif /* WINVER >= 0x0400 */
     
     
    WINUSERAPI
    BOOL
    WINAPI
    SetForegroundWindow(
        _In_ HWND hWnd);
     
    #if(_WIN32_WINNT >= 0x0500)
    WINUSERAPI
    BOOL
    WINAPI
    AllowSetForegroundWindow(
        _In_ DWORD dwProcessId);
     
    #define ASFW_ANY    ((DWORD)-1)
     
    WINUSERAPI
    BOOL
    WINAPI
    LockSetForegroundWindow(
        _In_ UINT uLockCode);
     
    #define LSFW_LOCK       1
    #define LSFW_UNLOCK     2
     
    #endif /* _WIN32_WINNT >= 0x0500 */
     
    WINUSERAPI
    HWND
    WINAPI
    WindowFromDC(
        _In_ HDC hDC);
     
    WINUSERAPI
    HDC
    WINAPI
    GetDC(
        _In_opt_ HWND hWnd);
     
    WINUSERAPI
    HDC
    WINAPI
    GetDCEx(
        _In_opt_ HWND hWnd,
        _In_opt_ HRGN hrgnClip,
        _In_ DWORD flags);
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    /*
     * GetDCEx() flags
     */
    #define DCX_WINDOW           0x00000001L
    #define DCX_CACHE            0x00000002L
    #define DCX_NORESETATTRS     0x00000004L
    #define DCX_CLIPCHILDREN     0x00000008L
    #define DCX_CLIPSIBLINGS     0x00000010L
    #define DCX_PARENTCLIP       0x00000020L
    #define DCX_EXCLUDERGN       0x00000040L
    #define DCX_INTERSECTRGN     0x00000080L
    #define DCX_EXCLUDEUPDATE    0x00000100L
    #define DCX_INTERSECTUPDATE  0x00000200L
    #define DCX_LOCKWINDOWUPDATE 0x00000400L
     
    #define DCX_VALIDATE         0x00200000L
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    WINUSERAPI
    HDC
    WINAPI
    GetWindowDC(
        _In_opt_ HWND hWnd);
     
    WINUSERAPI
    int
    WINAPI
    ReleaseDC(
        _In_opt_ HWND hWnd,
        _In_ HDC hDC);
     
    WINUSERAPI
    HDC
    WINAPI
    BeginPaint(
        _In_ HWND hWnd,
        _Out_ LPPAINTSTRUCT lpPaint);
     
    WINUSERAPI
    BOOL
    WINAPI
    EndPaint(
        _In_ HWND hWnd,
        _In_ CONST PAINTSTRUCT *lpPaint);
     
    WINUSERAPI
    BOOL
    WINAPI
    GetUpdateRect(
        _In_ HWND hWnd,
        _Out_opt_ LPRECT lpRect,
        _In_ BOOL bErase);
     
    WINUSERAPI
    int
    WINAPI
    GetUpdateRgn(
        _In_ HWND hWnd,
        _In_ HRGN hRgn,
        _In_ BOOL bErase);
     
    WINUSERAPI
    int
    WINAPI
    SetWindowRgn(
        _In_ HWND hWnd,
        _In_opt_ HRGN hRgn,
        _In_ BOOL bRedraw);
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    WINUSERAPI
    int
    WINAPI
    GetWindowRgn(
        _In_ HWND hWnd,
        _In_ HRGN hRgn);
     
    #if(_WIN32_WINNT >= 0x0501)
     
    WINUSERAPI
    int
    WINAPI
    GetWindowRgnBox(
        _In_ HWND hWnd,
        _Out_ LPRECT lprc);
     
    #endif /* _WIN32_WINNT >= 0x0501 */
     
    WINUSERAPI
    int
    WINAPI
    ExcludeUpdateRgn(
        _In_ HDC hDC,
        _In_ HWND hWnd);
     
    WINUSERAPI
    BOOL
    WINAPI
    InvalidateRect(
        _In_opt_ HWND hWnd,
        _In_opt_ CONST RECT *lpRect,
        _In_ BOOL bErase);
     
    WINUSERAPI
    BOOL
    WINAPI
    ValidateRect(
        _In_opt_ HWND hWnd,
        _In_opt_ CONST RECT *lpRect);
     
    WINUSERAPI
    BOOL
    WINAPI
    InvalidateRgn(
        _In_ HWND hWnd,
        _In_opt_ HRGN hRgn,
        _In_ BOOL bErase);
     
    WINUSERAPI
    BOOL
    WINAPI
    ValidateRgn(
        _In_ HWND hWnd,
        _In_opt_ HRGN hRgn);
     
     
    WINUSERAPI
    BOOL
    WINAPI
    RedrawWindow(
        _In_opt_ HWND hWnd,
        _In_opt_ CONST RECT *lprcUpdate,
        _In_opt_ HRGN hrgnUpdate,
        _In_ UINT flags);
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    /*
     * RedrawWindow() flags
     */
    #define RDW_INVALIDATE          0x0001
    #define RDW_INTERNALPAINT       0x0002
    #define RDW_ERASE               0x0004
     
    #define RDW_VALIDATE            0x0008
    #define RDW_NOINTERNALPAINT     0x0010
    #define RDW_NOERASE             0x0020
     
    #define RDW_NOCHILDREN          0x0040
    #define RDW_ALLCHILDREN         0x0080
     
    #define RDW_UPDATENOW           0x0100
    #define RDW_ERASENOW            0x0200
     
    #define RDW_FRAME               0x0400
    #define RDW_NOFRAME             0x0800
     
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    /*
     * LockWindowUpdate API
     */
     
    WINUSERAPI
    BOOL
    WINAPI
    LockWindowUpdate(
        _In_opt_ HWND hWndLock);
     
    WINUSERAPI
    BOOL
    WINAPI
    ScrollWindow(
        _In_ HWND hWnd,
        _In_ int XAmount,
        _In_ int YAmount,
        _In_opt_ CONST RECT *lpRect,
        _In_opt_ CONST RECT *lpClipRect);
     
    WINUSERAPI
    BOOL
    WINAPI
    ScrollDC(
        _In_ HDC hDC,
        _In_ int dx,
        _In_ int dy,
        _In_opt_ CONST RECT *lprcScroll,
        _In_opt_ CONST RECT *lprcClip,
        _In_opt_ HRGN hrgnUpdate,
        _Out_opt_ LPRECT lprcUpdate);
     
    WINUSERAPI
    int
    WINAPI
    ScrollWindowEx(
        _In_ HWND hWnd,
        _In_ int dx,
        _In_ int dy,
        _In_opt_ CONST RECT *prcScroll,
        _In_opt_ CONST RECT *prcClip,
        _In_opt_ HRGN hrgnUpdate,
        _Out_opt_ LPRECT prcUpdate,
        _In_ UINT flags);
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    #define SW_SCROLLCHILDREN   0x0001  /* Scroll children within *lprcScroll. */
    #define SW_INVALIDATE       0x0002  /* Invalidate after scrolling */
    #define SW_ERASE            0x0004  /* If SW_INVALIDATE, don't send WM_ERASEBACKGROUND */
    #if(WINVER >= 0x0500)
    #define SW_SMOOTHSCROLL     0x0010  /* Use smooth scrolling */
    #endif /* WINVER >= 0x0500 */
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    #ifndef NOSCROLL
     
    WINUSERAPI
    int
    WINAPI
    SetScrollPos(
        _In_ HWND hWnd,
        _In_ int nBar,
        _In_ int nPos,
        _In_ BOOL bRedraw);
     
    WINUSERAPI
    int
    WINAPI
    GetScrollPos(
        _In_ HWND hWnd,
        _In_ int nBar);
     
    WINUSERAPI
    BOOL
    WINAPI
    SetScrollRange(
        _In_ HWND hWnd,
        _In_ int nBar,
        _In_ int nMinPos,
        _In_ int nMaxPos,
        _In_ BOOL bRedraw);
     
    WINUSERAPI
    BOOL
    WINAPI
    GetScrollRange(
        _In_ HWND hWnd,
        _In_ int nBar,
        _Out_ LPINT lpMinPos,
        _Out_ LPINT lpMaxPos);
     
    WINUSERAPI
    BOOL
    WINAPI
    ShowScrollBar(
        _In_ HWND hWnd,
        _In_ int wBar,
        _In_ BOOL bShow);
     
    WINUSERAPI
    BOOL
    WINAPI
    EnableScrollBar(
        _In_ HWND hWnd,
        _In_ UINT wSBflags,
        _In_ UINT wArrows);
     
     
    /*
     * EnableScrollBar() flags
     */
    #define ESB_ENABLE_BOTH     0x0000
    #define ESB_DISABLE_BOTH    0x0003
     
    #define ESB_DISABLE_LEFT    0x0001
    #define ESB_DISABLE_RIGHT   0x0002
     
    #define ESB_DISABLE_UP      0x0001
    #define ESB_DISABLE_DOWN    0x0002
     
    #define ESB_DISABLE_LTUP    ESB_DISABLE_LEFT
    #define ESB_DISABLE_RTDN    ESB_DISABLE_RIGHT
     
     
    #endif  /* !NOSCROLL */
     
    WINUSERAPI
    BOOL
    WINAPI
    SetPropA(
        _In_ HWND hWnd,
        _In_ LPCSTR lpString,
        _In_opt_ HANDLE hData);
    WINUSERAPI
    BOOL
    WINAPI
    SetPropW(
        _In_ HWND hWnd,
        _In_ LPCWSTR lpString,
        _In_opt_ HANDLE hData);
    #ifdef UNICODE
    #define SetProp  SetPropW
    #else
    #define SetProp  SetPropA
    #endif // !UNICODE
     
    WINUSERAPI
    HANDLE
    WINAPI
    GetPropA(
        _In_ HWND hWnd,
        _In_ LPCSTR lpString);
    WINUSERAPI
    HANDLE
    WINAPI
    GetPropW(
        _In_ HWND hWnd,
        _In_ LPCWSTR lpString);
    #ifdef UNICODE
    #define GetProp  GetPropW
    #else
    #define GetProp  GetPropA
    #endif // !UNICODE
     
    WINUSERAPI
    HANDLE
    WINAPI
    RemovePropA(
        _In_ HWND hWnd,
        _In_ LPCSTR lpString);
    WINUSERAPI
    HANDLE
    WINAPI
    RemovePropW(
        _In_ HWND hWnd,
        _In_ LPCWSTR lpString);
    #ifdef UNICODE
    #define RemoveProp  RemovePropW
    #else
    #define RemoveProp  RemovePropA
    #endif // !UNICODE
     
    WINUSERAPI
    int
    WINAPI
    EnumPropsExA(
        _In_ HWND hWnd,
        _In_ PROPENUMPROCEXA lpEnumFunc,
        _In_ LPARAM lParam);
    WINUSERAPI
    int
    WINAPI
    EnumPropsExW(
        _In_ HWND hWnd,
        _In_ PROPENUMPROCEXW lpEnumFunc,
        _In_ LPARAM lParam);
    #ifdef UNICODE
    #define EnumPropsEx  EnumPropsExW
    #else
    #define EnumPropsEx  EnumPropsExA
    #endif // !UNICODE
     
    WINUSERAPI
    int
    WINAPI
    EnumPropsA(
        _In_ HWND hWnd,
        _In_ PROPENUMPROCA lpEnumFunc);
    WINUSERAPI
    int
    WINAPI
    EnumPropsW(
        _In_ HWND hWnd,
        _In_ PROPENUMPROCW lpEnumFunc);
    #ifdef UNICODE
    #define EnumProps  EnumPropsW
    #else
    #define EnumProps  EnumPropsA
    #endif // !UNICODE
     
    WINUSERAPI
    BOOL
    WINAPI
    SetWindowTextA(
        _In_ HWND hWnd,
        _In_opt_ LPCSTR lpString);
    WINUSERAPI
    BOOL
    WINAPI
    SetWindowTextW(
        _In_ HWND hWnd,
        _In_opt_ LPCWSTR lpString);
    #ifdef UNICODE
    #define SetWindowText  SetWindowTextW
    #else
    #define SetWindowText  SetWindowTextA
    #endif // !UNICODE
     
    _Ret_range_(0, nMaxCount)
    WINUSERAPI
    int
    WINAPI
    GetWindowTextA(
        _In_ HWND hWnd,
        _Out_writes_(nMaxCount) LPSTR lpString,
        _In_ int nMaxCount);
    _Ret_range_(0, nMaxCount)
    WINUSERAPI
    int
    WINAPI
    GetWindowTextW(
        _In_ HWND hWnd,
        _Out_writes_(nMaxCount) LPWSTR lpString,
        _In_ int nMaxCount);
    #ifdef UNICODE
    #define GetWindowText  GetWindowTextW
    #else
    #define GetWindowText  GetWindowTextA
    #endif // !UNICODE
     
    WINUSERAPI
    int
    WINAPI
    GetWindowTextLengthA(
        _In_ HWND hWnd);
    WINUSERAPI
    int
    WINAPI
    GetWindowTextLengthW(
        _In_ HWND hWnd);
    #ifdef UNICODE
    #define GetWindowTextLength  GetWindowTextLengthW
    #else
    #define GetWindowTextLength  GetWindowTextLengthA
    #endif // !UNICODE
     
    WINUSERAPI
    BOOL
    WINAPI
    GetClientRect(
        _In_ HWND hWnd,
        _Out_ LPRECT lpRect);
     
    WINUSERAPI
    BOOL
    WINAPI
    GetWindowRect(
        _In_ HWND hWnd,
        _Out_ LPRECT lpRect);
     
    WINUSERAPI
    BOOL
    WINAPI
    AdjustWindowRect(
        _Inout_ LPRECT lpRect,
        _In_ DWORD dwStyle,
        _In_ BOOL bMenu);
     
    WINUSERAPI
    BOOL
    WINAPI
    AdjustWindowRectEx(
        _Inout_ LPRECT lpRect,
        _In_ DWORD dwStyle,
        _In_ BOOL bMenu,
        _In_ DWORD dwExStyle);
     
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    #if(WINVER >= 0x0400)
    #define HELPINFO_WINDOW    0x0001
    #define HELPINFO_MENUITEM  0x0002
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    typedef struct tagHELPINFO      /* Structure pointed to by lParam of WM_HELP */
    {
        UINT    cbSize;             /* Size in bytes of this struct  */
        int     iContextType;       /* Either HELPINFO_WINDOW or HELPINFO_MENUITEM */
        int     iCtrlId;            /* Control Id or a Menu item Id. */
        HANDLE  hItemHandle;        /* hWnd of control or hMenu.     */
        DWORD_PTR dwContextId;      /* Context Id associated with this item */
        POINT   MousePos;           /* Mouse Position in screen co-ordinates */
    }  HELPINFO, FAR *LPHELPINFO;
     
    WINUSERAPI
    BOOL
    WINAPI
    SetWindowContextHelpId(
        _In_ HWND,
        _In_ DWORD);
     
    WINUSERAPI
    DWORD
    WINAPI
    GetWindowContextHelpId(
        _In_ HWND);
     
    WINUSERAPI
    BOOL
    WINAPI
    SetMenuContextHelpId(
        _In_ HMENU,
        _In_ DWORD);
     
    WINUSERAPI
    DWORD
    WINAPI
    GetMenuContextHelpId(
        _In_ HMENU);
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    #endif /* WINVER >= 0x0400 */
     
     
    #ifndef NOMB
     
    /*
     * MessageBox() Flags
     */
    #define MB_OK                       0x00000000L
    #define MB_OKCANCEL                 0x00000001L
    #define MB_ABORTRETRYIGNORE         0x00000002L
    #define MB_YESNOCANCEL              0x00000003L
    #define MB_YESNO                    0x00000004L
    #define MB_RETRYCANCEL              0x00000005L
    #if(WINVER >= 0x0500)
    #define MB_CANCELTRYCONTINUE        0x00000006L
    #endif /* WINVER >= 0x0500 */
     
     
    #define MB_ICONHAND                 0x00000010L
    #define MB_ICONQUESTION             0x00000020L
    #define MB_ICONEXCLAMATION          0x00000030L
    #define MB_ICONASTERISK             0x00000040L
     
    #if(WINVER >= 0x0400)
    #define MB_USERICON                 0x00000080L
    #define MB_ICONWARNING              MB_ICONEXCLAMATION
    #define MB_ICONERROR                MB_ICONHAND
    #endif /* WINVER >= 0x0400 */
     
    #define MB_ICONINFORMATION          MB_ICONASTERISK
    #define MB_ICONSTOP                 MB_ICONHAND
     
    #define MB_DEFBUTTON1               0x00000000L
    #define MB_DEFBUTTON2               0x00000100L
    #define MB_DEFBUTTON3               0x00000200L
    #if(WINVER >= 0x0400)
    #define MB_DEFBUTTON4               0x00000300L
    #endif /* WINVER >= 0x0400 */
     
    #define MB_APPLMODAL                0x00000000L
    #define MB_SYSTEMMODAL              0x00001000L
    #define MB_TASKMODAL                0x00002000L
    #if(WINVER >= 0x0400)
    #define MB_HELP                     0x00004000L // Help Button
    #endif /* WINVER >= 0x0400 */
     
    #define MB_NOFOCUS                  0x00008000L
    #define MB_SETFOREGROUND            0x00010000L
    #define MB_DEFAULT_DESKTOP_ONLY     0x00020000L
     
    #if(WINVER >= 0x0400)
    #define MB_TOPMOST                  0x00040000L
    #define MB_RIGHT                    0x00080000L
    #define MB_RTLREADING               0x00100000L
     
    #endif /* WINVER >= 0x0400 */
     
    #ifdef _WIN32_WINNT
    #if (_WIN32_WINNT >= 0x0400)
    #define MB_SERVICE_NOTIFICATION          0x00200000L
    #else
    #define MB_SERVICE_NOTIFICATION          0x00040000L
    #endif
    #define MB_SERVICE_NOTIFICATION_NT3X     0x00040000L
    #endif
     
    #define MB_TYPEMASK                 0x0000000FL
    #define MB_ICONMASK                 0x000000F0L
    #define MB_DEFMASK                  0x00000F00L
    #define MB_MODEMASK                 0x00003000L
    #define MB_MISCMASK                 0x0000C000L
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    WINUSERAPI
    int
    WINAPI
    MessageBoxA(
        _In_opt_ HWND hWnd,
        _In_opt_ LPCSTR lpText,
        _In_opt_ LPCSTR lpCaption,
        _In_ UINT uType);
    WINUSERAPI
    int
    WINAPI
    MessageBoxW(
        _In_opt_ HWND hWnd,
        _In_opt_ LPCWSTR lpText,
        _In_opt_ LPCWSTR lpCaption,
        _In_ UINT uType);
    #ifdef UNICODE
    #define MessageBox  MessageBoxW
    #else
    #define MessageBox  MessageBoxA
    #endif // !UNICODE
     
    #if defined(_M_CEE)
    #undef MessageBox
    __inline
    int
    MessageBox(
        HWND hWnd,
        LPCTSTR lpText,
        LPCTSTR lpCaption,
        UINT uType
        )
    {
    #ifdef UNICODE
        return MessageBoxW(
    #else
        return MessageBoxA(
    #endif
            hWnd,
        lpText,
        lpCaption,
        uType
            );
    }
    #endif  /* _M_CEE */
     
    WINUSERAPI
    int
    WINAPI
    MessageBoxExA(
        _In_opt_ HWND hWnd,
        _In_opt_ LPCSTR lpText,
        _In_opt_ LPCSTR lpCaption,
        _In_ UINT uType,
        _In_ WORD wLanguageId);
    WINUSERAPI
    int
    WINAPI
    MessageBoxExW(
        _In_opt_ HWND hWnd,
        _In_opt_ LPCWSTR lpText,
        _In_opt_ LPCWSTR lpCaption,
        _In_ UINT uType,
        _In_ WORD wLanguageId);
    #ifdef UNICODE
    #define MessageBoxEx  MessageBoxExW
    #else
    #define MessageBoxEx  MessageBoxExA
    #endif // !UNICODE
     
    #if(WINVER >= 0x0400)
     
    typedef VOID (CALLBACK *MSGBOXCALLBACK)(LPHELPINFO lpHelpInfo);
     
    typedef struct tagMSGBOXPARAMSA
    {
        UINT        cbSize;
        HWND        hwndOwner;
        HINSTANCE   hInstance;
        LPCSTR      lpszText;
        LPCSTR      lpszCaption;
        DWORD       dwStyle;
        LPCSTR      lpszIcon;
        DWORD_PTR   dwContextHelpId;
        MSGBOXCALLBACK      lpfnMsgBoxCallback;
        DWORD       dwLanguageId;
    } MSGBOXPARAMSA, *PMSGBOXPARAMSA, *LPMSGBOXPARAMSA;
    typedef struct tagMSGBOXPARAMSW
    {
        UINT        cbSize;
        HWND        hwndOwner;
        HINSTANCE   hInstance;
        LPCWSTR     lpszText;
        LPCWSTR     lpszCaption;
        DWORD       dwStyle;
        LPCWSTR     lpszIcon;
        DWORD_PTR   dwContextHelpId;
        MSGBOXCALLBACK      lpfnMsgBoxCallback;
        DWORD       dwLanguageId;
    } MSGBOXPARAMSW, *PMSGBOXPARAMSW, *LPMSGBOXPARAMSW;
    #ifdef UNICODE
    typedef MSGBOXPARAMSW MSGBOXPARAMS;
    typedef PMSGBOXPARAMSW PMSGBOXPARAMS;
    typedef LPMSGBOXPARAMSW LPMSGBOXPARAMS;
    #else
    typedef MSGBOXPARAMSA MSGBOXPARAMS;
    typedef PMSGBOXPARAMSA PMSGBOXPARAMS;
    typedef LPMSGBOXPARAMSA LPMSGBOXPARAMS;
    #endif // UNICODE
     
    WINUSERAPI
    int
    WINAPI
    MessageBoxIndirectA(
        _In_ CONST MSGBOXPARAMSA * lpmbp);
    WINUSERAPI
    int
    WINAPI
    MessageBoxIndirectW(
        _In_ CONST MSGBOXPARAMSW * lpmbp);
    #ifdef UNICODE
    #define MessageBoxIndirect  MessageBoxIndirectW
    #else
    #define MessageBoxIndirect  MessageBoxIndirectA
    #endif // !UNICODE
    #endif /* WINVER >= 0x0400 */
     
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    WINUSERAPI
    BOOL
    WINAPI
    MessageBeep(
        _In_ UINT uType);
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    #endif /* !NOMB */
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
     
    WINUSERAPI
    int
    WINAPI
    ShowCursor(
        _In_ BOOL bShow);
     
    WINUSERAPI
    BOOL
    WINAPI
    SetCursorPos(
        _In_ int X,
        _In_ int Y);
     
    #if(WINVER >= 0x0600)
    WINUSERAPI
    BOOL
    WINAPI
    SetPhysicalCursorPos(
        _In_ int X,
        _In_ int Y);
    #endif /* WINVER >= 0x0600 */
     
    WINUSERAPI
    HCURSOR
    WINAPI
    SetCursor(
        _In_opt_ HCURSOR hCursor);
     
    WINUSERAPI
    BOOL
    WINAPI
    GetCursorPos(
        _Out_ LPPOINT lpPoint);
     
    #if(WINVER >= 0x0600)
    WINUSERAPI
    BOOL
    WINAPI
    GetPhysicalCursorPos(
        _Out_ LPPOINT lpPoint);
    #endif /* WINVER >= 0x0600 */
     
    WINUSERAPI
    BOOL
    WINAPI
    ClipCursor(
        _In_opt_ CONST RECT *lpRect);
     
     
    WINUSERAPI
    BOOL
    WINAPI
    GetClipCursor(
        _Out_ LPRECT lpRect);
     
    WINUSERAPI
    HCURSOR
    WINAPI
    GetCursor(
        VOID);
     
    WINUSERAPI
    BOOL
    WINAPI
    CreateCaret(
        _In_ HWND hWnd,
        _In_opt_ HBITMAP hBitmap,
        _In_ int nWidth,
        _In_ int nHeight);
     
    WINUSERAPI
    UINT
    WINAPI
    GetCaretBlinkTime(
        VOID);
     
    WINUSERAPI
    BOOL
    WINAPI
    SetCaretBlinkTime(
        _In_ UINT uMSeconds);
     
    WINUSERAPI
    BOOL
    WINAPI
    DestroyCaret(
        VOID);
     
    WINUSERAPI
    BOOL
    WINAPI
    HideCaret(
        _In_opt_ HWND hWnd);
     
    WINUSERAPI
    BOOL
    WINAPI
    ShowCaret(
        _In_opt_ HWND hWnd);
     
    WINUSERAPI
    BOOL
    WINAPI
    SetCaretPos(
        _In_ int X,
        _In_ int Y);
     
    WINUSERAPI
    BOOL
    WINAPI
    GetCaretPos(
        _Out_ LPPOINT lpPoint);
     
    WINUSERAPI
    BOOL
    WINAPI
    ClientToScreen(
        _In_ HWND hWnd,
        _Inout_ LPPOINT lpPoint);
     
    WINUSERAPI
    BOOL
    WINAPI
    ScreenToClient(
        _In_ HWND hWnd,
        _Inout_ LPPOINT lpPoint);
     
    #if(WINVER >= 0x0600)
    WINUSERAPI
    BOOL
    WINAPI
    LogicalToPhysicalPoint(
        _In_ HWND hWnd,
        _Inout_ LPPOINT lpPoint);
     
    WINUSERAPI
    BOOL
    WINAPI
    PhysicalToLogicalPoint(
        _In_ HWND hWnd,
        _Inout_ LPPOINT lpPoint);
     
    #endif /* WINVER >= 0x0600 */
     
    #if(WINVER >= 0x0603)
    WINUSERAPI
    BOOL
    WINAPI
    LogicalToPhysicalPointForPerMonitorDPI(
        _In_opt_ HWND hWnd,
        _Inout_ LPPOINT lpPoint);
     
    WINUSERAPI
    BOOL
    WINAPI
    PhysicalToLogicalPointForPerMonitorDPI(
        _In_opt_ HWND hWnd,
        _Inout_ LPPOINT lpPoint);
     
    #endif /* WINVER >= 0x0603 */
     
    WINUSERAPI
    int
    WINAPI
    MapWindowPoints(
        _In_opt_ HWND hWndFrom,
        _In_opt_ HWND hWndTo,
        _Inout_updates_(cPoints) LPPOINT lpPoints,
        _In_ UINT cPoints);
     
    WINUSERAPI
    HWND
    WINAPI
    WindowFromPoint(
        _In_ POINT Point);
     
    #if(WINVER >= 0x0600)
    WINUSERAPI
    HWND
    WINAPI
    WindowFromPhysicalPoint(
        _In_ POINT Point);
    #endif /* WINVER >= 0x0600 */
     
    WINUSERAPI
    HWND
    WINAPI
    ChildWindowFromPoint(
        _In_ HWND hWndParent,
        _In_ POINT Point);
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    #if(WINVER >= 0x0400)
    #define CWP_ALL             0x0000
    #define CWP_SKIPINVISIBLE   0x0001
    #define CWP_SKIPDISABLED    0x0002
    #define CWP_SKIPTRANSPARENT 0x0004
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    WINUSERAPI
    HWND
    WINAPI
    ChildWindowFromPointEx(
        _In_ HWND hwnd,
        _In_ POINT pt,
        _In_ UINT flags);
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    #endif /* WINVER >= 0x0400 */
     
    #ifndef NOCOLOR
     
    /*
     * Color Types
     */
    #define CTLCOLOR_MSGBOX         0
    #define CTLCOLOR_EDIT           1
    #define CTLCOLOR_LISTBOX        2
    #define CTLCOLOR_BTN            3
    #define CTLCOLOR_DLG            4
    #define CTLCOLOR_SCROLLBAR      5
    #define CTLCOLOR_STATIC         6
    #define CTLCOLOR_MAX            7
     
    #define COLOR_SCROLLBAR         0
    #define COLOR_BACKGROUND        1
    #define COLOR_ACTIVECAPTION     2
    #define COLOR_INACTIVECAPTION   3
    #define COLOR_MENU              4
    #define COLOR_WINDOW            5
    #define COLOR_WINDOWFRAME       6
    #define COLOR_MENUTEXT          7
    #define COLOR_WINDOWTEXT        8
    #define COLOR_CAPTIONTEXT       9
    #define COLOR_ACTIVEBORDER      10
    #define COLOR_INACTIVEBORDER    11
    #define COLOR_APPWORKSPACE      12
    #define COLOR_HIGHLIGHT         13
    #define COLOR_HIGHLIGHTTEXT     14
    #define COLOR_BTNFACE           15
    #define COLOR_BTNSHADOW         16
    #define COLOR_GRAYTEXT          17
    #define COLOR_BTNTEXT           18
    #define COLOR_INACTIVECAPTIONTEXT 19
    #define COLOR_BTNHIGHLIGHT      20
     
    #if(WINVER >= 0x0400)
    #define COLOR_3DDKSHADOW        21
    #define COLOR_3DLIGHT           22
    #define COLOR_INFOTEXT          23
    #define COLOR_INFOBK            24
    #endif /* WINVER >= 0x0400 */
     
    #if(WINVER >= 0x0500)
    #define COLOR_HOTLIGHT          26
    #define COLOR_GRADIENTACTIVECAPTION 27
    #define COLOR_GRADIENTINACTIVECAPTION 28
    #if(WINVER >= 0x0501)
    #define COLOR_MENUHILIGHT       29
    #define COLOR_MENUBAR           30
    #endif /* WINVER >= 0x0501 */
    #endif /* WINVER >= 0x0500 */
     
    #if(WINVER >= 0x0400)
    #define COLOR_DESKTOP           COLOR_BACKGROUND
    #define COLOR_3DFACE            COLOR_BTNFACE
    #define COLOR_3DSHADOW          COLOR_BTNSHADOW
    #define COLOR_3DHIGHLIGHT       COLOR_BTNHIGHLIGHT
    #define COLOR_3DHILIGHT         COLOR_BTNHIGHLIGHT
    #define COLOR_BTNHILIGHT        COLOR_BTNHIGHLIGHT
    #endif /* WINVER >= 0x0400 */
     
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    WINUSERAPI
    DWORD
    WINAPI
    GetSysColor(
        _In_ int nIndex);
     
    #if(WINVER >= 0x0400)
    WINUSERAPI
    HBRUSH
    WINAPI
    GetSysColorBrush(
        _In_ int nIndex);
     
     
    #endif /* WINVER >= 0x0400 */
     
    WINUSERAPI
    BOOL
    WINAPI
    SetSysColors(
        _In_ int cElements,
        _In_reads_(cElements) CONST INT * lpaElements,
        _In_reads_(cElements) CONST COLORREF * lpaRgbValues);
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    #endif /* !NOCOLOR */
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    WINUSERAPI
    BOOL
    WINAPI
    DrawFocusRect(
        _In_ HDC hDC,
        _In_ CONST RECT * lprc);
     
    WINUSERAPI
    int
    WINAPI
    FillRect(
        _In_ HDC hDC,
        _In_ CONST RECT *lprc,
        _In_ HBRUSH hbr);
     
    WINUSERAPI
    int
    WINAPI
    FrameRect(
        _In_ HDC hDC,
        _In_ CONST RECT *lprc,
        _In_ HBRUSH hbr);
     
    WINUSERAPI
    BOOL
    WINAPI
    InvertRect(
        _In_ HDC hDC,
        _In_ CONST RECT *lprc);
     
    WINUSERAPI
    BOOL
    WINAPI
    SetRect(
        _Out_ LPRECT lprc,
        _In_ int xLeft,
        _In_ int yTop,
        _In_ int xRight,
        _In_ int yBottom);
     
    WINUSERAPI
    BOOL
    WINAPI
    SetRectEmpty(
        _Out_ LPRECT lprc);
     
    WINUSERAPI
    BOOL
    WINAPI
    CopyRect(
        _Out_ LPRECT lprcDst,
        _In_ CONST RECT *lprcSrc);
     
    WINUSERAPI
    BOOL
    WINAPI
    InflateRect(
        _Inout_ LPRECT lprc,
        _In_ int dx,
        _In_ int dy);
     
    WINUSERAPI
    BOOL
    WINAPI
    IntersectRect(
        _Out_ LPRECT lprcDst,
        _In_ CONST RECT *lprcSrc1,
        _In_ CONST RECT *lprcSrc2);
     
    WINUSERAPI
    BOOL
    WINAPI
    UnionRect(
        _Out_ LPRECT lprcDst,
        _In_ CONST RECT *lprcSrc1,
        _In_ CONST RECT *lprcSrc2);
     
    WINUSERAPI
    BOOL
    WINAPI
    SubtractRect(
        _Out_ LPRECT lprcDst,
        _In_ CONST RECT *lprcSrc1,
        _In_ CONST RECT *lprcSrc2);
     
    WINUSERAPI
    BOOL
    WINAPI
    OffsetRect(
        _Inout_ LPRECT lprc,
        _In_ int dx,
        _In_ int dy);
     
    WINUSERAPI
    BOOL
    WINAPI
    IsRectEmpty(
        _In_ CONST RECT *lprc);
     
    WINUSERAPI
    BOOL
    WINAPI
    EqualRect(
        _In_ CONST RECT *lprc1,
        _In_ CONST RECT *lprc2);
     
    WINUSERAPI
    BOOL
    WINAPI
    PtInRect(
        _In_ CONST RECT *lprc,
        _In_ POINT pt);
     
    #ifndef NOWINOFFSETS
     
    WINUSERAPI
    WORD
    WINAPI
    GetWindowWord(
        _In_ HWND hWnd,
        _In_ int nIndex);
     
    WINUSERAPI
    WORD
    WINAPI
    SetWindowWord(
        _In_ HWND hWnd,
        _In_ int nIndex,
        _In_ WORD wNewWord);
     
    WINUSERAPI
    LONG
    WINAPI
    GetWindowLongA(
        _In_ HWND hWnd,
        _In_ int nIndex);
    WINUSERAPI
    LONG
    WINAPI
    GetWindowLongW(
        _In_ HWND hWnd,
        _In_ int nIndex);
    #ifdef UNICODE
    #define GetWindowLong  GetWindowLongW
    #else
    #define GetWindowLong  GetWindowLongA
    #endif // !UNICODE
     
    WINUSERAPI
    LONG
    WINAPI
    SetWindowLongA(
        _In_ HWND hWnd,
        _In_ int nIndex,
        _In_ LONG dwNewLong);
    WINUSERAPI
    LONG
    WINAPI
    SetWindowLongW(
        _In_ HWND hWnd,
        _In_ int nIndex,
        _In_ LONG dwNewLong);
    #ifdef UNICODE
    #define SetWindowLong  SetWindowLongW
    #else
    #define SetWindowLong  SetWindowLongA
    #endif // !UNICODE
     
    #ifdef _WIN64
     
    WINUSERAPI
    LONG_PTR
    WINAPI
    GetWindowLongPtrA(
        _In_ HWND hWnd,
        _In_ int nIndex);
    WINUSERAPI
    LONG_PTR
    WINAPI
    GetWindowLongPtrW(
        _In_ HWND hWnd,
        _In_ int nIndex);
    #ifdef UNICODE
    #define GetWindowLongPtr  GetWindowLongPtrW
    #else
    #define GetWindowLongPtr  GetWindowLongPtrA
    #endif // !UNICODE
     
    WINUSERAPI
    LONG_PTR
    WINAPI
    SetWindowLongPtrA(
        _In_ HWND hWnd,
        _In_ int nIndex,
        _In_ LONG_PTR dwNewLong);
    WINUSERAPI
    LONG_PTR
    WINAPI
    SetWindowLongPtrW(
        _In_ HWND hWnd,
        _In_ int nIndex,
        _In_ LONG_PTR dwNewLong);
    #ifdef UNICODE
    #define SetWindowLongPtr  SetWindowLongPtrW
    #else
    #define SetWindowLongPtr  SetWindowLongPtrA
    #endif // !UNICODE
     
    #else  /* _WIN64 */
     
    #define GetWindowLongPtrA   GetWindowLongA
    #define GetWindowLongPtrW   GetWindowLongW
    #ifdef UNICODE
    #define GetWindowLongPtr  GetWindowLongPtrW
    #else
    #define GetWindowLongPtr  GetWindowLongPtrA
    #endif // !UNICODE
     
    #define SetWindowLongPtrA   SetWindowLongA
    #define SetWindowLongPtrW   SetWindowLongW
    #ifdef UNICODE
    #define SetWindowLongPtr  SetWindowLongPtrW
    #else
    #define SetWindowLongPtr  SetWindowLongPtrA
    #endif // !UNICODE
     
    #endif /* _WIN64 */
     
    WINUSERAPI
    WORD
    WINAPI
    GetClassWord(
        _In_ HWND hWnd,
        _In_ int nIndex);
     
    WINUSERAPI
    WORD
    WINAPI
    SetClassWord(
        _In_ HWND hWnd,
        _In_ int nIndex,
        _In_ WORD wNewWord);
     
    WINUSERAPI
    DWORD
    WINAPI
    GetClassLongA(
        _In_ HWND hWnd,
        _In_ int nIndex);
    WINUSERAPI
    DWORD
    WINAPI
    GetClassLongW(
        _In_ HWND hWnd,
        _In_ int nIndex);
    #ifdef UNICODE
    #define GetClassLong  GetClassLongW
    #else
    #define GetClassLong  GetClassLongA
    #endif // !UNICODE
     
    WINUSERAPI
    DWORD
    WINAPI
    SetClassLongA(
        _In_ HWND hWnd,
        _In_ int nIndex,
        _In_ LONG dwNewLong);
    WINUSERAPI
    DWORD
    WINAPI
    SetClassLongW(
        _In_ HWND hWnd,
        _In_ int nIndex,
        _In_ LONG dwNewLong);
    #ifdef UNICODE
    #define SetClassLong  SetClassLongW
    #else
    #define SetClassLong  SetClassLongA
    #endif // !UNICODE
     
    #ifdef _WIN64
     
    WINUSERAPI
    ULONG_PTR
    WINAPI
    GetClassLongPtrA(
        _In_ HWND hWnd,
        _In_ int nIndex);
    WINUSERAPI
    ULONG_PTR
    WINAPI
    GetClassLongPtrW(
        _In_ HWND hWnd,
        _In_ int nIndex);
    #ifdef UNICODE
    #define GetClassLongPtr  GetClassLongPtrW
    #else
    #define GetClassLongPtr  GetClassLongPtrA
    #endif // !UNICODE
     
    WINUSERAPI
    ULONG_PTR
    WINAPI
    SetClassLongPtrA(
        _In_ HWND hWnd,
        _In_ int nIndex,
        _In_ LONG_PTR dwNewLong);
    WINUSERAPI
    ULONG_PTR
    WINAPI
    SetClassLongPtrW(
        _In_ HWND hWnd,
        _In_ int nIndex,
        _In_ LONG_PTR dwNewLong);
    #ifdef UNICODE
    #define SetClassLongPtr  SetClassLongPtrW
    #else
    #define SetClassLongPtr  SetClassLongPtrA
    #endif // !UNICODE
     
    #else  /* _WIN64 */
     
    #define GetClassLongPtrA    GetClassLongA
    #define GetClassLongPtrW    GetClassLongW
    #ifdef UNICODE
    #define GetClassLongPtr  GetClassLongPtrW
    #else
    #define GetClassLongPtr  GetClassLongPtrA
    #endif // !UNICODE
     
    #define SetClassLongPtrA    SetClassLongA
    #define SetClassLongPtrW    SetClassLongW
    #ifdef UNICODE
    #define SetClassLongPtr  SetClassLongPtrW
    #else
    #define SetClassLongPtr  SetClassLongPtrA
    #endif // !UNICODE
     
    #endif /* _WIN64 */
     
    #endif /* !NOWINOFFSETS */
     
    #if(WINVER >= 0x0500)
    WINUSERAPI
    BOOL
    WINAPI
    GetProcessDefaultLayout(
        _Out_ DWORD *pdwDefaultLayout);
     
    WINUSERAPI
    BOOL
    WINAPI
    SetProcessDefaultLayout(
        _In_ DWORD dwDefaultLayout);
    #endif /* WINVER >= 0x0500 */
     
    WINUSERAPI
    HWND
    WINAPI
    GetDesktopWindow(
        VOID);
     
     
    WINUSERAPI
    HWND
    WINAPI
    GetParent(
        _In_ HWND hWnd);
     
    WINUSERAPI
    HWND
    WINAPI
    SetParent(
        _In_ HWND hWndChild,
        _In_opt_ HWND hWndNewParent);
     
    WINUSERAPI
    BOOL
    WINAPI
    EnumChildWindows(
        _In_opt_ HWND hWndParent,
        _In_ WNDENUMPROC lpEnumFunc,
        _In_ LPARAM lParam);
     
     
    WINUSERAPI
    HWND
    WINAPI
    FindWindowA(
        _In_opt_ LPCSTR lpClassName,
        _In_opt_ LPCSTR lpWindowName);
    WINUSERAPI
    HWND
    WINAPI
    FindWindowW(
        _In_opt_ LPCWSTR lpClassName,
        _In_opt_ LPCWSTR lpWindowName);
    #ifdef UNICODE
    #define FindWindow  FindWindowW
    #else
    #define FindWindow  FindWindowA
    #endif // !UNICODE
     
    #if(WINVER >= 0x0400)
    WINUSERAPI
    HWND
    WINAPI
    FindWindowExA(
        _In_opt_ HWND hWndParent,
        _In_opt_ HWND hWndChildAfter,
        _In_opt_ LPCSTR lpszClass,
        _In_opt_ LPCSTR lpszWindow);
    WINUSERAPI
    HWND
    WINAPI
    FindWindowExW(
        _In_opt_ HWND hWndParent,
        _In_opt_ HWND hWndChildAfter,
        _In_opt_ LPCWSTR lpszClass,
        _In_opt_ LPCWSTR lpszWindow);
    #ifdef UNICODE
    #define FindWindowEx  FindWindowExW
    #else
    #define FindWindowEx  FindWindowExA
    #endif // !UNICODE
     
    WINUSERAPI
    HWND
    WINAPI
    GetShellWindow(
        VOID);
     
    #endif /* WINVER >= 0x0400 */
     
     
    WINUSERAPI
    BOOL
    WINAPI
    RegisterShellHookWindow(
        _In_ HWND hwnd);
     
    WINUSERAPI
    BOOL
    WINAPI
    DeregisterShellHookWindow(
        _In_ HWND hwnd);
     
    WINUSERAPI
    BOOL
    WINAPI
    EnumWindows(
        _In_ WNDENUMPROC lpEnumFunc,
        _In_ LPARAM lParam);
     
    WINUSERAPI
    BOOL
    WINAPI
    EnumThreadWindows(
        _In_ DWORD dwThreadId,
        _In_ WNDENUMPROC lpfn,
        _In_ LPARAM lParam);
     
     
    #define EnumTaskWindows(hTask, lpfn, lParam) EnumThreadWindows(HandleToUlong(hTask), lpfn, lParam)
     
    WINUSERAPI
    int
    WINAPI
    GetClassNameA(
        _In_ HWND hWnd,
        _Out_writes_to_(nMaxCount, return) LPSTR lpClassName,
        _In_ int nMaxCount
        );
    WINUSERAPI
    int
    WINAPI
    GetClassNameW(
        _In_ HWND hWnd,
        _Out_writes_to_(nMaxCount, return) LPWSTR lpClassName,
        _In_ int nMaxCount
        );
    #ifdef UNICODE
    #define GetClassName  GetClassNameW
    #else
    #define GetClassName  GetClassNameA
    #endif // !UNICODE
     
    #if defined(_M_CEE)
    #undef GetClassName
    __inline
    int
    GetClassName(
        HWND hWnd,
        LPTSTR lpClassName,
        int nMaxCount
        )
    {
    #ifdef UNICODE
        return GetClassNameW(
    #else
        return GetClassNameA(
    #endif
            hWnd,
        lpClassName,
        nMaxCount
            );
    }
    #endif  /* _M_CEE */
     
     
     
    WINUSERAPI
    HWND
    WINAPI
    GetTopWindow(
        _In_opt_ HWND hWnd);
     
    #define GetNextWindow(hWnd, wCmd) GetWindow(hWnd, wCmd)
    #define GetSysModalWindow() (NULL)
    #define SetSysModalWindow(hWnd) (NULL)
     
    WINUSERAPI
    DWORD
    WINAPI
    GetWindowThreadProcessId(
        _In_ HWND hWnd,
        _Out_opt_ LPDWORD lpdwProcessId);
     
    #if(_WIN32_WINNT >= 0x0501)
    WINUSERAPI
    BOOL
    WINAPI
    IsGUIThread(
        _In_ BOOL bConvert);
     
    #endif /* _WIN32_WINNT >= 0x0501 */
     
     
    #define GetWindowTask(hWnd) \
            ((HANDLE)(DWORD_PTR)GetWindowThreadProcessId(hWnd, NULL))
     
    WINUSERAPI
    HWND
    WINAPI
    GetLastActivePopup(
        _In_ HWND hWnd);
     
    /*
     * GetWindow() Constants
     */
    #define GW_HWNDFIRST        0
    #define GW_HWNDLAST         1
    #define GW_HWNDNEXT         2
    #define GW_HWNDPREV         3
    #define GW_OWNER            4
    #define GW_CHILD            5
    #if(WINVER <= 0x0400)
    #define GW_MAX              5
    #else
    #define GW_ENABLEDPOPUP     6
    #define GW_MAX              6
    #endif
     
    WINUSERAPI
    HWND
    WINAPI
    GetWindow(
        _In_ HWND hWnd,
        _In_ UINT uCmd);
     
     
    #ifndef NOWH
     
    #ifdef STRICT
     
    WINUSERAPI
    HHOOK
    WINAPI
    SetWindowsHookA(
        _In_ int nFilterType,
        _In_ HOOKPROC pfnFilterProc);
    WINUSERAPI
    HHOOK
    WINAPI
    SetWindowsHookW(
        _In_ int nFilterType,
        _In_ HOOKPROC pfnFilterProc);
    #ifdef UNICODE
    #define SetWindowsHook  SetWindowsHookW
    #else
    #define SetWindowsHook  SetWindowsHookA
    #endif // !UNICODE
     
    #else /* !STRICT */
     
    WINUSERAPI
    HOOKPROC
    WINAPI
    SetWindowsHookA(
        _In_ int nFilterType,
        _In_ HOOKPROC pfnFilterProc);
    WINUSERAPI
    HOOKPROC
    WINAPI
    SetWindowsHookW(
        _In_ int nFilterType,
        _In_ HOOKPROC pfnFilterProc);
    #ifdef UNICODE
    #define SetWindowsHook  SetWindowsHookW
    #else
    #define SetWindowsHook  SetWindowsHookA
    #endif // !UNICODE
     
    #endif /* !STRICT */
     
    WINUSERAPI
    BOOL
    WINAPI
    UnhookWindowsHook(
        _In_ int nCode,
        _In_ HOOKPROC pfnFilterProc);
     
    WINUSERAPI
    HHOOK
    WINAPI
    SetWindowsHookExA(
        _In_ int idHook,
        _In_ HOOKPROC lpfn,
        _In_opt_ HINSTANCE hmod,
        _In_ DWORD dwThreadId);
    WINUSERAPI
    HHOOK
    WINAPI
    SetWindowsHookExW(
        _In_ int idHook,
        _In_ HOOKPROC lpfn,
        _In_opt_ HINSTANCE hmod,
        _In_ DWORD dwThreadId);
    #ifdef UNICODE
    #define SetWindowsHookEx  SetWindowsHookExW
    #else
    #define SetWindowsHookEx  SetWindowsHookExA
    #endif // !UNICODE
     
    WINUSERAPI
    BOOL
    WINAPI
    UnhookWindowsHookEx(
        _In_ HHOOK hhk);
     
    WINUSERAPI
    LRESULT
    WINAPI
    CallNextHookEx(
        _In_opt_ HHOOK hhk,
        _In_ int nCode,
        _In_ WPARAM wParam,
        _In_ LPARAM lParam);
     
    /*
     * Macros for source-level compatibility with old functions.
     */
    #ifdef STRICT
    #define DefHookProc(nCode, wParam, lParam, phhk)\
            CallNextHookEx(*phhk, nCode, wParam, lParam)
    #else
    #define DefHookProc(nCode, wParam, lParam, phhk)\
            CallNextHookEx((HHOOK)*phhk, nCode, wParam, lParam)
    #endif /* STRICT */
    #endif /* !NOWH */
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    #ifndef NOMENUS
     
     
    /* ;win40  -- A lot of MF_* flags have been renamed as MFT_* and MFS_* flags */
    /*
     * Menu flags for Add/Check/EnableMenuItem()
     */
    #define MF_INSERT           0x00000000L
    #define MF_CHANGE           0x00000080L
    #define MF_APPEND           0x00000100L
    #define MF_DELETE           0x00000200L
    #define MF_REMOVE           0x00001000L
     
    #define MF_BYCOMMAND        0x00000000L
    #define MF_BYPOSITION       0x00000400L
     
    #define MF_SEPARATOR        0x00000800L
     
    #define MF_ENABLED          0x00000000L
    #define MF_GRAYED           0x00000001L
    #define MF_DISABLED         0x00000002L
     
    #define MF_UNCHECKED        0x00000000L
    #define MF_CHECKED          0x00000008L
    #define MF_USECHECKBITMAPS  0x00000200L
     
    #define MF_STRING           0x00000000L
    #define MF_BITMAP           0x00000004L
    #define MF_OWNERDRAW        0x00000100L
     
    #define MF_POPUP            0x00000010L
    #define MF_MENUBARBREAK     0x00000020L
    #define MF_MENUBREAK        0x00000040L
     
    #define MF_UNHILITE         0x00000000L
    #define MF_HILITE           0x00000080L
     
    #if(WINVER >= 0x0400)
    #define MF_DEFAULT          0x00001000L
    #endif /* WINVER >= 0x0400 */
    #define MF_SYSMENU          0x00002000L
    #define MF_HELP             0x00004000L
    #if(WINVER >= 0x0400)
    #define MF_RIGHTJUSTIFY     0x00004000L
    #endif /* WINVER >= 0x0400 */
     
    #define MF_MOUSESELECT      0x00008000L
    #if(WINVER >= 0x0400)
    #define MF_END              0x00000080L  /* Obsolete -- only used by old RES files */
    #endif /* WINVER >= 0x0400 */
     
     
    #if(WINVER >= 0x0400)
    #define MFT_STRING          MF_STRING
    #define MFT_BITMAP          MF_BITMAP
    #define MFT_MENUBARBREAK    MF_MENUBARBREAK
    #define MFT_MENUBREAK       MF_MENUBREAK
    #define MFT_OWNERDRAW       MF_OWNERDRAW
    #define MFT_RADIOCHECK      0x00000200L
    #define MFT_SEPARATOR       MF_SEPARATOR
    #define MFT_RIGHTORDER      0x00002000L
    #define MFT_RIGHTJUSTIFY    MF_RIGHTJUSTIFY
     
    /* Menu flags for Add/Check/EnableMenuItem() */
    #define MFS_GRAYED          0x00000003L
    #define MFS_DISABLED        MFS_GRAYED
    #define MFS_CHECKED         MF_CHECKED
    #define MFS_HILITE          MF_HILITE
    #define MFS_ENABLED         MF_ENABLED
    #define MFS_UNCHECKED       MF_UNCHECKED
    #define MFS_UNHILITE        MF_UNHILITE
    #define MFS_DEFAULT         MF_DEFAULT
    #endif /* WINVER >= 0x0400 */
     
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    #if(WINVER >= 0x0400)
     
    WINUSERAPI
    BOOL
    WINAPI
    CheckMenuRadioItem(
        _In_ HMENU hmenu,
        _In_ UINT first,
        _In_ UINT last,
        _In_ UINT check,
        _In_ UINT flags);
    #endif /* WINVER >= 0x0400 */
     
    /*
     * Menu item resource format
     */
    typedef struct {
        WORD versionNumber;
        WORD offset;
    } MENUITEMTEMPLATEHEADER, *PMENUITEMTEMPLATEHEADER;
     
    typedef struct {        // version 0
        WORD mtOption;
        WORD mtID;
        WCHAR mtString[1];
    } MENUITEMTEMPLATE, *PMENUITEMTEMPLATE;
    #define MF_END             0x00000080L
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    #endif /* !NOMENUS */
     
    #ifndef NOSYSCOMMANDS
     
    /*
     * System Menu Command Values
     */
    #define SC_SIZE         0xF000
    #define SC_MOVE         0xF010
    #define SC_MINIMIZE     0xF020
    #define SC_MAXIMIZE     0xF030
    #define SC_NEXTWINDOW   0xF040
    #define SC_PREVWINDOW   0xF050
    #define SC_CLOSE        0xF060
    #define SC_VSCROLL      0xF070
    #define SC_HSCROLL      0xF080
    #define SC_MOUSEMENU    0xF090
    #define SC_KEYMENU      0xF100
    #define SC_ARRANGE      0xF110
    #define SC_RESTORE      0xF120
    #define SC_TASKLIST     0xF130
    #define SC_SCREENSAVE   0xF140
    #define SC_HOTKEY       0xF150
    #if(WINVER >= 0x0400)
    #define SC_DEFAULT      0xF160
    #define SC_MONITORPOWER 0xF170
    #define SC_CONTEXTHELP  0xF180
    #define SC_SEPARATOR    0xF00F
    #endif /* WINVER >= 0x0400 */
     
    #if(WINVER >= 0x0600)
    #define SCF_ISSECURE    0x00000001
    #endif /* WINVER >= 0x0600 */
     
    #define GET_SC_WPARAM(wParam) ((int)wParam & 0xFFF0)
     
    /*
     * Obsolete names
     */
    #define SC_ICON         SC_MINIMIZE
    #define SC_ZOOM         SC_MAXIMIZE
     
    #endif /* !NOSYSCOMMANDS */
     
    /*
     * Resource Loading Routines
     */
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    WINUSERAPI
    HBITMAP
    WINAPI
    LoadBitmapA(
        _In_opt_ HINSTANCE hInstance,
        _In_ LPCSTR lpBitmapName);
    WINUSERAPI
    HBITMAP
    WINAPI
    LoadBitmapW(
        _In_opt_ HINSTANCE hInstance,
        _In_ LPCWSTR lpBitmapName);
    #ifdef UNICODE
    #define LoadBitmap  LoadBitmapW
    #else
    #define LoadBitmap  LoadBitmapA
    #endif // !UNICODE
     
    WINUSERAPI
    HCURSOR
    WINAPI
    LoadCursorA(
        _In_opt_ HINSTANCE hInstance,
        _In_ LPCSTR lpCursorName);
    WINUSERAPI
    HCURSOR
    WINAPI
    LoadCursorW(
        _In_opt_ HINSTANCE hInstance,
        _In_ LPCWSTR lpCursorName);
    #ifdef UNICODE
    #define LoadCursor  LoadCursorW
    #else
    #define LoadCursor  LoadCursorA
    #endif // !UNICODE
     
    WINUSERAPI
    HCURSOR
    WINAPI
    LoadCursorFromFileA(
        _In_ LPCSTR lpFileName);
    WINUSERAPI
    HCURSOR
    WINAPI
    LoadCursorFromFileW(
        _In_ LPCWSTR lpFileName);
    #ifdef UNICODE
    #define LoadCursorFromFile  LoadCursorFromFileW
    #else
    #define LoadCursorFromFile  LoadCursorFromFileA
    #endif // !UNICODE
     
    WINUSERAPI
    HCURSOR
    WINAPI
    CreateCursor(
        _In_opt_ HINSTANCE hInst,
        _In_ int xHotSpot,
        _In_ int yHotSpot,
        _In_ int nWidth,
        _In_ int nHeight,
        _In_ CONST VOID *pvANDPlane,
        _In_ CONST VOID *pvXORPlane);
     
    WINUSERAPI
    BOOL
    WINAPI
    DestroyCursor(
        _In_ HCURSOR hCursor);
     
    #ifndef _MAC
    #define CopyCursor(pcur) ((HCURSOR)CopyIcon((HICON)(pcur)))
    #else
    WINUSERAPI
    HCURSOR
    WINAPI
    CopyCursor(
        _In_ HCURSOR hCursor);
    #endif
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    /*
     * Standard Cursor IDs
     */
    #define IDC_ARROW           MAKEINTRESOURCE(32512)
    #define IDC_IBEAM           MAKEINTRESOURCE(32513)
    #define IDC_WAIT            MAKEINTRESOURCE(32514)
    #define IDC_CROSS           MAKEINTRESOURCE(32515)
    #define IDC_UPARROW         MAKEINTRESOURCE(32516)
    #define IDC_SIZE            MAKEINTRESOURCE(32640)  /* OBSOLETE: use IDC_SIZEALL */
    #define IDC_ICON            MAKEINTRESOURCE(32641)  /* OBSOLETE: use IDC_ARROW */
    #define IDC_SIZENWSE        MAKEINTRESOURCE(32642)
    #define IDC_SIZENESW        MAKEINTRESOURCE(32643)
    #define IDC_SIZEWE          MAKEINTRESOURCE(32644)
    #define IDC_SIZENS          MAKEINTRESOURCE(32645)
    #define IDC_SIZEALL         MAKEINTRESOURCE(32646)
    #define IDC_NO              MAKEINTRESOURCE(32648) /*not in win3.1 */
    #if(WINVER >= 0x0500)
    #define IDC_HAND            MAKEINTRESOURCE(32649)
    #endif /* WINVER >= 0x0500 */
    #define IDC_APPSTARTING     MAKEINTRESOURCE(32650) /*not in win3.1 */
    #if(WINVER >= 0x0400)
    #define IDC_HELP            MAKEINTRESOURCE(32651)
    #endif /* WINVER >= 0x0400 */
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    WINUSERAPI
    BOOL
    WINAPI
    SetSystemCursor(
        _In_ HCURSOR hcur,
        _In_ DWORD id);
     
    typedef struct _ICONINFO {
        BOOL    fIcon;
        DWORD   xHotspot;
        DWORD   yHotspot;
        HBITMAP hbmMask;
        HBITMAP hbmColor;
    } ICONINFO;
    typedef ICONINFO *PICONINFO;
     
    WINUSERAPI
    HICON
    WINAPI
    LoadIconA(
        _In_opt_ HINSTANCE hInstance,
        _In_ LPCSTR lpIconName);
    WINUSERAPI
    HICON
    WINAPI
    LoadIconW(
        _In_opt_ HINSTANCE hInstance,
        _In_ LPCWSTR lpIconName);
    #ifdef UNICODE
    #define LoadIcon  LoadIconW
    #else
    #define LoadIcon  LoadIconA
    #endif // !UNICODE
     
     
    WINUSERAPI
    UINT
    WINAPI
    PrivateExtractIconsA(
        _In_reads_(MAX_PATH) LPCSTR szFileName,
        _In_ int nIconIndex,
        _In_ int cxIcon,
        _In_ int cyIcon,
        _Out_writes_opt_(nIcons) HICON *phicon,
        _Out_writes_opt_(nIcons) UINT *piconid,
        _In_ UINT nIcons,
        _In_ UINT flags);
    WINUSERAPI
    UINT
    WINAPI
    PrivateExtractIconsW(
        _In_reads_(MAX_PATH) LPCWSTR szFileName,
        _In_ int nIconIndex,
        _In_ int cxIcon,
        _In_ int cyIcon,
        _Out_writes_opt_(nIcons) HICON *phicon,
        _Out_writes_opt_(nIcons) UINT *piconid,
        _In_ UINT nIcons,
        _In_ UINT flags);
    #ifdef UNICODE
    #define PrivateExtractIcons  PrivateExtractIconsW
    #else
    #define PrivateExtractIcons  PrivateExtractIconsA
    #endif // !UNICODE
     
    WINUSERAPI
    HICON
    WINAPI
    CreateIcon(
        _In_opt_ HINSTANCE hInstance,
        _In_ int nWidth,
        _In_ int nHeight,
        _In_ BYTE cPlanes,
        _In_ BYTE cBitsPixel,
        _In_ CONST BYTE *lpbANDbits,
        _In_ CONST BYTE *lpbXORbits);
     
    WINUSERAPI
    BOOL
    WINAPI
    DestroyIcon(
        _In_ HICON hIcon);
     
    WINUSERAPI
    int
    WINAPI
    LookupIconIdFromDirectory(
        _In_reads_bytes_(sizeof(WORD) * 3) PBYTE presbits,
        _In_ BOOL fIcon);
     
    #if(WINVER >= 0x0400)
    WINUSERAPI
    int
    WINAPI
    LookupIconIdFromDirectoryEx(
        _In_reads_bytes_(sizeof(WORD) * 3) PBYTE presbits,
        _In_ BOOL fIcon,
        _In_ int cxDesired,
        _In_ int cyDesired,
        _In_ UINT Flags);
    #endif /* WINVER >= 0x0400 */
     
    WINUSERAPI
    HICON
    WINAPI
    CreateIconFromResource(
        _In_reads_bytes_(dwResSize) PBYTE presbits,
        _In_ DWORD dwResSize,
        _In_ BOOL fIcon,
        _In_ DWORD dwVer);
     
    #if(WINVER >= 0x0400)
    WINUSERAPI
    HICON
    WINAPI
    CreateIconFromResourceEx(
        _In_reads_bytes_(dwResSize) PBYTE presbits,
        _In_ DWORD dwResSize,
        _In_ BOOL fIcon,
        _In_ DWORD dwVer,
        _In_ int cxDesired,
        _In_ int cyDesired,
        _In_ UINT Flags);
     
    /* Icon/Cursor header */
    typedef struct tagCURSORSHAPE
    {
        int     xHotSpot;
        int     yHotSpot;
        int     cx;
        int     cy;
        int     cbWidth;
        BYTE    Planes;
        BYTE    BitsPixel;
    } CURSORSHAPE, FAR *LPCURSORSHAPE;
    #endif /* WINVER >= 0x0400 */
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    #define IMAGE_BITMAP        0
    #define IMAGE_ICON          1
    #define IMAGE_CURSOR        2
    #if(WINVER >= 0x0400)
    #define IMAGE_ENHMETAFILE   3
     
    #define LR_DEFAULTCOLOR     0x00000000
    #define LR_MONOCHROME       0x00000001
    #define LR_COLOR            0x00000002
    #define LR_COPYRETURNORG    0x00000004
    #define LR_COPYDELETEORG    0x00000008
    #define LR_LOADFROMFILE     0x00000010
    #define LR_LOADTRANSPARENT  0x00000020
    #define LR_DEFAULTSIZE      0x00000040
    #define LR_VGACOLOR         0x00000080
    #define LR_LOADMAP3DCOLORS  0x00001000
    #define LR_CREATEDIBSECTION 0x00002000
    #define LR_COPYFROMRESOURCE 0x00004000
    #define LR_SHARED           0x00008000
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    WINUSERAPI
    HANDLE
    WINAPI
    LoadImageA(
        _In_opt_ HINSTANCE hInst,
        _In_ LPCSTR name,
        _In_ UINT type,
        _In_ int cx,
        _In_ int cy,
        _In_ UINT fuLoad);
    WINUSERAPI
    HANDLE
    WINAPI
    LoadImageW(
        _In_opt_ HINSTANCE hInst,
        _In_ LPCWSTR name,
        _In_ UINT type,
        _In_ int cx,
        _In_ int cy,
        _In_ UINT fuLoad);
    #ifdef UNICODE
    #define LoadImage  LoadImageW
    #else
    #define LoadImage  LoadImageA
    #endif // !UNICODE
     
    WINUSERAPI
    HANDLE
    WINAPI
    CopyImage(
        _In_ HANDLE h,
        _In_ UINT type,
        _In_ int cx,
        _In_ int cy,
        _In_ UINT flags);
     
    #define DI_MASK         0x0001
    #define DI_IMAGE        0x0002
    #define DI_NORMAL       0x0003
    #define DI_COMPAT       0x0004
    #define DI_DEFAULTSIZE  0x0008
    #if(_WIN32_WINNT >= 0x0501)
    #define DI_NOMIRROR     0x0010
    #endif /* _WIN32_WINNT >= 0x0501 */
     
    WINUSERAPI BOOL WINAPI DrawIconEx(
        _In_ HDC hdc,
        _In_ int xLeft,
        _In_ int yTop,
        _In_ HICON hIcon,
        _In_ int cxWidth,
        _In_ int cyWidth,
        _In_ UINT istepIfAniCur,
        _In_opt_ HBRUSH hbrFlickerFreeDraw,
        _In_ UINT diFlags);
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    #endif /* WINVER >= 0x0400 */
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    WINUSERAPI
    HICON
    WINAPI
    CreateIconIndirect(
        _In_ PICONINFO piconinfo);
     
    WINUSERAPI
    HICON
    WINAPI
    CopyIcon(
        _In_ HICON hIcon);
     
    WINUSERAPI
    BOOL
    WINAPI
    GetIconInfo(
        _In_ HICON hIcon,
        _Out_ PICONINFO piconinfo);
     
    #if(_WIN32_WINNT >= 0x0600)
    typedef struct _ICONINFOEXA {
        DWORD   cbSize;
        BOOL    fIcon;
        DWORD   xHotspot;
        DWORD   yHotspot;
        HBITMAP hbmMask;
        HBITMAP hbmColor;
        WORD    wResID;
        CHAR    szModName[MAX_PATH];
        CHAR    szResName[MAX_PATH];
    } ICONINFOEXA, *PICONINFOEXA;
    typedef struct _ICONINFOEXW {
        DWORD   cbSize;
        BOOL    fIcon;
        DWORD   xHotspot;
        DWORD   yHotspot;
        HBITMAP hbmMask;
        HBITMAP hbmColor;
        WORD    wResID;
        WCHAR   szModName[MAX_PATH];
        WCHAR   szResName[MAX_PATH];
    } ICONINFOEXW, *PICONINFOEXW;
    #ifdef UNICODE
    typedef ICONINFOEXW ICONINFOEX;
    typedef PICONINFOEXW PICONINFOEX;
    #else
    typedef ICONINFOEXA ICONINFOEX;
    typedef PICONINFOEXA PICONINFOEX;
    #endif // UNICODE
     
    WINUSERAPI
    BOOL
    WINAPI
    GetIconInfoExA(
        _In_ HICON hicon,
        _Inout_ PICONINFOEXA piconinfo);
    WINUSERAPI
    BOOL
    WINAPI
    GetIconInfoExW(
        _In_ HICON hicon,
        _Inout_ PICONINFOEXW piconinfo);
    #ifdef UNICODE
    #define GetIconInfoEx  GetIconInfoExW
    #else
    #define GetIconInfoEx  GetIconInfoExA
    #endif // !UNICODE
    #endif /* _WIN32_WINNT >= 0x0600 */
     
    #if(WINVER >= 0x0400)
    #define RES_ICON    1
    #define RES_CURSOR  2
    #endif /* WINVER >= 0x0400 */
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    #ifdef OEMRESOURCE
     
     
    /*
     * OEM Resource Ordinal Numbers
     */
    #define OBM_CLOSE           32754
    #define OBM_UPARROW         32753
    #define OBM_DNARROW         32752
    #define OBM_RGARROW         32751
    #define OBM_LFARROW         32750
    #define OBM_REDUCE          32749
    #define OBM_ZOOM            32748
    #define OBM_RESTORE         32747
    #define OBM_REDUCED         32746
    #define OBM_ZOOMD           32745
    #define OBM_RESTORED        32744
    #define OBM_UPARROWD        32743
    #define OBM_DNARROWD        32742
    #define OBM_RGARROWD        32741
    #define OBM_LFARROWD        32740
    #define OBM_MNARROW         32739
    #define OBM_COMBO           32738
    #define OBM_UPARROWI        32737
    #define OBM_DNARROWI        32736
    #define OBM_RGARROWI        32735
    #define OBM_LFARROWI        32734
     
    #define OBM_OLD_CLOSE       32767
    #define OBM_SIZE            32766
    #define OBM_OLD_UPARROW     32765
    #define OBM_OLD_DNARROW     32764
    #define OBM_OLD_RGARROW     32763
    #define OBM_OLD_LFARROW     32762
    #define OBM_BTSIZE          32761
    #define OBM_CHECK           32760
    #define OBM_CHECKBOXES      32759
    #define OBM_BTNCORNERS      32758
    #define OBM_OLD_REDUCE      32757
    #define OBM_OLD_ZOOM        32756
    #define OBM_OLD_RESTORE     32755
     
     
    #define OCR_NORMAL          32512
    #define OCR_IBEAM           32513
    #define OCR_WAIT            32514
    #define OCR_CROSS           32515
    #define OCR_UP              32516
    #define OCR_SIZE            32640   /* OBSOLETE: use OCR_SIZEALL */
    #define OCR_ICON            32641   /* OBSOLETE: use OCR_NORMAL */
    #define OCR_SIZENWSE        32642
    #define OCR_SIZENESW        32643
    #define OCR_SIZEWE          32644
    #define OCR_SIZENS          32645
    #define OCR_SIZEALL         32646
    #define OCR_ICOCUR          32647   /* OBSOLETE: use OIC_WINLOGO */
    #define OCR_NO              32648
    #if(WINVER >= 0x0500)
    #define OCR_HAND            32649
    #endif /* WINVER >= 0x0500 */
    #if(WINVER >= 0x0400)
    #define OCR_APPSTARTING     32650
    #endif /* WINVER >= 0x0400 */
     
     
    #define OIC_SAMPLE          32512
    #define OIC_HAND            32513
    #define OIC_QUES            32514
    #define OIC_BANG            32515
    #define OIC_NOTE            32516
    #if(WINVER >= 0x0400)
    #define OIC_WINLOGO         32517
    #define OIC_WARNING         OIC_BANG
    #define OIC_ERROR           OIC_HAND
    #define OIC_INFORMATION     OIC_NOTE
    #endif /* WINVER >= 0x0400 */
    #if(WINVER >= 0x0600)
    #define OIC_SHIELD          32518
    #endif /* WINVER >= 0x0600 */
     
     
     
    #endif /* OEMRESOURCE */
     
    #define ORD_LANGDRIVER    1     /* The ordinal number for the entry point of
                                    ** language drivers.
                                    */
     
    #ifndef NOICONS
     
    /*
     * Standard Icon IDs
     */
    #ifdef RC_INVOKED
    #define IDI_APPLICATION     32512
    #define IDI_HAND            32513
    #define IDI_QUESTION        32514
    #define IDI_EXCLAMATION     32515
    #define IDI_ASTERISK        32516
    #if(WINVER >= 0x0400)
    #define IDI_WINLOGO         32517
    #endif /* WINVER >= 0x0400 */
    #if(WINVER >= 0x0600)
    #define IDI_SHIELD          32518
    #endif /* WINVER >= 0x0600 */
    #else
    #define IDI_APPLICATION     MAKEINTRESOURCE(32512)
    #define IDI_HAND            MAKEINTRESOURCE(32513)
    #define IDI_QUESTION        MAKEINTRESOURCE(32514)
    #define IDI_EXCLAMATION     MAKEINTRESOURCE(32515)
    #define IDI_ASTERISK        MAKEINTRESOURCE(32516)
    #if(WINVER >= 0x0400)
    #define IDI_WINLOGO         MAKEINTRESOURCE(32517)
    #endif /* WINVER >= 0x0400 */
    #if(WINVER >= 0x0600)
    #define IDI_SHIELD          MAKEINTRESOURCE(32518)
    #endif /* WINVER >= 0x0600 */
    #endif /* RC_INVOKED */
     
    #if(WINVER >= 0x0400)
    #define IDI_WARNING     IDI_EXCLAMATION
    #define IDI_ERROR       IDI_HAND
    #define IDI_INFORMATION IDI_ASTERISK
    #endif /* WINVER >= 0x0400 */
     
     
    #endif /* !NOICONS */
     
     
    #ifdef NOAPISET
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    WINUSERAPI
    int
    WINAPI
    LoadStringA(
        _In_opt_ HINSTANCE hInstance,
        _In_ UINT uID,
        _Out_writes_to_(cchBufferMax, return + 1) LPSTR lpBuffer,
        _In_ int cchBufferMax);
    WINUSERAPI
    int
    WINAPI
    LoadStringW(
        _In_opt_ HINSTANCE hInstance,
        _In_ UINT uID,
        _Out_writes_to_(cchBufferMax, return + 1) LPWSTR lpBuffer,
        _In_ int cchBufferMax);
    #ifdef UNICODE
    #define LoadString  LoadStringW
    #else
    #define LoadString  LoadStringA
    #endif // !UNICODE
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    #endif
     
     
    /*
     * Dialog Box Command IDs
     */
    #define IDOK                1
    #define IDCANCEL            2
    #define IDABORT             3
    #define IDRETRY             4
    #define IDIGNORE            5
    #define IDYES               6
    #define IDNO                7
    #if(WINVER >= 0x0400)
    #define IDCLOSE         8
    #define IDHELP          9
    #endif /* WINVER >= 0x0400 */
     
    #if(WINVER >= 0x0500)
    #define IDTRYAGAIN      10
    #define IDCONTINUE      11
    #endif /* WINVER >= 0x0500 */
     
    #if(WINVER >= 0x0501)
    #ifndef IDTIMEOUT
    #define IDTIMEOUT 32000
    #endif
    #endif /* WINVER >= 0x0501 */
     
     
    #ifndef NOCTLMGR
     
    /*
     * Control Manager Structures and Definitions
     */
     
    #ifndef NOWINSTYLES
     
     
    /*
     * Edit Control Styles
     */
    #define ES_LEFT             0x0000L
    #define ES_CENTER           0x0001L
    #define ES_RIGHT            0x0002L
    #define ES_MULTILINE        0x0004L
    #define ES_UPPERCASE        0x0008L
    #define ES_LOWERCASE        0x0010L
    #define ES_PASSWORD         0x0020L
    #define ES_AUTOVSCROLL      0x0040L
    #define ES_AUTOHSCROLL      0x0080L
    #define ES_NOHIDESEL        0x0100L
    #define ES_OEMCONVERT       0x0400L
    #define ES_READONLY         0x0800L
    #define ES_WANTRETURN       0x1000L
    #if(WINVER >= 0x0400)
    #define ES_NUMBER           0x2000L
    #endif /* WINVER >= 0x0400 */
     
     
    #endif /* !NOWINSTYLES */
     
    /*
     * Edit Control Notification Codes
     */
    #define EN_SETFOCUS         0x0100
    #define EN_KILLFOCUS        0x0200
    #define EN_CHANGE           0x0300
    #define EN_UPDATE           0x0400
    #define EN_ERRSPACE         0x0500
    #define EN_MAXTEXT          0x0501
    #define EN_HSCROLL          0x0601
    #define EN_VSCROLL          0x0602
     
    #if(_WIN32_WINNT >= 0x0500)
    #define EN_ALIGN_LTR_EC     0x0700
    #define EN_ALIGN_RTL_EC     0x0701
    #endif /* _WIN32_WINNT >= 0x0500 */
     
    #if(WINVER >= 0x0400)
    /* Edit control EM_SETMARGIN parameters */
    #define EC_LEFTMARGIN       0x0001
    #define EC_RIGHTMARGIN      0x0002
    #define EC_USEFONTINFO      0xffff
    #endif /* WINVER >= 0x0400 */
     
    #if(WINVER >= 0x0500)
    /* wParam of EM_GET/SETIMESTATUS  */
    #define EMSIS_COMPOSITIONSTRING        0x0001
     
    /* lParam for EMSIS_COMPOSITIONSTRING  */
    #define EIMES_GETCOMPSTRATONCE         0x0001
    #define EIMES_CANCELCOMPSTRINFOCUS     0x0002
    #define EIMES_COMPLETECOMPSTRKILLFOCUS 0x0004
    #endif /* WINVER >= 0x0500 */
     
    #ifndef NOWINMESSAGES
     
     
    /*
     * Edit Control Messages
     */
    #define EM_GETSEL               0x00B0
    #define EM_SETSEL               0x00B1
    #define EM_GETRECT              0x00B2
    #define EM_SETRECT              0x00B3
    #define EM_SETRECTNP            0x00B4
    #define EM_SCROLL               0x00B5
    #define EM_LINESCROLL           0x00B6
    #define EM_SCROLLCARET          0x00B7
    #define EM_GETMODIFY            0x00B8
    #define EM_SETMODIFY            0x00B9
    #define EM_GETLINECOUNT         0x00BA
    #define EM_LINEINDEX            0x00BB
    #define EM_SETHANDLE            0x00BC
    #define EM_GETHANDLE            0x00BD
    #define EM_GETTHUMB             0x00BE
    #define EM_LINELENGTH           0x00C1
    #define EM_REPLACESEL           0x00C2
    #define EM_GETLINE              0x00C4
    #define EM_LIMITTEXT            0x00C5
    #define EM_CANUNDO              0x00C6
    #define EM_UNDO                 0x00C7
    #define EM_FMTLINES             0x00C8
    #define EM_LINEFROMCHAR         0x00C9
    #define EM_SETTABSTOPS          0x00CB
    #define EM_SETPASSWORDCHAR      0x00CC
    #define EM_EMPTYUNDOBUFFER      0x00CD
    #define EM_GETFIRSTVISIBLELINE  0x00CE
    #define EM_SETREADONLY          0x00CF
    #define EM_SETWORDBREAKPROC     0x00D0
    #define EM_GETWORDBREAKPROC     0x00D1
    #define EM_GETPASSWORDCHAR      0x00D2
    #if(WINVER >= 0x0400)
    #define EM_SETMARGINS           0x00D3
    #define EM_GETMARGINS           0x00D4
    #define EM_SETLIMITTEXT         EM_LIMITTEXT   /* ;win40 Name change */
    #define EM_GETLIMITTEXT         0x00D5
    #define EM_POSFROMCHAR          0x00D6
    #define EM_CHARFROMPOS          0x00D7
    #endif /* WINVER >= 0x0400 */
     
    #if(WINVER >= 0x0500)
    #define EM_SETIMESTATUS         0x00D8
    #define EM_GETIMESTATUS         0x00D9
    #endif /* WINVER >= 0x0500 */
     
     
    #endif /* !NOWINMESSAGES */
     
    /*
     * EDITWORDBREAKPROC code values
     */
    #define WB_LEFT            0
    #define WB_RIGHT           1
    #define WB_ISDELIMITER     2
     
     
    /*
     * Button Control Styles
     */
    #define BS_PUSHBUTTON       0x00000000L
    #define BS_DEFPUSHBUTTON    0x00000001L
    #define BS_CHECKBOX         0x00000002L
    #define BS_AUTOCHECKBOX     0x00000003L
    #define BS_RADIOBUTTON      0x00000004L
    #define BS_3STATE           0x00000005L
    #define BS_AUTO3STATE       0x00000006L
    #define BS_GROUPBOX         0x00000007L
    #define BS_USERBUTTON       0x00000008L
    #define BS_AUTORADIOBUTTON  0x00000009L
    #define BS_PUSHBOX          0x0000000AL
    #define BS_OWNERDRAW        0x0000000BL
    #define BS_TYPEMASK         0x0000000FL
    #define BS_LEFTTEXT         0x00000020L
    #if(WINVER >= 0x0400)
    #define BS_TEXT             0x00000000L
    #define BS_ICON             0x00000040L
    #define BS_BITMAP           0x00000080L
    #define BS_LEFT             0x00000100L
    #define BS_RIGHT            0x00000200L
    #define BS_CENTER           0x00000300L
    #define BS_TOP              0x00000400L
    #define BS_BOTTOM           0x00000800L
    #define BS_VCENTER          0x00000C00L
    #define BS_PUSHLIKE         0x00001000L
    #define BS_MULTILINE        0x00002000L
    #define BS_NOTIFY           0x00004000L
    #define BS_FLAT             0x00008000L
    #define BS_RIGHTBUTTON      BS_LEFTTEXT
    #endif /* WINVER >= 0x0400 */
     
    /*
     * User Button Notification Codes
     */
    #define BN_CLICKED          0
    #define BN_PAINT            1
    #define BN_HILITE           2
    #define BN_UNHILITE         3
    #define BN_DISABLE          4
    #define BN_DOUBLECLICKED    5
    #if(WINVER >= 0x0400)
    #define BN_PUSHED           BN_HILITE
    #define BN_UNPUSHED         BN_UNHILITE
    #define BN_DBLCLK           BN_DOUBLECLICKED
    #define BN_SETFOCUS         6
    #define BN_KILLFOCUS        7
    #endif /* WINVER >= 0x0400 */
     
    /*
     * Button Control Messages
     */
    #define BM_GETCHECK        0x00F0
    #define BM_SETCHECK        0x00F1
    #define BM_GETSTATE        0x00F2
    #define BM_SETSTATE        0x00F3
    #define BM_SETSTYLE        0x00F4
    #if(WINVER >= 0x0400)
    #define BM_CLICK           0x00F5
    #define BM_GETIMAGE        0x00F6
    #define BM_SETIMAGE        0x00F7
    #endif /* WINVER >= 0x0400 */
    #if(WINVER >= 0x0600)
    #define BM_SETDONTCLICK    0x00F8
    #endif /* WINVER >= 0x0600 */
     
    #if(WINVER >= 0x0400)
    #define BST_UNCHECKED      0x0000
    #define BST_CHECKED        0x0001
    #define BST_INDETERMINATE  0x0002
    #define BST_PUSHED         0x0004
    #define BST_FOCUS          0x0008
    #endif /* WINVER >= 0x0400 */
     
    /*
     * Static Control Constants
     */
    #define SS_LEFT             0x00000000L
    #define SS_CENTER           0x00000001L
    #define SS_RIGHT            0x00000002L
    #define SS_ICON             0x00000003L
    #define SS_BLACKRECT        0x00000004L
    #define SS_GRAYRECT         0x00000005L
    #define SS_WHITERECT        0x00000006L
    #define SS_BLACKFRAME       0x00000007L
    #define SS_GRAYFRAME        0x00000008L
    #define SS_WHITEFRAME       0x00000009L
    #define SS_USERITEM         0x0000000AL
    #define SS_SIMPLE           0x0000000BL
    #define SS_LEFTNOWORDWRAP   0x0000000CL
    #if(WINVER >= 0x0400)
    #define SS_OWNERDRAW        0x0000000DL
    #define SS_BITMAP           0x0000000EL
    #define SS_ENHMETAFILE      0x0000000FL
    #define SS_ETCHEDHORZ       0x00000010L
    #define SS_ETCHEDVERT       0x00000011L
    #define SS_ETCHEDFRAME      0x00000012L
    #define SS_TYPEMASK         0x0000001FL
    #endif /* WINVER >= 0x0400 */
    #if(WINVER >= 0x0501)
    #define SS_REALSIZECONTROL  0x00000040L
    #endif /* WINVER >= 0x0501 */
    #define SS_NOPREFIX         0x00000080L /* Don't do "&" character translation */
    #if(WINVER >= 0x0400)
    #define SS_NOTIFY           0x00000100L
    #define SS_CENTERIMAGE      0x00000200L
    #define SS_RIGHTJUST        0x00000400L
    #define SS_REALSIZEIMAGE    0x00000800L
    #define SS_SUNKEN           0x00001000L
    #define SS_EDITCONTROL      0x00002000L
    #define SS_ENDELLIPSIS      0x00004000L
    #define SS_PATHELLIPSIS     0x00008000L
    #define SS_WORDELLIPSIS     0x0000C000L
    #define SS_ELLIPSISMASK     0x0000C000L
    #endif /* WINVER >= 0x0400 */
     
     
     
    #ifndef NOWINMESSAGES
    /*
     * Static Control Mesages
     */
    #define STM_SETICON         0x0170
    #define STM_GETICON         0x0171
    #if(WINVER >= 0x0400)
    #define STM_SETIMAGE        0x0172
    #define STM_GETIMAGE        0x0173
    #define STN_CLICKED         0
    #define STN_DBLCLK          1
    #define STN_ENABLE          2
    #define STN_DISABLE         3
    #endif /* WINVER >= 0x0400 */
    #define STM_MSGMAX          0x0174
    #endif /* !NOWINMESSAGES */
     
    /*
     * Dialog window class
     */
    #define WC_DIALOG       (MAKEINTATOM(0x8002))
     
    /*
     * Get/SetWindowWord/Long offsets for use with WC_DIALOG windows
     */
    #define DWL_MSGRESULT   0
    #define DWL_DLGPROC     4
    #define DWL_USER        8
     
    #ifdef _WIN64
     
    #undef DWL_MSGRESULT
    #undef DWL_DLGPROC
    #undef DWL_USER
     
    #endif /* _WIN64 */
     
    #define DWLP_MSGRESULT  0
    #define DWLP_DLGPROC    DWLP_MSGRESULT + sizeof(LRESULT)
    #define DWLP_USER       DWLP_DLGPROC + sizeof(DLGPROC)
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    /*
     * Dialog Manager Routines
     */
     
    #ifndef NOMSG
     
    WINUSERAPI
    BOOL
    WINAPI
    IsDialogMessageA(
        _In_ HWND hDlg,
        _In_ LPMSG lpMsg);
    WINUSERAPI
    BOOL
    WINAPI
    IsDialogMessageW(
        _In_ HWND hDlg,
        _In_ LPMSG lpMsg);
    #ifdef UNICODE
    #define IsDialogMessage  IsDialogMessageW
    #else
    #define IsDialogMessage  IsDialogMessageA
    #endif // !UNICODE
     
    #endif /* !NOMSG */
     
    WINUSERAPI
    BOOL
    WINAPI
    MapDialogRect(
        _In_ HWND hDlg,
        _Inout_ LPRECT lpRect);
     
    WINUSERAPI
    int
    WINAPI
    DlgDirListA(
        _In_ HWND hDlg,
        _Inout_ LPSTR lpPathSpec,
        _In_ int nIDListBox,
        _In_ int nIDStaticPath,
        _In_ UINT uFileType);
    WINUSERAPI
    int
    WINAPI
    DlgDirListW(
        _In_ HWND hDlg,
        _Inout_ LPWSTR lpPathSpec,
        _In_ int nIDListBox,
        _In_ int nIDStaticPath,
        _In_ UINT uFileType);
    #ifdef UNICODE
    #define DlgDirList  DlgDirListW
    #else
    #define DlgDirList  DlgDirListA
    #endif // !UNICODE
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    /*
     * DlgDirList, DlgDirListComboBox flags values
     */
    #define DDL_READWRITE       0x0000
    #define DDL_READONLY        0x0001
    #define DDL_HIDDEN          0x0002
    #define DDL_SYSTEM          0x0004
    #define DDL_DIRECTORY       0x0010
    #define DDL_ARCHIVE         0x0020
     
    #define DDL_POSTMSGS        0x2000
    #define DDL_DRIVES          0x4000
    #define DDL_EXCLUSIVE       0x8000
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    WINUSERAPI
    BOOL
    WINAPI
    DlgDirSelectExA(
        _In_ HWND hwndDlg,
        _Out_writes_(chCount) LPSTR lpString,
        _In_ int chCount,
        _In_ int idListBox);
    WINUSERAPI
    BOOL
    WINAPI
    DlgDirSelectExW(
        _In_ HWND hwndDlg,
        _Out_writes_(chCount) LPWSTR lpString,
        _In_ int chCount,
        _In_ int idListBox);
    #ifdef UNICODE
    #define DlgDirSelectEx  DlgDirSelectExW
    #else
    #define DlgDirSelectEx  DlgDirSelectExA
    #endif // !UNICODE
     
    WINUSERAPI
    int
    WINAPI
    DlgDirListComboBoxA(
        _In_ HWND hDlg,
        _Inout_ LPSTR lpPathSpec,
        _In_ int nIDComboBox,
        _In_ int nIDStaticPath,
        _In_ UINT uFiletype);
    WINUSERAPI
    int
    WINAPI
    DlgDirListComboBoxW(
        _In_ HWND hDlg,
        _Inout_ LPWSTR lpPathSpec,
        _In_ int nIDComboBox,
        _In_ int nIDStaticPath,
        _In_ UINT uFiletype);
    #ifdef UNICODE
    #define DlgDirListComboBox  DlgDirListComboBoxW
    #else
    #define DlgDirListComboBox  DlgDirListComboBoxA
    #endif // !UNICODE
     
    WINUSERAPI
    BOOL
    WINAPI
    DlgDirSelectComboBoxExA(
        _In_ HWND hwndDlg,
        _Out_writes_(cchOut) LPSTR lpString,
        _In_ int cchOut,
        _In_ int idComboBox);
    WINUSERAPI
    BOOL
    WINAPI
    DlgDirSelectComboBoxExW(
        _In_ HWND hwndDlg,
        _Out_writes_(cchOut) LPWSTR lpString,
        _In_ int cchOut,
        _In_ int idComboBox);
    #ifdef UNICODE
    #define DlgDirSelectComboBoxEx  DlgDirSelectComboBoxExW
    #else
    #define DlgDirSelectComboBoxEx  DlgDirSelectComboBoxExA
    #endif // !UNICODE
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
     
     
    /*
     * Dialog Styles
     */
    #define DS_ABSALIGN         0x01L
    #define DS_SYSMODAL         0x02L
    #define DS_LOCALEDIT        0x20L   /* Edit items get Local storage. */
    #define DS_SETFONT          0x40L   /* User specified font for Dlg controls */
    #define DS_MODALFRAME       0x80L   /* Can be combined with WS_CAPTION  */
    #define DS_NOIDLEMSG        0x100L  /* WM_ENTERIDLE message will not be sent */
    #define DS_SETFOREGROUND    0x200L  /* not in win3.1 */
     
     
    #if(WINVER >= 0x0400)
    #define DS_3DLOOK           0x0004L
    #define DS_FIXEDSYS         0x0008L
    #define DS_NOFAILCREATE     0x0010L
    #define DS_CONTROL          0x0400L
    #define DS_CENTER           0x0800L
    #define DS_CENTERMOUSE      0x1000L
    #define DS_CONTEXTHELP      0x2000L
     
    #define DS_SHELLFONT        (DS_SETFONT | DS_FIXEDSYS)
    #endif /* WINVER >= 0x0400 */
     
    #if defined(_WIN32_WCE) && (_WIN32_WCE >= 0x0500)
    #define DS_USEPIXELS        0x8000L
    #endif
     
     
    #define DM_GETDEFID         (WM_USER+0)
    #define DM_SETDEFID         (WM_USER+1)
     
    #if(WINVER >= 0x0400)
    #define DM_REPOSITION       (WM_USER+2)
    #endif /* WINVER >= 0x0400 */
    /*
     * Returned in HIWORD() of DM_GETDEFID result if msg is supported
     */
    #define DC_HASDEFID         0x534B
     
    /*
     * Dialog Codes
     */
    #define DLGC_WANTARROWS     0x0001      /* Control wants arrow keys         */
    #define DLGC_WANTTAB        0x0002      /* Control wants tab keys           */
    #define DLGC_WANTALLKEYS    0x0004      /* Control wants all keys           */
    #define DLGC_WANTMESSAGE    0x0004      /* Pass message to control          */
    #define DLGC_HASSETSEL      0x0008      /* Understands EM_SETSEL message    */
    #define DLGC_DEFPUSHBUTTON  0x0010      /* Default pushbutton               */
    #define DLGC_UNDEFPUSHBUTTON 0x0020     /* Non-default pushbutton           */
    #define DLGC_RADIOBUTTON    0x0040      /* Radio button                     */
    #define DLGC_WANTCHARS      0x0080      /* Want WM_CHAR messages            */
    #define DLGC_STATIC         0x0100      /* Static item: don't include       */
    #define DLGC_BUTTON         0x2000      /* Button item: can be checked      */
     
    #define LB_CTLCODE          0L
     
    /*
     * Listbox Return Values
     */
    #define LB_OKAY             0
    #define LB_ERR              (-1)
    #define LB_ERRSPACE         (-2)
     
    /*
    **  The idStaticPath parameter to DlgDirList can have the following values
    **  ORed if the list box should show other details of the files along with
    **  the name of the files;
    */
                                      /* all other details also will be returned */
     
     
    /*
     * Listbox Notification Codes
     */
    #define LBN_ERRSPACE        (-2)
    #define LBN_SELCHANGE       1
    #define LBN_DBLCLK          2
    #define LBN_SELCANCEL       3
    #define LBN_SETFOCUS        4
    #define LBN_KILLFOCUS       5
     
     
     
    #ifndef NOWINMESSAGES
     
    /*
     * Listbox messages
     */
    #define LB_ADDSTRING            0x0180
    #define LB_INSERTSTRING         0x0181
    #define LB_DELETESTRING         0x0182
    #define LB_SELITEMRANGEEX       0x0183
    #define LB_RESETCONTENT         0x0184
    #define LB_SETSEL               0x0185
    #define LB_SETCURSEL            0x0186
    #define LB_GETSEL               0x0187
    #define LB_GETCURSEL            0x0188
    #define LB_GETTEXT              0x0189
    #define LB_GETTEXTLEN           0x018A
    #define LB_GETCOUNT             0x018B
    #define LB_SELECTSTRING         0x018C
    #define LB_DIR                  0x018D
    #define LB_GETTOPINDEX          0x018E
    #define LB_FINDSTRING           0x018F
    #define LB_GETSELCOUNT          0x0190
    #define LB_GETSELITEMS          0x0191
    #define LB_SETTABSTOPS          0x0192
    #define LB_GETHORIZONTALEXTENT  0x0193
    #define LB_SETHORIZONTALEXTENT  0x0194
    #define LB_SETCOLUMNWIDTH       0x0195
    #define LB_ADDFILE              0x0196
    #define LB_SETTOPINDEX          0x0197
    #define LB_GETITEMRECT          0x0198
    #define LB_GETITEMDATA          0x0199
    #define LB_SETITEMDATA          0x019A
    #define LB_SELITEMRANGE         0x019B
    #define LB_SETANCHORINDEX       0x019C
    #define LB_GETANCHORINDEX       0x019D
    #define LB_SETCARETINDEX        0x019E
    #define LB_GETCARETINDEX        0x019F
    #define LB_SETITEMHEIGHT        0x01A0
    #define LB_GETITEMHEIGHT        0x01A1
    #define LB_FINDSTRINGEXACT      0x01A2
    #define LB_SETLOCALE            0x01A5
    #define LB_GETLOCALE            0x01A6
    #define LB_SETCOUNT             0x01A7
    #if(WINVER >= 0x0400)
    #define LB_INITSTORAGE          0x01A8
    #define LB_ITEMFROMPOINT        0x01A9
    #endif /* WINVER >= 0x0400 */
    #if defined(_WIN32_WCE) && (_WIN32_WCE >= 0x0400)
    #define LB_MULTIPLEADDSTRING    0x01B1
    #endif
     
     
    #if(_WIN32_WINNT >= 0x0501)
    #define LB_GETLISTBOXINFO       0x01B2
    #endif /* _WIN32_WINNT >= 0x0501 */
     
    #if(_WIN32_WINNT >= 0x0501)
    #define LB_MSGMAX               0x01B3
    #elif defined(_WIN32_WCE) && (_WIN32_WCE >= 0x0400)
    #define LB_MSGMAX               0x01B1
    #elif(WINVER >= 0x0400)
    #define LB_MSGMAX               0x01B0
    #else
    #define LB_MSGMAX               0x01A8
    #endif
     
    #endif /* !NOWINMESSAGES */
     
    #ifndef NOWINSTYLES
     
     
    /*
     * Listbox Styles
     */
    #define LBS_NOTIFY            0x0001L
    #define LBS_SORT              0x0002L
    #define LBS_NOREDRAW          0x0004L
    #define LBS_MULTIPLESEL       0x0008L
    #define LBS_OWNERDRAWFIXED    0x0010L
    #define LBS_OWNERDRAWVARIABLE 0x0020L
    #define LBS_HASSTRINGS        0x0040L
    #define LBS_USETABSTOPS       0x0080L
    #define LBS_NOINTEGRALHEIGHT  0x0100L
    #define LBS_MULTICOLUMN       0x0200L
    #define LBS_WANTKEYBOARDINPUT 0x0400L
    #define LBS_EXTENDEDSEL       0x0800L
    #define LBS_DISABLENOSCROLL   0x1000L
    #define LBS_NODATA            0x2000L
    #if(WINVER >= 0x0400)
    #define LBS_NOSEL             0x4000L
    #endif /* WINVER >= 0x0400 */
    #define LBS_COMBOBOX          0x8000L
     
    #define LBS_STANDARD          (LBS_NOTIFY | LBS_SORT | WS_VSCROLL | WS_BORDER)
     
     
    #endif /* !NOWINSTYLES */
     
     
    /*
     * Combo Box return Values
     */
    #define CB_OKAY             0
    #define CB_ERR              (-1)
    #define CB_ERRSPACE         (-2)
     
     
    /*
     * Combo Box Notification Codes
     */
    #define CBN_ERRSPACE        (-1)
    #define CBN_SELCHANGE       1
    #define CBN_DBLCLK          2
    #define CBN_SETFOCUS        3
    #define CBN_KILLFOCUS       4
    #define CBN_EDITCHANGE      5
    #define CBN_EDITUPDATE      6
    #define CBN_DROPDOWN        7
    #define CBN_CLOSEUP         8
    #define CBN_SELENDOK        9
    #define CBN_SELENDCANCEL    10
     
    #ifndef NOWINSTYLES
     
    /*
     * Combo Box styles
     */
    #define CBS_SIMPLE            0x0001L
    #define CBS_DROPDOWN          0x0002L
    #define CBS_DROPDOWNLIST      0x0003L
    #define CBS_OWNERDRAWFIXED    0x0010L
    #define CBS_OWNERDRAWVARIABLE 0x0020L
    #define CBS_AUTOHSCROLL       0x0040L
    #define CBS_OEMCONVERT        0x0080L
    #define CBS_SORT              0x0100L
    #define CBS_HASSTRINGS        0x0200L
    #define CBS_NOINTEGRALHEIGHT  0x0400L
    #define CBS_DISABLENOSCROLL   0x0800L
    #if(WINVER >= 0x0400)
    #define CBS_UPPERCASE         0x2000L
    #define CBS_LOWERCASE         0x4000L
    #endif /* WINVER >= 0x0400 */
     
    #endif  /* !NOWINSTYLES */
     
     
    /*
     * Combo Box messages
     */
    #ifndef NOWINMESSAGES
    #define CB_GETEDITSEL               0x0140
    #define CB_LIMITTEXT                0x0141
    #define CB_SETEDITSEL               0x0142
    #define CB_ADDSTRING                0x0143
    #define CB_DELETESTRING             0x0144
    #define CB_DIR                      0x0145
    #define CB_GETCOUNT                 0x0146
    #define CB_GETCURSEL                0x0147
    #define CB_GETLBTEXT                0x0148
    #define CB_GETLBTEXTLEN             0x0149
    #define CB_INSERTSTRING             0x014A
    #define CB_RESETCONTENT             0x014B
    #define CB_FINDSTRING               0x014C
    #define CB_SELECTSTRING             0x014D
    #define CB_SETCURSEL                0x014E
    #define CB_SHOWDROPDOWN             0x014F
    #define CB_GETITEMDATA              0x0150
    #define CB_SETITEMDATA              0x0151
    #define CB_GETDROPPEDCONTROLRECT    0x0152
    #define CB_SETITEMHEIGHT            0x0153
    #define CB_GETITEMHEIGHT            0x0154
    #define CB_SETEXTENDEDUI            0x0155
    #define CB_GETEXTENDEDUI            0x0156
    #define CB_GETDROPPEDSTATE          0x0157
    #define CB_FINDSTRINGEXACT          0x0158
    #define CB_SETLOCALE                0x0159
    #define CB_GETLOCALE                0x015A
    #if(WINVER >= 0x0400)
    #define CB_GETTOPINDEX              0x015b
    #define CB_SETTOPINDEX              0x015c
    #define CB_GETHORIZONTALEXTENT      0x015d
    #define CB_SETHORIZONTALEXTENT      0x015e
    #define CB_GETDROPPEDWIDTH          0x015f
    #define CB_SETDROPPEDWIDTH          0x0160
    #define CB_INITSTORAGE              0x0161
    #if defined(_WIN32_WCE) &&(_WIN32_WCE >= 0x0400)
    #define CB_MULTIPLEADDSTRING        0x0163
    #endif
    #endif /* WINVER >= 0x0400 */
     
    #if(_WIN32_WINNT >= 0x0501)
    #define CB_GETCOMBOBOXINFO          0x0164
    #endif /* _WIN32_WINNT >= 0x0501 */
     
    #if(_WIN32_WINNT >= 0x0501)
    #define CB_MSGMAX                   0x0165
    #elif defined(_WIN32_WCE) && (_WIN32_WCE >= 0x0400)
    #define CB_MSGMAX                   0x0163
    #elif(WINVER >= 0x0400)
    #define CB_MSGMAX                   0x0162
    #else
    #define CB_MSGMAX                   0x015B
    #endif
    #endif  /* !NOWINMESSAGES */
     
     
     
    #ifndef NOWINSTYLES
     
     
    /*
     * Scroll Bar Styles
     */
    #define SBS_HORZ                    0x0000L
    #define SBS_VERT                    0x0001L
    #define SBS_TOPALIGN                0x0002L
    #define SBS_LEFTALIGN               0x0002L
    #define SBS_BOTTOMALIGN             0x0004L
    #define SBS_RIGHTALIGN              0x0004L
    #define SBS_SIZEBOXTOPLEFTALIGN     0x0002L
    #define SBS_SIZEBOXBOTTOMRIGHTALIGN 0x0004L
    #define SBS_SIZEBOX                 0x0008L
    #if(WINVER >= 0x0400)
    #define SBS_SIZEGRIP                0x0010L
    #endif /* WINVER >= 0x0400 */
     
     
    #endif /* !NOWINSTYLES */
     
    /*
     * Scroll bar messages
     */
    #ifndef NOWINMESSAGES
    #define SBM_SETPOS                  0x00E0 /*not in win3.1 */
    #define SBM_GETPOS                  0x00E1 /*not in win3.1 */
    #define SBM_SETRANGE                0x00E2 /*not in win3.1 */
    #define SBM_SETRANGEREDRAW          0x00E6 /*not in win3.1 */
    #define SBM_GETRANGE                0x00E3 /*not in win3.1 */
    #define SBM_ENABLE_ARROWS           0x00E4 /*not in win3.1 */
    #if(WINVER >= 0x0400)
    #define SBM_SETSCROLLINFO           0x00E9
    #define SBM_GETSCROLLINFO           0x00EA
    #endif /* WINVER >= 0x0400 */
     
    #if(_WIN32_WINNT >= 0x0501)
    #define SBM_GETSCROLLBARINFO        0x00EB
    #endif /* _WIN32_WINNT >= 0x0501 */
     
    #if(WINVER >= 0x0400)
    #define SIF_RANGE           0x0001
    #define SIF_PAGE            0x0002
    #define SIF_POS             0x0004
    #define SIF_DISABLENOSCROLL 0x0008
    #define SIF_TRACKPOS        0x0010
    #define SIF_ALL             (SIF_RANGE | SIF_PAGE | SIF_POS | SIF_TRACKPOS)
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    typedef struct tagSCROLLINFO
    {
        UINT    cbSize;
        UINT    fMask;
        int     nMin;
        int     nMax;
        UINT    nPage;
        int     nPos;
        int     nTrackPos;
    }   SCROLLINFO, FAR *LPSCROLLINFO;
    typedef SCROLLINFO CONST FAR *LPCSCROLLINFO;
     
    WINUSERAPI
    int
    WINAPI
    SetScrollInfo(
        _In_ HWND hwnd,
        _In_ int nBar,
        _In_ LPCSCROLLINFO lpsi,
        _In_ BOOL redraw);
     
    WINUSERAPI
    BOOL
    WINAPI
    GetScrollInfo(
        _In_ HWND hwnd,
        _In_ int nBar,
        _Inout_ LPSCROLLINFO lpsi);
     
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
    #endif /* WINVER >= 0x0400 */
     
    #endif /* !NOWINMESSAGES */
    #endif /* !NOCTLMGR */
     
    #ifndef NOMDI
     
    /*
     * MDI client style bits
     */
    #define MDIS_ALLCHILDSTYLES    0x0001
     
    /*
     * wParam Flags for WM_MDITILE and WM_MDICASCADE messages.
     */
    #define MDITILE_VERTICAL       0x0000 /*not in win3.1 */
    #define MDITILE_HORIZONTAL     0x0001 /*not in win3.1 */
    #define MDITILE_SKIPDISABLED   0x0002 /*not in win3.1 */
    #if(_WIN32_WINNT >= 0x0500)
    #define MDITILE_ZORDER         0x0004
    #endif /* _WIN32_WINNT >= 0x0500 */
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    typedef struct tagMDICREATESTRUCTA {
        LPCSTR   szClass;
        LPCSTR   szTitle;
        HANDLE hOwner;
        int x;
        int y;
        int cx;
        int cy;
        DWORD style;
        LPARAM lParam;        /* app-defined stuff */
    } MDICREATESTRUCTA, *LPMDICREATESTRUCTA;
    typedef struct tagMDICREATESTRUCTW {
        LPCWSTR  szClass;
        LPCWSTR  szTitle;
        HANDLE hOwner;
        int x;
        int y;
        int cx;
        int cy;
        DWORD style;
        LPARAM lParam;        /* app-defined stuff */
    } MDICREATESTRUCTW, *LPMDICREATESTRUCTW;
    #ifdef UNICODE
    typedef MDICREATESTRUCTW MDICREATESTRUCT;
    typedef LPMDICREATESTRUCTW LPMDICREATESTRUCT;
    #else
    typedef MDICREATESTRUCTA MDICREATESTRUCT;
    typedef LPMDICREATESTRUCTA LPMDICREATESTRUCT;
    #endif // UNICODE
     
    typedef struct tagCLIENTCREATESTRUCT {
        HANDLE hWindowMenu;
        UINT idFirstChild;
    } CLIENTCREATESTRUCT, *LPCLIENTCREATESTRUCT;
     
    WINUSERAPI
    LRESULT
    WINAPI
    DefFrameProcA(
        _In_ HWND hWnd,
        _In_opt_ HWND hWndMDIClient,
        _In_ UINT uMsg,
        _In_ WPARAM wParam,
        _In_ LPARAM lParam);
    WINUSERAPI
    LRESULT
    WINAPI
    DefFrameProcW(
        _In_ HWND hWnd,
        _In_opt_ HWND hWndMDIClient,
        _In_ UINT uMsg,
        _In_ WPARAM wParam,
        _In_ LPARAM lParam);
    #ifdef UNICODE
    #define DefFrameProc  DefFrameProcW
    #else
    #define DefFrameProc  DefFrameProcA
    #endif // !UNICODE
     
    WINUSERAPI
    #ifndef _MAC
    LRESULT
    WINAPI
    #else
    LRESULT
    CALLBACK
    #endif
    DefMDIChildProcA(
        _In_ HWND hWnd,
        _In_ UINT uMsg,
        _In_ WPARAM wParam,
        _In_ LPARAM lParam);
    WINUSERAPI
    #ifndef _MAC
    LRESULT
    WINAPI
    #else
    LRESULT
    CALLBACK
    #endif
    DefMDIChildProcW(
        _In_ HWND hWnd,
        _In_ UINT uMsg,
        _In_ WPARAM wParam,
        _In_ LPARAM lParam);
    #ifdef UNICODE
    #define DefMDIChildProc  DefMDIChildProcW
    #else
    #define DefMDIChildProc  DefMDIChildProcA
    #endif // !UNICODE
     
    #ifndef NOMSG
     
    WINUSERAPI
    BOOL
    WINAPI
    TranslateMDISysAccel(
        _In_ HWND hWndClient,
        _In_ LPMSG lpMsg);
     
    #endif /* !NOMSG */
     
    WINUSERAPI
    UINT
    WINAPI
    ArrangeIconicWindows(
        _In_ HWND hWnd);
     
    WINUSERAPI
    HWND
    WINAPI
    CreateMDIWindowA(
        _In_ LPCSTR lpClassName,
        _In_ LPCSTR lpWindowName,
        _In_ DWORD dwStyle,
        _In_ int X,
        _In_ int Y,
        _In_ int nWidth,
        _In_ int nHeight,
        _In_opt_ HWND hWndParent,
        _In_opt_ HINSTANCE hInstance,
        _In_ LPARAM lParam);
    WINUSERAPI
    HWND
    WINAPI
    CreateMDIWindowW(
        _In_ LPCWSTR lpClassName,
        _In_ LPCWSTR lpWindowName,
        _In_ DWORD dwStyle,
        _In_ int X,
        _In_ int Y,
        _In_ int nWidth,
        _In_ int nHeight,
        _In_opt_ HWND hWndParent,
        _In_opt_ HINSTANCE hInstance,
        _In_ LPARAM lParam);
    #ifdef UNICODE
    #define CreateMDIWindow  CreateMDIWindowW
    #else
    #define CreateMDIWindow  CreateMDIWindowA
    #endif // !UNICODE
     
    #if(WINVER >= 0x0400)
    WINUSERAPI
    WORD
    WINAPI
    TileWindows(
        _In_opt_ HWND hwndParent,
        _In_ UINT wHow,
        _In_opt_ CONST RECT * lpRect,
        _In_ UINT cKids,
        _In_reads_opt_(cKids) const HWND FAR * lpKids);
     
    WINUSERAPI
    WORD
    WINAPI CascadeWindows(
        _In_opt_ HWND hwndParent,
        _In_ UINT wHow,
        _In_opt_ CONST RECT * lpRect,
        _In_ UINT cKids,
        _In_reads_opt_(cKids) const HWND FAR * lpKids);
     
    #endif /* WINVER >= 0x0400 */
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    #endif /* !NOMDI */
     
    #endif /* !NOUSER */
     
    /****** Help support ********************************************************/
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    #ifndef NOHELP
     
    typedef DWORD HELPPOLY;
    typedef struct tagMULTIKEYHELPA {
    #ifndef _MAC
        DWORD  mkSize;
    #else
        WORD   mkSize;
    #endif
        CHAR   mkKeylist;
        CHAR   szKeyphrase[1];
    } MULTIKEYHELPA, *PMULTIKEYHELPA, *LPMULTIKEYHELPA;
    typedef struct tagMULTIKEYHELPW {
    #ifndef _MAC
        DWORD  mkSize;
    #else
        WORD   mkSize;
    #endif
        WCHAR  mkKeylist;
        WCHAR  szKeyphrase[1];
    } MULTIKEYHELPW, *PMULTIKEYHELPW, *LPMULTIKEYHELPW;
    #ifdef UNICODE
    typedef MULTIKEYHELPW MULTIKEYHELP;
    typedef PMULTIKEYHELPW PMULTIKEYHELP;
    typedef LPMULTIKEYHELPW LPMULTIKEYHELP;
    #else
    typedef MULTIKEYHELPA MULTIKEYHELP;
    typedef PMULTIKEYHELPA PMULTIKEYHELP;
    typedef LPMULTIKEYHELPA LPMULTIKEYHELP;
    #endif // UNICODE
     
    typedef struct tagHELPWININFOA {
        int  wStructSize;
        int  x;
        int  y;
        int  dx;
        int  dy;
        int  wMax;
        CHAR   rgchMember[2];
    } HELPWININFOA, *PHELPWININFOA, *LPHELPWININFOA;
    typedef struct tagHELPWININFOW {
        int  wStructSize;
        int  x;
        int  y;
        int  dx;
        int  dy;
        int  wMax;
        WCHAR  rgchMember[2];
    } HELPWININFOW, *PHELPWININFOW, *LPHELPWININFOW;
    #ifdef UNICODE
    typedef HELPWININFOW HELPWININFO;
    typedef PHELPWININFOW PHELPWININFO;
    typedef LPHELPWININFOW LPHELPWININFO;
    #else
    typedef HELPWININFOA HELPWININFO;
    typedef PHELPWININFOA PHELPWININFO;
    typedef LPHELPWININFOA LPHELPWININFO;
    #endif // UNICODE
     
     
    /*
     * Commands to pass to WinHelp()
     */
    #define HELP_CONTEXT      0x0001L  /* Display topic in ulTopic */
    #define HELP_QUIT         0x0002L  /* Terminate help */
    #define HELP_INDEX        0x0003L  /* Display index */
    #define HELP_CONTENTS     0x0003L
    #define HELP_HELPONHELP   0x0004L  /* Display help on using help */
    #define HELP_SETINDEX     0x0005L  /* Set current Index for multi index help */
    #define HELP_SETCONTENTS  0x0005L
    #define HELP_CONTEXTPOPUP 0x0008L
    #define HELP_FORCEFILE    0x0009L
    #define HELP_KEY          0x0101L  /* Display topic for keyword in offabData */
    #define HELP_COMMAND      0x0102L
    #define HELP_PARTIALKEY   0x0105L
    #define HELP_MULTIKEY     0x0201L
    #define HELP_SETWINPOS    0x0203L
    #if(WINVER >= 0x0400)
    #define HELP_CONTEXTMENU  0x000a
    #define HELP_FINDER       0x000b
    #define HELP_WM_HELP      0x000c
    #define HELP_SETPOPUP_POS 0x000d
     
    #define HELP_TCARD              0x8000
    #define HELP_TCARD_DATA         0x0010
    #define HELP_TCARD_OTHER_CALLER 0x0011
     
    // These are in winhelp.h in Win95.
    #define IDH_NO_HELP                     28440
    #define IDH_MISSING_CONTEXT             28441 // Control doesn't have matching help context
    #define IDH_GENERIC_HELP_BUTTON         28442 // Property sheet help button
    #define IDH_OK                          28443
    #define IDH_CANCEL                      28444
    #define IDH_HELP                        28445
     
    #endif /* WINVER >= 0x0400 */
     
     
     
    WINUSERAPI
    BOOL
    WINAPI
    WinHelpA(
        _In_opt_ HWND hWndMain,
        _In_opt_ LPCSTR lpszHelp,
        _In_ UINT uCommand,
        _In_ ULONG_PTR dwData);
    WINUSERAPI
    BOOL
    WINAPI
    WinHelpW(
        _In_opt_ HWND hWndMain,
        _In_opt_ LPCWSTR lpszHelp,
        _In_ UINT uCommand,
        _In_ ULONG_PTR dwData);
    #ifdef UNICODE
    #define WinHelp  WinHelpW
    #else
    #define WinHelp  WinHelpA
    #endif // !UNICODE
     
    #endif /* !NOHELP */
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    #if(WINVER >= 0x0500)
     
    #define GR_GDIOBJECTS       0       /* Count of GDI objects */
    #define GR_USEROBJECTS      1       /* Count of USER objects */
    #endif /* WINVER >= 0x0500 */
    #if(WINVER >= 0x0601)
    #define GR_GDIOBJECTS_PEAK  2       /* Peak count of GDI objects */
    #define GR_USEROBJECTS_PEAK 4       /* Peak count of USER objects */
    #endif /* WINVER >= 0x0601 */
     
    #if(WINVER >= 0x0601)
    #define GR_GLOBAL           ((HANDLE)-2)
    #endif /* WINVER >= 0x0601 */
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    #if(WINVER >= 0x0500)
    WINUSERAPI
    DWORD
    WINAPI
    GetGuiResources(
        _In_ HANDLE hProcess,
        _In_ DWORD uiFlags);
    #endif /* WINVER >= 0x0500 */
     
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    #ifndef NOSYSPARAMSINFO
     
    /*
     * Parameter for SystemParametersInfo.
     */
     
    #define SPI_GETBEEP                 0x0001
    #define SPI_SETBEEP                 0x0002
    #define SPI_GETMOUSE                0x0003
    #define SPI_SETMOUSE                0x0004
    #define SPI_GETBORDER               0x0005
    #define SPI_SETBORDER               0x0006
    #define SPI_GETKEYBOARDSPEED        0x000A
    #define SPI_SETKEYBOARDSPEED        0x000B
    #define SPI_LANGDRIVER              0x000C
    #define SPI_ICONHORIZONTALSPACING   0x000D
    #define SPI_GETSCREENSAVETIMEOUT    0x000E
    #define SPI_SETSCREENSAVETIMEOUT    0x000F
    #define SPI_GETSCREENSAVEACTIVE     0x0010
    #define SPI_SETSCREENSAVEACTIVE     0x0011
    #define SPI_GETGRIDGRANULARITY      0x0012
    #define SPI_SETGRIDGRANULARITY      0x0013
    #define SPI_SETDESKWALLPAPER        0x0014
    #define SPI_SETDESKPATTERN          0x0015
    #define SPI_GETKEYBOARDDELAY        0x0016
    #define SPI_SETKEYBOARDDELAY        0x0017
    #define SPI_ICONVERTICALSPACING     0x0018
    #define SPI_GETICONTITLEWRAP        0x0019
    #define SPI_SETICONTITLEWRAP        0x001A
    #define SPI_GETMENUDROPALIGNMENT    0x001B
    #define SPI_SETMENUDROPALIGNMENT    0x001C
    #define SPI_SETDOUBLECLKWIDTH       0x001D
    #define SPI_SETDOUBLECLKHEIGHT      0x001E
    #define SPI_GETICONTITLELOGFONT     0x001F
    #define SPI_SETDOUBLECLICKTIME      0x0020
    #define SPI_SETMOUSEBUTTONSWAP      0x0021
    #define SPI_SETICONTITLELOGFONT     0x0022
    #define SPI_GETFASTTASKSWITCH       0x0023
    #define SPI_SETFASTTASKSWITCH       0x0024
    #if(WINVER >= 0x0400)
    #define SPI_SETDRAGFULLWINDOWS      0x0025
    #define SPI_GETDRAGFULLWINDOWS      0x0026
    #define SPI_GETNONCLIENTMETRICS     0x0029
    #define SPI_SETNONCLIENTMETRICS     0x002A
    #define SPI_GETMINIMIZEDMETRICS     0x002B
    #define SPI_SETMINIMIZEDMETRICS     0x002C
    #define SPI_GETICONMETRICS          0x002D
    #define SPI_SETICONMETRICS          0x002E
    #define SPI_SETWORKAREA             0x002F
    #define SPI_GETWORKAREA             0x0030
    #define SPI_SETPENWINDOWS           0x0031
     
    #define SPI_GETHIGHCONTRAST         0x0042
    #define SPI_SETHIGHCONTRAST         0x0043
    #define SPI_GETKEYBOARDPREF         0x0044
    #define SPI_SETKEYBOARDPREF         0x0045
    #define SPI_GETSCREENREADER         0x0046
    #define SPI_SETSCREENREADER         0x0047
    #define SPI_GETANIMATION            0x0048
    #define SPI_SETANIMATION            0x0049
    #define SPI_GETFONTSMOOTHING        0x004A
    #define SPI_SETFONTSMOOTHING        0x004B
    #define SPI_SETDRAGWIDTH            0x004C
    #define SPI_SETDRAGHEIGHT           0x004D
    #define SPI_SETHANDHELD             0x004E
    #define SPI_GETLOWPOWERTIMEOUT      0x004F
    #define SPI_GETPOWEROFFTIMEOUT      0x0050
    #define SPI_SETLOWPOWERTIMEOUT      0x0051
    #define SPI_SETPOWEROFFTIMEOUT      0x0052
    #define SPI_GETLOWPOWERACTIVE       0x0053
    #define SPI_GETPOWEROFFACTIVE       0x0054
    #define SPI_SETLOWPOWERACTIVE       0x0055
    #define SPI_SETPOWEROFFACTIVE       0x0056
    #define SPI_SETCURSORS              0x0057
    #define SPI_SETICONS                0x0058
    #define SPI_GETDEFAULTINPUTLANG     0x0059
    #define SPI_SETDEFAULTINPUTLANG     0x005A
    #define SPI_SETLANGTOGGLE           0x005B
    #define SPI_GETWINDOWSEXTENSION     0x005C
    #define SPI_SETMOUSETRAILS          0x005D
    #define SPI_GETMOUSETRAILS          0x005E
    #define SPI_SETSCREENSAVERRUNNING   0x0061
    #define SPI_SCREENSAVERRUNNING     SPI_SETSCREENSAVERRUNNING
    #endif /* WINVER >= 0x0400 */
    #define SPI_GETFILTERKEYS          0x0032
    #define SPI_SETFILTERKEYS          0x0033
    #define SPI_GETTOGGLEKEYS          0x0034
    #define SPI_SETTOGGLEKEYS          0x0035
    #define SPI_GETMOUSEKEYS           0x0036
    #define SPI_SETMOUSEKEYS           0x0037
    #define SPI_GETSHOWSOUNDS          0x0038
    #define SPI_SETSHOWSOUNDS          0x0039
    #define SPI_GETSTICKYKEYS          0x003A
    #define SPI_SETSTICKYKEYS          0x003B
    #define SPI_GETACCESSTIMEOUT       0x003C
    #define SPI_SETACCESSTIMEOUT       0x003D
    #if(WINVER >= 0x0400)
    #define SPI_GETSERIALKEYS          0x003E
    #define SPI_SETSERIALKEYS          0x003F
    #endif /* WINVER >= 0x0400 */
    #define SPI_GETSOUNDSENTRY         0x0040
    #define SPI_SETSOUNDSENTRY         0x0041
    #if(_WIN32_WINNT >= 0x0400)
    #define SPI_GETSNAPTODEFBUTTON     0x005F
    #define SPI_SETSNAPTODEFBUTTON     0x0060
    #endif /* _WIN32_WINNT >= 0x0400 */
    #if (_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)
    #define SPI_GETMOUSEHOVERWIDTH     0x0062
    #define SPI_SETMOUSEHOVERWIDTH     0x0063
    #define SPI_GETMOUSEHOVERHEIGHT    0x0064
    #define SPI_SETMOUSEHOVERHEIGHT    0x0065
    #define SPI_GETMOUSEHOVERTIME      0x0066
    #define SPI_SETMOUSEHOVERTIME      0x0067
    #define SPI_GETWHEELSCROLLLINES    0x0068
    #define SPI_SETWHEELSCROLLLINES    0x0069
    #define SPI_GETMENUSHOWDELAY       0x006A
    #define SPI_SETMENUSHOWDELAY       0x006B
     
    #if (_WIN32_WINNT >= 0x0600)
    #define SPI_GETWHEELSCROLLCHARS   0x006C
    #define SPI_SETWHEELSCROLLCHARS   0x006D
    #endif
     
    #define SPI_GETSHOWIMEUI          0x006E
    #define SPI_SETSHOWIMEUI          0x006F
    #endif
     
     
    #if(WINVER >= 0x0500)
    #define SPI_GETMOUSESPEED         0x0070
    #define SPI_SETMOUSESPEED         0x0071
    #define SPI_GETSCREENSAVERRUNNING 0x0072
    #define SPI_GETDESKWALLPAPER      0x0073
    #endif /* WINVER >= 0x0500 */
     
    #if(WINVER >= 0x0600)
    #define SPI_GETAUDIODESCRIPTION   0x0074
    #define SPI_SETAUDIODESCRIPTION   0x0075
     
    #define SPI_GETSCREENSAVESECURE   0x0076
    #define SPI_SETSCREENSAVESECURE   0x0077
    #endif /* WINVER >= 0x0600 */
     
    #if(_WIN32_WINNT >= 0x0601)
    #define SPI_GETHUNGAPPTIMEOUT           0x0078
    #define SPI_SETHUNGAPPTIMEOUT           0x0079
    #define SPI_GETWAITTOKILLTIMEOUT        0x007A
    #define SPI_SETWAITTOKILLTIMEOUT        0x007B
    #define SPI_GETWAITTOKILLSERVICETIMEOUT 0x007C
    #define SPI_SETWAITTOKILLSERVICETIMEOUT 0x007D
    #define SPI_GETMOUSEDOCKTHRESHOLD       0x007E
    #define SPI_SETMOUSEDOCKTHRESHOLD       0x007F
    #define SPI_GETPENDOCKTHRESHOLD         0x0080
    #define SPI_SETPENDOCKTHRESHOLD         0x0081
    #define SPI_GETWINARRANGING             0x0082
    #define SPI_SETWINARRANGING             0x0083
    #define SPI_GETMOUSEDRAGOUTTHRESHOLD    0x0084
    #define SPI_SETMOUSEDRAGOUTTHRESHOLD    0x0085
    #define SPI_GETPENDRAGOUTTHRESHOLD      0x0086
    #define SPI_SETPENDRAGOUTTHRESHOLD      0x0087
    #define SPI_GETMOUSESIDEMOVETHRESHOLD   0x0088
    #define SPI_SETMOUSESIDEMOVETHRESHOLD   0x0089
    #define SPI_GETPENSIDEMOVETHRESHOLD     0x008A
    #define SPI_SETPENSIDEMOVETHRESHOLD     0x008B
    #define SPI_GETDRAGFROMMAXIMIZE         0x008C
    #define SPI_SETDRAGFROMMAXIMIZE         0x008D
    #define SPI_GETSNAPSIZING               0x008E
    #define SPI_SETSNAPSIZING               0x008F
    #define SPI_GETDOCKMOVING               0x0090
    #define SPI_SETDOCKMOVING               0x0091
    #endif /* _WIN32_WINNT >= 0x0601 */
     
    #if(WINVER >= 0x0602)
    #define MAX_TOUCH_PREDICTION_FILTER_TAPS 3
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    typedef struct tagTouchPredictionParameters
    {
        UINT cbSize;
        UINT dwLatency;       // Latency in millisecs
        UINT dwSampleTime;    // Sample time in millisecs (used to deduce velocity)
        UINT bUseHWTimeStamp; // Use H/W TimeStamps
    } TOUCHPREDICTIONPARAMETERS, *PTOUCHPREDICTIONPARAMETERS;
     
    #define TOUCHPREDICTIONPARAMETERS_DEFAULT_LATENCY 8
    #define TOUCHPREDICTIONPARAMETERS_DEFAULT_SAMPLETIME 8
    #define TOUCHPREDICTIONPARAMETERS_DEFAULT_USE_HW_TIMESTAMP 1
    #define TOUCHPREDICTIONPARAMETERS_DEFAULT_RLS_DELTA 0.001f
    #define TOUCHPREDICTIONPARAMETERS_DEFAULT_RLS_LAMBDA_MIN 0.9f
    #define TOUCHPREDICTIONPARAMETERS_DEFAULT_RLS_LAMBDA_MAX 0.999f
    #define TOUCHPREDICTIONPARAMETERS_DEFAULT_RLS_LAMBDA_LEARNING_RATE 0.001f
    #define TOUCHPREDICTIONPARAMETERS_DEFAULT_RLS_EXPO_SMOOTH_ALPHA 0.99f
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    #define SPI_GETTOUCHPREDICTIONPARAMETERS 0x009C
    #define SPI_SETTOUCHPREDICTIONPARAMETERS 0x009D
     
    #define MAX_LOGICALDPIOVERRIDE  2
    #define MIN_LOGICALDPIOVERRIDE  -2
     
    #define SPI_GETLOGICALDPIOVERRIDE       0x009E
    #define SPI_SETLOGICALDPIOVERRIDE       0x009F
     
    #define SPI_GETMOUSECORNERCLIPLENGTH    0x00A0
    #define SPI_SETMOUSECORNERCLIPLENGTH    0x00A1
     
    #define SPI_GETMENURECT   0x00A2
    #define SPI_SETMENURECT   0x00A3
     
    #endif /* WINVER >= 0x0602 */
     
     
    #if(WINVER >= 0x0500)
    #define SPI_GETACTIVEWINDOWTRACKING         0x1000
    #define SPI_SETACTIVEWINDOWTRACKING         0x1001
    #define SPI_GETMENUANIMATION                0x1002
    #define SPI_SETMENUANIMATION                0x1003
    #define SPI_GETCOMBOBOXANIMATION            0x1004
    #define SPI_SETCOMBOBOXANIMATION            0x1005
    #define SPI_GETLISTBOXSMOOTHSCROLLING       0x1006
    #define SPI_SETLISTBOXSMOOTHSCROLLING       0x1007
    #define SPI_GETGRADIENTCAPTIONS             0x1008
    #define SPI_SETGRADIENTCAPTIONS             0x1009
    #define SPI_GETKEYBOARDCUES                 0x100A
    #define SPI_SETKEYBOARDCUES                 0x100B
    #define SPI_GETMENUUNDERLINES               SPI_GETKEYBOARDCUES
    #define SPI_SETMENUUNDERLINES               SPI_SETKEYBOARDCUES
    #define SPI_GETACTIVEWNDTRKZORDER           0x100C
    #define SPI_SETACTIVEWNDTRKZORDER           0x100D
    #define SPI_GETHOTTRACKING                  0x100E
    #define SPI_SETHOTTRACKING                  0x100F
    #define SPI_GETMENUFADE                     0x1012
    #define SPI_SETMENUFADE                     0x1013
    #define SPI_GETSELECTIONFADE                0x1014
    #define SPI_SETSELECTIONFADE                0x1015
    #define SPI_GETTOOLTIPANIMATION             0x1016
    #define SPI_SETTOOLTIPANIMATION             0x1017
    #define SPI_GETTOOLTIPFADE                  0x1018
    #define SPI_SETTOOLTIPFADE                  0x1019
    #define SPI_GETCURSORSHADOW                 0x101A
    #define SPI_SETCURSORSHADOW                 0x101B
    #if(_WIN32_WINNT >= 0x0501)
    #define SPI_GETMOUSESONAR                   0x101C
    #define SPI_SETMOUSESONAR                   0x101D
    #define SPI_GETMOUSECLICKLOCK               0x101E
    #define SPI_SETMOUSECLICKLOCK               0x101F
    #define SPI_GETMOUSEVANISH                  0x1020
    #define SPI_SETMOUSEVANISH                  0x1021
    #define SPI_GETFLATMENU                     0x1022
    #define SPI_SETFLATMENU                     0x1023
    #define SPI_GETDROPSHADOW                   0x1024
    #define SPI_SETDROPSHADOW                   0x1025
    #define SPI_GETBLOCKSENDINPUTRESETS         0x1026
    #define SPI_SETBLOCKSENDINPUTRESETS         0x1027
    #endif /* _WIN32_WINNT >= 0x0501 */
     
    #define SPI_GETUIEFFECTS                    0x103E
    #define SPI_SETUIEFFECTS                    0x103F
     
    #if(_WIN32_WINNT >= 0x0600)
    #define SPI_GETDISABLEOVERLAPPEDCONTENT     0x1040
    #define SPI_SETDISABLEOVERLAPPEDCONTENT     0x1041
    #define SPI_GETCLIENTAREAANIMATION          0x1042
    #define SPI_SETCLIENTAREAANIMATION          0x1043
    #define SPI_GETCLEARTYPE                    0x1048
    #define SPI_SETCLEARTYPE                    0x1049
    #define SPI_GETSPEECHRECOGNITION            0x104A
    #define SPI_SETSPEECHRECOGNITION            0x104B
    #endif /* _WIN32_WINNT >= 0x0600 */
     
    #if(WINVER >= 0x0601)
    #define SPI_GETCARETBROWSING                0x104C
    #define SPI_SETCARETBROWSING                0x104D
    #define SPI_GETTHREADLOCALINPUTSETTINGS     0x104E
    #define SPI_SETTHREADLOCALINPUTSETTINGS     0x104F
    #define SPI_GETSYSTEMLANGUAGEBAR            0x1050
    #define SPI_SETSYSTEMLANGUAGEBAR            0x1051
    #endif /* WINVER >= 0x0601 */
     
    #define SPI_GETFOREGROUNDLOCKTIMEOUT        0x2000
    #define SPI_SETFOREGROUNDLOCKTIMEOUT        0x2001
    #define SPI_GETACTIVEWNDTRKTIMEOUT          0x2002
    #define SPI_SETACTIVEWNDTRKTIMEOUT          0x2003
    #define SPI_GETFOREGROUNDFLASHCOUNT         0x2004
    #define SPI_SETFOREGROUNDFLASHCOUNT         0x2005
    #define SPI_GETCARETWIDTH                   0x2006
    #define SPI_SETCARETWIDTH                   0x2007
     
    #if(_WIN32_WINNT >= 0x0501)
    #define SPI_GETMOUSECLICKLOCKTIME           0x2008
    #define SPI_SETMOUSECLICKLOCKTIME           0x2009
    #define SPI_GETFONTSMOOTHINGTYPE            0x200A
    #define SPI_SETFONTSMOOTHINGTYPE            0x200B
     
    /* constants for SPI_GETFONTSMOOTHINGTYPE and SPI_SETFONTSMOOTHINGTYPE: */
    #define FE_FONTSMOOTHINGSTANDARD            0x0001
    #define FE_FONTSMOOTHINGCLEARTYPE           0x0002
     
    #define SPI_GETFONTSMOOTHINGCONTRAST           0x200C
    #define SPI_SETFONTSMOOTHINGCONTRAST           0x200D
     
    #define SPI_GETFOCUSBORDERWIDTH             0x200E
    #define SPI_SETFOCUSBORDERWIDTH             0x200F
    #define SPI_GETFOCUSBORDERHEIGHT            0x2010
    #define SPI_SETFOCUSBORDERHEIGHT            0x2011
     
    #define SPI_GETFONTSMOOTHINGORIENTATION           0x2012
    #define SPI_SETFONTSMOOTHINGORIENTATION           0x2013
     
    /* constants for SPI_GETFONTSMOOTHINGORIENTATION and SPI_SETFONTSMOOTHINGORIENTATION: */
    #define FE_FONTSMOOTHINGORIENTATIONBGR   0x0000
    #define FE_FONTSMOOTHINGORIENTATIONRGB   0x0001
    #endif /* _WIN32_WINNT >= 0x0501 */
     
    #if(_WIN32_WINNT >= 0x0600)
    #define SPI_GETMINIMUMHITRADIUS             0x2014
    #define SPI_SETMINIMUMHITRADIUS             0x2015
    #define SPI_GETMESSAGEDURATION              0x2016
    #define SPI_SETMESSAGEDURATION              0x2017
    #endif /* _WIN32_WINNT >= 0x0600 */
     
    #if(WINVER >= 0x0602)
    #define SPI_GETCONTACTVISUALIZATION         0x2018
    #define SPI_SETCONTACTVISUALIZATION         0x2019
    /* constants for SPI_GETCONTACTVISUALIZATION and SPI_SETCONTACTVISUALIZATION */
    #define CONTACTVISUALIZATION_OFF                 0x0000
    #define CONTACTVISUALIZATION_ON                  0x0001
    #define CONTACTVISUALIZATION_PRESENTATIONMODE    0x0002
     
    #define SPI_GETGESTUREVISUALIZATION         0x201A
    #define SPI_SETGESTUREVISUALIZATION         0x201B
    /* constants for SPI_GETGESTUREVISUALIZATION and SPI_SETGESTUREVISUALIZATION */
    #define GESTUREVISUALIZATION_OFF                 0x0000
    #define GESTUREVISUALIZATION_ON                  0x001F
    #define GESTUREVISUALIZATION_TAP                 0x0001
    #define GESTUREVISUALIZATION_DOUBLETAP           0x0002
    #define GESTUREVISUALIZATION_PRESSANDTAP         0x0004
    #define GESTUREVISUALIZATION_PRESSANDHOLD        0x0008
    #define GESTUREVISUALIZATION_RIGHTTAP            0x0010
    #endif /* WINVER >= 0x0602 */
     
    #if(WINVER >= 0x0602)
    #define SPI_GETMOUSEWHEELROUTING            0x201C
    #define SPI_SETMOUSEWHEELROUTING            0x201D
     
        #define MOUSEWHEEL_ROUTING_FOCUS                  0
        #define MOUSEWHEEL_ROUTING_HYBRID                 1
     
    #endif /* WINVER >= 0x0602 */
     
    #endif /* WINVER >= 0x0500 */
     
    /*
     * Flags
     */
    #define SPIF_UPDATEINIFILE    0x0001
    #define SPIF_SENDWININICHANGE 0x0002
    #define SPIF_SENDCHANGE       SPIF_SENDWININICHANGE
     
     
    #define METRICS_USEDEFAULT -1
    #ifdef _WINGDI_
    #ifndef NOGDI
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    typedef struct tagNONCLIENTMETRICSA
    {
        UINT    cbSize;
        int     iBorderWidth;
        int     iScrollWidth;
        int     iScrollHeight;
        int     iCaptionWidth;
        int     iCaptionHeight;
        LOGFONTA lfCaptionFont;
        int     iSmCaptionWidth;
        int     iSmCaptionHeight;
        LOGFONTA lfSmCaptionFont;
        int     iMenuWidth;
        int     iMenuHeight;
        LOGFONTA lfMenuFont;
        LOGFONTA lfStatusFont;
        LOGFONTA lfMessageFont;
    #if(WINVER >= 0x0600)
        int     iPaddedBorderWidth;
    #endif /* WINVER >= 0x0600 */
    }   NONCLIENTMETRICSA, *PNONCLIENTMETRICSA, FAR* LPNONCLIENTMETRICSA;
    typedef struct tagNONCLIENTMETRICSW
    {
        UINT    cbSize;
        int     iBorderWidth;
        int     iScrollWidth;
        int     iScrollHeight;
        int     iCaptionWidth;
        int     iCaptionHeight;
        LOGFONTW lfCaptionFont;
        int     iSmCaptionWidth;
        int     iSmCaptionHeight;
        LOGFONTW lfSmCaptionFont;
        int     iMenuWidth;
        int     iMenuHeight;
        LOGFONTW lfMenuFont;
        LOGFONTW lfStatusFont;
        LOGFONTW lfMessageFont;
    #if(WINVER >= 0x0600)
        int     iPaddedBorderWidth;
    #endif /* WINVER >= 0x0600 */
    }   NONCLIENTMETRICSW, *PNONCLIENTMETRICSW, FAR* LPNONCLIENTMETRICSW;
    #ifdef UNICODE
    typedef NONCLIENTMETRICSW NONCLIENTMETRICS;
    typedef PNONCLIENTMETRICSW PNONCLIENTMETRICS;
    typedef LPNONCLIENTMETRICSW LPNONCLIENTMETRICS;
    #else
    typedef NONCLIENTMETRICSA NONCLIENTMETRICS;
    typedef PNONCLIENTMETRICSA PNONCLIENTMETRICS;
    typedef LPNONCLIENTMETRICSA LPNONCLIENTMETRICS;
    #endif // UNICODE
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    #endif /* NOGDI */
    #endif /* _WINGDI_ */
     
    #define ARW_BOTTOMLEFT              0x0000L
    #define ARW_BOTTOMRIGHT             0x0001L
    #define ARW_TOPLEFT                 0x0002L
    #define ARW_TOPRIGHT                0x0003L
    #define ARW_STARTMASK               0x0003L
    #define ARW_STARTRIGHT              0x0001L
    #define ARW_STARTTOP                0x0002L
     
    #define ARW_LEFT                    0x0000L
    #define ARW_RIGHT                   0x0000L
    #define ARW_UP                      0x0004L
    #define ARW_DOWN                    0x0004L
    #define ARW_HIDE                    0x0008L
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    typedef struct tagMINIMIZEDMETRICS
    {
        UINT    cbSize;
        int     iWidth;
        int     iHorzGap;
        int     iVertGap;
        int     iArrange;
    }   MINIMIZEDMETRICS, *PMINIMIZEDMETRICS, *LPMINIMIZEDMETRICS;
     
    #ifdef _WINGDI_
    #ifndef NOGDI
    typedef struct tagICONMETRICSA
    {
        UINT    cbSize;
        int     iHorzSpacing;
        int     iVertSpacing;
        int     iTitleWrap;
        LOGFONTA lfFont;
    }   ICONMETRICSA, *PICONMETRICSA, *LPICONMETRICSA;
    typedef struct tagICONMETRICSW
    {
        UINT    cbSize;
        int     iHorzSpacing;
        int     iVertSpacing;
        int     iTitleWrap;
        LOGFONTW lfFont;
    }   ICONMETRICSW, *PICONMETRICSW, *LPICONMETRICSW;
    #ifdef UNICODE
    typedef ICONMETRICSW ICONMETRICS;
    typedef PICONMETRICSW PICONMETRICS;
    typedef LPICONMETRICSW LPICONMETRICS;
    #else
    typedef ICONMETRICSA ICONMETRICS;
    typedef PICONMETRICSA PICONMETRICS;
    typedef LPICONMETRICSA LPICONMETRICS;
    #endif // UNICODE
    #endif /* NOGDI */
    #endif /* _WINGDI_ */
     
    typedef struct tagANIMATIONINFO
    {
        UINT    cbSize;
        int     iMinAnimate;
    }   ANIMATIONINFO, *LPANIMATIONINFO;
     
    typedef struct tagSERIALKEYSA
    {
        UINT    cbSize;
        DWORD   dwFlags;
        LPSTR     lpszActivePort;
        LPSTR     lpszPort;
        UINT    iBaudRate;
        UINT    iPortState;
        UINT    iActive;
    }   SERIALKEYSA, *LPSERIALKEYSA;
    typedef struct tagSERIALKEYSW
    {
        UINT    cbSize;
        DWORD   dwFlags;
        LPWSTR    lpszActivePort;
        LPWSTR    lpszPort;
        UINT    iBaudRate;
        UINT    iPortState;
        UINT    iActive;
    }   SERIALKEYSW, *LPSERIALKEYSW;
    #ifdef UNICODE
    typedef SERIALKEYSW SERIALKEYS;
    typedef LPSERIALKEYSW LPSERIALKEYS;
    #else
    typedef SERIALKEYSA SERIALKEYS;
    typedef LPSERIALKEYSA LPSERIALKEYS;
    #endif // UNICODE
     
    /* flags for SERIALKEYS dwFlags field */
    #define SERKF_SERIALKEYSON  0x00000001
    #define SERKF_AVAILABLE     0x00000002
    #define SERKF_INDICATOR     0x00000004
     
     
    typedef struct tagHIGHCONTRASTA
    {
        UINT    cbSize;
        DWORD   dwFlags;
        LPSTR   lpszDefaultScheme;
    }   HIGHCONTRASTA, *LPHIGHCONTRASTA;
    typedef struct tagHIGHCONTRASTW
    {
        UINT    cbSize;
        DWORD   dwFlags;
        LPWSTR  lpszDefaultScheme;
    }   HIGHCONTRASTW, *LPHIGHCONTRASTW;
    #ifdef UNICODE
    typedef HIGHCONTRASTW HIGHCONTRAST;
    typedef LPHIGHCONTRASTW LPHIGHCONTRAST;
    #else
    typedef HIGHCONTRASTA HIGHCONTRAST;
    typedef LPHIGHCONTRASTA LPHIGHCONTRAST;
    #endif // UNICODE
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    /* flags for HIGHCONTRAST dwFlags field */
    #define HCF_HIGHCONTRASTON  0x00000001
    #define HCF_AVAILABLE       0x00000002
    #define HCF_HOTKEYACTIVE    0x00000004
    #define HCF_CONFIRMHOTKEY   0x00000008
    #define HCF_HOTKEYSOUND     0x00000010
    #define HCF_INDICATOR       0x00000020
    #define HCF_HOTKEYAVAILABLE 0x00000040
    #define HCF_LOGONDESKTOP    0x00000100
    #define HCF_DEFAULTDESKTOP  0x00000200
     
    /* Flags for ChangeDisplaySettings */
    #define CDS_UPDATEREGISTRY           0x00000001
    #define CDS_TEST                     0x00000002
    #define CDS_FULLSCREEN               0x00000004
    #define CDS_GLOBAL                   0x00000008
    #define CDS_SET_PRIMARY              0x00000010
    #define CDS_VIDEOPARAMETERS          0x00000020
    #if(WINVER >= 0x0600)
    #define CDS_ENABLE_UNSAFE_MODES      0x00000100
    #define CDS_DISABLE_UNSAFE_MODES     0x00000200
    #endif /* WINVER >= 0x0600 */
    #define CDS_RESET                    0x40000000
    #define CDS_RESET_EX                 0x20000000
    #define CDS_NORESET                  0x10000000
     
    #include <tvout.h>
     
    /* Return values for ChangeDisplaySettings */
    #define DISP_CHANGE_SUCCESSFUL       0
    #define DISP_CHANGE_RESTART          1
    #define DISP_CHANGE_FAILED          -1
    #define DISP_CHANGE_BADMODE         -2
    #define DISP_CHANGE_NOTUPDATED      -3
    #define DISP_CHANGE_BADFLAGS        -4
    #define DISP_CHANGE_BADPARAM        -5
    #if(_WIN32_WINNT >= 0x0501)
    #define DISP_CHANGE_BADDUALVIEW     -6
    #endif /* _WIN32_WINNT >= 0x0501 */
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    #ifdef _WINGDI_
    #ifndef NOGDI
     
    WINUSERAPI
    LONG
    WINAPI
    ChangeDisplaySettingsA(
        _In_opt_ DEVMODEA* lpDevMode,
        _In_ DWORD dwFlags);
    WINUSERAPI
    LONG
    WINAPI
    ChangeDisplaySettingsW(
        _In_opt_ DEVMODEW* lpDevMode,
        _In_ DWORD dwFlags);
    #ifdef UNICODE
    #define ChangeDisplaySettings  ChangeDisplaySettingsW
    #else
    #define ChangeDisplaySettings  ChangeDisplaySettingsA
    #endif // !UNICODE
     
    WINUSERAPI
    LONG
    WINAPI
    ChangeDisplaySettingsExA(
        _In_opt_ LPCSTR lpszDeviceName,
        _In_opt_ DEVMODEA* lpDevMode,
        _Reserved_ HWND hwnd,
        _In_ DWORD dwflags,
        _In_opt_ LPVOID lParam);
    WINUSERAPI
    LONG
    WINAPI
    ChangeDisplaySettingsExW(
        _In_opt_ LPCWSTR lpszDeviceName,
        _In_opt_ DEVMODEW* lpDevMode,
        _Reserved_ HWND hwnd,
        _In_ DWORD dwflags,
        _In_opt_ LPVOID lParam);
    #ifdef UNICODE
    #define ChangeDisplaySettingsEx  ChangeDisplaySettingsExW
    #else
    #define ChangeDisplaySettingsEx  ChangeDisplaySettingsExA
    #endif // !UNICODE
     
     
    #define ENUM_CURRENT_SETTINGS       ((DWORD)-1)
    #define ENUM_REGISTRY_SETTINGS      ((DWORD)-2)
     
    WINUSERAPI
    BOOL
    WINAPI
    EnumDisplaySettingsA(
        _In_opt_ LPCSTR lpszDeviceName,
        _In_ DWORD iModeNum,
        _Inout_ DEVMODEA* lpDevMode);
    WINUSERAPI
    BOOL
    WINAPI
    EnumDisplaySettingsW(
        _In_opt_ LPCWSTR lpszDeviceName,
        _In_ DWORD iModeNum,
        _Inout_ DEVMODEW* lpDevMode);
    #ifdef UNICODE
    #define EnumDisplaySettings  EnumDisplaySettingsW
    #else
    #define EnumDisplaySettings  EnumDisplaySettingsA
    #endif // !UNICODE
     
    #if(WINVER >= 0x0500)
     
    WINUSERAPI
    BOOL
    WINAPI
    EnumDisplaySettingsExA(
        _In_opt_ LPCSTR lpszDeviceName,
        _In_ DWORD iModeNum,
        _Inout_ DEVMODEA* lpDevMode,
        _In_ DWORD dwFlags);
    WINUSERAPI
    BOOL
    WINAPI
    EnumDisplaySettingsExW(
        _In_opt_ LPCWSTR lpszDeviceName,
        _In_ DWORD iModeNum,
        _Inout_ DEVMODEW* lpDevMode,
        _In_ DWORD dwFlags);
    #ifdef UNICODE
    #define EnumDisplaySettingsEx  EnumDisplaySettingsExW
    #else
    #define EnumDisplaySettingsEx  EnumDisplaySettingsExA
    #endif // !UNICODE
     
    /* Flags for EnumDisplaySettingsEx */
    #define EDS_RAWMODE                   0x00000002
    #define EDS_ROTATEDMODE               0x00000004
     
    WINUSERAPI
    BOOL
    WINAPI
    EnumDisplayDevicesA(
        _In_opt_ LPCSTR lpDevice,
        _In_ DWORD iDevNum,
        _Inout_ PDISPLAY_DEVICEA lpDisplayDevice,
        _In_ DWORD dwFlags);
    WINUSERAPI
    BOOL
    WINAPI
    EnumDisplayDevicesW(
        _In_opt_ LPCWSTR lpDevice,
        _In_ DWORD iDevNum,
        _Inout_ PDISPLAY_DEVICEW lpDisplayDevice,
        _In_ DWORD dwFlags);
    #ifdef UNICODE
    #define EnumDisplayDevices  EnumDisplayDevicesW
    #else
    #define EnumDisplayDevices  EnumDisplayDevicesA
    #endif // !UNICODE
     
    /* Flags for EnumDisplayDevices */
    #define EDD_GET_DEVICE_INTERFACE_NAME 0x00000001
     
    #endif /* WINVER >= 0x0500 */
     
    #if(WINVER >= 0x0601)
     
    WINUSERAPI
    LONG
    WINAPI
    GetDisplayConfigBufferSizes(
        _In_ UINT32 flags,
        _Out_ UINT32* numPathArrayElements,
        _Out_ UINT32* numModeInfoArrayElements);
     
    WINUSERAPI
    LONG
    WINAPI
    SetDisplayConfig(
        _In_ UINT32 numPathArrayElements,
        _In_reads_opt_(numPathArrayElements) DISPLAYCONFIG_PATH_INFO* pathArray,
        _In_ UINT32 numModeInfoArrayElements,
        _In_reads_opt_(numModeInfoArrayElements) DISPLAYCONFIG_MODE_INFO* modeInfoArray,
        _In_ UINT32 flags);
     
    WINUSERAPI
    _Success_(return == ERROR_SUCCESS) LONG
    WINAPI
    QueryDisplayConfig(
        _In_ UINT32 flags,
        _Inout_ UINT32* numPathArrayElements,
        _Out_writes_to_(*numPathArrayElements, *numPathArrayElements) DISPLAYCONFIG_PATH_INFO* pathArray,
        _Inout_ UINT32* numModeInfoArrayElements,
        _Out_writes_to_(*numModeInfoArrayElements, *numModeInfoArrayElements) DISPLAYCONFIG_MODE_INFO* modeInfoArray,
        _When_(!(flags & QDC_DATABASE_CURRENT), _Pre_null_)
        _When_(flags & QDC_DATABASE_CURRENT, _Out_)
            DISPLAYCONFIG_TOPOLOGY_ID* currentTopologyId);
     
    WINUSERAPI
    LONG
    WINAPI
    DisplayConfigGetDeviceInfo(
        _Inout_ DISPLAYCONFIG_DEVICE_INFO_HEADER* requestPacket);
     
    WINUSERAPI
    LONG
    WINAPI
    DisplayConfigSetDeviceInfo(
        _In_ DISPLAYCONFIG_DEVICE_INFO_HEADER* setPacket);
     
    #endif /* WINVER >= 0x0601 */
     
    #endif /* NOGDI */
    #endif /* _WINGDI_ */
     
     
    WINUSERAPI
    _Success_(return != FALSE)
    BOOL
    WINAPI
    SystemParametersInfoA(
        _In_ UINT uiAction,
        _In_ UINT uiParam,
        _Pre_maybenull_ _Post_valid_ PVOID pvParam,
        _In_ UINT fWinIni);
    WINUSERAPI
    _Success_(return != FALSE)
    BOOL
    WINAPI
    SystemParametersInfoW(
        _In_ UINT uiAction,
        _In_ UINT uiParam,
        _Pre_maybenull_ _Post_valid_ PVOID pvParam,
        _In_ UINT fWinIni);
    #ifdef UNICODE
    #define SystemParametersInfo  SystemParametersInfoW
    #else
    #define SystemParametersInfo  SystemParametersInfoA
    #endif // !UNICODE
     
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    #endif  /* !NOSYSPARAMSINFO  */
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    /*
     * Accessibility support
     */
    typedef struct tagFILTERKEYS
    {
        UINT  cbSize;
        DWORD dwFlags;
        DWORD iWaitMSec;            // Acceptance Delay
        DWORD iDelayMSec;           // Delay Until Repeat
        DWORD iRepeatMSec;          // Repeat Rate
        DWORD iBounceMSec;          // Debounce Time
    } FILTERKEYS, *LPFILTERKEYS;
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    /*
     * FILTERKEYS dwFlags field
     */
    #define FKF_FILTERKEYSON    0x00000001
    #define FKF_AVAILABLE       0x00000002
    #define FKF_HOTKEYACTIVE    0x00000004
    #define FKF_CONFIRMHOTKEY   0x00000008
    #define FKF_HOTKEYSOUND     0x00000010
    #define FKF_INDICATOR       0x00000020
    #define FKF_CLICKON         0x00000040
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    typedef struct tagSTICKYKEYS
    {
        UINT  cbSize;
        DWORD dwFlags;
    } STICKYKEYS, *LPSTICKYKEYS;
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    /*
     * STICKYKEYS dwFlags field
     */
    #define SKF_STICKYKEYSON    0x00000001
    #define SKF_AVAILABLE       0x00000002
    #define SKF_HOTKEYACTIVE    0x00000004
    #define SKF_CONFIRMHOTKEY   0x00000008
    #define SKF_HOTKEYSOUND     0x00000010
    #define SKF_INDICATOR       0x00000020
    #define SKF_AUDIBLEFEEDBACK 0x00000040
    #define SKF_TRISTATE        0x00000080
    #define SKF_TWOKEYSOFF      0x00000100
    #if(_WIN32_WINNT >= 0x0500)
    #define SKF_LALTLATCHED       0x10000000
    #define SKF_LCTLLATCHED       0x04000000
    #define SKF_LSHIFTLATCHED     0x01000000
    #define SKF_RALTLATCHED       0x20000000
    #define SKF_RCTLLATCHED       0x08000000
    #define SKF_RSHIFTLATCHED     0x02000000
    #define SKF_LWINLATCHED       0x40000000
    #define SKF_RWINLATCHED       0x80000000
    #define SKF_LALTLOCKED        0x00100000
    #define SKF_LCTLLOCKED        0x00040000
    #define SKF_LSHIFTLOCKED      0x00010000
    #define SKF_RALTLOCKED        0x00200000
    #define SKF_RCTLLOCKED        0x00080000
    #define SKF_RSHIFTLOCKED      0x00020000
    #define SKF_LWINLOCKED        0x00400000
    #define SKF_RWINLOCKED        0x00800000
    #endif /* _WIN32_WINNT >= 0x0500 */
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    typedef struct tagMOUSEKEYS
    {
        UINT cbSize;
        DWORD dwFlags;
        DWORD iMaxSpeed;
        DWORD iTimeToMaxSpeed;
        DWORD iCtrlSpeed;
        DWORD dwReserved1;
        DWORD dwReserved2;
    } MOUSEKEYS, *LPMOUSEKEYS;
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    /*
     * MOUSEKEYS dwFlags field
     */
    #define MKF_MOUSEKEYSON     0x00000001
    #define MKF_AVAILABLE       0x00000002
    #define MKF_HOTKEYACTIVE    0x00000004
    #define MKF_CONFIRMHOTKEY   0x00000008
    #define MKF_HOTKEYSOUND     0x00000010
    #define MKF_INDICATOR       0x00000020
    #define MKF_MODIFIERS       0x00000040
    #define MKF_REPLACENUMBERS  0x00000080
    #if(_WIN32_WINNT >= 0x0500)
    #define MKF_LEFTBUTTONSEL   0x10000000
    #define MKF_RIGHTBUTTONSEL  0x20000000
    #define MKF_LEFTBUTTONDOWN  0x01000000
    #define MKF_RIGHTBUTTONDOWN 0x02000000
    #define MKF_MOUSEMODE       0x80000000
    #endif /* _WIN32_WINNT >= 0x0500 */
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    typedef struct tagACCESSTIMEOUT
    {
        UINT  cbSize;
        DWORD dwFlags;
        DWORD iTimeOutMSec;
    } ACCESSTIMEOUT, *LPACCESSTIMEOUT;
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    /*
     * ACCESSTIMEOUT dwFlags field
     */
    #define ATF_TIMEOUTON       0x00000001
    #define ATF_ONOFFFEEDBACK   0x00000002
     
    /* values for SOUNDSENTRY iFSGrafEffect field */
    #define SSGF_NONE       0
    #define SSGF_DISPLAY    3
     
    /* values for SOUNDSENTRY iFSTextEffect field */
    #define SSTF_NONE       0
    #define SSTF_CHARS      1
    #define SSTF_BORDER     2
    #define SSTF_DISPLAY    3
     
    /* values for SOUNDSENTRY iWindowsEffect field */
    #define SSWF_NONE     0
    #define SSWF_TITLE    1
    #define SSWF_WINDOW   2
    #define SSWF_DISPLAY  3
    #define SSWF_CUSTOM   4
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    typedef struct tagSOUNDSENTRYA
    {
        UINT cbSize;
        DWORD dwFlags;
        DWORD iFSTextEffect;
        DWORD iFSTextEffectMSec;
        DWORD iFSTextEffectColorBits;
        DWORD iFSGrafEffect;
        DWORD iFSGrafEffectMSec;
        DWORD iFSGrafEffectColor;
        DWORD iWindowsEffect;
        DWORD iWindowsEffectMSec;
        LPSTR   lpszWindowsEffectDLL;
        DWORD iWindowsEffectOrdinal;
    } SOUNDSENTRYA, *LPSOUNDSENTRYA;
    typedef struct tagSOUNDSENTRYW
    {
        UINT cbSize;
        DWORD dwFlags;
        DWORD iFSTextEffect;
        DWORD iFSTextEffectMSec;
        DWORD iFSTextEffectColorBits;
        DWORD iFSGrafEffect;
        DWORD iFSGrafEffectMSec;
        DWORD iFSGrafEffectColor;
        DWORD iWindowsEffect;
        DWORD iWindowsEffectMSec;
        LPWSTR  lpszWindowsEffectDLL;
        DWORD iWindowsEffectOrdinal;
    } SOUNDSENTRYW, *LPSOUNDSENTRYW;
    #ifdef UNICODE
    typedef SOUNDSENTRYW SOUNDSENTRY;
    typedef LPSOUNDSENTRYW LPSOUNDSENTRY;
    #else
    typedef SOUNDSENTRYA SOUNDSENTRY;
    typedef LPSOUNDSENTRYA LPSOUNDSENTRY;
    #endif // UNICODE
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    /*
     * SOUNDSENTRY dwFlags field
     */
    #define SSF_SOUNDSENTRYON   0x00000001
    #define SSF_AVAILABLE       0x00000002
    #define SSF_INDICATOR       0x00000004
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    #if(_WIN32_WINNT >= 0x0600)
    WINUSERAPI
    BOOL
    WINAPI
    SoundSentry(VOID);
    #endif /* _WIN32_WINNT >= 0x0600 */
     
    typedef struct tagTOGGLEKEYS
    {
        UINT cbSize;
        DWORD dwFlags;
    } TOGGLEKEYS, *LPTOGGLEKEYS;
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    /*
     * TOGGLEKEYS dwFlags field
     */
    #define TKF_TOGGLEKEYSON    0x00000001
    #define TKF_AVAILABLE       0x00000002
    #define TKF_HOTKEYACTIVE    0x00000004
    #define TKF_CONFIRMHOTKEY   0x00000008
    #define TKF_HOTKEYSOUND     0x00000010
    #define TKF_INDICATOR       0x00000020
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    #if(_WIN32_WINNT >= 0x0600)
    typedef struct tagAUDIODESCRIPTION {
        UINT cbSize;   // sizeof(AudioDescriptionType)
        BOOL Enabled;  // On/Off
        LCID Locale;   // locale ID for language
    } AUDIODESCRIPTION, *LPAUDIODESCRIPTION;
    #endif /* _WIN32_WINNT >= 0x0600 */
     
     
    /*
     * Set debug level
     */
     
    WINUSERAPI
    VOID
    WINAPI
    SetDebugErrorLevel(
        _In_ DWORD dwLevel);
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    /*
     * SetLastErrorEx() types.
     */
     
    #define SLE_ERROR       0x00000001
    #define SLE_MINORERROR  0x00000002
    #define SLE_WARNING     0x00000003
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    WINUSERAPI
    VOID
    WINAPI
    SetLastErrorEx(
        _In_ DWORD dwErrCode,
        _In_ DWORD dwType);
     
    WINUSERAPI
    int
    WINAPI
    InternalGetWindowText(
        _In_ HWND hWnd,
        _Out_writes_to_(cchMaxCount, return + 1) LPWSTR pString,
        _In_ int cchMaxCount);
     
     
    #if defined(WINNT)
    WINUSERAPI
    BOOL
    WINAPI
    EndTask(
        _In_ HWND hWnd,
        _In_ BOOL fShutDown,
        _In_ BOOL fForce);
    #endif
     
    WINUSERAPI
    BOOL
    WINAPI
    CancelShutdown(
        VOID);
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
     
    #if(WINVER >= 0x0500)
     
    /*
     * Multimonitor API.
     */
     
    #define MONITOR_DEFAULTTONULL       0x00000000
    #define MONITOR_DEFAULTTOPRIMARY    0x00000001
    #define MONITOR_DEFAULTTONEAREST    0x00000002
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    WINUSERAPI
    HMONITOR
    WINAPI
    MonitorFromPoint(
        _In_ POINT pt,
        _In_ DWORD dwFlags);
     
    WINUSERAPI
    HMONITOR
    WINAPI
    MonitorFromRect(
        _In_ LPCRECT lprc,
        _In_ DWORD dwFlags);
     
    WINUSERAPI
    HMONITOR
    WINAPI
    MonitorFromWindow(
        _In_ HWND hwnd,
        _In_ DWORD dwFlags);
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    #define MONITORINFOF_PRIMARY        0x00000001
     
    #ifndef CCHDEVICENAME
    #define CCHDEVICENAME 32
    #endif
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    typedef struct tagMONITORINFO
    {
        DWORD   cbSize;
        RECT    rcMonitor;
        RECT    rcWork;
        DWORD   dwFlags;
    } MONITORINFO, *LPMONITORINFO;
     
    #ifdef __cplusplus
    typedef struct tagMONITORINFOEXA : public tagMONITORINFO
    {
        CHAR        szDevice[CCHDEVICENAME];
    } MONITORINFOEXA, *LPMONITORINFOEXA;
    typedef struct tagMONITORINFOEXW : public tagMONITORINFO
    {
        WCHAR       szDevice[CCHDEVICENAME];
    } MONITORINFOEXW, *LPMONITORINFOEXW;
    #ifdef UNICODE
    typedef MONITORINFOEXW MONITORINFOEX;
    typedef LPMONITORINFOEXW LPMONITORINFOEX;
    #else
    typedef MONITORINFOEXA MONITORINFOEX;
    typedef LPMONITORINFOEXA LPMONITORINFOEX;
    #endif // UNICODE
    #else // ndef __cplusplus
    typedef struct tagMONITORINFOEXA
    {
        MONITORINFO;
        CHAR        szDevice[CCHDEVICENAME];
    } MONITORINFOEXA, *LPMONITORINFOEXA;
    typedef struct tagMONITORINFOEXW
    {
        MONITORINFO;
        WCHAR       szDevice[CCHDEVICENAME];
    } MONITORINFOEXW, *LPMONITORINFOEXW;
    #ifdef UNICODE
    typedef MONITORINFOEXW MONITORINFOEX;
    typedef LPMONITORINFOEXW LPMONITORINFOEX;
    #else
    typedef MONITORINFOEXA MONITORINFOEX;
    typedef LPMONITORINFOEXA LPMONITORINFOEX;
    #endif // UNICODE
    #endif
     
    WINUSERAPI
    BOOL
    WINAPI
    GetMonitorInfoA(
        _In_ HMONITOR hMonitor,
        _Inout_ LPMONITORINFO lpmi);
    WINUSERAPI
    BOOL
    WINAPI
    GetMonitorInfoW(
        _In_ HMONITOR hMonitor,
        _Inout_ LPMONITORINFO lpmi);
    #ifdef UNICODE
    #define GetMonitorInfo  GetMonitorInfoW
    #else
    #define GetMonitorInfo  GetMonitorInfoA
    #endif // !UNICODE
     
    typedef BOOL (CALLBACK* MONITORENUMPROC)(HMONITOR, HDC, LPRECT, LPARAM);
     
    WINUSERAPI
    BOOL
    WINAPI
    EnumDisplayMonitors(
        _In_opt_ HDC hdc,
        _In_opt_ LPCRECT lprcClip,
        _In_ MONITORENUMPROC lpfnEnum,
        _In_ LPARAM dwData);
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    #ifndef NOWINABLE
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    /*
     * WinEvents - Active Accessibility hooks
     */
     
    WINUSERAPI
    VOID
    WINAPI
    NotifyWinEvent(
        _In_ DWORD event,
        _In_ HWND  hwnd,
        _In_ LONG  idObject,
        _In_ LONG  idChild);
     
    typedef VOID (CALLBACK* WINEVENTPROC)(
        HWINEVENTHOOK hWinEventHook,
        DWORD         event,
        HWND          hwnd,
        LONG          idObject,
        LONG          idChild,
        DWORD         idEventThread,
        DWORD         dwmsEventTime);
     
    WINUSERAPI
    HWINEVENTHOOK
    WINAPI
    SetWinEventHook(
        _In_ DWORD eventMin,
        _In_ DWORD eventMax,
        _In_opt_ HMODULE hmodWinEventProc,
        _In_ WINEVENTPROC pfnWinEventProc,
        _In_ DWORD idProcess,
        _In_ DWORD idThread,
        _In_ DWORD dwFlags);
     
    #if(_WIN32_WINNT >= 0x0501)
    WINUSERAPI
    BOOL
    WINAPI
    IsWinEventHookInstalled(
        _In_ DWORD event);
    #endif /* _WIN32_WINNT >= 0x0501 */
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    /*
     * dwFlags for SetWinEventHook
     */
    #define WINEVENT_OUTOFCONTEXT   0x0000  // Events are ASYNC
    #define WINEVENT_SKIPOWNTHREAD  0x0001  // Don't call back for events on installer's thread
    #define WINEVENT_SKIPOWNPROCESS 0x0002  // Don't call back for events on installer's process
    #define WINEVENT_INCONTEXT      0x0004  // Events are SYNC, this causes your dll to be injected into every process
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    WINUSERAPI
    BOOL
    WINAPI
    UnhookWinEvent(
        _In_ HWINEVENTHOOK hWinEventHook);
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    /*
     * idObject values for WinEventProc and NotifyWinEvent
     */
     
    /*
     * hwnd + idObject can be used with OLEACC.DLL's OleGetObjectFromWindow()
     * to get an interface pointer to the container.  indexChild is the item
     * within the container in question.  Setup a VARIANT with vt VT_I4 and
     * lVal the indexChild and pass that in to all methods.  Then you
     * are raring to go.
     */
     
     
    /*
     * Common object IDs (cookies, only for sending WM_GETOBJECT to get at the
     * thing in question).  Positive IDs are reserved for apps (app specific),
     * negative IDs are system things and are global, 0 means "just little old
     * me".
     */
    #define     CHILDID_SELF        0
    #define     INDEXID_OBJECT      0
    #define     INDEXID_CONTAINER   0
     
    /*
     * Reserved IDs for system objects
     */
    #define     OBJID_WINDOW        ((LONG)0x00000000)
    #define     OBJID_SYSMENU       ((LONG)0xFFFFFFFF)
    #define     OBJID_TITLEBAR      ((LONG)0xFFFFFFFE)
    #define     OBJID_MENU          ((LONG)0xFFFFFFFD)
    #define     OBJID_CLIENT        ((LONG)0xFFFFFFFC)
    #define     OBJID_VSCROLL       ((LONG)0xFFFFFFFB)
    #define     OBJID_HSCROLL       ((LONG)0xFFFFFFFA)
    #define     OBJID_SIZEGRIP      ((LONG)0xFFFFFFF9)
    #define     OBJID_CARET         ((LONG)0xFFFFFFF8)
    #define     OBJID_CURSOR        ((LONG)0xFFFFFFF7)
    #define     OBJID_ALERT         ((LONG)0xFFFFFFF6)
    #define     OBJID_SOUND         ((LONG)0xFFFFFFF5)
    #define     OBJID_QUERYCLASSNAMEIDX ((LONG)0xFFFFFFF4)
    #define     OBJID_NATIVEOM      ((LONG)0xFFFFFFF0)
     
    /*
     * EVENT DEFINITION
     */
    #define EVENT_MIN           0x00000001
    #define EVENT_MAX           0x7FFFFFFF
     
    /*
     *  EVENT_SYSTEM_SOUND
     *  Sent when a sound is played.  Currently nothing is generating this, we
     *  this event when a system sound (for menus, etc) is played.  Apps
     *  generate this, if accessible, when a private sound is played.  For
     *  example, if Mail plays a "New Mail" sound.
     *
     *  System Sounds:
     *  (Generated by PlaySoundEvent in USER itself)
     *      hwnd            is NULL
     *      idObject        is OBJID_SOUND
     *      idChild         is sound child ID if one
     *  App Sounds:
     *  (PlaySoundEvent won't generate notification; up to app)
     *      hwnd + idObject gets interface pointer to Sound object
     *      idChild identifies the sound in question
     *  are going to be cleaning up the SOUNDSENTRY feature in the control panel
     *  and will use this at that time.  Applications implementing WinEvents
     *  are perfectly welcome to use it.  Clients of IAccessible* will simply
     *  turn around and get back a non-visual object that describes the sound.
     */
    #define EVENT_SYSTEM_SOUND              0x0001
     
    /*
     * EVENT_SYSTEM_ALERT
     * System Alerts:
     * (Generated by MessageBox() calls for example)
     *      hwnd            is hwndMessageBox
     *      idObject        is OBJID_ALERT
     * App Alerts:
     * (Generated whenever)
     *      hwnd+idObject gets interface pointer to Alert
     */
    #define EVENT_SYSTEM_ALERT              0x0002
     
    /*
     * EVENT_SYSTEM_FOREGROUND
     * Sent when the foreground (active) window changes, even if it is changing
     * to another window in the same thread as the previous one.
     *      hwnd            is hwndNewForeground
     *      idObject        is OBJID_WINDOW
     *      idChild    is INDEXID_OBJECT
     */
    #define EVENT_SYSTEM_FOREGROUND         0x0003
     
    /*
     * Menu
     *      hwnd            is window (top level window or popup menu window)
     *      idObject        is ID of control (OBJID_MENU, OBJID_SYSMENU, OBJID_SELF for popup)
     *      idChild         is CHILDID_SELF
     *
     * EVENT_SYSTEM_MENUSTART
     * EVENT_SYSTEM_MENUEND
     * For MENUSTART, hwnd+idObject+idChild refers to the control with the menu bar,
     *  or the control bringing up the context menu.
     *
     * Sent when entering into and leaving from menu mode (system, app bar, and
     * track popups).
     */
    #define EVENT_SYSTEM_MENUSTART          0x0004
    #define EVENT_SYSTEM_MENUEND            0x0005
     
    /*
     * EVENT_SYSTEM_MENUPOPUPSTART
     * EVENT_SYSTEM_MENUPOPUPEND
     * Sent when a menu popup comes up and just before it is taken down.  Note
     * that for a call to TrackPopupMenu(), a client will see EVENT_SYSTEM_MENUSTART
     * followed almost immediately by EVENT_SYSTEM_MENUPOPUPSTART for the popup
     * being shown.
     *
     * For MENUPOPUP, hwnd+idObject+idChild refers to the NEW popup coming up, not the
     * parent item which is hierarchical.  You can get the parent menu/popup by
     * asking for the accParent object.
     */
    #define EVENT_SYSTEM_MENUPOPUPSTART     0x0006
    #define EVENT_SYSTEM_MENUPOPUPEND       0x0007
     
     
    /*
     * EVENT_SYSTEM_CAPTURESTART
     * EVENT_SYSTEM_CAPTUREEND
     * Sent when a window takes the capture and releases the capture.
     */
    #define EVENT_SYSTEM_CAPTURESTART       0x0008
    #define EVENT_SYSTEM_CAPTUREEND         0x0009
     
    /*
     * Move Size
     * EVENT_SYSTEM_MOVESIZESTART
     * EVENT_SYSTEM_MOVESIZEEND
     * Sent when a window enters and leaves move-size dragging mode.
     */
    #define EVENT_SYSTEM_MOVESIZESTART      0x000A
    #define EVENT_SYSTEM_MOVESIZEEND        0x000B
     
    /*
     * Context Help
     * EVENT_SYSTEM_CONTEXTHELPSTART
     * EVENT_SYSTEM_CONTEXTHELPEND
     * Sent when a window enters and leaves context sensitive help mode.
     */
    #define EVENT_SYSTEM_CONTEXTHELPSTART   0x000C
    #define EVENT_SYSTEM_CONTEXTHELPEND     0x000D
     
    /*
     * Drag & Drop
     * EVENT_SYSTEM_DRAGDROPSTART
     * EVENT_SYSTEM_DRAGDROPEND
     * Send the START notification just before going into drag&drop loop.  Send
     * the END notification just after canceling out.
     * Note that it is up to apps and OLE to generate this, since the system
     * doesn't know.  Like EVENT_SYSTEM_SOUND, it will be a while before this
     * is prevalent.
     */
    #define EVENT_SYSTEM_DRAGDROPSTART      0x000E
    #define EVENT_SYSTEM_DRAGDROPEND        0x000F
     
    /*
     * Dialog
     * Send the START notification right after the dialog is completely
     *  initialized and visible.  Send the END right before the dialog
     *  is hidden and goes away.
     * EVENT_SYSTEM_DIALOGSTART
     * EVENT_SYSTEM_DIALOGEND
     */
    #define EVENT_SYSTEM_DIALOGSTART        0x0010
    #define EVENT_SYSTEM_DIALOGEND          0x0011
     
    /*
     * EVENT_SYSTEM_SCROLLING
     * EVENT_SYSTEM_SCROLLINGSTART
     * EVENT_SYSTEM_SCROLLINGEND
     * Sent when beginning and ending the tracking of a scrollbar in a window,
     * and also for scrollbar controls.
     */
    #define EVENT_SYSTEM_SCROLLINGSTART     0x0012
    #define EVENT_SYSTEM_SCROLLINGEND       0x0013
     
    /*
     * Alt-Tab Window
     * Send the START notification right after the switch window is initialized
     * and visible.  Send the END right before it is hidden and goes away.
     * EVENT_SYSTEM_SWITCHSTART
     * EVENT_SYSTEM_SWITCHEND
     */
    #define EVENT_SYSTEM_SWITCHSTART        0x0014
    #define EVENT_SYSTEM_SWITCHEND          0x0015
     
    /*
     * EVENT_SYSTEM_MINIMIZESTART
     * EVENT_SYSTEM_MINIMIZEEND
     * Sent when a window minimizes and just before it restores.
     */
    #define EVENT_SYSTEM_MINIMIZESTART      0x0016
    #define EVENT_SYSTEM_MINIMIZEEND        0x0017
     
     
    #if(_WIN32_WINNT >= 0x0600)
    #define EVENT_SYSTEM_DESKTOPSWITCH      0x0020
    #endif /* _WIN32_WINNT >= 0x0600 */
     
     
    #if(_WIN32_WINNT >= 0x0602)
    // AppGrabbed: HWND = hwnd of app thumbnail, objectID = 0, childID = 0
    #define EVENT_SYSTEM_SWITCHER_APPGRABBED    0x0024
    // OverTarget: HWND = hwnd of app thumbnail, objectID =
    //            1 for center
    //            2 for near snapped
    //            3 for far snapped
    //            4 for prune
    //            childID = 0
    #define EVENT_SYSTEM_SWITCHER_APPOVERTARGET 0x0025
    // Dropped: HWND = hwnd of app thumbnail, objectID = <same as above>, childID = 0
    #define EVENT_SYSTEM_SWITCHER_APPDROPPED    0x0026
    // Cancelled: HWND = hwnd of app thumbnail, objectID = 0, childID = 0
    #define EVENT_SYSTEM_SWITCHER_CANCELLED     0x0027
    #endif /* _WIN32_WINNT >= 0x0602 */
     
     
    #if(_WIN32_WINNT >= 0x0602)
     
    /*
     * Sent when an IME's soft key is pressed and should be echoed,
     * but is not passed through the keyboard hook.
     * Must not be sent when a key is sent through the keyboard hook.
     *     HWND             is the hwnd of the UI containing the soft key
     *     idChild          is the Unicode value of the character entered
     *     idObject         is a bitfield
     *         0x00000001: set if a 32-bit Unicode surrogate pair is used
     */
    #define EVENT_SYSTEM_IME_KEY_NOTIFICATION  0x0029
     
    #endif /* _WIN32_WINNT >= 0x0602 */
     
     
    #if(_WIN32_WINNT >= 0x0601)
    #define EVENT_SYSTEM_END        0x00FF
     
    #define EVENT_OEM_DEFINED_START     0x0101
    #define EVENT_OEM_DEFINED_END       0x01FF
     
    #define EVENT_UIA_EVENTID_START         0x4E00
    #define EVENT_UIA_EVENTID_END           0x4EFF
     
    #define EVENT_UIA_PROPID_START          0x7500
    #define EVENT_UIA_PROPID_END            0x75FF
    #endif /* _WIN32_WINNT >= 0x0601 */
     
    #if(_WIN32_WINNT >= 0x0501)
    #define EVENT_CONSOLE_CARET             0x4001
    #define EVENT_CONSOLE_UPDATE_REGION     0x4002
    #define EVENT_CONSOLE_UPDATE_SIMPLE     0x4003
    #define EVENT_CONSOLE_UPDATE_SCROLL     0x4004
    #define EVENT_CONSOLE_LAYOUT            0x4005
    #define EVENT_CONSOLE_START_APPLICATION 0x4006
    #define EVENT_CONSOLE_END_APPLICATION   0x4007
     
    /*
     * Flags for EVENT_CONSOLE_START/END_APPLICATION.
     */
    #if defined(_WIN64)
    #define CONSOLE_APPLICATION_16BIT       0x0000
    #else
    #define CONSOLE_APPLICATION_16BIT       0x0001
    #endif
     
    /*
     * Flags for EVENT_CONSOLE_CARET
     */
    #define CONSOLE_CARET_SELECTION         0x0001
    #define CONSOLE_CARET_VISIBLE           0x0002
    #endif /* _WIN32_WINNT >= 0x0501 */
     
    #if(_WIN32_WINNT >= 0x0601)
    #define EVENT_CONSOLE_END       0x40FF
    #endif /* _WIN32_WINNT >= 0x0601 */
     
    /*
     * Object events
     *
     * The system AND apps generate these.  The system generates these for
     * real windows.  Apps generate these for objects within their window which
     * act like a separate control, e.g. an item in a list view.
     *
     * When the system generate them, dwParam2 is always WMOBJID_SELF.  When
     * apps generate them, apps put the has-meaning-to-the-app-only ID value
     * in dwParam2.
     * For all events, if you want detailed accessibility information, callers
     * should
     *      * Call AccessibleObjectFromWindow() with the hwnd, idObject parameters
     *          of the event, and IID_IAccessible as the REFIID, to get back an
     *          IAccessible* to talk to
     *      * Initialize and fill in a VARIANT as VT_I4 with lVal the idChild
     *          parameter of the event.
     *      * If idChild isn't zero, call get_accChild() in the container to see
     *          if the child is an object in its own right.  If so, you will get
     *          back an IDispatch* object for the child.  You should release the
     *          parent, and call QueryInterface() on the child object to get its
     *          IAccessible*.  Then you talk directly to the child.  Otherwise,
     *          if get_accChild() returns you nothing, you should continue to
     *          use the child VARIANT.  You will ask the container for the properties
     *          of the child identified by the VARIANT.  In other words, the
     *          child in this case is accessible but not a full-blown object.
     *          Like a button on a titlebar which is 'small' and has no children.
     */
     
    /*
     * For all EVENT_OBJECT events,
     *      hwnd is the dude to Send the WM_GETOBJECT message to (unless NULL,
     *          see above for system things)
     *      idObject is the ID of the object that can resolve any queries a
     *          client might have.  It's a way to deal with windowless controls,
     *          controls that are just drawn on the screen in some larger parent
     *          window (like SDM), or standard frame elements of a window.
     *      idChild is the piece inside of the object that is affected.  This
     *          allows clients to access things that are too small to have full
     *          blown objects in their own right.  Like the thumb of a scrollbar.
     *          The hwnd/idObject pair gets you to the container, the dude you
     *          probably want to talk to most of the time anyway.  The idChild
     *          can then be passed into the acc properties to get the name/value
     *          of it as needed.
     *
     * Example #1:
     *      System propagating a listbox selection change
     *      EVENT_OBJECT_SELECTION
     *          hwnd == listbox hwnd
     *          idObject == OBJID_WINDOW
     *          idChild == new selected item, or CHILDID_SELF if
     *              nothing now selected within container.
     *      Word '97 propagating a listbox selection change
     *          hwnd == SDM window
     *          idObject == SDM ID to get at listbox 'control'
     *          idChild == new selected item, or CHILDID_SELF if
     *              nothing
     *
     * Example #2:
     *      System propagating a menu item selection on the menu bar
     *      EVENT_OBJECT_SELECTION
     *          hwnd == top level window
     *          idObject == OBJID_MENU
     *          idChild == ID of child menu bar item selected
     *
     * Example #3:
     *      System propagating a dropdown coming off of said menu bar item
     *      EVENT_OBJECT_CREATE
     *          hwnd == popup item
     *          idObject == OBJID_WINDOW
     *          idChild == CHILDID_SELF
     *
     * Example #4:
     *
     * For EVENT_OBJECT_REORDER, the object referred to by hwnd/idObject is the
     * PARENT container in which the zorder is occurring.  This is because if
     * one child is zordering, all of them are changing their relative zorder.
     */
    #define EVENT_OBJECT_CREATE                 0x8000  // hwnd + ID + idChild is created item
    #define EVENT_OBJECT_DESTROY                0x8001  // hwnd + ID + idChild is destroyed item
    #define EVENT_OBJECT_SHOW                   0x8002  // hwnd + ID + idChild is shown item
    #define EVENT_OBJECT_HIDE                   0x8003  // hwnd + ID + idChild is hidden item
    #define EVENT_OBJECT_REORDER                0x8004  // hwnd + ID + idChild is parent of zordering children
    /*
     * NOTE:
     * Minimize the number of notifications!
     *
     * When you are hiding a parent object, obviously all child objects are no
     * longer visible on screen.  They still have the same "visible" status,
     * but are not truly visible.  Hence do not send HIDE notifications for the
     * children also.  One implies all.  The same goes for SHOW.
     */
     
     
    #define EVENT_OBJECT_FOCUS                  0x8005  // hwnd + ID + idChild is focused item
    #define EVENT_OBJECT_SELECTION              0x8006  // hwnd + ID + idChild is selected item (if only one), or idChild is OBJID_WINDOW if complex
    #define EVENT_OBJECT_SELECTIONADD           0x8007  // hwnd + ID + idChild is item added
    #define EVENT_OBJECT_SELECTIONREMOVE        0x8008  // hwnd + ID + idChild is item removed
    #define EVENT_OBJECT_SELECTIONWITHIN        0x8009  // hwnd + ID + idChild is parent of changed selected items
     
    /*
     * NOTES:
     * There is only one "focused" child item in a parent.  This is the place
     * keystrokes are going at a given moment.  Hence only send a notification
     * about where the NEW focus is going.  A NEW item getting the focus already
     * implies that the OLD item is losing it.
     *
     * SELECTION however can be multiple.  Hence the different SELECTION
     * notifications.  Here's when to use each:
     *
     * (1) Send a SELECTION notification in the simple single selection
     *     case (like the focus) when the item with the selection is
     *     merely moving to a different item within a container.  hwnd + ID
     *     is the container control, idChildItem is the new child with the
     *     selection.
     *
     * (2) Send a SELECTIONADD notification when a new item has simply been added
     *     to the selection within a container.  This is appropriate when the
     *     number of newly selected items is very small.  hwnd + ID is the
     *     container control, idChildItem is the new child added to the selection.
     *
     * (3) Send a SELECTIONREMOVE notification when a new item has simply been
     *     removed from the selection within a container.  This is appropriate
     *     when the number of newly selected items is very small, just like
     *     SELECTIONADD.  hwnd + ID is the container control, idChildItem is the
     *     new child removed from the selection.
     *
     * (4) Send a SELECTIONWITHIN notification when the selected items within a
     *     control have changed substantially.  Rather than propagate a large
     *     number of changes to reflect removal for some items, addition of
     *     others, just tell somebody who cares that a lot happened.  It will
     *     be faster an easier for somebody watching to just turn around and
     *     query the container control what the new bunch of selected items
     *     are.
     */
     
    #define EVENT_OBJECT_STATECHANGE            0x800A  // hwnd + ID + idChild is item w/ state change
    /*
     * Examples of when to send an EVENT_OBJECT_STATECHANGE include
     *      * It is being enabled/disabled (USER does for windows)
     *      * It is being pressed/released (USER does for buttons)
     *      * It is being checked/unchecked (USER does for radio/check buttons)
     */
    #define EVENT_OBJECT_LOCATIONCHANGE         0x800B  // hwnd + ID + idChild is moved/sized item
     
    /*
     * Note:
     * A LOCATIONCHANGE is not sent for every child object when the parent
     * changes shape/moves.  Send one notification for the topmost object
     * that is changing.  For example, if the user resizes a top level window,
     * USER will generate a LOCATIONCHANGE for it, but not for the menu bar,
     * title bar, scrollbars, etc.  that are also changing shape/moving.
     *
     * In other words, it only generates LOCATIONCHANGE notifications for
     * real windows that are moving/sizing.  It will not generate a LOCATIONCHANGE
     * for every non-floating child window when the parent moves (the children are
     * logically moving also on screen, but not relative to the parent).
     *
     * Now, if the app itself resizes child windows as a result of being
     * sized, USER will generate LOCATIONCHANGEs for those dudes also because
     * it doesn't know better.
     *
     * Note also that USER will generate LOCATIONCHANGE notifications for two
     * non-window sys objects:
     *      (1) System caret
     *      (2) Cursor
     */
     
    #define EVENT_OBJECT_NAMECHANGE             0x800C  // hwnd + ID + idChild is item w/ name change
    #define EVENT_OBJECT_DESCRIPTIONCHANGE      0x800D  // hwnd + ID + idChild is item w/ desc change
    #define EVENT_OBJECT_VALUECHANGE            0x800E  // hwnd + ID + idChild is item w/ value change
    #define EVENT_OBJECT_PARENTCHANGE           0x800F  // hwnd + ID + idChild is item w/ new parent
    #define EVENT_OBJECT_HELPCHANGE             0x8010  // hwnd + ID + idChild is item w/ help change
    #define EVENT_OBJECT_DEFACTIONCHANGE        0x8011  // hwnd + ID + idChild is item w/ def action change
    #define EVENT_OBJECT_ACCELERATORCHANGE      0x8012  // hwnd + ID + idChild is item w/ keybd accel change
     
    #if(_WIN32_WINNT >= 0x0600)
    #define EVENT_OBJECT_INVOKED                0x8013  // hwnd + ID + idChild is item invoked
    #define EVENT_OBJECT_TEXTSELECTIONCHANGED   0x8014  // hwnd + ID + idChild is item w? test selection change
     
    /*
     * EVENT_OBJECT_CONTENTSCROLLED
     * Sent when ending the scrolling of a window object.
     *
     * Unlike the similar event (EVENT_SYSTEM_SCROLLEND), this event will be
     * associated with the scrolling window itself. There is no difference
     * between horizontal or vertical scrolling.
     *
     * This event should be posted whenever scroll action is completed, including
     * when it is scrolled by scroll bars, mouse wheel, or keyboard navigations.
     *
     *   example:
     *          hwnd == window that is scrolling
     *          idObject == OBJID_CLIENT
     *          idChild == CHILDID_SELF
     */
    #define EVENT_OBJECT_CONTENTSCROLLED        0x8015
    #endif /* _WIN32_WINNT >= 0x0600 */
     
    #if(_WIN32_WINNT >= 0x0601)
    #define EVENT_SYSTEM_ARRANGMENTPREVIEW      0x8016
    #endif /* _WIN32_WINNT >= 0x0601 */
     
    #if(_WIN32_WINNT >= 0x0602)
     
    /*
     * EVENT_OBJECT_CLOAKED / UNCLOAKED
     * Sent when a window is cloaked or uncloaked.
     * A cloaked window still exists, but is invisible to
     * the user.
     */
    #define EVENT_OBJECT_CLOAKED                0x8017
    #define EVENT_OBJECT_UNCLOAKED              0x8018
     
    /*
     * EVENT_OBJECT_LIVEREGIONCHANGED
     * Sent when an object that is part of a live region
     * changes.  A live region is an area of an application
     * that changes frequently and/or asynchronously, so
     * that an assistive technology tool might want to pay
     * special attention to it.
     */
    #define EVENT_OBJECT_LIVEREGIONCHANGED      0x8019
     
    /*
     * EVENT_OBJECT_HOSTEDOBJECTSINVALIDATED
     * Sent when a window that is hosting other Accessible
     * objects changes the hosted objects.  A client may
     * wish to requery to see what the new hosted objects are,
     * especially if it has been monitoring events from this
     * window.  A hosted object is one with a different Accessibility
     * framework (MSAA or UI Automation) from its host.
     *
     * Changes in hosted objects with the *same* framework
     * as the parent should be handed with the usual structural
     * change events, such as EVENT_OBJECT_CREATED for MSAA.
     * see above.
     */
    #define EVENT_OBJECT_HOSTEDOBJECTSINVALIDATED 0x8020
     
    /*
     * Drag / Drop Events
     * These events are used in conjunction with the
     * UI Automation Drag/Drop patterns.
     *
     * For DRAGSTART, DRAGCANCEL, and DRAGCOMPLETE,
     * HWND+objectID+childID refers to the object being dragged.
     *
     * For DRAGENTER, DRAGLEAVE, and DRAGDROPPED,
     * HWND+objectID+childID refers to the target of the drop
     * that is being hovered over.
     */
     
    #define EVENT_OBJECT_DRAGSTART              0x8021
    #define EVENT_OBJECT_DRAGCANCEL             0x8022
    #define EVENT_OBJECT_DRAGCOMPLETE           0x8023
     
    #define EVENT_OBJECT_DRAGENTER              0x8024
    #define EVENT_OBJECT_DRAGLEAVE              0x8025
    #define EVENT_OBJECT_DRAGDROPPED            0x8026
     
    /*
     * EVENT_OBJECT_IME_SHOW/HIDE
     * Sent by an IME window when it has become visible or invisible.
     */
    #define EVENT_OBJECT_IME_SHOW               0x8027
    #define EVENT_OBJECT_IME_HIDE               0x8028
     
    /*
     * EVENT_OBJECT_IME_CHANGE
     * Sent by an IME window whenever it changes size or position.
     */
    #define EVENT_OBJECT_IME_CHANGE             0x8029
     
    #define EVENT_OBJECT_TEXTEDIT_CONVERSIONTARGETCHANGED 0x8030
     
    #endif /* _WIN32_WINNT >= 0x0602 */
     
    #if(_WIN32_WINNT >= 0x0601)
    #define EVENT_OBJECT_END                    0x80FF
     
    #define EVENT_AIA_START                     0xA000
    #define EVENT_AIA_END                       0xAFFF
    #endif /* _WIN32_WINNT >= 0x0601 */
     
     
    /*
     * Child IDs
     */
     
     
    /*
     * System Sounds (idChild of system SOUND notification)
     */
    #define SOUND_SYSTEM_STARTUP            1
    #define SOUND_SYSTEM_SHUTDOWN           2
    #define SOUND_SYSTEM_BEEP               3
    #define SOUND_SYSTEM_ERROR              4
    #define SOUND_SYSTEM_QUESTION           5
    #define SOUND_SYSTEM_WARNING            6
    #define SOUND_SYSTEM_INFORMATION        7
    #define SOUND_SYSTEM_MAXIMIZE           8
    #define SOUND_SYSTEM_MINIMIZE           9
    #define SOUND_SYSTEM_RESTOREUP          10
    #define SOUND_SYSTEM_RESTOREDOWN        11
    #define SOUND_SYSTEM_APPSTART           12
    #define SOUND_SYSTEM_FAULT              13
    #define SOUND_SYSTEM_APPEND             14
    #define SOUND_SYSTEM_MENUCOMMAND        15
    #define SOUND_SYSTEM_MENUPOPUP          16
    #define CSOUND_SYSTEM                   16
     
    /*
     * System Alerts (indexChild of system ALERT notification)
     */
    #define ALERT_SYSTEM_INFORMATIONAL      1       // MB_INFORMATION
    #define ALERT_SYSTEM_WARNING            2       // MB_WARNING
    #define ALERT_SYSTEM_ERROR              3       // MB_ERROR
    #define ALERT_SYSTEM_QUERY              4       // MB_QUESTION
    #define ALERT_SYSTEM_CRITICAL           5       // HardSysErrBox
    #define CALERT_SYSTEM                   6
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    typedef struct tagGUITHREADINFO
    {
        DWORD   cbSize;
        DWORD   flags;
        HWND    hwndActive;
        HWND    hwndFocus;
        HWND    hwndCapture;
        HWND    hwndMenuOwner;
        HWND    hwndMoveSize;
        HWND    hwndCaret;
        RECT    rcCaret;
    } GUITHREADINFO, *PGUITHREADINFO, FAR * LPGUITHREADINFO;
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    #define GUI_CARETBLINKING   0x00000001
    #define GUI_INMOVESIZE      0x00000002
    #define GUI_INMENUMODE      0x00000004
    #define GUI_SYSTEMMENUMODE  0x00000008
    #define GUI_POPUPMENUMODE   0x00000010
    #if(_WIN32_WINNT >= 0x0501)
    #if defined(_WIN64)
    #define GUI_16BITTASK       0x00000000
    #else
    #define GUI_16BITTASK       0x00000020
    #endif
    #endif /* _WIN32_WINNT >= 0x0501 */
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    WINUSERAPI
    BOOL
    WINAPI
    GetGUIThreadInfo(
        _In_ DWORD idThread,
        _Inout_ PGUITHREADINFO pgui);
     
    WINUSERAPI
    BOOL
    WINAPI
    BlockInput(
        BOOL fBlockIt);
     
    #if(_WIN32_WINNT >= 0x0600)
     
    #define USER_DEFAULT_SCREEN_DPI 96
     
    WINUSERAPI
    BOOL
    WINAPI
    SetProcessDPIAware(
        VOID);
     
    WINUSERAPI
    BOOL
    WINAPI
    IsProcessDPIAware(
        VOID);
     
    #endif /* _WIN32_WINNT >= 0x0600 */
     
    WINUSERAPI
    UINT
    WINAPI
    GetWindowModuleFileNameA(
        _In_ HWND hwnd,
        _Out_writes_to_(cchFileNameMax, return) LPSTR pszFileName,
        _In_ UINT cchFileNameMax);
    WINUSERAPI
    UINT
    WINAPI
    GetWindowModuleFileNameW(
        _In_ HWND hwnd,
        _Out_writes_to_(cchFileNameMax, return) LPWSTR pszFileName,
        _In_ UINT cchFileNameMax);
    #ifdef UNICODE
    #define GetWindowModuleFileName  GetWindowModuleFileNameW
    #else
    #define GetWindowModuleFileName  GetWindowModuleFileNameA
    #endif // !UNICODE
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    #ifndef NO_STATE_FLAGS
    #define STATE_SYSTEM_UNAVAILABLE        0x00000001  // Disabled
    #define STATE_SYSTEM_SELECTED           0x00000002
    #define STATE_SYSTEM_FOCUSED            0x00000004
    #define STATE_SYSTEM_PRESSED            0x00000008
    #define STATE_SYSTEM_CHECKED            0x00000010
    #define STATE_SYSTEM_MIXED              0x00000020  // 3-state checkbox or toolbar button
    #define STATE_SYSTEM_INDETERMINATE      STATE_SYSTEM_MIXED
    #define STATE_SYSTEM_READONLY           0x00000040
    #define STATE_SYSTEM_HOTTRACKED         0x00000080
    #define STATE_SYSTEM_DEFAULT            0x00000100
    #define STATE_SYSTEM_EXPANDED           0x00000200
    #define STATE_SYSTEM_COLLAPSED          0x00000400
    #define STATE_SYSTEM_BUSY               0x00000800
    #define STATE_SYSTEM_FLOATING           0x00001000  // Children "owned" not "contained" by parent
    #define STATE_SYSTEM_MARQUEED           0x00002000
    #define STATE_SYSTEM_ANIMATED           0x00004000
    #define STATE_SYSTEM_INVISIBLE          0x00008000
    #define STATE_SYSTEM_OFFSCREEN          0x00010000
    #define STATE_SYSTEM_SIZEABLE           0x00020000
    #define STATE_SYSTEM_MOVEABLE           0x00040000
    #define STATE_SYSTEM_SELFVOICING        0x00080000
    #define STATE_SYSTEM_FOCUSABLE          0x00100000
    #define STATE_SYSTEM_SELECTABLE         0x00200000
    #define STATE_SYSTEM_LINKED             0x00400000
    #define STATE_SYSTEM_TRAVERSED          0x00800000
    #define STATE_SYSTEM_MULTISELECTABLE    0x01000000  // Supports multiple selection
    #define STATE_SYSTEM_EXTSELECTABLE      0x02000000  // Supports extended selection
    #define STATE_SYSTEM_ALERT_LOW          0x04000000  // This information is of low priority
    #define STATE_SYSTEM_ALERT_MEDIUM       0x08000000  // This information is of medium priority
    #define STATE_SYSTEM_ALERT_HIGH         0x10000000  // This information is of high priority
    #define STATE_SYSTEM_PROTECTED          0x20000000  // access to this is restricted
    #define STATE_SYSTEM_VALID              0x3FFFFFFF
    #endif
     
    #define CCHILDREN_TITLEBAR              5
    #define CCHILDREN_SCROLLBAR             5
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    /*
     * Information about the global cursor.
     */
    typedef struct tagCURSORINFO
    {
        DWORD   cbSize;
        DWORD   flags;
        HCURSOR hCursor;
        POINT   ptScreenPos;
    } CURSORINFO, *PCURSORINFO, *LPCURSORINFO;
     
    #define CURSOR_SHOWING     0x00000001
    #if(WINVER >= 0x0602)
    #define CURSOR_SUPPRESSED  0x00000002
    #endif /* WINVER >= 0x0602 */
     
    WINUSERAPI
    BOOL
    WINAPI
    GetCursorInfo(
        _Inout_ PCURSORINFO pci);
     
    /*
     * Window information snapshot
     */
    typedef struct tagWINDOWINFO
    {
        DWORD cbSize;
        RECT rcWindow;
        RECT rcClient;
        DWORD dwStyle;
        DWORD dwExStyle;
        DWORD dwWindowStatus;
        UINT cxWindowBorders;
        UINT cyWindowBorders;
        ATOM atomWindowType;
        WORD wCreatorVersion;
    } WINDOWINFO, *PWINDOWINFO, *LPWINDOWINFO;
     
    #define WS_ACTIVECAPTION    0x0001
     
    WINUSERAPI
    BOOL
    WINAPI
    GetWindowInfo(
        _In_ HWND hwnd,
        _Inout_ PWINDOWINFO pwi);
     
    /*
     * Titlebar information.
     */
    typedef struct tagTITLEBARINFO
    {
        DWORD cbSize;
        RECT rcTitleBar;
        DWORD rgstate[CCHILDREN_TITLEBAR + 1];
    } TITLEBARINFO, *PTITLEBARINFO, *LPTITLEBARINFO;
     
    WINUSERAPI
    BOOL
    WINAPI
    GetTitleBarInfo(
        _In_ HWND hwnd,
        _Inout_ PTITLEBARINFO pti);
     
    #if(WINVER >= 0x0600)
    typedef struct tagTITLEBARINFOEX
    {
        DWORD cbSize;
        RECT rcTitleBar;
        DWORD rgstate[CCHILDREN_TITLEBAR + 1];
        RECT rgrect[CCHILDREN_TITLEBAR + 1];
    } TITLEBARINFOEX, *PTITLEBARINFOEX, *LPTITLEBARINFOEX;
    #endif /* WINVER >= 0x0600 */
     
    /*
     * Menubar information
     */
    typedef struct tagMENUBARINFO
    {
        DWORD cbSize;
        RECT rcBar;          // rect of bar, popup, item
        HMENU hMenu;         // real menu handle of bar, popup
        HWND hwndMenu;       // hwnd of item submenu if one
        BOOL fBarFocused:1;  // bar, popup has the focus
        BOOL fFocused:1;     // item has the focus
    } MENUBARINFO, *PMENUBARINFO, *LPMENUBARINFO;
     
    WINUSERAPI
    BOOL
    WINAPI
    GetMenuBarInfo(
        _In_ HWND hwnd,
        _In_ LONG idObject,
        _In_ LONG idItem,
        _Inout_ PMENUBARINFO pmbi);
     
    /*
     * Scrollbar information
     */
    typedef struct tagSCROLLBARINFO
    {
        DWORD cbSize;
        RECT rcScrollBar;
        int dxyLineButton;
        int xyThumbTop;
        int xyThumbBottom;
        int reserved;
        DWORD rgstate[CCHILDREN_SCROLLBAR + 1];
    } SCROLLBARINFO, *PSCROLLBARINFO, *LPSCROLLBARINFO;
     
    WINUSERAPI
    BOOL
    WINAPI
    GetScrollBarInfo(
        _In_ HWND hwnd,
        _In_ LONG idObject,
        _Inout_ PSCROLLBARINFO psbi);
     
    /*
     * Combobox information
     */
    typedef struct tagCOMBOBOXINFO
    {
        DWORD cbSize;
        RECT rcItem;
        RECT rcButton;
        DWORD stateButton;
        HWND hwndCombo;
        HWND hwndItem;
        HWND hwndList;
    } COMBOBOXINFO, *PCOMBOBOXINFO, *LPCOMBOBOXINFO;
     
    WINUSERAPI
    BOOL
    WINAPI
    GetComboBoxInfo(
        _In_ HWND hwndCombo,
        _Inout_ PCOMBOBOXINFO pcbi);
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    /*
     * The "real" ancestor window
     */
    #define     GA_PARENT       1
    #define     GA_ROOT         2
    #define     GA_ROOTOWNER    3
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    WINUSERAPI
    HWND
    WINAPI
    GetAncestor(
        _In_ HWND hwnd,
        _In_ UINT gaFlags);
     
     
    /*
     * This gets the REAL child window at the point.  If it is in the dead
     * space of a group box, it will try a sibling behind it.  But static
     * fields will get returned.  In other words, it is kind of a cross between
     * ChildWindowFromPointEx and WindowFromPoint.
     */
    WINUSERAPI
    HWND
    WINAPI
    RealChildWindowFromPoint(
        _In_ HWND hwndParent,
        _In_ POINT ptParentClientCoords);
     
     
    /*
     * This gets the name of the window TYPE, not class.  This allows us to
     * recognize ThunderButton32 et al.
     */
    WINUSERAPI
    UINT
    WINAPI
    RealGetWindowClassA(
        _In_ HWND hwnd,
        _Out_writes_to_(cchClassNameMax, return) LPSTR ptszClassName,
        _In_ UINT cchClassNameMax);
    /*
     * This gets the name of the window TYPE, not class.  This allows us to
     * recognize ThunderButton32 et al.
     */
    WINUSERAPI
    UINT
    WINAPI
    RealGetWindowClassW(
        _In_ HWND hwnd,
        _Out_writes_to_(cchClassNameMax, return) LPWSTR ptszClassName,
        _In_ UINT cchClassNameMax);
    #ifdef UNICODE
    #define RealGetWindowClass  RealGetWindowClassW
    #else
    #define RealGetWindowClass  RealGetWindowClassA
    #endif // !UNICODE
     
    /*
     * Alt-Tab Switch window information.
     */
    typedef struct tagALTTABINFO
    {
        DWORD cbSize;
        int cItems;
        int cColumns;
        int cRows;
        int iColFocus;
        int iRowFocus;
        int cxItem;
        int cyItem;
        POINT ptStart;
    } ALTTABINFO, *PALTTABINFO, *LPALTTABINFO;
     
    WINUSERAPI
    BOOL
    WINAPI
    GetAltTabInfoA(
        _In_opt_ HWND hwnd,
        _In_ int iItem,
        _Inout_ PALTTABINFO pati,
        _Out_writes_opt_(cchItemText) LPSTR pszItemText,
        _In_ UINT cchItemText);
    WINUSERAPI
    BOOL
    WINAPI
    GetAltTabInfoW(
        _In_opt_ HWND hwnd,
        _In_ int iItem,
        _Inout_ PALTTABINFO pati,
        _Out_writes_opt_(cchItemText) LPWSTR pszItemText,
        _In_ UINT cchItemText);
    #ifdef UNICODE
    #define GetAltTabInfo  GetAltTabInfoW
    #else
    #define GetAltTabInfo  GetAltTabInfoA
    #endif // !UNICODE
     
    /*
     * Listbox information.
     * Returns the number of items per row.
     */
    WINUSERAPI
    DWORD
    WINAPI
    GetListBoxInfo(
        _In_ HWND hwnd);
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    #endif /* NOWINABLE */
    #endif /* WINVER >= 0x0500 */
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
     
    #if(_WIN32_WINNT >= 0x0500)
    WINUSERAPI
    BOOL
    WINAPI
    LockWorkStation(
        VOID);
    #endif /* _WIN32_WINNT >= 0x0500 */
     
    #if(_WIN32_WINNT >= 0x0500)
     
    WINUSERAPI
    BOOL
    WINAPI
    UserHandleGrantAccess(
        _In_ HANDLE hUserHandle,
        _In_ HANDLE hJob,
        _In_ BOOL   bGrant);
     
    #endif /* _WIN32_WINNT >= 0x0500 */
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    #if(_WIN32_WINNT >= 0x0501)
     
    /*
     * Raw Input Messages.
     */
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    DECLARE_HANDLE(HRAWINPUT);
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    /*
     * WM_INPUT wParam
     */
     
    /*
     * Use this macro to get the input code from wParam.
     */
    #define GET_RAWINPUT_CODE_WPARAM(wParam)    ((wParam) & 0xff)
     
    /*
     * The input is in the regular message flow,
     * the app is required to call DefWindowProc
     * so that the system can perform clean ups.
     */
    #define RIM_INPUT       0
     
    /*
     * The input is sink only. The app is expected
     * to behave nicely.
     */
    #define RIM_INPUTSINK   1
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    /*
     * Raw Input data header
     */
    typedef struct tagRAWINPUTHEADER {
        DWORD dwType;
        DWORD dwSize;
        HANDLE hDevice;
        WPARAM wParam;
    } RAWINPUTHEADER, *PRAWINPUTHEADER, *LPRAWINPUTHEADER;
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    /*
     * Type of the raw input
     */
    #define RIM_TYPEMOUSE       0
    #define RIM_TYPEKEYBOARD    1
    #define RIM_TYPEHID         2
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    /*
     * Raw format of the mouse input
     */
    typedef struct tagRAWMOUSE {
        /*
         * Indicator flags.
         */
        USHORT usFlags;
     
        /*
         * The transition state of the mouse buttons.
         */
        union {
            ULONG ulButtons;
            struct  {
                USHORT  usButtonFlags;
                USHORT  usButtonData;
            };
        };
     
     
        /*
         * The raw state of the mouse buttons.
         */
        ULONG ulRawButtons;
     
        /*
         * The signed relative or absolute motion in the X direction.
         */
        LONG lLastX;
     
        /*
         * The signed relative or absolute motion in the Y direction.
         */
        LONG lLastY;
     
        /*
         * Device-specific additional information for the event.
         */
        ULONG ulExtraInformation;
     
    } RAWMOUSE, *PRAWMOUSE, *LPRAWMOUSE;
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    /*
     * Define the mouse button state indicators.
     */
     
    #define RI_MOUSE_LEFT_BUTTON_DOWN   0x0001  // Left Button changed to down.
    #define RI_MOUSE_LEFT_BUTTON_UP     0x0002  // Left Button changed to up.
    #define RI_MOUSE_RIGHT_BUTTON_DOWN  0x0004  // Right Button changed to down.
    #define RI_MOUSE_RIGHT_BUTTON_UP    0x0008  // Right Button changed to up.
    #define RI_MOUSE_MIDDLE_BUTTON_DOWN 0x0010  // Middle Button changed to down.
    #define RI_MOUSE_MIDDLE_BUTTON_UP   0x0020  // Middle Button changed to up.
     
    #define RI_MOUSE_BUTTON_1_DOWN      RI_MOUSE_LEFT_BUTTON_DOWN
    #define RI_MOUSE_BUTTON_1_UP        RI_MOUSE_LEFT_BUTTON_UP
    #define RI_MOUSE_BUTTON_2_DOWN      RI_MOUSE_RIGHT_BUTTON_DOWN
    #define RI_MOUSE_BUTTON_2_UP        RI_MOUSE_RIGHT_BUTTON_UP
    #define RI_MOUSE_BUTTON_3_DOWN      RI_MOUSE_MIDDLE_BUTTON_DOWN
    #define RI_MOUSE_BUTTON_3_UP        RI_MOUSE_MIDDLE_BUTTON_UP
     
    #define RI_MOUSE_BUTTON_4_DOWN      0x0040
    #define RI_MOUSE_BUTTON_4_UP        0x0080
    #define RI_MOUSE_BUTTON_5_DOWN      0x0100
    #define RI_MOUSE_BUTTON_5_UP        0x0200
     
    /*
     * If usButtonFlags has RI_MOUSE_WHEEL, the wheel delta is stored in usButtonData.
     * Take it as a signed value.
     */
    #define RI_MOUSE_WHEEL              0x0400
     
    /*
     * Define the mouse indicator flags.
     */
    #define MOUSE_MOVE_RELATIVE         0
    #define MOUSE_MOVE_ABSOLUTE         1
    #define MOUSE_VIRTUAL_DESKTOP    0x02  // the coordinates are mapped to the virtual desktop
    #define MOUSE_ATTRIBUTES_CHANGED 0x04  // requery for mouse attributes
    #if(WINVER >= 0x0600)
    #define MOUSE_MOVE_NOCOALESCE    0x08  // do not coalesce mouse moves
    #endif /* WINVER >= 0x0600 */
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    /*
     * Raw format of the keyboard input
     */
    typedef struct tagRAWKEYBOARD {
        /*
         * The "make" scan code (key depression).
         */
        USHORT MakeCode;
     
        /*
         * The flags field indicates a "break" (key release) and other
         * miscellaneous scan code information defined in ntddkbd.h.
         */
        USHORT Flags;
     
        USHORT Reserved;
     
        /*
         * Windows message compatible information
         */
        USHORT VKey;
        UINT   Message;
     
        /*
         * Device-specific additional information for the event.
         */
        ULONG ExtraInformation;
     
     
    } RAWKEYBOARD, *PRAWKEYBOARD, *LPRAWKEYBOARD;
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    /*
     * Define the keyboard overrun MakeCode.
     */
     
    #define KEYBOARD_OVERRUN_MAKE_CODE    0xFF
     
    /*
     * Define the keyboard input data Flags.
     */
    #define RI_KEY_MAKE             0
    #define RI_KEY_BREAK            1
    #define RI_KEY_E0               2
    #define RI_KEY_E1               4
    #define RI_KEY_TERMSRV_SET_LED  8
    #define RI_KEY_TERMSRV_SHADOW   0x10
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    /*
     * Raw format of the input from Human Input Devices
     */
    typedef struct tagRAWHID {
        DWORD dwSizeHid;    // byte size of each report
        DWORD dwCount;      // number of input packed
        BYTE bRawData[1];
    } RAWHID, *PRAWHID, *LPRAWHID;
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    /*
     * RAWINPUT data structure.
     */
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    typedef struct tagRAWINPUT {
        RAWINPUTHEADER header;
        union {
            RAWMOUSE    mouse;
            RAWKEYBOARD keyboard;
            RAWHID      hid;
        } data;
    } RAWINPUT, *PRAWINPUT, *LPRAWINPUT;
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    #ifdef _WIN64
    #define RAWINPUT_ALIGN(x)   (((x) + sizeof(QWORD) - 1) & ~(sizeof(QWORD) - 1))
    #else   // _WIN64
    #define RAWINPUT_ALIGN(x)   (((x) + sizeof(DWORD) - 1) & ~(sizeof(DWORD) - 1))
    #endif  // _WIN64
     
    #define NEXTRAWINPUTBLOCK(ptr) ((PRAWINPUT)RAWINPUT_ALIGN((ULONG_PTR)((PBYTE)(ptr) + (ptr)->header.dwSize)))
     
    /*
     * Flags for GetRawInputData
     */
     
    #define RID_INPUT               0x10000003
    #define RID_HEADER              0x10000005
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    WINUSERAPI
    UINT
    WINAPI
    GetRawInputData(
        _In_ HRAWINPUT hRawInput,
        _In_ UINT uiCommand,
        _Out_writes_bytes_to_opt_(*pcbSize, return) LPVOID pData,
        _Inout_ PUINT pcbSize,
        _In_ UINT cbSizeHeader);
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    /*
     * Raw Input Device Information
     */
    #define RIDI_PREPARSEDDATA      0x20000005
    #define RIDI_DEVICENAME         0x20000007  // the return valus is the character length, not the byte size
    #define RIDI_DEVICEINFO         0x2000000b
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    typedef struct tagRID_DEVICE_INFO_MOUSE {
        DWORD dwId;
        DWORD dwNumberOfButtons;
        DWORD dwSampleRate;
        BOOL  fHasHorizontalWheel;
    } RID_DEVICE_INFO_MOUSE, *PRID_DEVICE_INFO_MOUSE;
     
    typedef struct tagRID_DEVICE_INFO_KEYBOARD {
        DWORD dwType;
        DWORD dwSubType;
        DWORD dwKeyboardMode;
        DWORD dwNumberOfFunctionKeys;
        DWORD dwNumberOfIndicators;
        DWORD dwNumberOfKeysTotal;
    } RID_DEVICE_INFO_KEYBOARD, *PRID_DEVICE_INFO_KEYBOARD;
     
    typedef struct tagRID_DEVICE_INFO_HID {
        DWORD dwVendorId;
        DWORD dwProductId;
        DWORD dwVersionNumber;
     
        /*
         * Top level collection UsagePage and Usage
         */
        USHORT usUsagePage;
        USHORT usUsage;
    } RID_DEVICE_INFO_HID, *PRID_DEVICE_INFO_HID;
     
    typedef struct tagRID_DEVICE_INFO {
        DWORD cbSize;
        DWORD dwType;
        union {
            RID_DEVICE_INFO_MOUSE mouse;
            RID_DEVICE_INFO_KEYBOARD keyboard;
            RID_DEVICE_INFO_HID hid;
        };
    } RID_DEVICE_INFO, *PRID_DEVICE_INFO, *LPRID_DEVICE_INFO;
     
    WINUSERAPI
    UINT
    WINAPI
    GetRawInputDeviceInfoA(
        _In_opt_ HANDLE hDevice,
        _In_ UINT uiCommand,
        _Inout_updates_bytes_to_opt_(*pcbSize, *pcbSize) LPVOID pData,
        _Inout_ PUINT pcbSize);
    WINUSERAPI
    UINT
    WINAPI
    GetRawInputDeviceInfoW(
        _In_opt_ HANDLE hDevice,
        _In_ UINT uiCommand,
        _Inout_updates_bytes_to_opt_(*pcbSize, *pcbSize) LPVOID pData,
        _Inout_ PUINT pcbSize);
    #ifdef UNICODE
    #define GetRawInputDeviceInfo  GetRawInputDeviceInfoW
    #else
    #define GetRawInputDeviceInfo  GetRawInputDeviceInfoA
    #endif // !UNICODE
     
     
    /*
     * Raw Input Bulk Read: GetRawInputBuffer
     */
    WINUSERAPI
    UINT
    WINAPI
    GetRawInputBuffer(
        _Out_writes_bytes_opt_(*pcbSize) PRAWINPUT pData,
        _Inout_ PUINT pcbSize,
        _In_ UINT cbSizeHeader);
     
    /*
     * Raw Input request APIs
     */
    typedef struct tagRAWINPUTDEVICE {
        USHORT usUsagePage; // Toplevel collection UsagePage
        USHORT usUsage;     // Toplevel collection Usage
        DWORD dwFlags;
        HWND hwndTarget;    // Target hwnd. NULL = follows keyboard focus
    } RAWINPUTDEVICE, *PRAWINPUTDEVICE, *LPRAWINPUTDEVICE;
     
    typedef CONST RAWINPUTDEVICE* PCRAWINPUTDEVICE;
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    #define RIDEV_REMOVE            0x00000001
    #define RIDEV_EXCLUDE           0x00000010
    #define RIDEV_PAGEONLY          0x00000020
    #define RIDEV_NOLEGACY          0x00000030
    #define RIDEV_INPUTSINK         0x00000100
    #define RIDEV_CAPTUREMOUSE      0x00000200  // effective when mouse nolegacy is specified, otherwise it would be an error
    #define RIDEV_NOHOTKEYS         0x00000200  // effective for keyboard.
    #define RIDEV_APPKEYS           0x00000400  // effective for keyboard.
    #if(_WIN32_WINNT >= 0x0501)
    #define RIDEV_EXINPUTSINK       0x00001000
    #define RIDEV_DEVNOTIFY         0x00002000
    #endif /* _WIN32_WINNT >= 0x0501 */
    #define RIDEV_EXMODEMASK        0x000000F0
     
    #define RIDEV_EXMODE(mode)  ((mode) & RIDEV_EXMODEMASK)
     
    #if(_WIN32_WINNT >= 0x0501)
    /*
     * Flags for the WM_INPUT_DEVICE_CHANGE message.
     */
    #define GIDC_ARRIVAL             1
    #define GIDC_REMOVAL             2
    #endif /* _WIN32_WINNT >= 0x0501 */
     
    #if (_WIN32_WINNT >= 0x0601)
    #define GET_DEVICE_CHANGE_WPARAM(wParam)  (LOWORD(wParam))
    #elif (_WIN32_WINNT >= 0x0501)
    #define GET_DEVICE_CHANGE_LPARAM(lParam)  (LOWORD(lParam))
    #endif /* (_WIN32_WINNT >= 0x0601) */
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    WINUSERAPI
    BOOL
    WINAPI
    RegisterRawInputDevices(
        _In_reads_(uiNumDevices) PCRAWINPUTDEVICE pRawInputDevices,
        _In_ UINT uiNumDevices,
        _In_ UINT cbSize);
     
    WINUSERAPI
    UINT
    WINAPI
    GetRegisteredRawInputDevices(
        _Out_writes_opt_( *puiNumDevices) PRAWINPUTDEVICE pRawInputDevices,
        _Inout_ PUINT puiNumDevices,
        _In_ UINT cbSize);
     
     
    typedef struct tagRAWINPUTDEVICELIST {
        HANDLE hDevice;
        DWORD dwType;
    } RAWINPUTDEVICELIST, *PRAWINPUTDEVICELIST;
     
    WINUSERAPI
    UINT
    WINAPI
    GetRawInputDeviceList(
        _Out_writes_opt_(*puiNumDevices) PRAWINPUTDEVICELIST pRawInputDeviceList,
        _Inout_ PUINT puiNumDevices,
        _In_ UINT cbSize);
     
    WINUSERAPI
    LRESULT
    WINAPI
    DefRawInputProc(
        _In_reads_(nInput) PRAWINPUT* paRawInput,
        _In_ INT nInput,
        _In_ UINT cbSizeHeader);
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    #endif /* _WIN32_WINNT >= 0x0501 */
     
     
    #if(WINVER >= 0x0602)
     
    #define POINTER_DEVICE_PRODUCT_STRING_MAX 520
    /*
     * wParam values for WM_POINTERDEVICECHANGE
     */
    #define PDC_ARRIVAL                   0x001
    #define PDC_REMOVAL                   0x002
    #define PDC_ORIENTATION_0             0x004
    #define PDC_ORIENTATION_90            0x008
    #define PDC_ORIENTATION_180           0x010
    #define PDC_ORIENTATION_270           0x020
    #define PDC_MODE_DEFAULT              0x040
    #define PDC_MODE_CENTERED             0x080
    #define PDC_MAPPING_CHANGE            0x100
    #define PDC_RESOLUTION                0x200
    #define PDC_ORIGIN                    0x400
    #define PDC_MODE_ASPECTRATIOPRESERVED 0x800
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    typedef enum tagPOINTER_DEVICE_TYPE {
        POINTER_DEVICE_TYPE_INTEGRATED_PEN = 0x00000001,
        POINTER_DEVICE_TYPE_EXTERNAL_PEN   = 0x00000002,
        POINTER_DEVICE_TYPE_TOUCH          = 0x00000003,
    #if(WINVER >= 0x0603)
        POINTER_DEVICE_TYPE_TOUCH_PAD      = 0x00000004,
    #endif /* WINVER >= 0x0603 */
        POINTER_DEVICE_TYPE_MAX            = 0xFFFFFFFF
    } POINTER_DEVICE_TYPE;
     
    typedef struct tagPOINTER_DEVICE_INFO {
        DWORD displayOrientation;
        HANDLE device;
        POINTER_DEVICE_TYPE pointerDeviceType;
        HMONITOR monitor;
        ULONG startingCursorId;
        USHORT maxActiveContacts;
        WCHAR productString[POINTER_DEVICE_PRODUCT_STRING_MAX];
    } POINTER_DEVICE_INFO;
     
    typedef struct tagPOINTER_DEVICE_PROPERTY {
        INT32 logicalMin;
        INT32 logicalMax;
        INT32 physicalMin;
        INT32 physicalMax;
        UINT32 unit;
        UINT32 unitExponent;
        USHORT usagePageId;
        USHORT usageId;
    } POINTER_DEVICE_PROPERTY;
     
    typedef enum tagPOINTER_DEVICE_CURSOR_TYPE {
        POINTER_DEVICE_CURSOR_TYPE_UNKNOWN   = 0x00000000,
        POINTER_DEVICE_CURSOR_TYPE_TIP       = 0x00000001,
        POINTER_DEVICE_CURSOR_TYPE_ERASER    = 0x00000002,
        POINTER_DEVICE_CURSOR_TYPE_MAX       = 0xFFFFFFFF
    } POINTER_DEVICE_CURSOR_TYPE;
     
    typedef struct tagPOINTER_DEVICE_CURSOR_INFO {
        UINT32 cursorId;
        POINTER_DEVICE_CURSOR_TYPE cursor;
    } POINTER_DEVICE_CURSOR_INFO;
     
    WINUSERAPI
    BOOL
    WINAPI
    GetPointerDevices(
        _Inout_ UINT32* deviceCount,
        _Out_writes_opt_(*deviceCount) POINTER_DEVICE_INFO *pointerDevices);
     
    WINUSERAPI
    BOOL
    WINAPI
    GetPointerDevice(
        _In_ HANDLE device,
        _Out_writes_(1) POINTER_DEVICE_INFO *pointerDevice);
     
    WINUSERAPI
    BOOL
    WINAPI
    GetPointerDeviceProperties(
        _In_ HANDLE device,
        _Inout_ UINT32* propertyCount,
        _Out_writes_opt_(*propertyCount) POINTER_DEVICE_PROPERTY *pointerProperties);
     
    WINUSERAPI
    BOOL
    WINAPI
    RegisterPointerDeviceNotifications(
        _In_ HWND window,
        _In_ BOOL notifyRange);
     
    WINUSERAPI
    BOOL
    WINAPI
    GetPointerDeviceRects(
        _In_ HANDLE device,
        _Out_writes_(1) RECT* pointerDeviceRect,
        _Out_writes_(1) RECT* displayRect);
     
    WINUSERAPI
    BOOL
    WINAPI
    GetPointerDeviceCursors(
        _In_ HANDLE device,
        _Inout_ UINT32* cursorCount,
        _Out_writes_opt_(*cursorCount) POINTER_DEVICE_CURSOR_INFO *deviceCursors);
     
    WINUSERAPI
    BOOL
    WINAPI
    GetRawPointerDeviceData(
        _In_ UINT32 pointerId,
        _In_ UINT32 historyCount,
        _In_ UINT32 propertiesCount,
        _In_reads_(propertiesCount) POINTER_DEVICE_PROPERTY* pProperties,
        _Out_writes_(historyCount * propertiesCount) LONG* pValues);
     
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    #endif /* WINVER >= 0x0602 */
     
     
    #if(WINVER >= 0x0600)
     
    /*
     * Message Filter
     */
     
    #define MSGFLT_ADD 1
    #define MSGFLT_REMOVE 2
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    WINUSERAPI
    BOOL
    WINAPI
    ChangeWindowMessageFilter(
        _In_ UINT message,
        _In_ DWORD dwFlag);
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    #endif /* WINVER >= 0x0600 */
     
    #if(WINVER >= 0x0601)
     
    /*
     * Message filter info values (CHANGEFILTERSTRUCT.ExtStatus)
     */
    #define MSGFLTINFO_NONE                         (0)
    #define MSGFLTINFO_ALREADYALLOWED_FORWND        (1)
    #define MSGFLTINFO_ALREADYDISALLOWED_FORWND     (2)
    #define MSGFLTINFO_ALLOWED_HIGHER               (3)
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    typedef struct tagCHANGEFILTERSTRUCT {
        DWORD cbSize;
        DWORD ExtStatus;
    } CHANGEFILTERSTRUCT, *PCHANGEFILTERSTRUCT;
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    /*
     * Message filter action values (action parameter to ChangeWindowMessageFilterEx)
     */
    #define MSGFLT_RESET                            (0)
    #define MSGFLT_ALLOW                            (1)
    #define MSGFLT_DISALLOW                         (2)
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    WINUSERAPI
    BOOL
    WINAPI
    ChangeWindowMessageFilterEx(
        _In_ HWND hwnd,                                         // Window
        _In_ UINT message,                                      // WM_ message
        _In_ DWORD action,                                      // Message filter action value
        _Inout_opt_ PCHANGEFILTERSTRUCT pChangeFilterStruct);   // Optional
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    #endif /* WINVER >= 0x0601 */
     
    #if(WINVER >= 0x0601)
    #endif /* WINVER >= 0x0601 */
     
    #if(WINVER >= 0x0601)
     
    /*
     * Gesture defines and functions
     */
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    /*
     * Gesture information handle
     */
    DECLARE_HANDLE(HGESTUREINFO);
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    /*
     * Gesture flags - GESTUREINFO.dwFlags
     */
    #define GF_BEGIN                        0x00000001
    #define GF_INERTIA                      0x00000002
    #define GF_END                          0x00000004
     
    /*
     * Gesture IDs
     */
    #define GID_BEGIN                       1
    #define GID_END                         2
    #define GID_ZOOM                        3
    #define GID_PAN                         4
    #define GID_ROTATE                      5
    #define GID_TWOFINGERTAP                6
    #define GID_PRESSANDTAP                 7
    #define GID_ROLLOVER                    GID_PRESSANDTAP
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    /*
     * Gesture information structure
     *   - Pass the HGESTUREINFO received in the WM_GESTURE message lParam into the
     *     GetGestureInfo function to retrieve this information.
     *   - If cbExtraArgs is non-zero, pass the HGESTUREINFO received in the WM_GESTURE
     *     message lParam into the GetGestureExtraArgs function to retrieve extended
     *     argument information.
     */
    typedef struct tagGESTUREINFO {
        UINT cbSize;                    // size, in bytes, of this structure (including variable length Args field)
        DWORD dwFlags;                  // see GF_* flags
        DWORD dwID;                     // gesture ID, see GID_* defines
        HWND hwndTarget;                // handle to window targeted by this gesture
        POINTS ptsLocation;             // current location of this gesture
        DWORD dwInstanceID;             // internally used
        DWORD dwSequenceID;             // internally used
        ULONGLONG ullArguments;         // arguments for gestures whose arguments fit in 8 BYTES
        UINT cbExtraArgs;               // size, in bytes, of extra arguments, if any, that accompany this gesture
    } GESTUREINFO, *PGESTUREINFO;
    typedef GESTUREINFO const * PCGESTUREINFO;
     
     
    /*
     * Gesture notification structure
     *   - The WM_GESTURENOTIFY message lParam contains a pointer to this structure.
     *   - The WM_GESTURENOTIFY message notifies a window that gesture recognition is
     *     in progress and a gesture will be generated if one is recognized under the
     *     current gesture settings.
     */
    typedef struct tagGESTURENOTIFYSTRUCT {
        UINT cbSize;                    // size, in bytes, of this structure
        DWORD dwFlags;                  // unused
        HWND hwndTarget;                // handle to window targeted by the gesture
        POINTS ptsLocation;             // starting location
        DWORD dwInstanceID;             // internally used
    } GESTURENOTIFYSTRUCT, *PGESTURENOTIFYSTRUCT;
     
    /*
     * Gesture argument helpers
     *   - Angle should be a double in the range of -2pi to +2pi
     *   - Argument should be an unsigned 16-bit value
     */
    #define GID_ROTATE_ANGLE_TO_ARGUMENT(_arg_)     ((USHORT)((((_arg_) + 2.0 * 3.14159265) / (4.0 * 3.14159265)) * 65535.0))
    #define GID_ROTATE_ANGLE_FROM_ARGUMENT(_arg_)   ((((double)(_arg_) / 65535.0) * 4.0 * 3.14159265) - 2.0 * 3.14159265)
     
    /*
     * Gesture information retrieval
     *   - HGESTUREINFO is received by a window in the lParam of a WM_GESTURE message.
     */
    WINUSERAPI
    BOOL
    WINAPI
    GetGestureInfo(
        _In_ HGESTUREINFO hGestureInfo,
        _Out_ PGESTUREINFO pGestureInfo);
     
    /*
     * Gesture extra arguments retrieval
     *   - HGESTUREINFO is received by a window in the lParam of a WM_GESTURE message.
     *   - Size, in bytes, of the extra argument data is available in the cbExtraArgs
     *     field of the GESTUREINFO structure retrieved using the GetGestureInfo function.
     */
    WINUSERAPI
    BOOL
    WINAPI
    GetGestureExtraArgs(
        _In_ HGESTUREINFO hGestureInfo,
        _In_ UINT cbExtraArgs,
        _Out_writes_bytes_(cbExtraArgs) PBYTE pExtraArgs);
     
    /*
     * Gesture information handle management
     *   - If an application processes the WM_GESTURE message, then once it is done
     *     with the associated HGESTUREINFO, the application is responsible for
     *     closing the handle using this function. Failure to do so may result in
     *     process memory leaks.
     *   - If the message is instead passed to DefWindowProc, or is forwarded using
     *     one of the PostMessage or SendMessage class of API functions, the handle
     *     is transfered with the message and need not be closed by the application.
     */
    WINUSERAPI
    BOOL
    WINAPI
    CloseGestureInfoHandle(
        _In_ HGESTUREINFO hGestureInfo);
     
     
    /*
     * Gesture configuration structure
     *   - Used in SetGestureConfig and GetGestureConfig
     *   - Note that any setting not included in either GESTURECONFIG.dwWant or
     *     GESTURECONFIG.dwBlock will use the parent window's preferences or
     *     system defaults.
     */
    typedef struct tagGESTURECONFIG {
        DWORD dwID;                     // gesture ID
        DWORD dwWant;                   // settings related to gesture ID that are to be turned on
        DWORD dwBlock;                  // settings related to gesture ID that are to be turned off
    } GESTURECONFIG, *PGESTURECONFIG;
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    /*
     * Gesture configuration flags - GESTURECONFIG.dwWant or GESTURECONFIG.dwBlock
     */
     
    /*
     * Common gesture configuration flags - set GESTURECONFIG.dwID to zero
     */
    #define GC_ALLGESTURES                              0x00000001
     
    /*
     * Zoom gesture configuration flags - set GESTURECONFIG.dwID to GID_ZOOM
     */
    #define GC_ZOOM                                     0x00000001
     
    /*
     * Pan gesture configuration flags - set GESTURECONFIG.dwID to GID_PAN
     */
    #define GC_PAN                                      0x00000001
    #define GC_PAN_WITH_SINGLE_FINGER_VERTICALLY        0x00000002
    #define GC_PAN_WITH_SINGLE_FINGER_HORIZONTALLY      0x00000004
    #define GC_PAN_WITH_GUTTER                          0x00000008
    #define GC_PAN_WITH_INERTIA                         0x00000010
     
    /*
     * Rotate gesture configuration flags - set GESTURECONFIG.dwID to GID_ROTATE
     */
    #define GC_ROTATE                                   0x00000001
     
    /*
     * Two finger tap gesture configuration flags - set GESTURECONFIG.dwID to GID_TWOFINGERTAP
     */
    #define GC_TWOFINGERTAP                             0x00000001
     
    /*
     * PressAndTap gesture configuration flags - set GESTURECONFIG.dwID to GID_PRESSANDTAP
     */
    #define GC_PRESSANDTAP                              0x00000001
    #define GC_ROLLOVER                                 GC_PRESSANDTAP
     
    #define GESTURECONFIGMAXCOUNT           256             // Maximum number of gestures that can be included
                                                            // in a single call to SetGestureConfig / GetGestureConfig
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    WINUSERAPI
    BOOL
    WINAPI
    SetGestureConfig(
        _In_ HWND hwnd,                                     // window for which configuration is specified
        _In_ DWORD dwReserved,                              // reserved, must be 0
        _In_ UINT cIDs,                                     // count of GESTURECONFIG structures
        _In_reads_(cIDs) PGESTURECONFIG pGestureConfig,    // array of GESTURECONFIG structures, dwIDs will be processed in the
                                                            // order specified and repeated occurances will overwrite previous ones
        _In_ UINT cbSize);                                  // sizeof(GESTURECONFIG)
     
     
    #define GCF_INCLUDE_ANCESTORS           0x00000001      // If specified, GetGestureConfig returns consolidated configuration
                                                            // for the specified window and it's parent window chain
     
    WINUSERAPI
    BOOL
    WINAPI
    GetGestureConfig(
        _In_ HWND hwnd,                                     // window for which configuration is required
        _In_ DWORD dwReserved,                              // reserved, must be 0
        _In_ DWORD dwFlags,                                 // see GCF_* flags
        _In_ PUINT pcIDs,                                   // *pcIDs contains the size, in number of GESTURECONFIG structures,
                                                            // of the buffer pointed to by pGestureConfig
        _Inout_updates_(*pcIDs) PGESTURECONFIG pGestureConfig,
                                                            // pointer to buffer to receive the returned array of GESTURECONFIG structures
        _In_ UINT cbSize);                                  // sizeof(GESTURECONFIG)
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
     
    #endif /* WINVER >= 0x0601 */
     
     
    #if(WINVER >= 0x0601)
     
    /*
     * GetSystemMetrics(SM_DIGITIZER) flag values
     */
    #define NID_INTEGRATED_TOUCH  0x00000001
    #define NID_EXTERNAL_TOUCH    0x00000002
    #define NID_INTEGRATED_PEN    0x00000004
    #define NID_EXTERNAL_PEN      0x00000008
    #define NID_MULTI_INPUT       0x00000040
    #define NID_READY             0x00000080
     
    #endif /* WINVER >= 0x0601 */
     
     
    #define MAX_STR_BLOCKREASON 256
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    WINUSERAPI
    BOOL
    WINAPI
    ShutdownBlockReasonCreate(
        _In_ HWND hWnd,
        _In_ LPCWSTR pwszReason);
     
    WINUSERAPI
    BOOL
    WINAPI
    ShutdownBlockReasonQuery(
        _In_ HWND hWnd,
        _Out_writes_opt_(*pcchBuff) LPWSTR pwszBuff,
        _Inout_ DWORD *pcchBuff);
     
    WINUSERAPI
    BOOL
    WINAPI
    ShutdownBlockReasonDestroy(
        _In_ HWND hWnd);
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
     
    #if(WINVER >= 0x0601)
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    /*
     * Identifiers for message input source device type.
     */
    typedef enum tagINPUT_MESSAGE_DEVICE_TYPE  {
         IMDT_UNAVAILABLE = 0x00000000,      // not specified
         IMDT_KEYBOARD    = 0x00000001,      // from keyboard
         IMDT_MOUSE       = 0x00000002,      // from mouse
         IMDT_TOUCH       = 0x00000004,      // from touch
         IMDT_PEN         = 0x00000008,      // from pen
    #if(WINVER >= 0x0603)
         IMDT_TOUCHPAD    = 0x00000010,      // from touchpad
    #endif /* WINVER >= 0x0603 */
     } INPUT_MESSAGE_DEVICE_TYPE;
     
    typedef enum tagINPUT_MESSAGE_ORIGIN_ID {
         IMO_UNAVAILABLE = 0x00000000,  // not specified
         IMO_HARDWARE    = 0x00000001,  // from a hardware device or injected by a UIAccess app
         IMO_INJECTED    = 0x00000002,  // injected via SendInput() by a non-UIAccess app
         IMO_SYSTEM      = 0x00000004,  // injected by the system
    } INPUT_MESSAGE_ORIGIN_ID;
     
    /*
     * Input source structure.
     */
     typedef struct tagINPUT_MESSAGE_SOURCE {
         INPUT_MESSAGE_DEVICE_TYPE deviceType;
         INPUT_MESSAGE_ORIGIN_ID   originId;
     } INPUT_MESSAGE_SOURCE;
     
     
    /*
     * API to determine the input source of the current messsage.
     */
    WINUSERAPI
    BOOL
    WINAPI
    GetCurrentInputMessageSource(
        _Out_ INPUT_MESSAGE_SOURCE *inputMessageSource);
     
    WINUSERAPI
    BOOL
    WINAPI
    GetCIMSSM(
        _Out_ INPUT_MESSAGE_SOURCE *inputMessageSource);
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    #endif /* WINVER >= 0x0601 */
     
    #if(WINVER >= 0x0601)
     
    #pragma region Application Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)
     
    /*
     * AutoRotation state structure
     */
    typedef enum tagAR_STATE {
        AR_ENABLED        = 0x0,
        AR_DISABLED       = 0x1,
        AR_SUPPRESSED     = 0x2,
        AR_REMOTESESSION  = 0x4,
        AR_MULTIMON       = 0x8,
        AR_NOSENSOR       = 0x10,
        AR_NOT_SUPPORTED  = 0x20,
        AR_DOCKED         = 0x40,
        AR_LAPTOP         = 0x80
    } AR_STATE, *PAR_STATE;
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) */
    #pragma endregion
     
    #ifndef MIDL_PASS
    // Dont define this for MIDL compiler passes over winuser.h. Some of them
    // dont include winnt.h (where DEFINE_ENUM_FLAG_OPERATORS is defined and
    // get compile errors.
    DEFINE_ENUM_FLAG_OPERATORS(AR_STATE);
    #endif
     
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
    /*
     * Orientation preference structure. This is used by applications to specify
     * their orientation preferences to windows.
     */
    typedef enum ORIENTATION_PREFERENCE {
        ORIENTATION_PREFERENCE_NONE              = 0x0,
        ORIENTATION_PREFERENCE_LANDSCAPE         = 0x1,
        ORIENTATION_PREFERENCE_PORTRAIT          = 0x2,
        ORIENTATION_PREFERENCE_LANDSCAPE_FLIPPED = 0x4,
        ORIENTATION_PREFERENCE_PORTRAIT_FLIPPED  = 0x8
    } ORIENTATION_PREFERENCE;
     
    #ifndef MIDL_PASS
    // Dont define this for MIDL compiler passes over winuser.h. Some of them
    // dont include winnt.h (where DEFINE_ENUM_FLAG_OPERATORS is defined and
    // get compile errors.
    DEFINE_ENUM_FLAG_OPERATORS(ORIENTATION_PREFERENCE);
    #endif
     
    WINUSERAPI
    BOOL
    WINAPI
    GetAutoRotationState(
        _Out_ PAR_STATE pState);
     
    WINUSERAPI
    BOOL
    WINAPI
    GetDisplayAutoRotationPreferences(
        _Out_ ORIENTATION_PREFERENCE *pOrientation);
     
    WINUSERAPI
    BOOL
    WINAPI
    GetDisplayAutoRotationPreferencesByProcessId(
        _In_ DWORD dwProcessId,
        _Out_ ORIENTATION_PREFERENCE *pOrientation,
        _Out_ BOOL *fRotateScreen);
     
    WINUSERAPI
    BOOL
    WINAPI
    SetDisplayAutoRotationPreferences(
        _In_ ORIENTATION_PREFERENCE orientation);
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    #endif /* WINVER >= 0x0601 */
     
     
    #if(WINVER >= 0x0601)
    #pragma region Desktop Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     
     
    WINUSERAPI
    BOOL
    WINAPI
    IsImmersiveProcess(
        _In_ HANDLE hProcess);
     
    WINUSERAPI
    BOOL
    WINAPI
    SetProcessRestrictionExemption(
        _In_ BOOL fEnableExemption);
     
    #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    #pragma endregion
     
    #endif /* WINVER >= 0x0601 */
     
     
     
     
    #if !defined(RC_INVOKED) /* RC complains about long symbols in #ifs */
    #if defined(ISOLATION_AWARE_ENABLED) && (ISOLATION_AWARE_ENABLED != 0)
    #include "winuser.inl"
    #endif /* ISOLATION_AWARE_ENABLED */
    #endif /* RC */
     
    #ifdef __cplusplus
    }
    #endif  /* __cplusplus */
     
    #endif /* !_WINUSER_ */
     
     
     
    
  • 相关阅读:
    导弹拦截版
    [USACO1.5]数字三角形 Number Triangles
    FBI树
    修复公路
    台阶问题
    阶乘问题
    连续自然数和
    又是毕业季I
    生活大爆炸版石头剪刀布
    曹冲养猪
  • 原文地址:https://www.cnblogs.com/chr2020/p/15212331.html
Copyright © 2020-2023  润新知