zoukankan      html  css  js  c++  java
  • Windows API 常量定义

    Windows 常量定义在winuser.h中可以找到,如果了安装了visual studio 2010,winuser.h所在目录为C:Program Files (x86)Microsoft SDKsWindowsv7.0AInclude

    /****************************************************************************
    * *
    * 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(_USER32_)
    #define WINUSERAPI DECLSPEC_IMPORT
    #define WINABLEAPI DECLSPEC_IMPORT
    #else
    #define WINUSERAPI
    #define WINABLEAPI
    #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 NOUSER

    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);

    #ifdef STRICT

    typedef INT_PTR (CALLBACK* DLGPROC)(HWND, UINT, WPARAM, LPARAM);
    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 */


    #else /* !STRICT */

    typedef FARPROC DLGPROC;
    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 /* !STRICT */

    #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 */

    #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

    WINUSERAPI
    int
    WINAPI
    wvsprintfA(
    __out LPSTR,
    __in __format_string LPCSTR,
    __in va_list arglist);
    WINUSERAPI
    int
    WINAPI
    wvsprintfW(
    __out LPWSTR,
    __in __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 __format_string LPCSTR,
    ...);
    WINUSERAPI
    int
    WINAPIV
    wsprintfW(
    __out LPWSTR,
    __in __format_string LPCWSTR,
    ...);
    #ifdef UNICODE
    #define wsprintf wsprintfW
    #else
    #define wsprintf wsprintfA
    #endif // !UNICODE

    #if defined(DEPRECATE_SUPPORTED)
    #pragma warning(pop)
    #endif


    /*
    * 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

    /*
    * 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;

    #if(_WIN32_WINNT >= 0x0501)
    /*
    * WTSSESSION_NOTIFICATION struct pointed by lParam, for WM_WTSSESSION_CHANGE
    */
    typedef struct tagWTSSESSION_NOTIFICATION
    {
    DWORD cbSize;
    DWORD dwSessionId;

    } WTSSESSION_NOTIFICATION, *PWTSSESSION_NOTIFICATION;

    /*
    * 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

    #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 */


    #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 */

    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 */

    #if (_WIN32_WINNT >= 0x0400)

    /*
    * Low level hook flags
    */

    #define LLKHF_EXTENDED (KF_EXTENDED >> 8)
    #define LLKHF_INJECTED 0x00000010
    #define LLKHF_ALTDOWN (KF_ALTDOWN >> 8)
    #define LLKHF_UP (KF_UP >> 8)

    #define LLMHF_INJECTED 0x00000001

    /*
    * 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 // (_WIN32_WINNT >= 0x0400)

    /*
    * 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 /* !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

    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_bcount(256) CONST BYTE *lpKeyState,
    __out_ecount(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_ecount(KL_NAMELENGTH) LPSTR pwszKLID);
    WINUSERAPI
    BOOL
    WINAPI
    GetKeyboardLayoutNameW(
    __out_ecount(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_ecount_part_opt(nBuff, return) HKL FAR *lpList);

    WINUSERAPI
    HKL
    WINAPI
    GetKeyboardLayout(
    __in DWORD idThread);

    #endif /* WINVER >= 0x0400 */


    #if(WINVER >= 0x0500)

    typedef struct tagMOUSEMOVEPOINT {
    int x;
    int y;
    DWORD time;
    ULONG_PTR dwExtraInfo;
    } MOUSEMOVEPOINT, *PMOUSEMOVEPOINT, FAR* LPMOUSEMOVEPOINT;

    /*
    * Values for resolution parameter of GetMouseMovePointsEx
    */
    #define GMMP_USE_DISPLAY_POINTS 1
    #define GMMP_USE_HIGH_RESOLUTION_POINTS 2

    WINUSERAPI
    int
    WINAPI
    GetMouseMovePointsEx(
    __in UINT cbSize,
    __in LPMOUSEMOVEPOINT lppt,
    __out_ecount(nBufPoints) LPMOUSEMOVEPOINT lpptBuf,
    __in int nBufPoints,
    __in DWORD resolution);

    #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

    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 /* NOGDI */
    #endif /* _WINGDI_ */

    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 /* !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

    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 /* !NOWINDOWSTATION */

    #ifndef NOSECURITY

    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_bcount_opt(nLength) PSECURITY_DESCRIPTOR pSID,
    __in DWORD nLength,
    __out LPDWORD lpnLengthNeeded);

    #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 */

    typedef struct tagUSEROBJECTFLAGS {
    BOOL fInherit;
    BOOL fReserved;
    DWORD dwFlags;
    } USEROBJECTFLAGS, *PUSEROBJECTFLAGS;

    WINUSERAPI
    BOOL
    WINAPI
    GetUserObjectInformationA(
    __in HANDLE hObj,
    __in int nIndex,
    __out_bcount_opt(nLength) PVOID pvInfo,
    __in DWORD nLength,
    __out_opt LPDWORD lpnLengthNeeded);
    WINUSERAPI
    BOOL
    WINAPI
    GetUserObjectInformationW(
    __in HANDLE hObj,
    __in int nIndex,
    __out_bcount_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_bcount(nLength) PVOID pvInfo,
    __in DWORD nLength);
    WINUSERAPI
    BOOL
    WINAPI
    SetUserObjectInformationW(
    __in HANDLE hObj,
    __in int nIndex,
    __in_bcount(nLength) PVOID pvInfo,
    __in DWORD nLength);
    #ifdef UNICODE
    #define SetUserObjectInformation SetUserObjectInformationW
    #else
    #define SetUserObjectInformation SetUserObjectInformationA
    #endif // !UNICODE

    #endif /* !NOSECURITY */

    #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 */


    #ifndef NOMSG

    /*
    * 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;

    #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
    /*
    * Struct pointed to by WM_GETMINMAXINFO lParam
    */
    typedef struct tagMINMAXINFO {
    POINT ptReserved;
    POINT ptMaxSize;
    POINT ptMaxPosition;
    POINT ptMinTrackSize;
    POINT ptMaxTrackSize;
    } MINMAXINFO, *PMINMAXINFO, *LPMINMAXINFO;

    #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


    /*
    * lParam of WM_COPYDATA message points to...
    */
    typedef struct tagCOPYDATASTRUCT {
    ULONG_PTR dwData;
    DWORD cbData;
    __field_bcount(cbData) PVOID lpData;
    } COPYDATASTRUCT, *PCOPYDATASTRUCT;

    #if(WINVER >= 0x0400)
    typedef struct tagMDINEXTMENU
    {
    HMENU hmenuIn;
    HMENU hmenuNext;
    HWND hwndNext;
    } MDINEXTMENU, * PMDINEXTMENU, FAR * LPMDINEXTMENU;
    #endif /* WINVER >= 0x0400 */


    #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
    typedef struct {
    GUID PowerSetting;
    DWORD DataLength;
    UCHAR Data[1];
    } POWERBROADCAST_SETTING, *PPOWERBROADCAST_SETTING;


    #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 >= 0x0601)
    #define WM_TOUCH 0x0240
    #endif /* WINVER >= 0x0601 */


    #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 */

    #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 */

    #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 */


    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


    /*
    * 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

    /*
    * 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;

    /*
    * 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)
    typedef struct tagTRACKMOUSEEVENT {
    DWORD cbSize;
    DWORD dwFlags;
    HWND hwndTrack;
    DWORD dwHoverTime;
    } TRACKMOUSEEVENT, *LPTRACKMOUSEEVENT;

    WINUSERAPI
    BOOL
    WINAPI
    TrackMouseEvent(
    __inout LPTRACKMOUSEEVENT lpEventTrack);
    #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
    #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 */


    WINUSERAPI
    BOOL
    WINAPI
    DrawEdge(
    __in HDC hdc,
    __inout LPRECT qrc,
    __in UINT edge,
    __in UINT grfFlags);

    /* 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

    WINUSERAPI
    BOOL
    WINAPI
    DrawFrameControl(
    __in HDC,
    __inout LPRECT,
    __in UINT,
    __in UINT);


    /* 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 */

    WINUSERAPI
    BOOL
    WINAPI
    DrawCaption(
    __in HWND hwnd,
    __in HDC hdc,
    __in CONST RECT * lprect,
    __in UINT flags);


    #define IDANI_OPEN 1
    #define IDANI_CAPTION 3

    WINUSERAPI
    BOOL
    WINAPI
    DrawAnimatedRects(
    __in_opt HWND hwnd,
    __in int idAni,
    __in CONST RECT *lprcFrom,
    __in CONST RECT *lprcTo);

    #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

    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 */

    #if(WINVER >= 0x0400)
    typedef struct tagNMHDR
    {
    HWND hwndFrom;
    UINT_PTR idFrom;
    UINT code; // NM_ code
    } NMHDR;
    typedef NMHDR FAR * LPNMHDR;

    typedef struct tagSTYLESTRUCT
    {
    DWORD styleOld;
    DWORD styleNew;
    } STYLESTRUCT, * LPSTYLESTRUCT;
    #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 */

    /*
    * 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;

    #ifndef NOMSG

    /*
    * 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


    /*
    * 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 */

    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);

    #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)

    #define ENDSESSION_LOGOFF 0x80000000

    #define ENDSESSION_CRITICAL 0x40000000

    #define ENDSESSION_CLOSEAPP 0x00000001
    #endif /* WINVER >= 0x0400 */

    #define EWX_LOGOFF 0
    #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 ExitWindows(dwReserved, Code) ExitWindowsEx(EWX_LOGOFF, 0xFFFFFFFF)

    __drv_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 >= 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,
    __in WPARAM wParam,
    __in LPARAM lParam);
    WINUSERAPI
    LRESULT
    WINAPI
    SendMessageW(
    __in HWND hWnd,
    __in UINT Msg,
    __in WPARAM wParam,
    __in 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 */

    #if(WINVER >= 0x0400)

    #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

    //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

    #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
    );
    #endif // (_WIN32_WINNT >= 0x0502)
    #endif /* WINVER >= 0x0500 */


    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

    #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 */

    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);


    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);

    #if(WINVER >= 0x0500)
    WINUSERAPI
    DWORD
    WINAPI
    InSendMessageEx(
    __reserved LPVOID lpReserved);

    /*
    * 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 */

    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

    WINUSERAPI
    BOOL
    WINAPI
    GetClassInfoA(
    __in_opt HINSTANCE hInstance,
    __in LPCSTR lpClassName,
    __out LPWNDCLASSA lpWndClass);
    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

    WINUSERAPI
    BOOL
    WINAPI
    GetClassInfoExA(
    __in_opt HINSTANCE hInstance,
    __in LPCSTR lpszClass,
    __out LPWNDCLASSEXA lpwcx);
    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 */

    #define CW_USEDEFAULT ((int)0x80000000)

    /*
    * Special value for CreateWindow, et al.
    */
    #define HWND_DESKTOP ((HWND)0)

    #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

    #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

    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 */

    #if(_WIN32_WINNT >= 0x0500)
    #if defined(_WINGDI_) && !defined(NOGDI)

    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
    {
    __in DWORD cbSize;
    __in_opt HDC hdcDst;
    __in_opt const POINT* pptDst;
    __in_opt const SIZE* psize;
    __in_opt HDC hdcSrc;
    __in_opt const POINT* pptSrc;
    __in_opt COLORREF crKey;
    __in_opt const BLENDFUNCTION* pblend;
    __in DWORD dwFlags;
    __in_opt 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

    #if(_WIN32_WINNT >= 0x0501)
    WINUSERAPI
    BOOL
    WINAPI
    GetLayeredWindowAttributes(
    __in HWND hwnd,
    __out_opt COLORREF* pcrKey,
    __out_opt BYTE* pbAlpha,
    __out_opt DWORD* pdwFlags);

    #define PW_CLIENTONLY 0x00000001


    WINUSERAPI
    BOOL
    WINAPI
    PrintWindow(
    __in HWND hwnd,
    __in HDC hdcBlt,
    __in UINT nFlags);

    #endif /* _WIN32_WINNT >= 0x0501 */

    WINUSERAPI
    BOOL
    WINAPI
    SetLayeredWindowAttributes(
    __in HWND hwnd,
    __in COLORREF crKey,
    __in BYTE bAlpha,
    __in DWORD dwFlags);

    #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 */


    #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 */

    #ifndef NODEFERWINDOWPOS

    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 /* !NODEFERWINDOWPOS */

    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);

    /*
    * 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>

    /*
    * original NT 32 bit dialog template:
    */
    typedef struct {
    DWORD style;
    DWORD dwExtendedStyle;
    WORD cdit;
    short x;
    short y;
    short cx;
    short cy;
    } DLGTEMPLATE;
    typedef DLGTEMPLATE *LPDLGTEMPLATEA;
    typedef DLGTEMPLATE *LPDLGTEMPLATEW;
    #ifdef UNICODE
    typedef LPDLGTEMPLATEW LPDLGTEMPLATE;
    #else
    typedef LPDLGTEMPLATEA LPDLGTEMPLATE;
    #endif // UNICODE
    typedef CONST DLGTEMPLATE *LPCDLGTEMPLATEA;
    typedef CONST DLGTEMPLATE *LPCDLGTEMPLATEW;
    #ifdef UNICODE
    typedef LPCDLGTEMPLATEW LPCDLGTEMPLATE;
    #else
    typedef LPCDLGTEMPLATEA LPCDLGTEMPLATE;
    #endif // UNICODE

    /*
    * 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


    #include <poppack.h> /* Resume normal packing */

    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

    WINUSERAPI
    UINT
    WINAPI
    GetDlgItemTextA(
    __in HWND hDlg,
    __in int nIDDlgItem,
    __out_ecount(cchMax) LPSTR lpString,
    __in int cchMax);
    WINUSERAPI
    UINT
    WINAPI
    GetDlgItemTextW(
    __in HWND hDlg,
    __in int nIDDlgItem,
    __out_ecount(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

    /*
    * Window extra byted needed for private dialog classes.
    */
    #ifndef _MAC
    #define DLGWINDOWEXTRA 30
    #else
    #define DLGWINDOWEXTRA 48
    #endif

    #endif /* !NOCTLMGR */

    #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_ecount(cchMaxCount) LPSTR lpszFormatName,
    __in int cchMaxCount);
    WINUSERAPI
    int
    WINAPI
    GetClipboardFormatNameW(
    __in UINT format,
    __out_ecount(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_ecount(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_ecount(cFormats) __notnull PUINT lpuiFormats,
    __in UINT cFormats,
    __out __notnull PUINT pcFormatsOut);
    #endif /* WINVER >= 0x0600 */
    #endif /* !NOCLIPBOARD */

    /*
    * Character Translation Routines
    */

    WINUSERAPI
    BOOL
    WINAPI
    CharToOemA(
    __in_xcount(strlen(pSrc) + 1) LPCSTR pSrc,
    __out_xcount(strlen(pSrc) + 1) LPSTR pDst);
    WINUSERAPI
    BOOL
    WINAPI
    CharToOemW(
    __in_xcount(strlen(pSrc) + 1) LPCWSTR pSrc,
    __out_xcount(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_xcount(strlen(pSrc) + 1) LPCSTR pSrc,
    __out_xcount(strlen(pSrc) + 1) LPSTR pDst);
    __drv_preferredFunction("OemToCharBuff","Does not validate buffer size")
    WINUSERAPI
    BOOL
    WINAPI
    OemToCharW(
    __in_xcount(strlen(pSrc) + 1) LPCSTR pSrc,
    __out_xcount(strlen(pSrc) + 1) LPWSTR pDst);
    #ifdef UNICODE
    #define OemToChar OemToCharW
    #else
    #define OemToChar OemToCharA
    #endif // !UNICODE

    WINUSERAPI
    BOOL
    WINAPI
    CharToOemBuffA(
    __in LPCSTR lpszSrc,
    __out_ecount(cchDstLength) LPSTR lpszDst,
    __in DWORD cchDstLength);
    WINUSERAPI
    BOOL
    WINAPI
    CharToOemBuffW(
    __in LPCWSTR lpszSrc,
    __out_ecount(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_ecount(cchDstLength) LPSTR lpszDst,
    __in DWORD cchDstLength);
    WINUSERAPI
    BOOL
    WINAPI
    OemToCharBuffW(
    __in LPCSTR lpszSrc,
    __out_ecount(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_ecount(cchLength) LPSTR lpsz,
    __in DWORD cchLength);
    WINUSERAPI
    DWORD
    WINAPI
    CharUpperBuffW(
    __inout_ecount(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_ecount(cchLength) LPSTR lpsz,
    __in DWORD cchLength);
    WINUSERAPI
    DWORD
    WINAPI
    CharLowerBuffW(
    __inout_ecount(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 */

    /*
    * 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

    #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
    BOOL
    WINAPI
    GetKeyboardState(
    __out_ecount(256) PBYTE lpKeyState);

    WINUSERAPI
    BOOL
    WINAPI
    SetKeyboardState(
    __in_ecount(256) LPBYTE lpKeyState);

    WINUSERAPI
    int
    WINAPI
    GetKeyNameTextA(
    __in LONG lParam,
    __out_ecount(cchSize) LPSTR lpString,
    __in int cchSize);
    WINUSERAPI
    int
    WINAPI
    GetKeyNameTextW(
    __in LONG lParam,
    __out_ecount(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_ecount_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_ecount_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_bcount_opt(256) CONST BYTE *lpKeyState,
    __out_ecount(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);

    #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 */

    WINUSERAPI
    VOID
    WINAPI
    mouse_event(
    __in DWORD dwFlags,
    __in DWORD dx,
    __in DWORD dy,
    __in DWORD dwData,
    __in ULONG_PTR dwExtraInfo);

    #if (_WIN32_WINNT > 0x0400)

    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_ecount(cInputs) LPINPUT pInputs, // array of inputs
    __in int cbSize); // sizeof(INPUT)

    #endif // (_WIN32_WINNT > 0x0400)

    #if(WINVER >= 0x0601)

    /*
    * 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;


    /*
    * 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

    WINUSERAPI
    BOOL
    WINAPI
    GetTouchInputInfo(
    __in HTOUCHINPUT hTouchInput, // input event handle; from touch message lParam
    __in UINT cInputs, // number of elements in the array
    __out_ecount(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


    /*
    * RegisterTouchWindow flag values
    */
    #define TWF_FINETOUCH (0x00000001)
    #define TWF_WANTPALM (0x00000002)

    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 /* WINVER >= 0x0601 */

    #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_ecount_opt(nCount) CONST HANDLE *pHandles,
    __in BOOL fWaitAll,
    __in DWORD dwMilliseconds,
    __in DWORD dwWakeMask);

    WINUSERAPI
    DWORD
    WINAPI
    MsgWaitForMultipleObjectsEx(
    __in DWORD nCount,
    __in_ecount_opt(nCount) CONST HANDLE *pHandles,
    __in DWORD dwMilliseconds,
    __in DWORD dwWakeMask,
    __in DWORD dwFlags);


    #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 */

    #define QS_MOUSE (QS_MOUSEMOVE |
    QS_MOUSEBUTTON)

    #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)

    #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

    /*
    * Windows Functions
    */

    WINUSERAPI
    UINT_PTR
    WINAPI
    SetTimer(
    __in_opt HWND hWnd,
    __in UINT_PTR nIDEvent,
    __in UINT uElapse,
    __in_opt TIMERPROC lpTimerFunc);

    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_ecount(cAccel) LPACCEL paccel,
    __in int cAccel);
    WINUSERAPI
    HACCEL
    WINAPI
    CreateAcceleratorTableW(
    __in_ecount(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_ecount_part_opt(cAccelEntries, return) LPACCEL lpAccelDst,
    __in int cAccelEntries);
    WINUSERAPI
    int
    WINAPI
    CopyAcceleratorTableW(
    __in HACCEL hAccelSrc,
    __out_ecount_part_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 */

    #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 */

    #endif /* WINVER >= 0x0500 */


    WINUSERAPI
    int
    WINAPI
    GetSystemMetrics(
    __in int nIndex);


    #endif /* !NOSYSMETRICS */

    #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_ecount_opt(cchMax) LPSTR lpString,
    __in int cchMax,
    __in UINT flags);
    WINUSERAPI
    int
    WINAPI
    GetMenuStringW(
    __in HMENU hMenu,
    __in UINT uIDItem,
    __out_ecount_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,
    __in int nReserved,
    __in HWND hWnd,
    __in_opt 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,
    __in UINT,
    __in int,
    __in int,
    __in HWND,
    __in_opt LPTPMPARAMS);
    #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
    __field_ecount_opt(cch) 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
    __field_ecount_opt(cch) 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 */


    #if(WINVER >= 0x0400)
    //
    // 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;

    #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

    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 /* WINVER >= 0x0400 */

    WINUSERAPI
    BOOL
    WINAPI
    DrawIcon(
    __in HDC hDC,
    __in int X,
    __in int Y,
    __in HICON hIcon);

    #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 */

    typedef struct tagDRAWTEXTPARAMS
    {
    UINT cbSize;
    int iTabLength;
    int iLeftMargin;
    int iRightMargin;
    UINT uiLengthDrawn;
    } DRAWTEXTPARAMS, FAR *LPDRAWTEXTPARAMS;
    #endif /* WINVER >= 0x0400 */


    WINUSERAPI
    int
    WINAPI
    DrawTextA(
    __in HDC hdc,
    __inout_ecount_opt(cchText) LPCSTR lpchText,
    __in int cchText,
    __inout LPRECT lprc,
    __in UINT format);
    WINUSERAPI
    int
    WINAPI
    DrawTextW(
    __in HDC hdc,
    __inout_ecount_opt(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
    int
    WINAPI
    DrawTextExA(
    __in HDC hdc,
    __inout_ecount_opt(cchText) LPSTR lpchText,
    __in int cchText,
    __inout LPRECT lprc,
    __in UINT format,
    __in_opt LPDRAWTEXTPARAMS lpdtp);
    WINUSERAPI
    int
    WINAPI
    DrawTextExW(
    __in HDC hdc,
    __inout_ecount_opt(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 /* !NODRAWTEXT */

    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

    #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

    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 /* WINVER >= 0x0400 */

    WINUSERAPI
    LONG
    WINAPI
    TabbedTextOutA(
    __in HDC hdc,
    __in int x,
    __in int y,
    __in_ecount(chCount) LPCSTR lpString,
    __in int chCount,
    __in int nTabPositions,
    __in_ecount_opt(nTabPositions) CONST INT *lpnTabStopPositions,
    __in int nTabOrigin);
    WINUSERAPI
    LONG
    WINAPI
    TabbedTextOutW(
    __in HDC hdc,
    __in int x,
    __in int y,
    __in_ecount(chCount) LPCWSTR lpString,
    __in int chCount,
    __in int nTabPositions,
    __in_ecount_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_ecount(chCount) LPCSTR lpString,
    __in int chCount,
    __in int nTabPositions,
    __in_ecount_opt(nTabPositions) CONST INT *lpnTabStopPositions);
    WINUSERAPI
    DWORD
    WINAPI
    GetTabbedTextExtentW(
    __in HDC hdc,
    __in_ecount(chCount) LPCWSTR lpString,
    __in int chCount,
    __in int nTabPositions,
    __in_ecount_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);

    /*
    * 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

    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);


    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);

    /*
    * 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


    /*
    * 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);

    #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 */

    #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

    WINUSERAPI
    int
    WINAPI
    GetWindowTextA(
    __in HWND hWnd,
    __out_ecount(nMaxCount) LPSTR lpString,
    __in int nMaxCount);
    WINUSERAPI
    int
    WINAPI
    GetWindowTextW(
    __in HWND hWnd,
    __out_ecount(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);


    #if(WINVER >= 0x0400)
    #define HELPINFO_WINDOW 0x0001
    #define HELPINFO_MENUITEM 0x0002
    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 /* 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

    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 */


    WINUSERAPI
    BOOL
    WINAPI
    MessageBeep(
    __in UINT uType);

    #endif /* !NOMB */


    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 */

    WINUSERAPI
    int
    WINAPI
    MapWindowPoints(
    __in_opt HWND hWndFrom,
    __in_opt HWND hWndTo,
    __inout_ecount(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);

    #if(WINVER >= 0x0400)
    #define CWP_ALL 0x0000
    #define CWP_SKIPINVISIBLE 0x0001
    #define CWP_SKIPDISABLED 0x0002
    #define CWP_SKIPTRANSPARENT 0x0004

    WINUSERAPI
    HWND
    WINAPI
    ChildWindowFromPointEx(
    __in HWND hwnd,
    __in POINT pt,
    __in UINT flags);
    #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 */


    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_ecount(cElements) CONST INT * lpaElements,
    __in_ecount(cElements) CONST COLORREF * lpaRgbValues);

    #endif /* !NOCOLOR */

    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_ecount_part(nMaxCount, return) LPSTR lpClassName,
    __in int nMaxCount
    );
    WINUSERAPI
    int
    WINAPI
    GetClassNameW(
    __in HWND hWnd,
    __out_ecount_part(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 */

    #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 */


    #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 /* !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
    */

    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

    /*
    * 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 */

    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 LPCSTR szFileName,
    __in int nIconIndex,
    __in int cxIcon,
    __in int cyIcon,
    __out_ecount_part_opt(nIcons, return) HICON *phicon,
    __out_ecount_part_opt(nIcons, return) UINT *piconid,
    __in UINT nIcons,
    __in UINT flags);
    WINUSERAPI
    UINT
    WINAPI
    PrivateExtractIconsW(
    __in LPCWSTR szFileName,
    __in int nIconIndex,
    __in int cxIcon,
    __in int cyIcon,
    __out_ecount_part_opt(nIcons, return) HICON *phicon,
    __out_ecount_part_opt(nIcons, return) 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 PBYTE presbits,
    __in BOOL fIcon);

    #if(WINVER >= 0x0400)
    WINUSERAPI
    int
    WINAPI
    LookupIconIdFromDirectoryEx(
    __in PBYTE presbits,
    __in BOOL fIcon,
    __in int cxDesired,
    __in int cyDesired,
    __in UINT Flags);
    #endif /* WINVER >= 0x0400 */

    WINUSERAPI
    HICON
    WINAPI
    CreateIconFromResource(
    __in PBYTE presbits,
    __in DWORD dwResSize,
    __in BOOL fIcon,
    __in DWORD dwVer);

    #if(WINVER >= 0x0400)
    WINUSERAPI
    HICON
    WINAPI
    CreateIconFromResourceEx(
    __in 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 */

    #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

    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 /* WINVER >= 0x0400 */

    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 */

    #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 */


    WINUSERAPI
    int
    WINAPI
    LoadStringA(
    __in_opt HINSTANCE hInstance,
    __in UINT uID,
    __out_ecount_part(cchBufferMax, return + 1) LPSTR lpBuffer,
    __in int cchBufferMax);
    WINUSERAPI
    int
    WINAPI
    LoadStringW(
    __in_opt HINSTANCE hInstance,
    __in UINT uID,
    __out_ecount_part(cchBufferMax, return + 1) LPWSTR lpBuffer,
    __in int cchBufferMax);
    #ifdef UNICODE
    #define LoadString LoadStringW
    #else
    #define LoadString LoadStringA
    #endif // !UNICODE


    /*
    * 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)

    /*
    * 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

    /*
    * 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

    WINUSERAPI
    BOOL
    WINAPI
    DlgDirSelectExA(
    __in HWND hwndDlg,
    __out_ecount(chCount) LPSTR lpString,
    __in int chCount,
    __in int idListBox);
    WINUSERAPI
    BOOL
    WINAPI
    DlgDirSelectExW(
    __in HWND hwndDlg,
    __out_ecount(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_ecount(cchOut) LPSTR lpString,
    __in int cchOut,
    __in int idComboBox);
    WINUSERAPI
    BOOL
    WINAPI
    DlgDirSelectComboBoxExW(
    __in HWND hwndDlg,
    __out_ecount(cchOut) LPWSTR lpString,
    __in int cchOut,
    __in int idComboBox);
    #ifdef UNICODE
    #define DlgDirSelectComboBoxEx DlgDirSelectComboBoxExW
    #else
    #define DlgDirSelectComboBoxEx DlgDirSelectComboBoxExA
    #endif // !UNICODE

    /*
    * 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(_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(_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(_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(_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(_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)

    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 /* 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 */

    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_ecount_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_ecount_opt(cKids) const HWND FAR * lpKids);

    #endif /* WINVER >= 0x0400 */
    #endif /* !NOMDI */

    #endif /* !NOUSER */

    /****** Help support ********************************************************/

    #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 */

    #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 */

    #if(WINVER >= 0x0500)
    WINUSERAPI
    DWORD
    WINAPI
    GetGuiResources(
    __in HANDLE hProcess,
    __in DWORD uiFlags);
    #endif /* WINVER >= 0x0500 */


    #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 >= 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 */

    #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 */

    #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
    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 /* 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

    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

    /* 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 */

    #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_ecount_opt(numPathArrayElements) DISPLAYCONFIG_PATH_INFO* pathArray,
    __in UINT32 numModeInfoArrayElements,
    __in_ecount_opt(numModeInfoArrayElements) DISPLAYCONFIG_MODE_INFO* modeInfoArray,
    __in UINT32 flags);

    WINUSERAPI
    LONG
    WINAPI
    QueryDisplayConfig(
    __in UINT32 flags,
    __inout UINT32* numPathArrayElements,
    __out_ecount_part(*numPathArrayElements, *numPathArrayElements) DISPLAYCONFIG_PATH_INFO* pathArray,
    __inout UINT32* numModeInfoArrayElements,
    __out_ecount_part(*numModeInfoArrayElements, *numModeInfoArrayElements) DISPLAYCONFIG_MODE_INFO* modeInfoArray,
    __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
    BOOL
    WINAPI
    SystemParametersInfoA(
    __in UINT uiAction,
    __in UINT uiParam,
    __inout_opt PVOID pvParam,
    __in UINT fWinIni);
    WINUSERAPI
    BOOL
    WINAPI
    SystemParametersInfoW(
    __in UINT uiAction,
    __in UINT uiParam,
    __inout_opt PVOID pvParam,
    __in UINT fWinIni);
    #ifdef UNICODE
    #define SystemParametersInfo SystemParametersInfoW
    #else
    #define SystemParametersInfo SystemParametersInfoA
    #endif // !UNICODE


    #endif /* !NOSYSPARAMSINFO */

    /*
    * 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;

    /*
    * 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

    typedef struct tagSTICKYKEYS
    {
    UINT cbSize;
    DWORD dwFlags;
    } STICKYKEYS, *LPSTICKYKEYS;

    /*
    * 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 */

    typedef struct tagMOUSEKEYS
    {
    UINT cbSize;
    DWORD dwFlags;
    DWORD iMaxSpeed;
    DWORD iTimeToMaxSpeed;
    DWORD iCtrlSpeed;
    DWORD dwReserved1;
    DWORD dwReserved2;
    } MOUSEKEYS, *LPMOUSEKEYS;

    /*
    * 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 */

    typedef struct tagACCESSTIMEOUT
    {
    UINT cbSize;
    DWORD dwFlags;
    DWORD iTimeOutMSec;
    } ACCESSTIMEOUT, *LPACCESSTIMEOUT;

    /*
    * 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

    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

    /*
    * SOUNDSENTRY dwFlags field
    */
    #define SSF_SOUNDSENTRYON 0x00000001
    #define SSF_AVAILABLE 0x00000002
    #define SSF_INDICATOR 0x00000004

    #if(_WIN32_WINNT >= 0x0600)
    WINUSERAPI
    BOOL
    WINAPI
    SoundSentry(VOID);
    #endif /* _WIN32_WINNT >= 0x0600 */

    typedef struct tagTOGGLEKEYS
    {
    UINT cbSize;
    DWORD dwFlags;
    } TOGGLEKEYS, *LPTOGGLEKEYS;

    /*
    * 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

    #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);

    /*
    * SetLastErrorEx() types.
    */

    #define SLE_ERROR 0x00000001
    #define SLE_MINORERROR 0x00000002
    #define SLE_WARNING 0x00000003

    WINUSERAPI
    VOID
    WINAPI
    SetLastErrorEx(
    __in DWORD dwErrCode,
    __in DWORD dwType);

    WINUSERAPI
    int
    WINAPI
    InternalGetWindowText(
    __in HWND hWnd,
    __out_ecount_part(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);


    #if(WINVER >= 0x0500)

    /*
    * Multimonitor API.
    */

    #define MONITOR_DEFAULTTONULL 0x00000000
    #define MONITOR_DEFAULTTOPRIMARY 0x00000001
    #define MONITOR_DEFAULTTONEAREST 0x00000002

    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);

    #define MONITORINFOF_PRIMARY 0x00000001

    #ifndef CCHDEVICENAME
    #define CCHDEVICENAME 32
    #endif

    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);


    #ifndef NOWINABLE

    /*
    * 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 */

    /*
    * 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

    WINUSERAPI
    BOOL
    WINAPI
    UnhookWinEvent(
    __in HWINEVENTHOOK hWinEventHook);

    /*
    * 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 >= 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 >= 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

    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;

    #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 */

    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_ecount_part(cchFileNameMax, return) LPSTR pszFileName,
    __in UINT cchFileNameMax);
    WINUSERAPI
    UINT
    WINAPI
    GetWindowModuleFileNameW(
    __in HWND hwnd,
    __out_ecount_part(cchFileNameMax, return) LPWSTR pszFileName,
    __in UINT cchFileNameMax);
    #ifdef UNICODE
    #define GetWindowModuleFileName GetWindowModuleFileNameW
    #else
    #define GetWindowModuleFileName GetWindowModuleFileNameA
    #endif // !UNICODE

    #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

    /*
    * Information about the global cursor.
    */
    typedef struct tagCURSORINFO
    {
    DWORD cbSize;
    DWORD flags;
    HCURSOR hCursor;
    POINT ptScreenPos;
    } CURSORINFO, *PCURSORINFO, *LPCURSORINFO;

    #define CURSOR_SHOWING 0x00000001

    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);

    /*
    * The "real" ancestor window
    */
    #define GA_PARENT 1
    #define GA_ROOT 2
    #define GA_ROOTOWNER 3

    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_ecount_part(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_ecount_part(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_ecount_opt(cchItemText) LPSTR pszItemText,
    __in UINT cchItemText);
    WINUSERAPI
    BOOL
    WINAPI
    GetAltTabInfoW(
    __in_opt HWND hwnd,
    __in int iItem,
    __inout PALTTABINFO pati,
    __out_ecount_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 /* NOWINABLE */
    #endif /* WINVER >= 0x0500 */


    #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 */

    #if(_WIN32_WINNT >= 0x0501)

    /*
    * Raw Input Messages.
    */

    DECLARE_HANDLE(HRAWINPUT);

    /*
    * 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


    /*
    * Raw Input data header
    */
    typedef struct tagRAWINPUTHEADER {
    DWORD dwType;
    DWORD dwSize;
    HANDLE hDevice;
    WPARAM wParam;
    } RAWINPUTHEADER, *PRAWINPUTHEADER, *LPRAWINPUTHEADER;

    /*
    * Type of the raw input
    */
    #define RIM_TYPEMOUSE 0
    #define RIM_TYPEKEYBOARD 1
    #define RIM_TYPEHID 2

    /*
    * 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;

    /*
    * 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 */

    /*
    * 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;


    /*
    * 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


    /*
    * 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;

    /*
    * RAWINPUT data structure.
    */
    typedef struct tagRAWINPUT {
    RAWINPUTHEADER header;
    union {
    RAWMOUSE mouse;
    RAWKEYBOARD keyboard;
    RAWHID hid;
    } data;
    } RAWINPUT, *PRAWINPUT, *LPRAWINPUT;

    #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

    WINUSERAPI
    UINT
    WINAPI
    GetRawInputData(
    __in HRAWINPUT hRawInput,
    __in UINT uiCommand,
    __out_bcount_part_opt(*pcbSize, return) LPVOID pData,
    __inout PUINT pcbSize,
    __in UINT cbSizeHeader);

    /*
    * 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

    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_bcount_part_opt(*pcbSize, *pcbSize) LPVOID pData,
    __inout PUINT pcbSize);
    WINUSERAPI
    UINT
    WINAPI
    GetRawInputDeviceInfoW(
    __in_opt HANDLE hDevice,
    __in UINT uiCommand,
    __inout_bcount_part_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_bcount_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;

    #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) */

    WINUSERAPI
    BOOL
    WINAPI
    RegisterRawInputDevices(
    __in_ecount(uiNumDevices) PCRAWINPUTDEVICE pRawInputDevices,
    __in UINT uiNumDevices,
    __in UINT cbSize);

    WINUSERAPI
    UINT
    WINAPI
    GetRegisteredRawInputDevices(
    __out_ecount_opt( *puiNumDevices) PRAWINPUTDEVICE pRawInputDevices,
    __inout PUINT puiNumDevices,
    __in UINT cbSize);


    typedef struct tagRAWINPUTDEVICELIST {
    HANDLE hDevice;
    DWORD dwType;
    } RAWINPUTDEVICELIST, *PRAWINPUTDEVICELIST;

    WINUSERAPI
    UINT
    WINAPI
    GetRawInputDeviceList(
    __out_ecount_opt(*puiNumDevices) PRAWINPUTDEVICELIST pRawInputDeviceList,
    __inout PUINT puiNumDevices,
    __in UINT cbSize);

    WINUSERAPI
    LRESULT
    WINAPI
    DefRawInputProc(
    __in_ecount(nInput) PRAWINPUT* paRawInput,
    __in INT nInput,
    __in UINT cbSizeHeader);

    #endif /* _WIN32_WINNT >= 0x0501 */


    #if(WINVER >= 0x0600)

    /*
    * Message Filter
    */

    #define MSGFLT_ADD 1
    #define MSGFLT_REMOVE 2

    WINUSERAPI
    BOOL
    WINAPI
    ChangeWindowMessageFilter(
    __in UINT message,
    __in DWORD dwFlag);

    #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)

    typedef struct tagCHANGEFILTERSTRUCT {
    DWORD cbSize;
    DWORD ExtStatus;
    } CHANGEFILTERSTRUCT, *PCHANGEFILTERSTRUCT;

    /*
    * Message filter action values (action parameter to ChangeWindowMessageFilterEx)
    */
    #define MSGFLT_RESET (0)
    #define MSGFLT_ALLOW (1)
    #define MSGFLT_DISALLOW (2)

    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 /* WINVER >= 0x0601 */


    #if(WINVER >= 0x0601)

    /*
    * Gesture defines and functions
    */

    /*
    * Gesture information handle
    */
    DECLARE_HANDLE(HGESTUREINFO);


    /*
    * 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

    /*
    * 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_bcount(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;

    /*
    * 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

    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_ecount(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_ecount(*pcIDs) PGESTURECONFIG pGestureConfig,
    // pointer to buffer to receive the returned array of GESTURECONFIG structures
    __in UINT cbSize); // sizeof(GESTURECONFIG)

    #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

    WINUSERAPI
    BOOL
    WINAPI
    ShutdownBlockReasonCreate(
    __in HWND hWnd,
    __in LPCWSTR pwszReason);

    WINUSERAPI
    BOOL
    WINAPI
    ShutdownBlockReasonQuery(
    __in HWND hWnd,
    __out_ecount_opt(*pcchBuff) LPWSTR pwszBuff,
    __inout DWORD *pcchBuff);

    WINUSERAPI
    BOOL
    WINAPI
    ShutdownBlockReasonDestroy(
    __in HWND hWnd);


    #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_ */

  • 相关阅读:
    SVG.js 文本绘制整理
    SVG.js 基础图形绘制整理(二)
    SVG.js 基础图形绘制整理(一)
    C# 异步编程Task整理(一)
    Svg.Js 父类的基础操作
    Svg.Js A标签,链接操作
    Svg.Js 简介(转)
    SVG 相关整理
    Kendo UI
    Kendo UI
  • 原文地址:https://www.cnblogs.com/moonlight-zjb/p/3442280.html
Copyright © 2011-2022 走看看