view dynamin/c/windows.d @ 0:aa4efef0f0b1

Initial commit of code.
author Jordan Miner <jminer7@gmail.com>
date Mon, 15 Jun 2009 22:10:48 -0500
parents
children c41eb8d907b2
line wrap: on
line source

module dynamin.c.windows;

/*
 * A binding to at least the part of the Windows API that Dynamin uses. This
 * binding is obviously very incomplete but does contain several functions
 * that the standard Windows binding does not contain.
 */

version(Windows) {
} else {
	static assert(0);
}

version(build) { pragma(link, gdi32, comdlg32, shell32, ole32, winmm); }

extern(Windows):

version = UNICODE;
alias char*	 LPSTR;
alias wchar* LPWSTR;
alias char*	 LPCSTR;
alias wchar* LPCWSTR;
version(UNICODE) {
	alias wchar	  TCHAR;
	alias LPWSTR  LPTSTR;
	alias LPCWSTR LPCTSTR;
} else {
	alias char	 TCHAR;
	alias LPSTR	 LPTSTR;
	alias LPCSTR LPCTSTR;
}

alias VOID*		HANDLE;
alias HANDLE	HBITMAP;
alias HANDLE	HBRUSH;
alias HANDLE	HICON;
alias HICON		HCURSOR;
alias HANDLE	HDC;
alias HANDLE	HGDIOBJ;
alias HANDLE	HGLOBAL;
alias int		HFILE;
alias HANDLE	HFONT;
alias HANDLE	HINSTANCE;
alias HANDLE	HKEY;
alias HANDLE	HMENU;
alias HINSTANCE HMODULE;
alias int		HRESULT;
alias HANDLE	HRGN;
alias HANDLE	HTHEME;
alias HANDLE	HWND;

version(Win64) {
	alias int	HALF_PTR;
	alias uint	UHALF_PTR;
	alias long	INT_PTR;
	alias ulong UINT_PTR;
	alias long	LONG_PTR;
	alias ulong ULONG_PTR;
} else {
	alias short	 HALF_PTR;
	alias ushort UHALF_PTR;
	alias int	 INT_PTR;
	alias uint	 UINT_PTR;
	alias int	 LONG_PTR;
	alias uint	 ULONG_PTR;
}

alias INT_PTR function() FARPROC;
alias int		BOOL;
alias ubyte		BYTE;
alias char		CHAR;
alias wchar     WCHAR;
alias uint		DWORD;
alias ulong		DWORDLONG;
alias uint		DWORD32;
alias ulong		DWORD64;
alias float		FLOAT;
alias int		INT;
alias int		INT32;
alias long		INT64;
alias int		LONG;
alias int		LONG32;
alias long		LONG64;
alias UINT_PTR	WPARAM;
alias LONG_PTR	LPARAM;
alias LONG_PTR	LRESULT;
alias char		UCHAR;
alias uint		UINT;
alias uint		UINT32;
alias ulong		UINT64;
alias uint		ULONG;
alias uint		ULONG32;
alias ulong		ULONG64;
alias short		SHORT;
alias ushort	USHORT;
alias void		VOID;
alias ushort	WORD;
alias WORD		ATOM;
alias ULONG_PTR SIZE_T;
alias DWORD		COLORREF;
alias LONG      NTSTATUS;

const HRESULT S_OK	  = 0;
const HRESULT S_FALSE = 1;
const HRESULT NOERROR = 0;

const int MAX_PATH = 260;

alias UINT_PTR function(HWND hdlg, UINT uiMsg, WPARAM wParam, LPARAM lParam) LPOFNHOOKPROC;
alias LRESULT function(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) WNDPROC;
alias int function(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData) BFFCALLBACK;

public import tango.sys.win32.Macros;
//public import tango.sys.win32.UserGdi : LOWORD, HIWORD, RGB;

WORD MAKEWORD(BYTE a, BYTE b) { return cast(WORD)a | cast(WORD)b << 8; }
LONG MAKELONG(WORD a, WORD b) { return cast(WORD)a | cast(WORD)b << 16; }
BYTE LOBYTE(WORD w) { return cast(BYTE)(w & 0xff); }
BYTE HIBYTE(WORD w) { return cast(BYTE)(w >> 8); }
LPWSTR MAKEINTRESOURCE(int i) { return cast(LPWSTR)cast(WORD)i; }
BYTE GetRValue(DWORD rgb) { return LOBYTE(rgb); }
BYTE GetGValue(DWORD rgb) { return LOBYTE(cast(WORD)rgb >> 8); }
BYTE GetBValue(DWORD rgb) { return LOBYTE(rgb >> 16); }

int MessageBoxA(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType);
int MessageBoxW(HWND hWnd, LPCWSTR lpText, LPCWSTR lpCaption, UINT uType);

DWORD GetLastError();

int MultiByteToWideChar(
	UINT CodePage,
	DWORD dwFlags,
	LPCSTR lpMultiByteStr,
	int cbMultiByte,
	LPWSTR lpWideCharStr,
	int cchWideChar);

int WideCharToMultiByte(
	UINT CodePage,
	DWORD dwFlags,
	LPCWSTR lpWideCharStr,
	int cchWideChar,
	LPSTR lpMultiByteStr,
	int cbMultiByte,
	LPCSTR lpDefaultChar,
	BOOL* lpUsedDefaultChar);

//{{{ memory functions
HANDLE GetProcessHeap();

VOID* HeapAlloc(HANDLE hHeap, DWORD dwFlags, SIZE_T dwBytes);

VOID* HeapReAlloc(HANDLE hHeap, DWORD dwFlags, VOID* lpMem, SIZE_T dwBytes);

BOOL HeapFree(HANDLE hHeap, DWORD dwFlags, VOID* lpMem);

SIZE_T HeapSize(HANDLE hHeap, DWORD dwFlags, /*const*/ VOID* lpMem);

enum {
	HEAP_ZERO_MEMORY = 0x0008,
	HEAP_REALLOC_IN_PLACE_ONLY = 0x0010
}

HGLOBAL GlobalAlloc(UINT uFlags, SIZE_T dwBytes);

HGLOBAL GlobalReAlloc(HGLOBAL hMem, SIZE_T dwBytes, UINT uFlags);

HGLOBAL GlobalFree(HGLOBAL hMem);

VOID* GlobalLock(HGLOBAL hMem);

BOOL GlobalUnlock(HGLOBAL hMem);

enum {
	GMEM_FIXED = 0x0000,
	GMEM_MOVEABLE = 0x0002,
	GMEM_ZEROINIT = 0x0040,
	GPTR = 0x0040,
	GHND = 0x0042
}
//}}}

//{{{ window functions
enum {
	CS_VREDRAW =	 0x0001,
	CS_HREDRAW =	 0x0002,
	CS_DBLCLKS =	 0x0008,
	CS_OWNDC =		 0x0020,
	CS_CLASSDC =	 0x0040,
	CS_PARENTDC =	 0x0080,
	CS_NOCLOSE =	 0x0200,
	CS_SAVEBITS =	 0x0800,
	CS_BYTEALIGNCLIENT = 0x1000,
	CS_BYTEALIGNWINDOW = 0x2000,
	CS_GLOBALCLASS = 0x4000,
	//Windows XP required
	CS_DROPSHADOW =	 0x00020000

}
ATOM RegisterClassExA(/*const*/ WNDCLASSEX* lpwcx);
ATOM RegisterClassExW(/*const*/ WNDCLASSEX* lpwcx);

LRESULT DefWindowProcW(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

//{{{ window styles
enum {
	WS_OVERLAPPED =	  0x00000000,
	WS_MAXIMIZEBOX =  0x00010000,
	WS_TABSTOP =	  0x00010000,
	WS_GROUP =		  0x00020000,
	WS_MINIMIZEBOX =  0x00020000,
	WS_THICKFRAME =	  0x00040000,
	WS_SYSMENU =	  0x00080000,
	WS_HSCROLL =	  0x00100000,
	WS_VSCROLL =	  0x00200000,
	WS_DLGFRAME =	  0x00400000,
	WS_BORDER =		  0x00800000,
	WS_CAPTION =	  0x00C00000,
	WS_MAXIMIZE =	  0x01000000,
	WS_CLIPCHILDREN = 0x02000000,
	WS_CLIPSIBLINGS = 0x04000000,
	WS_DISABLED =	  0x08000000,
	WS_VISIBLE =	  0x10000000,
	WS_MINIMIZE =	  0x20000000,
	WS_CHILD =		  0x40000000,
	WS_POPUP =		  0x80000000,
	WS_OVERLAPPEDWINDOW = WS_OVERLAPPED |
						  WS_CAPTION |
						  WS_SYSMENU |
						  WS_THICKFRAME |
						  WS_MINIMIZEBOX |
						  WS_MAXIMIZEBOX,
	WS_POPUPWINDOW =  WS_POPUP |
					  WS_BORDER |
					  WS_SYSMENU,
	WS_CHILDWINDOW =  WS_CHILD,
	WS_TILED =		  WS_OVERLAPPED,
	WS_ICONIC =		  WS_MINIMIZE,
	WS_SIZEBOX =	  WS_THICKFRAME,
	WS_TILEDWINDOW =  WS_OVERLAPPEDWINDOW
}
//}}}

//{{{ extended window styles
enum {
	WS_EX_DLGMODALFRAME =	 0x00000001,
	WS_EX_TOPMOST =			 0x00000008,
	WS_EX_TOOLWINDOW =		 0x00000080,
	WS_EX_WINDOWEDGE =		 0x00000100,
	WS_EX_CLIENTEDGE =		 0x00000200,
	WS_EX_CONTROLPARENT =	 0x00010000,
	WS_EX_STATICEDGE =		 0x00020000,
	WS_EX_APPWINDOW =		 0x00040000,
	WS_EX_LAYERED =			 0x00080000,
	WS_EX_OVERLAPPEDWINDOW = WS_EX_WINDOWEDGE | WS_EX_CLIENTEDGE,
	WS_EX_COMPOSITED =		 0x02000000
}
//}}}

//{{{ CreateWindowEx()
HWND CreateWindowExA(
	DWORD dwExStyle,
	LPCSTR lpClassName,
	LPCSTR lpWindowName,
	DWORD dwStyle,
	int x,
	int y,
	int nWidth,
	int nHeight,
	HWND hWndParent,
	HMENU hMenu,
	HINSTANCE hInstance,
	VOID* lpParam);
HWND CreateWindowExW(
	DWORD dwExStyle,
	LPCWSTR lpClassName,
	LPCWSTR lpWindowName,
	DWORD dwStyle,
	int x,
	int y,
	int nWidth,
	int nHeight,
	HWND hWndParent,
	HMENU hMenu,
	HINSTANCE hInstance,
	VOID* lpParam);
//}}}

BOOL DestroyWindow(HWND hWnd);

BOOL ClientToScreen(HWND hWnd, POINT* lpPoint);

BOOL ScreenToClient(HWND hWnd, POINT* lpPoint);

//{{{ messages
enum {
	WM_NULL					  = 0x0000,
	WM_CREATE				  = 0x0001,
	WM_DESTROY				  = 0x0002,
	WM_MOVE					  = 0x0003,
	WM_SIZE					  = 0x0005,
	WM_ACTIVATE				  = 0x0006,
	WM_SETFOCUS				  = 0x0007,
	WM_KILLFOCUS			  = 0x0008,
	WM_ENABLE				  = 0x000A,
	WM_SETREDRAW			  = 0x000B,
	WM_SETTEXT				  = 0x000C,
	WM_GETTEXT				  = 0x000D,
	WM_GETTEXTLENGTH		  = 0x000E,
	WM_PAINT				  = 0x000F,
	WM_CLOSE				  = 0x0010,
	WM_QUERYENDSESSION		  = 0x0011,
	WM_QUERYOPEN			  = 0x0013,
	WM_ENDSESSION			  = 0x0016,
	WM_QUIT					  = 0x0012,
	WM_ERASEBKGND			  = 0x0014,
	WM_SYSCOLORCHANGE		  = 0x0015,
	WM_SHOWWINDOW			  = 0x0018,
	WM_WININICHANGE			  = 0x001A,
	WM_SETTINGCHANGE		  = WM_WININICHANGE,
	WM_DEVMODECHANGE		  = 0x001B,
	WM_ACTIVATEAPP			  = 0x001C,
	WM_FONTCHANGE			  = 0x001D,
	WM_TIMECHANGE			  = 0x001E,
	WM_CANCELMODE			  = 0x001F,
	WM_SETCURSOR			  = 0x0020,
	WM_MOUSEACTIVATE		  = 0x0021,
	WM_CHILDACTIVATE		  = 0x0022,
	WM_QUEUESYNC			  = 0x0023,
	WM_GETMINMAXINFO		  = 0x0024,
	WM_PAINTICON			  = 0x0026,
	WM_ICONERASEBKGND		  = 0x0027,
	WM_NEXTDLGCTL			  = 0x0028,
	WM_SPOOLERSTATUS		  = 0x002A,
	WM_DRAWITEM				  = 0x002B,
	WM_MEASUREITEM			  = 0x002C,
	WM_DELETEITEM			  = 0x002D,
	WM_VKEYTOITEM			  = 0x002E,
	WM_CHARTOITEM			  = 0x002F,
	WM_SETFONT				  = 0x0030,
	WM_GETFONT				  = 0x0031,
	WM_SETHOTKEY			  = 0x0032,
	WM_GETHOTKEY			  = 0x0033,
	WM_QUERYDRAGICON		  = 0x0037,
	WM_COMPAREITEM			  = 0x0039,
	WM_GETOBJECT			  = 0x003D,
	WM_COMPACTING			  = 0x0041,
	WM_WINDOWPOSCHANGING	  = 0x0046,
	WM_WINDOWPOSCHANGED		  = 0x0047,
	WM_POWER				  = 0x0048,
	WM_COPYDATA				  = 0x004A,
	WM_CANCELJOURNAL		  = 0x004B,
	WM_NOTIFY				  = 0x004E,
	WM_INPUTLANGCHANGEREQUEST = 0x0050,
	WM_INPUTLANGCHANGE		  = 0x0051,
	WM_TCARD				  = 0x0052,
	WM_HELP					  = 0x0053,
	WM_USERCHANGED			  = 0x0054,
	WM_NOTIFYFORMAT			  = 0x0055,
	WM_CONTEXTMENU			  = 0x007B,
	WM_STYLECHANGING		  = 0x007C,
	WM_STYLECHANGED			  = 0x007D,
	WM_DISPLAYCHANGE		  = 0x007E,
	WM_GETICON				  = 0x007F,
	WM_SETICON				  = 0x0080,
	WM_NCCREATE				  = 0x0081,
	WM_NCDESTROY			  = 0x0082,
	WM_NCCALCSIZE			  = 0x0083,
	WM_NCHITTEST			  = 0x0084,
	WM_NCPAINT				  = 0x0085,
	WM_NCACTIVATE			  = 0x0086,
	WM_GETDLGCODE			  = 0x0087,
	WM_SYNCPAINT			  = 0x0088,
	WM_NCMOUSEMOVE			  = 0x00A0,
	WM_NCLBUTTONDOWN		  = 0x00A1,
	WM_NCLBUTTONUP			  = 0x00A2,
	WM_NCLBUTTONDBLCLK		  = 0x00A3,
	WM_NCRBUTTONDOWN		  = 0x00A4,
	WM_NCRBUTTONUP			  = 0x00A5,
	WM_NCRBUTTONDBLCLK		  = 0x00A6,
	WM_NCMBUTTONDOWN		  = 0x00A7,
	WM_NCMBUTTONUP			  = 0x00A8,
	WM_NCMBUTTONDBLCLK		  = 0x00A9,
	WM_NCXBUTTONDOWN		  = 0x00AB,
	WM_NCXBUTTONUP			  = 0x00AC,
	WM_NCXBUTTONDBLCLK		  = 0x00AD,
	WM_INPUT				  = 0x00FF,
	WM_KEYDOWN				  = 0x0100,
	WM_KEYUP				  = 0x0101,
	WM_CHAR					  = 0x0102,
	WM_DEADCHAR				  = 0x0103,
	WM_SYSKEYDOWN			  = 0x0104,
	WM_SYSKEYUP				  = 0x0105,
	WM_SYSCHAR				  = 0x0106,
	WM_SYSDEADCHAR			  = 0x0107,
	WM_UNICHAR				  = 0x0109,
	WM_IME_STARTCOMPOSITION	  = 0x010D,
	WM_IME_ENDCOMPOSITION	  = 0x010E,
	WM_IME_COMPOSITION		  = 0x010F,
	WM_IME_KEYLAST			  = 0x010F,
	WM_INITDIALOG			  = 0x0110,
	WM_COMMAND				  = 0x0111,
	WM_SYSCOMMAND			  = 0x0112,
	WM_TIMER				  = 0x0113,
	WM_HSCROLL				  = 0x0114,
	WM_VSCROLL				  = 0x0115,
	WM_INITMENU				  = 0x0116,
	WM_INITMENUPOPUP		  = 0x0117,
	WM_MENUSELECT			  = 0x011F,
	WM_MENUCHAR				  = 0x0120,
	WM_ENTERIDLE			  = 0x0121,
	WM_MENURBUTTONUP		  = 0x0122,
	WM_MENUDRAG				  = 0x0123,
	WM_MENUGETOBJECT		  = 0x0124,
	WM_UNINITMENUPOPUP		  = 0x0125,
	WM_MENUCOMMAND			  = 0x0126,
	WM_CHANGEUISTATE		  = 0x0127,
	WM_UPDATEUISTATE		  = 0x0128,
	WM_QUERYUISTATE			  = 0x0129,
	WM_CTLCOLORMSGBOX		  = 0x0132,
	WM_CTLCOLOREDIT			  = 0x0133,
	WM_CTLCOLORLISTBOX		  = 0x0134,
	WM_CTLCOLORBTN			  = 0x0135,
	WM_CTLCOLORDLG			  = 0x0136,
	WM_CTLCOLORSCROLLBAR	  = 0x0137,
	WM_CTLCOLORSTATIC		  = 0x0138,
	WM_MOUSEFIRST			  = 0x0200,
	WM_MOUSEMOVE			  = 0x0200,
	WM_LBUTTONDOWN			  = 0x0201,
	WM_LBUTTONUP			  = 0x0202,
	WM_LBUTTONDBLCLK		  = 0x0203,
	WM_RBUTTONDOWN			  = 0x0204,
	WM_RBUTTONUP			  = 0x0205,
	WM_RBUTTONDBLCLK		  = 0x0206,
	WM_MBUTTONDOWN			  = 0x0207,
	WM_MBUTTONUP			  = 0x0208,
	WM_MBUTTONDBLCLK		  = 0x0209,
	WM_MOUSEWHEEL			  = 0x020A,
	WM_XBUTTONDOWN			  = 0x020B,
	WM_XBUTTONUP			  = 0x020C,
	WM_XBUTTONDBLCLK		  = 0x020D,
	WM_PARENTNOTIFY			  = 0x0210,
	WM_ENTERMENULOOP		  = 0x0211,
	WM_EXITMENULOOP			  = 0x0212,
	WM_NEXTMENU				  = 0x0213,
	WM_SIZING				  = 0x0214,
	WM_CAPTURECHANGED		  = 0x0215,
	WM_MOVING				  = 0x0216,
	WM_POWERBROADCAST		  = 0x0218,
	WM_DEVICECHANGE			  = 0x0219,
	WM_MDICREATE			  = 0x0220,
	WM_MDIDESTROY			  = 0x0221,
	WM_MDIACTIVATE			  = 0x0222,
	WM_MDIRESTORE			  = 0x0223,
	WM_MDINEXT				  = 0x0224,
	WM_MDIMAXIMIZE			  = 0x0225,
	WM_MDITILE				  = 0x0226,
	WM_MDICASCADE			  = 0x0227,
	WM_MDIICONARRANGE		  = 0x0228,
	WM_MDIGETACTIVE			  = 0x0229,
	WM_MDISETMENU			  = 0x0230,
	WM_ENTERSIZEMOVE		  = 0x0231,
	WM_EXITSIZEMOVE			  = 0x0232,
	WM_DROPFILES			  = 0x0233,
	WM_MDIREFRESHMENU		  = 0x0234,
	WM_IME_SETCONTEXT		  = 0x0281,
	WM_IME_NOTIFY			  = 0x0282,
	WM_IME_CONTROL			  = 0x0283,
	WM_IME_COMPOSITIONFULL	  = 0x0284,
	WM_IME_SELECT			  = 0x0285,
	WM_IME_CHAR				  = 0x0286,
	WM_IME_REQUEST			  = 0x0288,
	WM_IME_KEYDOWN			  = 0x0290,
	WM_IME_KEYUP			  = 0x0291,
	WM_MOUSEHOVER			  = 0x02A1,
	WM_MOUSELEAVE			  = 0x02A3,
	WM_NCMOUSEHOVER			  = 0x02A0,
	WM_NCMOUSELEAVE			  = 0x02A2,
	WM_WTSSESSION_CHANGE	  = 0x02B1,
	WM_TABLET_FIRST			  = 0x02C0,
	WM_TABLET_LAST			  = 0x02DF,
	WM_CUT					  = 0x0300,
	WM_COPY					  = 0x0301,
	WM_PASTE				  = 0x0302,
	WM_CLEAR				  = 0x0303,
	WM_UNDO					  = 0x0304,
	WM_RENDERFORMAT			  = 0x0305,
	WM_RENDERALLFORMATS		  = 0x0306,
	WM_DESTROYCLIPBOARD		  = 0x0307,
	WM_DRAWCLIPBOARD		  = 0x0308,
	WM_PAINTCLIPBOARD		  = 0x0309,
	WM_VSCROLLCLIPBOARD		  = 0x030A,
	WM_SIZECLIPBOARD		  = 0x030B,
	WM_ASKCBFORMATNAME		  = 0x030C,
	WM_CHANGECBCHAIN		  = 0x030D,
	WM_HSCROLLCLIPBOARD		  = 0x030E,
	WM_QUERYNEWPALETTE		  = 0x030F,
	WM_PALETTEISCHANGING	  = 0x0310,
	WM_PALETTECHANGED		  = 0x0311,
	WM_HOTKEY				  = 0x0312,
	WM_PRINT				  = 0x0317,
	WM_PRINTCLIENT			  = 0x0318,
	WM_APPCOMMAND			  = 0x0319,
	WM_THEMECHANGED			  = 0x031A,
	WM_HANDHELDFIRST		  = 0x0358,
	WM_HANDHELDLAST			  = 0x035F,
	WM_AFXFIRST				  = 0x0360,
	WM_AFXLAST				  = 0x037F,
	WM_PENWINFIRST			  = 0x0380,
	WM_PENWINLAST			  = 0x038F,
	WM_APP					  = 0x8000,
	WM_USER					  = 0x0400
}
enum {
	PBT_APMQUERYSUSPEND       = 0x0000,
	PBT_APMQUERYSTANDBY       = 0x0001,
	PBT_APMQUERYSUSPENDFAILED = 0x0002,
	PBT_APMQUERYSTANDBYFAILED = 0x0003,
	PBT_APMSUSPEND            = 0x0004,
	PBT_APMSTANDBY            = 0x0005,
	PBT_APMRESUMECRITICAL     = 0x0006,
	PBT_APMRESUMESUSPEND      = 0x0007,
	PBT_APMRESUMESTANDBY      = 0x0008,
	PBTF_APMRESUMEFROMFAILURE = 0x00000001,
	PBT_APMBATTERYLOW         = 0x0009,
	PBT_APMPOWERSTATUSCHANGE  = 0x000A,
	PBT_APMOEMEVENT           = 0x000B,
	PBT_APMRESUMEAUTOMATIC    = 0x0012
}
//}}}

enum {
	MK_LBUTTON =  0x0001,
	MK_RBUTTON =  0x0002,
	MK_SHIFT =	  0x0004,
	MK_CONTROL =  0x0008,
	MK_MBUTTON =  0x0010,
	MK_XBUTTON1 = 0x0020,
	MK_XBUTTON2 = 0x0040
}

enum {
	WMSZ_LEFT		 = 1,
	WMSZ_RIGHT		 = 2,
	WMSZ_TOP		 = 3,
	WMSZ_TOPLEFT	 = 4,
	WMSZ_TOPRIGHT	 = 5,
	WMSZ_BOTTOM		 = 6,
	WMSZ_BOTTOMLEFT	 = 7,
	WMSZ_BOTTOMRIGHT = 8
}

enum {
	SIZE_RESTORED  = 0,
	SIZE_MINIMIZED = 1,
	SIZE_MAXIMIZED = 2,
	SIZE_MAXSHOW   = 3,
	SIZE_MAXHIDE   = 4
}

enum {
	SW_HIDE = 0,
	SW_SHOWNORMAL = 1,
	SW_NORMAL = 1,
	SW_SHOWMINIMIZED = 2,
	SW_SHOWMAXIMIZED = 3,
	SW_MAXIMIZE = 3,
	SW_SHOWNOACTIVATE = 4,
	SW_SHOW = 5,
	SW_MINIMIZE = 6,
	SW_SHOWMINNOACTIVE = 7,
	SW_SHOWNA = 8,
	SW_RESTORE = 9,
	SW_SHOWDEFAULT = 10,
	SW_FORCEMINIMIZE = 11,
	SW_MAX = 11
}

enum {
	GWL_STYLE =	  -16,
	GWL_EXSTYLE = -20
}

DWORD GetClassLongA(HWND hWnd, int nIndex);
DWORD GetClassLongW(HWND hWnd, int nIndex);

DWORD SetClassLongA(HWND hWnd, int nIndex, LONG dwNewLong);
DWORD SetClassLongW(HWND hWnd, int nIndex, LONG dwNewLong);

ULONG_PTR GetClassLongPtrA(HWND hWnd, int nIndex);
ULONG_PTR GetClassLongPtrW(HWND hWnd, int nIndex);

ULONG_PTR SetClassLongPtrA(HWND hWnd, int nIndex, LONG_PTR dwNewLong);
ULONG_PTR SetClassLongPtrW(HWND hWnd, int nIndex, LONG_PTR dwNewLong);

LONG GetWindowLongA(HWND hWnd, int nIndex);
LONG GetWindowLongW(HWND hWnd, int nIndex);

LONG SetWindowLongA(HWND hWnd, int nIndex, LONG dwNewLong);
LONG SetWindowLongW(HWND hWnd, int nIndex, LONG dwNewLong);

LONG_PTR GetWindowLongPtrA(HWND hWnd, int nIndex);
LONG_PTR GetWindowLongPtrW(HWND hWnd, int nIndex);

LONG_PTR SetWindowLongPtrA(HWND hWnd, int nIndex, LONG_PTR dwNewLong);
LONG_PTR SetWindowLongPtrW(HWND hWnd, int nIndex, LONG_PTR dwNewLong);

BOOL ShowWindow(HWND hWnd, int nCmdShow);

//Windows 98 required
BOOL AnimateWindow(HWND hWnd, DWORD dwTime, DWORD dwFlags);

BOOL IsWindowVisible(HWND hWnd);

BOOL IsWindow(HWND hWnd);

BOOL GetWindowRect(HWND hWnd, RECT* lpRect);

BOOL GetClientRect(HWND hWnd, RECT* lpRect);

enum {
	SWP_NOSIZE =	   0x0001,
	SWP_NOMOVE =	   0x0002,
	SWP_NOZORDER =	   0x0004,
	SWP_NOACTIVATE =   0x0010,
	SWP_FRAMECHANGED = 0x0020
}

BOOL SetWindowPos(HWND hWnd, HWND hWndInsertAfter, int x, int y, int cx, int cy, UINT uFlags);

BOOL MoveWindow(HWND hWnd, int x, int y, int nWidth, int nHeight, BOOL bRepaint);

int SetWindowRgn(HWND hWnd, HRGN hRgn, BOOL bRedraw);

enum {
	ULW_COLORKEY = 0x00000001,
	ULW_ALPHA =	   0x00000002,
	ULW_OPAQUE =   0x00000004
}

BOOL UpdateLayeredWindow(
	HWND hWnd,
	HDC hdcDst,
	POINT* pptDst,
	SIZE* psize,
	HDC hdcSrc,
	POINT* pptSrc,
	COLORREF crKey,
	BLENDFUNCTION* pblend,
	DWORD dwFlags);

HWND SetParent(HWND hWndChild, HWND hWndNewParent);

HWND GetParent(HWND hWnd);

BOOL IsChild(HWND hWndParent, HWND hWnd);

BOOL EnableWindow(HWND hWnd, BOOL bEnable);

enum {
	GW_HWNDFIRST = 0,
	GW_HWNDLAST =  1,
	GW_HWNDNEXT =  2,
	GW_HWNDPREV =  3,
	GW_OWNER =	   4,
	GW_CHILD =	   5
}

HWND GetWindow(HWND hWnd, UINT uCmd);

BOOL GetWindowInfo(HWND hwnd, WINDOWINFO* pwi);

int GetWindowTextLength(HWND hWnd);

int GetWindowTextA(HWND hWnd, LPSTR lpString, int nMaxCount);
int GetWindowTextW(HWND hWnd, LPWSTR lpString, int nMaxCount);

BOOL SetWindowTextA(HWND hWnd, LPCSTR lpString);
BOOL SetWindowTextW(HWND hWnd, LPCWSTR lpString);

UINT GetWindowModuleFileNameA(HWND hWnd, LPSTR lpszFileName, UINT cchFileNameMax);
UINT GetWindowModuleFileNameW(HWND hWnd, LPWSTR lpszFileName, UINT cchFileNameMax);

BOOL SetPropA(HWND hWnd, LPCSTR lpString, HANDLE hData);
BOOL SetPropW(HWND hWnd, LPCWSTR lpString, HANDLE hData);

HANDLE GetPropA(HWND hWnd, LPCSTR lpString);
HANDLE GetPropW(HWND hWnd, LPCWSTR lpString);

HANDLE RemovePropA(HWND hWnd, LPCSTR lpString);
HANDLE RemovePropW(HWND hWnd, LPCWSTR lpString);

DWORD CommDlgExtendedError();
enum { FNERR_BUFFERTOOSMALL = 0x3003 }

enum {
	OFN_READONLY			 = 0x00000001,
	OFN_OVERWRITEPROMPT		 = 0x00000002,
	OFN_HIDEREADONLY		 = 0x00000004,
	OFN_NOCHANGEDIR			 = 0x00000008,
	OFN_SHOWHELP			 = 0x00000010,
	OFN_ENABLEHOOK			 = 0x00000020,
	OFN_ENABLETEMPLATE		 = 0x00000040,
	OFN_ENABLETEMPLATEHANDLE = 0x00000080,
	OFN_NOVALIDATE			 = 0x00000100,
	OFN_ALLOWMULTISELECT	 = 0x00000200,
	OFN_EXTENSIONDIFFERENT	 = 0x00000400,
	OFN_PATHMUSTEXIST		 = 0x00000800,
	OFN_FILEMUSTEXIST		 = 0x00001000,
	OFN_CREATEPROMPT		 = 0x00002000,
	OFN_SHAREAWARE			 = 0x00004000,
	OFN_NOREADONLYRETURN	 = 0x00008000,
	OFN_NOTESTFILECREATE	 = 0x00010000,
	OFN_NONETWORKBUTTON		 = 0x00020000,
	OFN_NOLONGNAMES			 = 0x00040000,
	OFN_EXPLORER			 = 0x00080000,
	OFN_NODEREFERENCELINKS	 = 0x00100000,
	OFN_LONGNAMES			 = 0x00200000,
	OFN_ENABLEINCLUDENOTIFY	 = 0x00400000,
	OFN_ENABLESIZING		 = 0x00800000,
	OFN_DONTADDTORECENT		 = 0x02000000,
	OFN_FORCESHOWHIDDEN		 = 0x10000000
}

BOOL GetOpenFileNameA(OPENFILENAME* lpofn);
BOOL GetOpenFileNameW(OPENFILENAME* lpofn);

BOOL GetSaveFileNameA(OPENFILENAME* lpofn);
BOOL GetSaveFileNameW(OPENFILENAME* lpofn);

//}}}

//{{{ painting functions
BOOL InvalidateRect(HWND hWnd, RECT* lpRect, BOOL bErase);

BOOL ValidateRect(HWND hWnd, RECT* lpRect);

BOOL UpdateWindow(HWND hWnd);

HWND WindowFromDC(HDC hdc);

HDC BeginPaint(HWND hWnd, PAINTSTRUCT* lpPaint);

BOOL EndPaint(HWND hWnd, PAINTSTRUCT* lpPaint);
//}}}

//{{{ device context functions
HDC GetDC(HWND hWnd);

int ReleaseDC(HWND hWnd, HDC hDC);

HDC CreateCompatibleDC(HDC hdc);

BOOL DeleteDC(HDC hdc);

HGDIOBJ SelectObject(HDC hdc, HGDIOBJ hObject);

BOOL DeleteObject(HGDIOBJ hObject);

int GetObjectW(HANDLE h, int c, VOID* pv);

HBITMAP CreateCompatibleBitmap(HDC hdc, int cx, int cy);

HBITMAP CreateDIBSection(
	HDC hdc,
	BITMAPINFO* lpbmi,
	UINT usage,
	VOID** ppvBits,
	HANDLE hSection,
	DWORD offset);

int GetDIBits(HDC hdc, HBITMAP hbm, UINT start, UINT cLines, VOID* lpvBits, BITMAPINFO* lpbmi, UINT usage);

enum {
	DIB_RGB_COLORS = 0
}
enum {
	BI_RGB = 0
}

enum {
	SRCCOPY = 0x00CC0020
}

BOOL BitBlt(HDC hdc, int x, int y, int cx, int cy, HDC hdcSrc, int x1, int y1, DWORD rop);

enum {
	AC_SRC_OVER = 0x00,
	AC_SRC_ALPHA = 0x01
}

int EnumFontFamiliesExA(
	HDC hdc, LOGFONT* lpLogfont,
	FONTENUMPROCA lpProc, LPARAM lParam, DWORD dwFlags);
int EnumFontFamiliesExW(
	HDC hdc, LOGFONT* lpLogfont,
	FONTENUMPROCW lpProc, LPARAM lParam, DWORD dwFlags);

alias int function(ENUMLOGFONTEX*, TEXTMETRIC*, DWORD, LPARAM) FONTENUMPROCA;
alias int function(ENUMLOGFONTEX*, TEXTMETRIC*, DWORD, LPARAM) FONTENUMPROCW;
//}}}

//{{{ message functions
BOOL GetMessageA(MSG* lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax);
BOOL GetMessageW(MSG* lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax);

BOOL TranslateMessage(MSG* lpMsg);

LRESULT DispatchMessageA(MSG* lpMsg);
LRESULT DispatchMessageW(MSG* lpMsg);

BOOL PostMessage(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);

void PostQuitMessage(int nExitCode);

LRESULT SendMessage(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
//}}}

//{{{ clipboard functions
enum {
	CF_TEXT			= 1,
	CF_BITMAP		= 2,
	CF_METAFILEPICT = 3,
	CF_SYLK			= 4,
	CF_DIF			= 5,
	CF_TIFF			= 6,
	CF_OEMTEXT		= 7,
	CF_DIB			= 8,
	CF_PALETTE		= 9,
	CF_PENDATA		= 10,
	CF_RIFF			= 11,
	CF_WAVE			= 12,
	CF_UNICODETEXT	= 13,
	CF_ENHMETAFILE	= 14,
	CF_HDROP		= 15,
	CF_LOCALE		= 16
}

BOOL OpenClipboard(HWND hWndNewOwner);

BOOL CloseClipboard();

BOOL IsClipboardFormatAvailable(UINT format);

HANDLE GetClipboardData(UINT uFormat);

HANDLE SetClipboardData(UINT uFormat, HANDLE hMem);

BOOL EmptyClipboard();
//}}}

//{{{ mouse functions
enum {
	XBUTTON1 = 0x0001,
	XBUTTON2 = 0x0002
}

HWND SetCapture(HWND hWnd);

BOOL ReleaseCapture();

enum {
	TME_HOVER	  = 0x00000001,
	TME_LEAVE	  = 0x00000002,
	TME_NONCLIENT = 0x00000010
}
BOOL TrackMouseEvent(TRACKMOUSEEVENT* lpEventTrack);

HCURSOR SetCursor(HCURSOR hCursor);

BOOL GetCursorPos(POINT* lpPoint);
//}}}

//{{{ keyboard functions
//{{{ keys
enum {
	VK_LBUTTON			   = 0x01,
	VK_RBUTTON			   = 0x02,
	VK_CANCEL			   = 0x03,
	VK_MBUTTON			   = 0x04,
	VK_XBUTTON1			   = 0x05,
	VK_XBUTTON2			   = 0x06,
	VK_BACK				   = 0x08,
	VK_TAB				   = 0x09,
	VK_CLEAR			   = 0x0C,
	VK_RETURN			   = 0x0D,
	VK_SHIFT			   = 0x10,
	VK_CONTROL			   = 0x11,
	VK_MENU				   = 0x12,
	VK_PAUSE			   = 0x13,
	VK_CAPITAL			   = 0x14,
	VK_KANA				   = 0x15,
	VK_HANGEUL			   = 0x15,
	VK_HANGUL			   = 0x15,
	VK_JUNJA			   = 0x17,
	VK_FINAL			   = 0x18,
	VK_HANJA			   = 0x19,
	VK_KANJI			   = 0x19,
	VK_ESCAPE			   = 0x1B,
	VK_CONVERT			   = 0x1C,
	VK_NONCONVERT		   = 0x1D,
	VK_ACCEPT			   = 0x1E,
	VK_MODECHANGE		   = 0x1F,
	VK_SPACE			   = 0x20,
	VK_PRIOR			   = 0x21,
	VK_NEXT				   = 0x22,
	VK_END				   = 0x23,
	VK_HOME				   = 0x24,
	VK_LEFT				   = 0x25,
	VK_UP				   = 0x26,
	VK_RIGHT			   = 0x27,
	VK_DOWN				   = 0x28,
	VK_SELECT			   = 0x29,
	VK_PRINT			   = 0x2A,
	VK_EXECUTE			   = 0x2B,
	VK_SNAPSHOT			   = 0x2C,
	VK_INSERT			   = 0x2D,
	VK_DELETE			   = 0x2E,
	VK_HELP				   = 0x2F,
	VK_LWIN				   = 0x5B,
	VK_RWIN				   = 0x5C,
	VK_APPS				   = 0x5D,
	VK_SLEEP			   = 0x5F,
	VK_NUMPAD0			   = 0x60,
	VK_NUMPAD1			   = 0x61,
	VK_NUMPAD2			   = 0x62,
	VK_NUMPAD3			   = 0x63,
	VK_NUMPAD4			   = 0x64,
	VK_NUMPAD5			   = 0x65,
	VK_NUMPAD6			   = 0x66,
	VK_NUMPAD7			   = 0x67,
	VK_NUMPAD8			   = 0x68,
	VK_NUMPAD9			   = 0x69,
	VK_MULTIPLY			   = 0x6A,
	VK_ADD				   = 0x6B,
	VK_SEPARATOR		   = 0x6C,
	VK_SUBTRACT			   = 0x6D,
	VK_DECIMAL			   = 0x6E,
	VK_DIVIDE			   = 0x6F,
	VK_F1				   = 0x70,
	VK_F2				   = 0x71,
	VK_F3				   = 0x72,
	VK_F4				   = 0x73,
	VK_F5				   = 0x74,
	VK_F6				   = 0x75,
	VK_F7				   = 0x76,
	VK_F8				   = 0x77,
	VK_F9				   = 0x78,
	VK_F10				   = 0x79,
	VK_F11				   = 0x7A,
	VK_F12				   = 0x7B,
	VK_F13				   = 0x7C,
	VK_F14				   = 0x7D,
	VK_F15				   = 0x7E,
	VK_F16				   = 0x7F,
	VK_F17				   = 0x80,
	VK_F18				   = 0x81,
	VK_F19				   = 0x82,
	VK_F20				   = 0x83,
	VK_F21				   = 0x84,
	VK_F22				   = 0x85,
	VK_F23				   = 0x86,
	VK_F24				   = 0x87,
	VK_NUMLOCK			   = 0x90,
	VK_SCROLL			   = 0x91,
	VK_OEM_NEC_EQUAL	   = 0x92,
	VK_OEM_FJ_JISHO		   = 0x92,
	VK_OEM_FJ_MASSHOU	   = 0x93,
	VK_OEM_FJ_TOUROKU	   = 0x94,
	VK_OEM_FJ_LOYA		   = 0x95,
	VK_OEM_FJ_ROYA		   = 0x96,
	VK_LSHIFT			   = 0xA0,
	VK_RSHIFT			   = 0xA1,
	VK_LCONTROL			   = 0xA2,
	VK_RCONTROL			   = 0xA3,
	VK_LMENU			   = 0xA4,
	VK_RMENU			   = 0xA5,
	VK_BROWSER_BACK		   = 0xA6,
	VK_BROWSER_FORWARD	   = 0xA7,
	VK_BROWSER_REFRESH	   = 0xA8,
	VK_BROWSER_STOP		   = 0xA9,
	VK_BROWSER_SEARCH	   = 0xAA,
	VK_BROWSER_FAVORITES   = 0xAB,
	VK_BROWSER_HOME		   = 0xAC,
	VK_VOLUME_MUTE		   = 0xAD,
	VK_VOLUME_DOWN		   = 0xAE,
	VK_VOLUME_UP		   = 0xAF,
	VK_MEDIA_NEXT_TRACK	   = 0xB0,
	VK_MEDIA_PREV_TRACK	   = 0xB1,
	VK_MEDIA_STOP		   = 0xB2,
	VK_MEDIA_PLAY_PAUSE	   = 0xB3,
	VK_LAUNCH_MAIL		   = 0xB4,
	VK_LAUNCH_MEDIA_SELECT = 0xB5,
	VK_LAUNCH_APP1		   = 0xB6,
	VK_LAUNCH_APP2		   = 0xB7,
	VK_OEM_1			   = 0xBA,
	VK_OEM_PLUS			   = 0xBB,
	VK_OEM_COMMA		   = 0xBC,
	VK_OEM_MINUS		   = 0xBD,
	VK_OEM_PERIOD		   = 0xBE,
	VK_OEM_2			   = 0xBF,
	VK_OEM_3			   = 0xC0,
	VK_OEM_4			   = 0xDB,
	VK_OEM_5			   = 0xDC,
	VK_OEM_6			   = 0xDD,
	VK_OEM_7			   = 0xDE,
	VK_OEM_8			   = 0xDF,
	VK_OEM_AX			   = 0xE1,
	VK_OEM_102			   = 0xE2,
	VK_ICO_HELP			   = 0xE3,
	VK_ICO_00			   = 0xE4,
	VK_PROCESSKEY		   = 0xE5,
	VK_ICO_CLEAR		   = 0xE6,
	VK_PACKET			   = 0xE7,
	VK_OEM_RESET		   = 0xE9,
	VK_OEM_JUMP			   = 0xEA,
	VK_OEM_PA1			   = 0xEB,
	VK_OEM_PA2			   = 0xEC,
	VK_OEM_PA3			   = 0xED,
	VK_OEM_WSCTRL		   = 0xEE,
	VK_OEM_CUSEL		   = 0xEF,
	VK_OEM_ATTN			   = 0xF0,
	VK_OEM_FINISH		   = 0xF1,
	VK_OEM_COPY			   = 0xF2,
	VK_OEM_AUTO			   = 0xF3,
	VK_OEM_ENLW			   = 0xF4,
	VK_OEM_BACKTAB		   = 0xF5,
	VK_ATTN				   = 0xF6,
	VK_CRSEL			   = 0xF7,
	VK_EXSEL			   = 0xF8,
	VK_EREOF			   = 0xF9,
	VK_PLAY				   = 0xFA,
	VK_ZOOM				   = 0xFB,
	VK_NONAME			   = 0xFC,
	VK_PA1				   = 0xFD,
	VK_OEM_CLEAR		   = 0xFE
}
//}}}

SHORT GetKeyState(int nVirtKey);
//}}}

//{{{ system functions
//const LPTSTR IDC_ARROW		 = cast(LPTSTR)32512u;
//const LPTSTR IDC_IBEAM		 = cast(LPTSTR)32513u;
//const LPTSTR IDC_WAIT		 = cast(LPTSTR)32514u;
//const LPTSTR IDC_CROSS		 = cast(LPTSTR)32515u;
//const LPTSTR IDC_UPARROW	 = cast(LPTSTR)32516u;
//const LPTSTR IDC_SIZE		 = cast(LPTSTR)32640u;
//const LPTSTR IDC_ICON		 = cast(LPTSTR)32641u;
//const LPTSTR IDC_SIZENWSE	 = cast(LPTSTR)32642u;
//const LPTSTR IDC_SIZENESW	 = cast(LPTSTR)32643u;
//const LPTSTR IDC_SIZEWE		 = cast(LPTSTR)32644u;
//const LPTSTR IDC_SIZENS		 = cast(LPTSTR)32645u;
//const LPTSTR IDC_SIZEALL	 = cast(LPTSTR)32646u;
//const LPTSTR IDC_NO			 = cast(LPTSTR)32648u;
//const LPTSTR IDC_HAND		 = cast(LPTSTR)32649u;
//const LPTSTR IDC_APPSTARTING = cast(LPTSTR)32650u;
//const LPTSTR IDC_HELP		 = cast(LPTSTR)32651u;

//const LPTSTR IDI_APPLICATION = cast(LPTSTR)32512;
//const LPTSTR IDI_HAND		 = cast(LPTSTR)32513;
//const LPTSTR IDI_QUESTION	 = cast(LPTSTR)32514;
//const LPTSTR IDI_EXCLAMATION = cast(LPTSTR)32515;
//const LPTSTR IDI_ASTERISK	 = cast(LPTSTR)32516;
//const LPTSTR IDI_WINLOGO	 = cast(LPTSTR)32517;
//const LPTSTR IDI_WARNING	 = IDI_EXCLAMATION;
//const LPTSTR IDI_ERROR		 = IDI_HAND;
//const LPTSTR IDI_INFORMATION = IDI_ASTERISK;

enum {
	OIC_SAMPLE      = 32512,
	OIC_HAND        = 32513,
	OIC_QUES        = 32514,
	OIC_BANG        = 32515,
	OIC_NOTE        = 32516,
	OIC_WINLOGO     = 32517,
	OIC_WARNING     = OIC_BANG,
	OIC_ERROR       = OIC_HAND,
	OIC_INFORMATION = OIC_NOTE
}

enum {
	OCR_NORMAL      = 32512,
	OCR_IBEAM       = 32513,
	OCR_WAIT        = 32514,
	OCR_CROSS       = 32515,
	OCR_UP          = 32516,
	OCR_SIZENWSE    = 32642,
	OCR_SIZENESW    = 32643,
	OCR_SIZEWE      = 32644,
	OCR_SIZENS      = 32645,
	OCR_SIZEALL     = 32646,
	OCR_NO          = 32648,
	OCR_HAND        = 32649,
	OCR_APPSTARTING = 32650
}

enum {
	IMAGE_BITMAP = 0,
	IMAGE_ICON	 = 1,
	IMAGE_CURSOR = 2
}

enum {
	LR_DEFAULTCOLOR		= 0x0000,
	LR_MONOCHROME		= 0x0001,
	LR_COLOR			= 0x0002,
	LR_COPYRETURNORG	= 0x0004,
	LR_COPYDELETEORG	= 0x0008,
	LR_LOADFROMFILE		= 0x0010,
	LR_LOADTRANSPARENT	= 0x0020,
	LR_DEFAULTSIZE		= 0x0040,
	LR_VGACOLOR			= 0x0080,
	LR_LOADMAP3DCOLORS	= 0x1000,
	LR_CREATEDIBSECTION = 0x2000,
	LR_COPYFROMRESOURCE = 0x4000,
	LR_SHARED			= 0x8000
}

HANDLE LoadImageA(
	HINSTANCE hInst,
	LPCSTR name,
	UINT type,
	int cx,
	int cy,
	UINT fuLoad);
HANDLE LoadImageW(
	HINSTANCE hInst,
	LPCWSTR name,
	UINT type,
	int cx,
	int cy,
	UINT fuLoad);

HICON CreateIconFromResource(
	BYTE* presbits,
	DWORD dwResSize,
	BOOL fIcon,
	DWORD dwVer);

enum {
	SPI_GETNONCLIENTMETRICS = 0x0029,
	SPI_GETWORKAREA			= 0x0030,
	SPI_GETWHEELSCROLLLINES = 0x0068
}

BOOL SystemParametersInfoA(UINT uiAction, UINT uiParam, VOID* pvParam, UINT fWinIni);
BOOL SystemParametersInfoW(UINT uiAction, UINT uiParam, VOID* pvParam, UINT fWinIni);

enum {
	COLOR_SCROLLBAR       = 0,
	COLOR_BACKGROUND      = 1,
	COLOR_ACTIVECAPTION   = 2,
	COLOR_INACTIVECAPTION = 3,
	COLOR_MENU            = 4,
	COLOR_WINDOW          = 5,
	COLOR_WINDOWFRAME     = 6,
	COLOR_MENUTEXT        = 7,
	COLOR_WINDOWTEXT      = 8,
	COLOR_CAPTIONTEXT     = 9,
	COLOR_ACTIVEBORDER    = 10,
	COLOR_INACTIVEBORDER  = 11,
	COLOR_APPWORKSPACE    = 12,
	COLOR_HIGHLIGHT       = 13,
	COLOR_HIGHLIGHTTEXT   = 14,
	COLOR_BTNFACE         = 15,
	COLOR_BTNSHADOW       = 16,
	COLOR_GRAYTEXT        = 17,
	COLOR_BTNTEXT         = 18,
	COLOR_INACTIVECAPTIONTEXT = 19,
	COLOR_BTNHIGHLIGHT    = 20,

	COLOR_3DDKSHADOW      = 21,
	COLOR_3DLIGHT         = 22,
	COLOR_INFOTEXT        = 23,
	COLOR_INFOBK          = 24,

	COLOR_HOTLIGHT        = 26,
	COLOR_GRADIENTACTIVECAPTION = 27,
	COLOR_GRADIENTINACTIVECAPTION = 28,
	COLOR_MENUHILIGHT     = 29,
	COLOR_MENUBAR         = 30,

	COLOR_DESKTOP         = COLOR_BACKGROUND,
	COLOR_3DFACE          = COLOR_BTNFACE,
	COLOR_3DSHADOW        = COLOR_BTNSHADOW,
	COLOR_3DHIGHLIGHT     = COLOR_BTNHIGHLIGHT,
	COLOR_3DHILIGHT       = COLOR_BTNHIGHLIGHT,
	COLOR_BTNHILIGHT      = COLOR_BTNHIGHLIGHT
}

DWORD GetSysColor(int nIndex);

enum {
	SM_CXSCREEN          = 0,
	SM_CYSCREEN          = 1,
	SM_CXVSCROLL         = 2,
	SM_CYHSCROLL         = 3,
	SM_CYCAPTION         = 4,
	SM_CXBORDER          = 5,
	SM_CYBORDER          = 6,
	SM_CXDLGFRAME        = 7,
	SM_CYDLGFRAME        = 8,
	SM_CYVTHUMB          = 9,
	SM_CXHTHUMB          = 10,
	SM_CXICON            = 11,
	SM_CYICON            = 12,
	SM_CXCURSOR          = 13,
	SM_CYCURSOR          = 14,
	SM_CYMENU            = 15,
	SM_CXFULLSCREEN      = 16,
	SM_CYFULLSCREEN      = 17,
	SM_CYKANJIWINDOW     = 18,
	SM_MOUSEPRESENT      = 19,
	SM_CYVSCROLL         = 20,
	SM_CXHSCROLL         = 21,
	SM_DEBUG             = 22,
	SM_SWAPBUTTON        = 23,
	SM_RESERVED1         = 24,
	SM_RESERVED2         = 25,
	SM_RESERVED3         = 26,
	SM_RESERVED4         = 27,
	SM_CXMIN             = 28,
	SM_CYMIN             = 29,
	SM_CXSIZE            = 30,
	SM_CYSIZE            = 31,
	SM_CXFRAME           = 32,
	SM_CYFRAME           = 33,
	SM_CXMINTRACK        = 34,
	SM_CYMINTRACK        = 35,
	SM_CXDOUBLECLK       = 36,
	SM_CYDOUBLECLK       = 37,
	SM_CXICONSPACING     = 38,
	SM_CYICONSPACING     = 39,
	SM_MENUDROPALIGNMENT = 40,
	SM_PENWINDOWS        = 41,
	SM_DBCSENABLED       = 42,
	SM_CMOUSEBUTTONS     = 43,
	SM_CXFIXEDFRAME      = SM_CXDLGFRAME,
	SM_CYFIXEDFRAME      = SM_CYDLGFRAME,
	SM_CXSIZEFRAME       = SM_CXFRAME,
	SM_CYSIZEFRAME       = SM_CYFRAME,
	SM_SECURE            = 44,
	SM_CXEDGE            = 45,
	SM_CYEDGE            = 46,
	SM_CXMINSPACING      = 47,
	SM_CYMINSPACING      = 48,
	SM_CXSMICON          = 49,
	SM_CYSMICON          = 50,
	SM_CYSMCAPTION       = 51,
	SM_CXSMSIZE          = 52,
	SM_CYSMSIZE          = 53,
	SM_CXMENUSIZE        = 54,
	SM_CYMENUSIZE        = 55,
	SM_ARRANGE           = 56,
	SM_CXMINIMIZED       = 57,
	SM_CYMINIMIZED       = 58,
	SM_CXMAXTRACK        = 59,
	SM_CYMAXTRACK        = 60,
	SM_CXMAXIMIZED       = 61,
	SM_CYMAXIMIZED       = 62,
	SM_NETWORK           = 63,
	SM_CLEANBOOT         = 67,
	SM_CXDRAG            = 68,
	SM_CYDRAG            = 69,
	SM_SHOWSOUNDS        = 70,
	SM_CXMENUCHECK       = 71,
	SM_CYMENUCHECK       = 72,
	SM_SLOWMACHINE       = 73,
	SM_MIDEASTENABLED    = 74,
	SM_MOUSEWHEELPRESENT = 75,
	SM_XVIRTUALSCREEN    = 76,
	SM_YVIRTUALSCREEN    = 77,
	SM_CXVIRTUALSCREEN   = 78,
	SM_CYVIRTUALSCREEN   = 79,
	SM_CMONITORS         = 80,
	SM_SAMEDISPLAYFORMAT = 81,
	SM_IMMENABLED        = 82,
	SM_CXFOCUSBORDER     = 83,
	SM_CYFOCUSBORDER     = 84,
	SM_TABLETPC          = 86,
	SM_MEDIACENTER       = 87,
	SM_STARTER           = 88,
	SM_SERVERR2          = 89
}

int GetSystemMetrics(int nIndex);

VOID GetSystemInfo(SYSTEM_INFO* lpSystemInfo);

BOOL GetVersionExA(OSVERSIONINFO* lpVersionInformation);
BOOL GetVersionExW(OSVERSIONINFO* lpVersionInformation);

HMODULE GetModuleHandleA(LPCSTR lpModuleName);
HMODULE GetModuleHandleW(LPCWSTR lpModuleName);

HMODULE LoadLibraryA(LPCSTR lpLibFileName);
HMODULE LoadLibraryW(LPCWSTR lpLibFileName);

FARPROC GetProcAddress(HMODULE hModule, LPCSTR lpProcName);

//Requires Internet Explorer 4.0 (but will work on Windows 95 with IE 4)
BOOL SHGetSpecialFolderPathA(HWND hWndOwner, LPSTR lpszPath, int nFolder, BOOL fCreate);
BOOL SHGetSpecialFolderPathW(HWND hWndOwner, LPWSTR lpszPath, int nFolder, BOOL fCreate);

BOOL QueryPerformanceFrequency(ulong* lpFrequency);

BOOL QueryPerformanceCounter(ulong* lpPerformanceCount);

VOID GetSystemTimeAsFileTime(FILETIME* lpSystemTimeAsFileTime);

BOOL SystemTimeToFileTime(SYSTEMTIME* lpSystemTime, FILETIME* lpFileTime);

HANDLE GetCurrentThread();

VOID Sleep(DWORD dwMilliseconds);

BOOL GetProcessAffinityMask(
	HANDLE hProcess,
	ULONG_PTR* lpProcessAffinityMask,
	ULONG_PTR* lpSystemAffinityMask);

ULONG_PTR SetThreadAffinityMask(HANDLE hThread, ULONG_PTR dwThreadAffinityMask);
//}}}

//{{{ file functions

BOOL GetFileSizeEx(HANDLE hFile, long* lpFileSize);

BOOL ReadFile(
	HANDLE hFile,
	VOID* lpBuffer,
	DWORD nNumberOfBytesToRead,
	DWORD* lpNumberOfBytesRead,
	OVERLAPPED* lpOverlapped);

BOOL WriteFile(
	HANDLE hFile,
	VOID* lpBuffer,
	DWORD nNumberOfBytesToWrite,
	DWORD* lpNumberOfBytesWritten,
	OVERLAPPED* lpOverlapped);
//}}}

//{{{ console functions
BOOL AllocConsole();

BOOL FreeConsole();

BOOL GetConsoleMode(HANDLE hConsoleHandle, DWORD* lpMode);

BOOL SetConsoleMode(HANDLE hConsoleHandle, DWORD dwMode);

DWORD GetConsoleTitleA(LPSTR lpConsoleTitle, DWORD nSize);
DWORD GetConsoleTitleW(LPWSTR lpConsoleTitle, DWORD nSize);

BOOL SetConsoleTitleA(LPCSTR lpConsoleTitle);
BOOL SetConsoleTitleW(LPCWSTR lpConsoleTitle);

BOOL ReadConsoleA(
	HANDLE hConsoleInput,
	LPSTR lpBuffer,
	DWORD nNumberOfCharsToRead,
	DWORD* lpNumberOfCharsRead,
	VOID* lpReserved);
BOOL ReadConsoleW(
	HANDLE hConsoleInput,
	LPWSTR lpBuffer,
	DWORD nNumberOfCharsToRead,
	DWORD* lpNumberOfCharsRead,
	VOID* lpReserved);

BOOL WriteConsoleA(
	HANDLE hConsoleOutput,
	LPCSTR lpBuffer,
	DWORD nNumberOfCharsToWrite,
	DWORD* lpNumberOfCharsWritten,
	VOID* lpReserved);
BOOL WriteConsoleW(
	HANDLE hConsoleOutput,
	LPCWSTR lpBuffer,
	DWORD nNumberOfCharsToWrite,
	DWORD* lpNumberOfCharsWritten,
	VOID* lpReserved);

enum {
	FOREGROUND_BLUE		 = 0x0001,
	FOREGROUND_GREEN	 = 0x0002,
	FOREGROUND_RED		 = 0x0004,
	FOREGROUND_INTENSITY = 0x0008,
	BACKGROUND_BLUE		 = 0x0010,
	BACKGROUND_GREEN	 = 0x0020,
	BACKGROUND_RED		 = 0x0040,
	BACKGROUND_INTENSITY = 0x0080
}

BOOL SetConsoleTextAttribute(HANDLE hConsoleOutput, WORD wAttributes);

BOOL GetConsoleScreenBufferInfo(
	HANDLE hConsoleOutput,
	CONSOLE_SCREEN_BUFFER_INFO* lpConsoleScreenBufferInfo);

BOOL SetConsoleActiveScreenBuffer(HANDLE hConsoleOutput);

enum {
	STD_INPUT_HANDLE  = -10,
	STD_OUTPUT_HANDLE = -11,
	STD_ERROR_HANDLE  = -12
}

HANDLE GetStdHandle(DWORD nStdHandle);

UINT GetConsoleCP();

UINT GetConsoleOutputCP();

//}}}

//{{{ COM functions
enum {
	COINIT_APARTMENTTHREADED = 0x2,
}

HRESULT CoInitializeEx(VOID* pvReserved, DWORD dwCoInit);
void CoUninitialize();

VOID* CoTaskMemAlloc(SIZE_T cb);
VOID* CoTaskMemRealloc(VOID* pv, SIZE_T cb);
void CoTaskMemFree(VOID* pv);

enum {
	BIF_RETURNONLYFSDIRS = 0x0001,
	BIF_EDITBOX			 = 0x0010,
	BIF_NEWDIALOGSTYLE	 = 0x0040,
	BIF_USENEWUI		 = (BIF_NEWDIALOGSTYLE | BIF_EDITBOX)
}

ITEMIDLIST* SHBrowseForFolderA(BROWSEINFO* lpbi);
ITEMIDLIST* SHBrowseForFolderW(BROWSEINFO* lpbi);

BOOL SHGetPathFromIDListA(ITEMIDLIST* pidl, LPSTR pszPath);
BOOL SHGetPathFromIDListW(ITEMIDLIST* pidl, LPWSTR pszPath);

HRESULT SHGetFolderPathA(HWND hwnd, int csidl, HANDLE hToken, DWORD dwFlags, LPSTR pszPath);
HRESULT SHGetFolderPathW(HWND hwnd, int csidl, HANDLE hToken, DWORD dwFlags, LPWSTR pszPath);

HRESULT SHGetDesktopFolder(IShellFolder** ppshf);

struct GUID {
align(1):
	uint Data1;
	ushort Data2;
	ushort Data3;
	ubyte[8] Data4;
}
alias GUID IID;
alias GUID CLSID;

// I can't get this #!@#! COM stuff working...
interface IUnknown {
extern(Windows):
	HRESULT QueryInterface(IID* riid, void** ppvObject);
	ULONG AddRef();
	ULONG Release();
}
alias void* LPBC;
interface IShellFolder : IUnknown {
extern(Windows):
	HRESULT ParseDisplayName(
		HWND hwnd,
		LPBC pbc,
		wchar* pszDisplayName,
		ULONG* pchEaten,
		ITEMIDLIST** ppidl,
		ULONG* pdwAttributes);

	//other methods omitted
}
//}}}

//{{{ Multimedia functions
alias uint MMRESULT;
alias HANDLE HWAVEOUT;
struct TIMECAPS {
	UINT wPeriodMin;
	UINT wPeriodMax;
}
DWORD timeGetTime();
MMRESULT timeGetDevCaps(TIMECAPS* ptc, UINT cbtc);
MMRESULT timeBeginPeriod(UINT uPeriod);
MMRESULT timeEndPeriod(UINT uPeriod);

struct WAVEHDR {
	LPSTR     lpData;
	DWORD     dwBufferLength;
	DWORD     dwBytesRecorded;
	ULONG_PTR dwUser;
	DWORD     dwFlags;
	DWORD     dwLoops;
	WAVEHDR*  lpNext;
	ULONG_PTR reserved;
}
enum {
	WHDR_DONE      = 0x00000001,
	WHDR_PREPARED  = 0x00000002,
	WHDR_BEGINLOOP = 0x00000004,
	WHDR_ENDLOOP   = 0x00000008,
	WHDR_INQUEUE   = 0x00000010
}
alias uint MMVERSION;
struct WAVEOUTCAPSW {
	WORD      wMid;
	WORD      wPid;
	MMVERSION vDriverVersion;
	WCHAR[32] szPname;
	DWORD     dwFormats;
	WORD      wChannels;
	WORD      wReserved1;
	DWORD     dwSupport;
}
struct MMTIME {
	UINT wType;
	union _u {
		DWORD ms;
		DWORD sample;
		DWORD cb;
		DWORD ticks;

		struct _smpte {
			BYTE hour;
			BYTE min;
			BYTE sec;
			BYTE frame;
			BYTE fps;
			BYTE dummy;
			BYTE pad[2];
		}
		_smpte smpte;

		struct _midi {
			DWORD songptrpos;
		}
		_midi midi;
	}
	_u u;
}
enum {
	TIME_MS      = 0x0001,
	TIME_SAMPLES = 0x0002,
	TIME_BYTES   = 0x0004,
	TIME_SMPTE   = 0x0008,
	TIME_MIDI    = 0x0010,
	TIME_TICKS   = 0x0020
}
struct WAVEFORMATEX {
	WORD  wFormatTag;
	WORD  nChannels;
	DWORD nSamplesPerSec;
	DWORD nAvgBytesPerSec;
	WORD  nBlockAlign;
	WORD  wBitsPerSample;
	WORD  cbSize;

}

MMRESULT waveOutGetVolume(HWAVEOUT hwo, DWORD* pdwVolume);
MMRESULT waveOutSetVolume(HWAVEOUT hwo, DWORD dwVolume);
MMRESULT waveOutOpen(
	HWAVEOUT* phwo,
	UINT uDeviceID,
	WAVEFORMATEX* pwfx,
	ULONG_PTR dwCallback,
	ULONG_PTR dwInstance,
	DWORD fdwOpen);
MMRESULT waveOutClose(HWAVEOUT hwo);
MMRESULT waveOutPrepareHeader(HWAVEOUT hwo, WAVEHDR* pwh, UINT cbwh);
MMRESULT waveOutUnprepareHeader(HWAVEOUT hwo, WAVEHDR* pwh, UINT cbwh);
MMRESULT waveOutWrite(HWAVEOUT hwo, WAVEHDR* pwh, UINT cbwh);
MMRESULT waveOutPause(HWAVEOUT hwo);
MMRESULT waveOutRestart(HWAVEOUT hwo);
MMRESULT waveOutReset(HWAVEOUT hwo);
MMRESULT waveOutBreakLoop(HWAVEOUT hwo);
MMRESULT waveOutGetPosition(HWAVEOUT hwo, MMTIME* pmmt, UINT cbmmt);
MMRESULT waveOutGetPitch(HWAVEOUT hwo, DWORD* pdwPitch);
MMRESULT waveOutSetPitch(HWAVEOUT hwo, DWORD dwPitch);
MMRESULT waveOutGetPlaybackRate(HWAVEOUT hwo, DWORD* pdwRate);
MMRESULT waveOutSetPlaybackRate(HWAVEOUT hwo, DWORD dwRate);

//}}}

version(UNICODE) {
	alias RegisterClassExW		   RegisterClassEx;
	alias CreateWindowExW		   CreateWindowEx;
	alias DefWindowProcW		   DefWindowProc;
	alias GetWindowLongW		   GetWindowLong;
	alias SetWindowLongW		   SetWindowLong;
	alias GetWindowLongPtrW		   GetWindowLongPtr;
	alias SetWindowLongPtrW		   SetWindowLongPtr;
	alias GetWindowTextW		   GetWindowText;
	alias SetWindowTextW		   SetWindowText;
	alias GetWindowModuleFileNameW GetWindowModuleFileName;
	alias SetPropW				   SetProp;
	alias GetPropW				   GetProp;
	alias RemovePropW			   RemoveProp;
	alias GetOpenFileNameW		   GetOpenFileName;
	alias GetSaveFileNameW		   GetSaveFileName;
	alias GetMessageW			   GetMessage;
	alias DispatchMessageW		   DispatchMessage;
	alias LoadImageW			   LoadImage;
	alias GetObjectW               GetObject;
	alias EnumFontFamiliesExW	   EnumFontFamiliesEx;
	alias SystemParametersInfoW	   SystemParametersInfo;
	alias GetVersionExW			   GetVersionEx;
	alias GetModuleHandleW		   GetModuleHandle;
	alias LoadLibraryW			   LoadLibrary;
	alias SHGetSpecialFolderPathW  SHGetSpecialFolderPath;
	alias GetConsoleTitleW		   GetConsoleTitle;
	alias SetConsoleTitleW		   SetConsoleTitle;
	alias ReadConsoleW			   ReadConsole;
	alias WriteConsoleW			   WriteConsole;
	alias SHBrowseForFolderW	   SHBrowseForFolder;
	alias SHGetPathFromIDListW	   SHGetPathFromIDList;
	alias SHGetFolderPathW		   SHGetFolderPath;

	alias LOGFONTW       LOGFONT;
	alias NONCLIENTMETRICSW NONCLIENTMETRICS;
	alias ENUMLOGFONTEXW ENUMLOGFONTEX;
	alias TEXTMETRICW    TEXTMETRIC;
	alias OSVERSIONINFOW OSVERSIONINFO;
} else {
	alias RegisterClassExA		   RegisterClassEx;
	alias CreateWindowExA		   CreateWindowEx;
	alias DefWindowProcA		   DefWindowProc;
	alias GetWindowLongA		   GetWindowLong;
	alias SetWindowLongA		   SetWindowLong;
	alias GetWindowLongPtrA		   GetWindowLongPtr;
	alias SetWindowLongPtrA		   SetWindowLongPtr;
	alias GetWindowTextA		   GetWindowText;
	alias SetWindowTextA		   SetWindowText;
	alias GetWindowModuleFileNameA GetWindowModuleFileName;
	alias SetPropA				   SetProp;
	alias GetPropA				   GetProp;
	alias RemovePropA			   RemoveProp;
	alias GetOpenFileNameA		   GetOpenFileName;
	alias GetSaveFileNameA		   GetSaveFileName;
	alias GetMessageA			   GetMessage;
	alias DispatchMessageA		   DispatchMessage;
	alias LoadImageA			   LoadImage;
	alias EnumFontFamiliesExA	   EnumFontFamiliesEx;
	alias SystemParametersInfoA	   SystemParametersInfo;
	alias GetVersionExA			   GetVersionEx;
	alias GetModuleHandleA		   GetModuleHandle;
	alias LoadLibraryA			   LoadLibrary;
	alias SHGetSpecialFolderPathA  SHGetSpecialFolderPath;
	alias GetConsoleTitleA		   GetConsoleTitle;
	alias SetConsoleTitleA		   SetConsoleTitle;
	alias ReadConsoleA			   ReadConsole;
	alias WriteConsoleA			   WriteConsole;
	alias SHBrowseForFolderA	   SHBrowseForFolder;
	alias SHGetPathFromIDListA	   SHGetPathFromIDList;
	alias SHGetFolderPathA		   SHGetFolderPath;
}

struct POINT {
	LONG x;
	LONG y;
}
struct SIZE {
	LONG cx;
	LONG cy;
}
struct RECT {
	LONG left;
	LONG top;
	LONG right;
	LONG bottom;
}
struct BLENDFUNCTION {
	BYTE BlendOp;
	BYTE BlendFlags;
	BYTE SourceConstantAlpha;
	BYTE AlphaFormat;
}
const int LF_FACESIZE = 32;
struct LOGFONTW {
	LONG			   lfHeight;
	LONG			   lfWidth;
	LONG			   lfEscapement;
	LONG			   lfOrientation;
	LONG			   lfWeight;
	BYTE			   lfItalic;
	BYTE			   lfUnderline;
	BYTE			   lfStrikeOut;
	BYTE			   lfCharSet;
	BYTE			   lfOutPrecision;
	BYTE			   lfClipPrecision;
	BYTE			   lfQuality;
	BYTE			   lfPitchAndFamily;
	WCHAR[LF_FACESIZE] lfFaceName;
}
struct NONCLIENTMETRICSW {
	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;
}
const int LF_FULLFACESIZE = 64;
struct ENUMLOGFONTEXW {
	LOGFONT				   elfLogFont;
	WCHAR[LF_FULLFACESIZE] elfFullName;
	WCHAR[LF_FACESIZE]	   elfStyle;
	WCHAR[LF_FACESIZE]	   elfScript;
}
struct TEXTMETRICW {
	LONG  tmHeight;
	LONG  tmAscent;
	LONG  tmDescent;
	LONG  tmInternalLeading;
	LONG  tmExternalLeading;
	LONG  tmAveCharWidth;
	LONG  tmMaxCharWidth;
	LONG  tmWeight;
	LONG  tmOverhang;
	LONG  tmDigitizedAspectX;
	LONG  tmDigitizedAspectY;
	WCHAR tmFirstChar;
	WCHAR tmLastChar;
	WCHAR tmDefaultChar;
	WCHAR tmBreakChar;
	BYTE  tmItalic;
	BYTE  tmUnderlined;
	BYTE  tmStruckOut;
	BYTE  tmPitchAndFamily;
	BYTE  tmCharSet;
}
struct RGBQUAD {
	BYTE rgbBlue;
	BYTE rgbGreen;
	BYTE rgbRed;
	BYTE rgbReserved;
}
struct BITMAPINFO {
	BITMAPINFOHEADER bmiHeader;
	RGBQUAD[1]		 bmiColors;
}
struct BITMAPINFOHEADER {
	DWORD biSize;
	LONG  biWidth;
	LONG  biHeight;
	WORD  biPlanes;
	WORD  biBitCount;
	DWORD biCompression;
	DWORD biSizeImage;
	LONG  biXPelsPerMeter;
	LONG  biYPelsPerMeter;
	DWORD biClrUsed;
	DWORD biClrImportant;
}
struct DIBSECTION {
	BITMAP           dsBm;
	BITMAPINFOHEADER dsBmih;
	DWORD[3]         dsBitfields;
	HANDLE           dshSection;
	DWORD            dsOffset;
}
struct BITMAP {
	LONG  bmType;
	LONG  bmWidth;
	LONG  bmHeight;
	LONG  bmWidthBytes;
	WORD  bmPlanes;
	WORD  bmBitsPixel;
	VOID* bmBits;
}
struct MSG {
	HWND hWnd;
	UINT message;
	WPARAM wParam;
	LPARAM lParam;
	DWORD time;
	POINT pt;
}
struct WNDCLASSEX {
	UINT	  cbSize;
	UINT	  style;
	WNDPROC	  lpfnWndProc;
	int		  cbClsExtra;
	int		  cbWndExtra;
	HINSTANCE hInstance;
	HICON	  hIcon;
	HCURSOR	  hCursor;
	HBRUSH	  hbrBackground;
	LPCTSTR	  lpszMenuName;
	LPCTSTR	  lpszClassName;
	HICON	  hIconSm;
}
struct WINDOWINFO {
	DWORD cbSize;
	RECT  rcWindow;
	RECT  rcClient;
	DWORD dwStyle;
	DWORD dwExStyle;
	DWORD dwWindowStatus;
	UINT  cxWindowBorders;
	UINT  cyWindowBorders;
	ATOM  atomWindowType;
	WORD  wCreatorVersion;
}
struct PAINTSTRUCT {
	HDC		 hdc;
	BOOL	 fErase;
	RECT	 rcPaint;
	BOOL	 fRestore;
	BOOL	 fIncUpdate;
	BYTE[32] rgbReserved;
}
struct TRACKMOUSEEVENT {
	DWORD cbSize;
	DWORD dwFlags;
	HWND  hWndTrack;
	DWORD dwHoverTime;
}
struct OPENFILENAME {
	DWORD		  lStructSize;
	HWND		  hWndOwner;
	HINSTANCE	  hInstance;
	LPCTSTR		  lpstrFilter;
	LPTSTR		  lpstrCustomFilter;
	DWORD		  nMaxCustFilter;
	DWORD		  nFilterIndex;
	LPTSTR		  lpstrFile;
	DWORD		  nMaxFile;
	LPTSTR		  lpstrFileTitle;
	DWORD		  nMaxFileTitle;
	LPCTSTR		  lpstrInitialDir;
	LPCTSTR		  lpstrTitle;
	DWORD		  Flags;
	WORD		  nFileOffset;
	WORD		  nFileExtension;
	LPCTSTR		  lpstrDefExt;
	LPARAM		  lCustData;
	LPOFNHOOKPROC lpfnHook;
	LPCTSTR		  lpTemplateName;
	//	if(_WIN32_WINNT >= 0x0500)
	//void*		  pvReserved;
	//DWORD		  dwReserved;
	//DWORD		  FlagsEx;
}
struct SHITEMID {
	USHORT	cb;
	BYTE[1] abID;
}
struct ITEMIDLIST {
	SHITEMID mkid;
}
struct BROWSEINFO {
	HWND		hwndOwner;
	ITEMIDLIST* pidlRoot;
	LPTSTR		pszDisplayName;
	LPCTSTR		lpszTitle;
	UINT		ulFlags;
	BFFCALLBACK lpfn;
	LPARAM		lParam;
	int			iImage;
}
struct OVERLAPPED {
	ULONG_PTR Internal;
	ULONG_PTR InternalHigh;
	union {
		struct {
			DWORD Offset;
			DWORD OffsetHigh;
		}

		VOID* Pointer;
	}

	HANDLE hEvent;
}
struct OSVERSIONINFOW {
	DWORD dwOSVersionInfoSize;
	DWORD dwMajorVersion;
	DWORD dwMinorVersion;
	DWORD dwBuildNumber;
	DWORD dwPlatformId;
	WCHAR[128] szCSDVersion;
}
struct SYSTEM_INFO {
	WORD wProcessorArchitecture;
	WORD wReserved;
	DWORD dwPageSize;
	VOID* lpMinimumApplicationAddress;
	VOID* lpMaximumApplicationAddress;
	ULONG_PTR dwActiveProcessorMask;
	DWORD dwNumberOfProcessors;
	DWORD dwProcessorType;
	DWORD dwAllocationGranularity;
	WORD wProcessorLevel;
	WORD wProcessorRevision;
}
struct CONSOLE_SCREEN_BUFFER_INFO {
	COORD dwSize;
	COORD dwCursorPosition;
	WORD wAttributes;
	SMALL_RECT srWindow;
	COORD dwMaximumWindowSize;
}
struct FILETIME {
	DWORD dwLowDateTime;
	DWORD dwHighDateTime;
}
struct SYSTEMTIME {
	WORD wYear;
	WORD wMonth;
	WORD wDayOfWeek;
	WORD wDay;
	WORD wHour;
	WORD wMinute;
	WORD wSecond;
	WORD wMilliseconds;
}
struct COORD {
	SHORT X;
	SHORT Y;
}
struct SMALL_RECT {
	SHORT Left;
	SHORT Top;
	SHORT Right;
	SHORT Bottom;
}