{******************************************************************************}
{                                                                              }
{ Windows User API interface Unit for Object Pascal                            }
{                                                                              }
{ Portions created by Microsoft are Copyright (C) 1995-2001 Microsoft          }
{ Corporation. All Rights Reserved.                                            }
{                                                                              }
{ The original file is: winuser.h, released June 2000. The original Pascal     }
{ code is: WinUser.pas, released December 2000. The initial developer of the   }
{ Pascal code is Marcel van Brakel (brakelm att chello dott nl).               }
{                                                                              }
{ Portions created by Marcel van Brakel are Copyright (C) 1999-2001            }
{ Marcel van Brakel. All Rights Reserved.                                      }
{                                                                              }
{ Obtained through: Joint Endeavour of Delphi Innovators (Project JEDI)        }
{                                                                              }
{ You may retrieve the latest version of this file at the Project JEDI         }
{ APILIB home page, located at http://jedi-apilib.sourceforge.net              }
{                                                                              }
{ The contents of this file are used with permission, subject to the Mozilla   }
{ Public License Version 1.1 (the "License"); you may not use this file except }
{ in compliance with the License. You may obtain a copy of the License at      }
{ http://www.mozilla.org/MPL/MPL-1.1.html                                      }
{                                                                              }
{ Software distributed under the License is distributed on an "AS IS" basis,   }
{ WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for }
{ the specific language governing rights and limitations under the License.    }
{                                                                              }
{ Alternatively, the contents of this file may be used under the terms of the  }
{ GNU Lesser General Public License (the  "LGPL License"), in which case the   }
{ provisions of the LGPL License are applicable instead of those above.        }
{ If you wish to allow use of your version of this file only under the terms   }
{ of the LGPL License and not to allow others to use your version of this file }
{ under the MPL, indicate your decision by deleting  the provisions above and  }
{ replace  them with the notice and other provisions required by the LGPL      }
{ License.  If you do not delete the provisions above, a recipient may use     }
{ your version of this file under either the MPL or the LGPL License.          }
{                                                                              }
{ For more information about the LGPL: http://www.gnu.org/copyleft/lesser.html }
{                                                                              }
{******************************************************************************}

// $Id: JwaWinUser.pas,v 1.19 2007/09/14 06:48:48 marquardt Exp $

{$IFNDEF JWA_OMIT_SECTIONS}
unit JwaWinUser;

{$WEAKPACKAGEUNIT}
{$ENDIF JWA_OMIT_SECTIONS}

{$HPPEMIT ''}
{$HPPEMIT '#include "WinUser.h"'}
{$HPPEMIT ''}

{$IFNDEF JWA_OMIT_SECTIONS}

{$I jediapilib.inc}

interface

uses
  JwaWinBase, JwaWinGDI, JwaWinNT, JwaWinType;
{$ENDIF JWA_OMIT_SECTIONS}

{$IFNDEF JWA_IMPLEMENTATIONSECTION}
const
  UINT_MAX = UINT($FFFFFFFF); // from limits.h TODO
  {$EXTERNALSYM UINT_MAX}

type
  HDWP = HANDLE;
  {$EXTERNALSYM HDWP}

  MENUTEMPLATEA = Pointer;
  {$EXTERNALSYM MENUTEMPLATEA}
  MENUTEMPLATEW = Pointer;
  {$EXTERNALSYM MENUTEMPLATEW}

  {$IFDEF UNICODE}
  MENUTEMPLATE = MENUTEMPLATEW;
  {$EXTERNALSYM MENUTEMPLATE}
  {$ELSE}
  MENUTEMPLATE = MENUTEMPLATEA;
  {$EXTERNALSYM MENUTEMPLATE}
  {$ENDIF UNICODE}

  LPMENUTEMPLATEA = PVOID;
  {$EXTERNALSYM LPMENUTEMPLATEA}
  LPMENUTEMPLATEW = PVOID;
  {$EXTERNALSYM LPMENUTEMPLATEW}
  {$IFDEF UNICODE}
  LPMENUTEMPLATE = LPMENUTEMPLATEW;
  {$EXTERNALSYM LPMENUTEMPLATE}
  {$ELSE}
  LPMENUTEMPLATE = LPMENUTEMPLATEA;
  {$EXTERNALSYM LPMENUTEMPLATE}
  {$ENDIF UNICODE}

  WNDPROC = function(hWnd: HWND; uMsg: UINT; lParam: WPARAM; wParam: LPARAM): LRESULT; stdcall;
  {$EXTERNALSYM WNDPROC}

  DLGPROC = function(hwndDlg: HWND; wMsg: UINT; wParam: WPARAM; lParam: LPARAM): INT_PTR; stdcall;
  {$EXTERNALSYM DLGPROC}
  TIMERPROC = procedure(hwnd: HWND; uMsg: UINT; idEvent: UINT_PTR; dwTime: DWORD); stdcall;
  {$EXTERNALSYM TIMERPROC}
  GRAYSTRINGPROC = function(hdc: HDC; lpData: LPARAM; cchData: Integer): BOOL; stdcall;
  {$EXTERNALSYM GRAYSTRINGPROC}
  WNDENUMPROC = function(hwnd: HWND; lParam: LPARAM): BOOL; stdcall;
  {$EXTERNALSYM WNDENUMPROC}
  HOOKPROC = function(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
  {$EXTERNALSYM HOOKPROC}
  SENDASYNCPROC = procedure(hwnd: HWND; uMsg: UINT; dwData: ULONG_PTR; lResult: LRESULT); stdcall;
  {$EXTERNALSYM SENDASYNCPROC}

  PROPENUMPROCA = function(hwnd: HWND; lpszString: LPCSTR; hData: HANDLE): BOOL; stdcall;
  {$EXTERNALSYM PROPENUMPROCA}
  PROPENUMPROCW = function(hwnd: HWND; lpszString: LPCWSTR; hData: HANDLE): BOOL; stdcall;
  {$EXTERNALSYM PROPENUMPROCW}

  PROPENUMPROCEXA = function(hwnd: HWND; lpszString: LPSTR; hData: HANDLE; dwData: ULONG_PTR): BOOL; stdcall;
  {$EXTERNALSYM PROPENUMPROCEXA}
  PROPENUMPROCEXW = function(hwnd: HWND; lpszString: LPWSTR; hData: HANDLE; dwData: ULONG_PTR): BOOL; stdcall;
  {$EXTERNALSYM PROPENUMPROCEXW}

  EDITWORDBREAKPROCA = function(lpch: LPSTR; ichCurrent: Integer; cch, code: Integer): Integer; stdcall;
  {$EXTERNALSYM EDITWORDBREAKPROCA}
  EDITWORDBREAKPROCW = function(lpch: LPWSTR; ichCurrent: Integer; cch, code: Integer): Integer; stdcall;
  {$EXTERNALSYM EDITWORDBREAKPROCW}

  DRAWSTATEPROC = function(hdc: HDC; lData: LPARAM; wData: WPARAM; cx, cy: Integer): BOOL; stdcall;
  {$EXTERNALSYM DRAWSTATEPROC}

  {$IFDEF UNICODE}
  PROPENUMPROC = PROPENUMPROCW;
  {$EXTERNALSYM PROPENUMPROC}
  PROPENUMPROCEX = PROPENUMPROCEXW;
  {$EXTERNALSYM PROPENUMPROCEX}
  EDITWORDBREAKPROC = EDITWORDBREAKPROCW;
  {$EXTERNALSYM EDITWORDBREAKPROC}
  {$ELSE}
  PROPENUMPROC = PROPENUMPROCA;
  {$EXTERNALSYM PROPENUMPROC}
  PROPENUMPROCEX = PROPENUMPROCEXA;
  {$EXTERNALSYM PROPENUMPROCEX}
  EDITWORDBREAKPROC = EDITWORDBREAKPROCA;
  {$EXTERNALSYM EDITWORDBREAKPROC}
  {$ENDIF UNICODE}

  NAMEENUMPROCA = function(lpstr: LPSTR; lParam: LPARAM): BOOL; stdcall;
  {$EXTERNALSYM NAMEENUMPROCA}
  NAMEENUMPROCW = function(lpstr: LPWSTR; lParam: LPARAM): BOOL; stdcall;
  {$EXTERNALSYM NAMEENUMPROCW}

  WINSTAENUMPROCA = NAMEENUMPROCA;
  {$EXTERNALSYM WINSTAENUMPROCA}
  DESKTOPENUMPROCA = NAMEENUMPROCA;
  {$EXTERNALSYM DESKTOPENUMPROCA}
  WINSTAENUMPROCW = NAMEENUMPROCW;
  {$EXTERNALSYM WINSTAENUMPROCW}
  DESKTOPENUMPROCW = NAMEENUMPROCW;
  {$EXTERNALSYM DESKTOPENUMPROCW}

  {$IFDEF UNICODE}
  WINSTAENUMPROC = WINSTAENUMPROCW;
  {$EXTERNALSYM WINSTAENUMPROC}
  DESKTOPENUMPROC = DESKTOPENUMPROCW;
  {$EXTERNALSYM DESKTOPENUMPROC}
  {$ELSE}
  WINSTAENUMPROC = WINSTAENUMPROCA;
  {$EXTERNALSYM WINSTAENUMPROC}
  DESKTOPENUMPROC = DESKTOPENUMPROCA;
  {$EXTERNALSYM DESKTOPENUMPROC}
  {$ENDIF UNICODE}

function IS_INTRESOURCE(wInteger: WORD): BOOL;
{$EXTERNALSYM IS_INTRESOURCE}

type
  MAKEINTRESOURCEA = LPSTR;
  {$EXTERNALSYM MAKEINTRESOURCEA}
  MAKEINTRESOURCEW = LPWSTR;
  {$EXTERNALSYM MAKEINTRESOURCEW}
  {$IFDEF UNICODE}
  MAKEINTRESOURCE = MAKEINTRESOURCEW;
  {$EXTERNALSYM MAKEINTRESOURCE}
  {$ELSE}
  MAKEINTRESOURCE = MAKEINTRESOURCEA;
  {$EXTERNALSYM MAKEINTRESOURCE}
  {$ENDIF UNICODE}

//
// Predefined Resource Types
//

const
  RT_CURSOR       = MAKEINTRESOURCE(1);
  {$EXTERNALSYM RT_CURSOR}
  RT_BITMAP       = MAKEINTRESOURCE(2);
  {$EXTERNALSYM RT_BITMAP}
  RT_ICON         = MAKEINTRESOURCE(3);
  {$EXTERNALSYM RT_ICON}
  RT_MENU         = MAKEINTRESOURCE(4);
  {$EXTERNALSYM RT_MENU}
  RT_DIALOG       = MAKEINTRESOURCE(5);
  {$EXTERNALSYM RT_DIALOG}
  RT_STRING       = MAKEINTRESOURCE(6);
  {$EXTERNALSYM RT_STRING}
  RT_FONTDIR      = MAKEINTRESOURCE(7);
  {$EXTERNALSYM RT_FONTDIR}
  RT_FONT         = MAKEINTRESOURCE(8);
  {$EXTERNALSYM RT_FONT}
  RT_ACCELERATOR  = MAKEINTRESOURCE(9);
  {$EXTERNALSYM RT_ACCELERATOR}
  RT_RCDATA       = MAKEINTRESOURCE(10);
  {$EXTERNALSYM RT_RCDATA}
  RT_MESSAGETABLE = MAKEINTRESOURCE(11);
  {$EXTERNALSYM RT_MESSAGETABLE}

  DIFFERENCE = 11;
  {$EXTERNALSYM DIFFERENCE}

  RT_GROUP_CURSOR = MAKEINTRESOURCE(ULONG_PTR(RT_CURSOR) + DIFFERENCE);
  {$EXTERNALSYM RT_GROUP_CURSOR}
  RT_GROUP_ICON = MAKEINTRESOURCE(ULONG_PTR(RT_ICON) + DIFFERENCE);
  {$EXTERNALSYM RT_GROUP_ICON}
  RT_VERSION    = MAKEINTRESOURCE(16);
  {$EXTERNALSYM RT_VERSION}
  RT_DLGINCLUDE = MAKEINTRESOURCE(17);
  {$EXTERNALSYM RT_DLGINCLUDE}
  RT_PLUGPLAY   = MAKEINTRESOURCE(19);
  {$EXTERNALSYM RT_PLUGPLAY}
  RT_VXD        = MAKEINTRESOURCE(20);
  {$EXTERNALSYM RT_VXD}
  RT_ANICURSOR  = MAKEINTRESOURCE(21);
  {$EXTERNALSYM RT_ANICURSOR}
  RT_ANIICON    = MAKEINTRESOURCE(22);
  {$EXTERNALSYM RT_ANIICON}
  RT_HTML       = MAKEINTRESOURCE(23);
  {$EXTERNALSYM RT_HTML}
  RT_MANIFEST   = MAKEINTRESOURCE(24);
  CREATEPROCESS_MANIFEST_RESOURCE_ID = MAKEINTRESOURCE(1);
  {$EXTERNALSYM CREATEPROCESS_MANIFEST_RESOURCE_ID}
  ISOLATIONAWARE_MANIFEST_RESOURCE_ID = MAKEINTRESOURCE(2);
  {$EXTERNALSYM ISOLATIONAWARE_MANIFEST_RESOURCE_ID}
  ISOLATIONAWARE_NOSTATICIMPORT_MANIFEST_RESOURCE_ID = MAKEINTRESOURCE(3);
  {$EXTERNALSYM ISOLATIONAWARE_NOSTATICIMPORT_MANIFEST_RESOURCE_ID}
  MINIMUM_RESERVED_MANIFEST_RESOURCE_ID = MAKEINTRESOURCE(1{inclusive});
  {$EXTERNALSYM MINIMUM_RESERVED_MANIFEST_RESOURCE_ID}
  MAXIMUM_RESERVED_MANIFEST_RESOURCE_ID = MAKEINTRESOURCE(16{inclusive});
  {$EXTERNALSYM MAXIMUM_RESERVED_MANIFEST_RESOURCE_ID}

type
  va_list = PChar;
  {$EXTERNALSYM va_list}

function wvsprintfA(Output: LPSTR; Format: LPCSTR; arglist: va_list): Integer; stdcall;
{$EXTERNALSYM wvsprintfA}
function wvsprintfW(Output: LPWSTR; Format: LPCWSTR; arglist: va_list): Integer; stdcall;
{$EXTERNALSYM wvsprintfW}
function wvsprintf(Output: LPTSTR; Format: LPCTSTR; arglist: va_list): Integer; stdcall;
{$EXTERNALSYM wvsprintf}

function wsprintfA(Output: LPSTR; Format: LPCSTR): Integer; stdcall;
{$EXTERNALSYM wsprintfA}
function wsprintfW(Output: LPWSTR; Format: LPCWSTR): Integer; stdcall;
{$EXTERNALSYM wsprintfW}
function wsprintf(Output: LPTSTR; Format: LPCTSTR): Integer; stdcall;
{$EXTERNALSYM wsprintf}

//
// SPI_SETDESKWALLPAPER defined constants
//

const
  SETWALLPAPER_DEFAULT = LPWSTR(-1);
  {$EXTERNALSYM SETWALLPAPER_DEFAULT}

//
// Scroll Bar Constants
//

  SB_HORZ = 0;
  {$EXTERNALSYM SB_HORZ}
  SB_VERT = 1;
  {$EXTERNALSYM SB_VERT}
  SB_CTL  = 2;
  {$EXTERNALSYM SB_CTL}
  SB_BOTH = 3;
  {$EXTERNALSYM SB_BOTH}

//
// Scroll Bar Commands
//

  SB_LINEUP        = 0;
  {$EXTERNALSYM SB_LINEUP}
  SB_LINELEFT      = 0;
  {$EXTERNALSYM SB_LINELEFT}
  SB_LINEDOWN      = 1;
  {$EXTERNALSYM SB_LINEDOWN}
  SB_LINERIGHT     = 1;
  {$EXTERNALSYM SB_LINERIGHT}
  SB_PAGEUP        = 2;
  {$EXTERNALSYM SB_PAGEUP}
  SB_PAGELEFT      = 2;
  {$EXTERNALSYM SB_PAGELEFT}
  SB_PAGEDOWN      = 3;
  {$EXTERNALSYM SB_PAGEDOWN}
  SB_PAGERIGHT     = 3;
  {$EXTERNALSYM SB_PAGERIGHT}
  SB_THUMBPOSITION = 4;
  {$EXTERNALSYM SB_THUMBPOSITION}
  SB_THUMBTRACK    = 5;
  {$EXTERNALSYM SB_THUMBTRACK}
  SB_TOP           = 6;
  {$EXTERNALSYM SB_TOP}
  SB_LEFT          = 6;
  {$EXTERNALSYM SB_LEFT}
  SB_BOTTOM        = 7;
  {$EXTERNALSYM SB_BOTTOM}
  SB_RIGHT         = 7;
  {$EXTERNALSYM SB_RIGHT}
  SB_ENDSCROLL     = 8;
  {$EXTERNALSYM SB_ENDSCROLL}

//
// ShowWindow() Commands
//

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

//
// Old ShowWindow() Commands
//

  HIDE_WINDOW         = 0;
  {$EXTERNALSYM HIDE_WINDOW}
  SHOW_OPENWINDOW     = 1;
  {$EXTERNALSYM SHOW_OPENWINDOW}
  SHOW_ICONWINDOW     = 2;
  {$EXTERNALSYM SHOW_ICONWINDOW}
  SHOW_FULLSCREEN     = 3;
  {$EXTERNALSYM SHOW_FULLSCREEN}
  SHOW_OPENNOACTIVATE = 4;
  {$EXTERNALSYM SHOW_OPENNOACTIVATE}

//
// Identifiers for the WM_SHOWWINDOW message
//

  SW_PARENTCLOSING = 1;
  {$EXTERNALSYM SW_PARENTCLOSING}
  SW_OTHERZOOM     = 2;
  {$EXTERNALSYM SW_OTHERZOOM}
  SW_PARENTOPENING = 3;
  {$EXTERNALSYM SW_PARENTOPENING}
  SW_OTHERUNZOOM   = 4;
  {$EXTERNALSYM SW_OTHERUNZOOM}

//
// AnimateWindow() Commands
//

  AW_HOR_POSITIVE = $00000001;
  {$EXTERNALSYM AW_HOR_POSITIVE}
  AW_HOR_NEGATIVE = $00000002;
  {$EXTERNALSYM AW_HOR_NEGATIVE}
  AW_VER_POSITIVE = $00000004;
  {$EXTERNALSYM AW_VER_POSITIVE}
  AW_VER_NEGATIVE = $00000008;
  {$EXTERNALSYM AW_VER_NEGATIVE}
  AW_CENTER       = $00000010;
  {$EXTERNALSYM AW_CENTER}
  AW_HIDE         = $00010000;
  {$EXTERNALSYM AW_HIDE}
  AW_ACTIVATE     = $00020000;
  {$EXTERNALSYM AW_ACTIVATE}
  AW_SLIDE        = $00040000;
  {$EXTERNALSYM AW_SLIDE}
  AW_BLEND        = $00080000;
  {$EXTERNALSYM AW_BLEND}

//
// WM_KEYUP/DOWN/CHAR HIWORD(lParam) flags
//

  KF_EXTENDED = $0100;
  {$EXTERNALSYM KF_EXTENDED}
  KF_DLGMODE  = $0800;
  {$EXTERNALSYM KF_DLGMODE}
  KF_MENUMODE = $1000;
  {$EXTERNALSYM KF_MENUMODE}
  KF_ALTDOWN  = $2000;
  {$EXTERNALSYM KF_ALTDOWN}
  KF_REPEAT   = $4000;
  {$EXTERNALSYM KF_REPEAT}
  KF_UP       = $8000;
  {$EXTERNALSYM KF_UP}

//
// Virtual Keys, Standard Set
//

  VK_LBUTTON = $01;
  {$EXTERNALSYM VK_LBUTTON}
  VK_RBUTTON = $02;
  {$EXTERNALSYM VK_RBUTTON}
  VK_CANCEL  = $03;
  {$EXTERNALSYM VK_CANCEL}
  VK_MBUTTON = $04; // NOT contiguous with L & RBUTTON
  {$EXTERNALSYM VK_MBUTTON}

  {$IFDEF WIN98ME_UP}
  VK_XBUTTON1 = $05; // NOT contiguous with L & RBUTTON
  {$EXTERNALSYM VK_XBUTTON1}
  VK_XBUTTON2 = $06; // NOT contiguous with L & RBUTTON
  {$EXTERNALSYM VK_XBUTTON2}
  {$ENDIF WIN98ME_UP}

//
// 0x07 : unassigned
//

  VK_BACK = $08;
  {$EXTERNALSYM VK_BACK}
  VK_TAB  = $09;
  {$EXTERNALSYM VK_TAB}

//
// 0x0A - 0x0B : reserved
//

  VK_CLEAR  = $0C;
  {$EXTERNALSYM VK_CLEAR}
  VK_RETURN = $0D;
  {$EXTERNALSYM VK_RETURN}

  VK_SHIFT   = $10;
  {$EXTERNALSYM VK_SHIFT}
  VK_CONTROL = $11;
  {$EXTERNALSYM VK_CONTROL}
  VK_MENU    = $12;
  {$EXTERNALSYM VK_MENU}
  VK_PAUSE   = $13;
  {$EXTERNALSYM VK_PAUSE}
  VK_CAPITAL = $14;
  {$EXTERNALSYM VK_CAPITAL}

  VK_KANA    = $15;
  {$EXTERNALSYM VK_KANA}
  VK_HANGEUL = $15; // old name - should be here for compatibility
  {$EXTERNALSYM VK_HANGEUL}
  VK_HANGUL  = $15;
  {$EXTERNALSYM VK_HANGUL}
  VK_JUNJA   = $17;
  {$EXTERNALSYM VK_JUNJA}
  VK_FINAL   = $18;
  {$EXTERNALSYM VK_FINAL}
  VK_HANJA   = $19;
  {$EXTERNALSYM VK_HANJA}
  VK_KANJI   = $19;
  {$EXTERNALSYM VK_KANJI}

  VK_ESCAPE = $1B;
  {$EXTERNALSYM VK_ESCAPE}

  VK_CONVERT    = $1C;
  {$EXTERNALSYM VK_CONVERT}
  VK_NONCONVERT = $1D;
  {$EXTERNALSYM VK_NONCONVERT}
  VK_ACCEPT     = $1E;
  {$EXTERNALSYM VK_ACCEPT}
  VK_MODECHANGE = $1F;
  {$EXTERNALSYM VK_MODECHANGE}

  VK_SPACE    = $20;
  {$EXTERNALSYM VK_SPACE}
  VK_PRIOR    = $21;
  {$EXTERNALSYM VK_PRIOR}
  VK_NEXT     = $22;
  {$EXTERNALSYM VK_NEXT}
  VK_END      = $23;
  {$EXTERNALSYM VK_END}
  VK_HOME     = $24;
  {$EXTERNALSYM VK_HOME}
  VK_LEFT     = $25;
  {$EXTERNALSYM VK_LEFT}
  VK_UP       = $26;
  {$EXTERNALSYM VK_UP}
  VK_RIGHT    = $27;
  {$EXTERNALSYM VK_RIGHT}
  VK_DOWN     = $28;
  {$EXTERNALSYM VK_DOWN}
  VK_SELECT   = $29;
  {$EXTERNALSYM VK_SELECT}
  VK_PRINT    = $2A;
  {$EXTERNALSYM VK_PRINT}
  VK_EXECUTE  = $2B;
  {$EXTERNALSYM VK_EXECUTE}
  VK_SNAPSHOT = $2C;
  {$EXTERNALSYM VK_SNAPSHOT}
  VK_INSERT   = $2D;
  {$EXTERNALSYM VK_INSERT}
  VK_DELETE   = $2E;
  {$EXTERNALSYM VK_DELETE}
  VK_HELP     = $2F;
  {$EXTERNALSYM VK_HELP}

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

  VK_LWIN = $5B;
  {$EXTERNALSYM VK_LWIN}
  VK_RWIN = $5C;
  {$EXTERNALSYM VK_RWIN}
  VK_APPS = $5D;
  {$EXTERNALSYM VK_APPS}

//
// 0x5E : reserved
//

  VK_SLEEP = $5F;
  {$EXTERNALSYM VK_SLEEP}

  VK_NUMPAD0   = $60;
  {$EXTERNALSYM VK_NUMPAD0}
  VK_NUMPAD1   = $61;
  {$EXTERNALSYM VK_NUMPAD1}
  VK_NUMPAD2   = $62;
  {$EXTERNALSYM VK_NUMPAD2}
  VK_NUMPAD3   = $63;
  {$EXTERNALSYM VK_NUMPAD3}
  VK_NUMPAD4   = $64;
  {$EXTERNALSYM VK_NUMPAD4}
  VK_NUMPAD5   = $65;
  {$EXTERNALSYM VK_NUMPAD5}
  VK_NUMPAD6   = $66;
  {$EXTERNALSYM VK_NUMPAD6}
  VK_NUMPAD7   = $67;
  {$EXTERNALSYM VK_NUMPAD7}
  VK_NUMPAD8   = $68;
  {$EXTERNALSYM VK_NUMPAD8}
  VK_NUMPAD9   = $69;
  {$EXTERNALSYM VK_NUMPAD9}
  VK_MULTIPLY  = $6A;
  {$EXTERNALSYM VK_MULTIPLY}
  VK_ADD       = $6B;
  {$EXTERNALSYM VK_ADD}
  VK_SEPARATOR = $6C;
  {$EXTERNALSYM VK_SEPARATOR}
  VK_SUBTRACT  = $6D;
  {$EXTERNALSYM VK_SUBTRACT}
  VK_DECIMAL   = $6E;
  {$EXTERNALSYM VK_DECIMAL}
  VK_DIVIDE    = $6F;
  {$EXTERNALSYM VK_DIVIDE}
  VK_F1        = $70;
  {$EXTERNALSYM VK_F1}
  VK_F2        = $71;
  {$EXTERNALSYM VK_F2}
  VK_F3        = $72;
  {$EXTERNALSYM VK_F3}
  VK_F4        = $73;
  {$EXTERNALSYM VK_F4}
  VK_F5        = $74;
  {$EXTERNALSYM VK_F5}
  VK_F6        = $75;
  {$EXTERNALSYM VK_F6}
  VK_F7        = $76;
  {$EXTERNALSYM VK_F7}
  VK_F8        = $77;
  {$EXTERNALSYM VK_F8}
  VK_F9        = $78;
  {$EXTERNALSYM VK_F9}
  VK_F10       = $79;
  {$EXTERNALSYM VK_F10}
  VK_F11       = $7A;
  {$EXTERNALSYM VK_F11}
  VK_F12       = $7B;
  {$EXTERNALSYM VK_F12}
  VK_F13       = $7C;
  {$EXTERNALSYM VK_F13}
  VK_F14       = $7D;
  {$EXTERNALSYM VK_F14}
  VK_F15       = $7E;
  {$EXTERNALSYM VK_F15}
  VK_F16       = $7F;
  {$EXTERNALSYM VK_F16}
  VK_F17       = $80;
  {$EXTERNALSYM VK_F17}
  VK_F18       = $81;
  {$EXTERNALSYM VK_F18}
  VK_F19       = $82;
  {$EXTERNALSYM VK_F19}
  VK_F20       = $83;
  {$EXTERNALSYM VK_F20}
  VK_F21       = $84;
  {$EXTERNALSYM VK_F21}
  VK_F22       = $85;
  {$EXTERNALSYM VK_F22}
  VK_F23       = $86;
  {$EXTERNALSYM VK_F23}
  VK_F24       = $87;
  {$EXTERNALSYM VK_F24}

//
// 0x88 - 0x8F : unassigned
//

  VK_NUMLOCK = $90;
  {$EXTERNALSYM VK_NUMLOCK}
  VK_SCROLL  = $91;
  {$EXTERNALSYM VK_SCROLL}

//
// NEC PC-9800 kbd definitions
//

  VK_OEM_NEC_EQUAL = $92; // '=' key on numpad
  {$EXTERNALSYM VK_OEM_NEC_EQUAL}

//
// Fujitsu/OASYS kbd definitions
//

  VK_OEM_FJ_JISHO   = $92; // 'Dictionary' key
  {$EXTERNALSYM VK_OEM_FJ_JISHO}
  VK_OEM_FJ_MASSHOU = $93; // 'Unregister word' key
  {$EXTERNALSYM VK_OEM_FJ_MASSHOU}
  VK_OEM_FJ_TOUROKU = $94; // 'Register word' key
  {$EXTERNALSYM VK_OEM_FJ_TOUROKU}
  VK_OEM_FJ_LOYA    = $95; // 'Left OYAYUBI' key
  {$EXTERNALSYM VK_OEM_FJ_LOYA}
  VK_OEM_FJ_ROYA    = $96; // 'Right OYAYUBI' key
  {$EXTERNALSYM VK_OEM_FJ_ROYA}

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

  VK_LSHIFT   = $A0;
  {$EXTERNALSYM VK_LSHIFT}
  VK_RSHIFT   = $A1;
  {$EXTERNALSYM VK_RSHIFT}
  VK_LCONTROL = $A2;
  {$EXTERNALSYM VK_LCONTROL}
  VK_RCONTROL = $A3;
  {$EXTERNALSYM VK_RCONTROL}
  VK_LMENU    = $A4;
  {$EXTERNALSYM VK_LMENU}
  VK_RMENU    = $A5;
  {$EXTERNALSYM VK_RMENU}

  {$IFDEF WIN98ME_UP}

  VK_BROWSER_BACK      = $A6;
  {$EXTERNALSYM VK_BROWSER_BACK}
  VK_BROWSER_FORWARD   = $A7;
  {$EXTERNALSYM VK_BROWSER_FORWARD}
  VK_BROWSER_REFRESH   = $A8;
  {$EXTERNALSYM VK_BROWSER_REFRESH}
  VK_BROWSER_STOP      = $A9;
  {$EXTERNALSYM VK_BROWSER_STOP}
  VK_BROWSER_SEARCH    = $AA;
  {$EXTERNALSYM VK_BROWSER_SEARCH}
  VK_BROWSER_FAVORITES = $AB;
  {$EXTERNALSYM VK_BROWSER_FAVORITES}
  VK_BROWSER_HOME      = $AC;
  {$EXTERNALSYM VK_BROWSER_HOME}

  VK_VOLUME_MUTE         = $AD;
  {$EXTERNALSYM VK_VOLUME_MUTE}
  VK_VOLUME_DOWN         = $AE;
  {$EXTERNALSYM VK_VOLUME_DOWN}
  VK_VOLUME_UP           = $AF;
  {$EXTERNALSYM VK_VOLUME_UP}
  VK_MEDIA_NEXT_TRACK    = $B0;
  {$EXTERNALSYM VK_MEDIA_NEXT_TRACK}
  VK_MEDIA_PREV_TRACK    = $B1;
  {$EXTERNALSYM VK_MEDIA_PREV_TRACK}
  VK_MEDIA_STOP          = $B2;
  {$EXTERNALSYM VK_MEDIA_STOP}
  VK_MEDIA_PLAY_PAUSE    = $B3;
  {$EXTERNALSYM VK_MEDIA_PLAY_PAUSE}
  VK_LAUNCH_MAIL         = $B4;
  {$EXTERNALSYM VK_LAUNCH_MAIL}
  VK_LAUNCH_MEDIA_SELECT = $B5;
  {$EXTERNALSYM VK_LAUNCH_MEDIA_SELECT}
  VK_LAUNCH_APP1         = $B6;
  {$EXTERNALSYM VK_LAUNCH_APP1}
  VK_LAUNCH_APP2         = $B7;
  {$EXTERNALSYM VK_LAUNCH_APP2}

  {$ENDIF WIN98ME_UP}

//
// 0xB8 - 0xB9 : reserved
//

  VK_OEM_1      = $BA; // ';:' for US
  {$EXTERNALSYM VK_OEM_1}
  VK_OEM_PLUS   = $BB; // '+' any country
  {$EXTERNALSYM VK_OEM_PLUS}
  VK_OEM_COMMA  = $BC; // ',' any country
  {$EXTERNALSYM VK_OEM_COMMA}
  VK_OEM_MINUS  = $BD; // '-' any country
  {$EXTERNALSYM VK_OEM_MINUS}
  VK_OEM_PERIOD = $BE; // '.' any country
  {$EXTERNALSYM VK_OEM_PERIOD}
  VK_OEM_2      = $BF; // '/?' for US
  {$EXTERNALSYM VK_OEM_2}
  VK_OEM_3      = $C0; // '`~' for US
  {$EXTERNALSYM VK_OEM_3}

//
// 0xC1 - 0xD7 : reserved
//

//
// 0xD8 - 0xDA : unassigned
//

  VK_OEM_4 = $DB; // '[{' for US
  {$EXTERNALSYM VK_OEM_4}
  VK_OEM_5 = $DC; // '\|' for US
  {$EXTERNALSYM VK_OEM_5}
  VK_OEM_6 = $DD; // ']}' for US
  {$EXTERNALSYM VK_OEM_6}
  VK_OEM_7 = $DE; // ''"' for US
  {$EXTERNALSYM VK_OEM_7}
  VK_OEM_8 = $DF;
  {$EXTERNALSYM VK_OEM_8}

//
// 0xE0 : reserved
//

//
// Various extended or enhanced keyboards
//

  VK_OEM_AX   = $E1; // 'AX' key on Japanese AX kbd
  {$EXTERNALSYM VK_OEM_AX}
  VK_OEM_102  = $E2; // "<>" or "\|" on RT 102-key kbd.
  {$EXTERNALSYM VK_OEM_102}
  VK_ICO_HELP = $E3; // Help key on ICO
  {$EXTERNALSYM VK_ICO_HELP}
  VK_ICO_00   = $E4; // 00 key on ICO
  {$EXTERNALSYM VK_ICO_00}

  VK_PROCESSKEY = $E5;
  {$EXTERNALSYM VK_PROCESSKEY}

  VK_ICO_CLEAR = $E6;
  {$EXTERNALSYM VK_ICO_CLEAR}

  {$IFDEF WIN98ME_UP}
  VK_PACKET = $E7;
  {$EXTERNALSYM VK_PACKET}
  {$ENDIF WIN98ME_UP}

//
// 0xE8 : unassigned
//

//
// Nokia/Ericsson definitions
//

  VK_OEM_RESET   = $E9;
  {$EXTERNALSYM VK_OEM_RESET}
  VK_OEM_JUMP    = $EA;
  {$EXTERNALSYM VK_OEM_JUMP}
  VK_OEM_PA1     = $EB;
  {$EXTERNALSYM VK_OEM_PA1}
  VK_OEM_PA2     = $EC;
  {$EXTERNALSYM VK_OEM_PA2}
  VK_OEM_PA3     = $ED;
  {$EXTERNALSYM VK_OEM_PA3}
  VK_OEM_WSCTRL  = $EE;
  {$EXTERNALSYM VK_OEM_WSCTRL}
  VK_OEM_CUSEL   = $EF;
  {$EXTERNALSYM VK_OEM_CUSEL}
  VK_OEM_ATTN    = $F0;
  {$EXTERNALSYM VK_OEM_ATTN}
  VK_OEM_FINISH  = $F1;
  {$EXTERNALSYM VK_OEM_FINISH}
  VK_OEM_COPY    = $F2;
  {$EXTERNALSYM VK_OEM_COPY}
  VK_OEM_AUTO    = $F3;
  {$EXTERNALSYM VK_OEM_AUTO}
  VK_OEM_ENLW    = $F4;
  {$EXTERNALSYM VK_OEM_ENLW}
  VK_OEM_BACKTAB = $F5;
  {$EXTERNALSYM VK_OEM_BACKTAB}

  VK_ATTN      = $F6;
  {$EXTERNALSYM VK_ATTN}
  VK_CRSEL     = $F7;
  {$EXTERNALSYM VK_CRSEL}
  VK_EXSEL     = $F8;
  {$EXTERNALSYM VK_EXSEL}
  VK_EREOF     = $F9;
  {$EXTERNALSYM VK_EREOF}
  VK_PLAY      = $FA;
  {$EXTERNALSYM VK_PLAY}
  VK_ZOOM      = $FB;
  {$EXTERNALSYM VK_ZOOM}
  VK_NONAME    = $FC;
  {$EXTERNALSYM VK_NONAME}
  VK_PA1       = $FD;
  {$EXTERNALSYM VK_PA1}
  VK_OEM_CLEAR = $FE;
  {$EXTERNALSYM VK_OEM_CLEAR}

//
// 0xFF : reserved
//

//
// SetWindowsHook() codes
//

  WH_MIN             = DWORD(-1);
  {$EXTERNALSYM WH_MIN}
  WH_MSGFILTER       = DWORD(-1);
  {$EXTERNALSYM WH_MSGFILTER}
  WH_JOURNALRECORD   = 0;
  {$EXTERNALSYM WH_JOURNALRECORD}
  WH_JOURNALPLAYBACK = 1;
  {$EXTERNALSYM WH_JOURNALPLAYBACK}
  WH_KEYBOARD        = 2;
  {$EXTERNALSYM WH_KEYBOARD}
  WH_GETMESSAGE      = 3;
  {$EXTERNALSYM WH_GETMESSAGE}
  WH_CALLWNDPROC     = 4;
  {$EXTERNALSYM WH_CALLWNDPROC}
  WH_CBT             = 5;
  {$EXTERNALSYM WH_CBT}
  WH_SYSMSGFILTER    = 6;
  {$EXTERNALSYM WH_SYSMSGFILTER}
  WH_MOUSE           = 7;
  {$EXTERNALSYM WH_MOUSE}
  WH_HARDWARE        = 8;
  {$EXTERNALSYM WH_HARDWARE}
  WH_DEBUG           = 9;
  {$EXTERNALSYM WH_DEBUG}
  WH_SHELL           = 10;
  {$EXTERNALSYM WH_SHELL}
  WH_FOREGROUNDIDLE  = 11;
  {$EXTERNALSYM WH_FOREGROUNDIDLE}
  WH_CALLWNDPROCRET  = 12;
  {$EXTERNALSYM WH_CALLWNDPROCRET}

  {$IFDEF WINNT4_UP}
  WH_KEYBOARD_LL = 13;
  {$EXTERNALSYM WH_KEYBOARD_LL}
  WH_MOUSE_LL    = 14;
  {$EXTERNALSYM WH_MOUSE_LL}
  {$ENDIF WINNT4_UP}

  {$IFDEF WINNT4_UP}
  WH_MAX = 14;
  {$EXTERNALSYM WH_MAX}
  {$ELSE}
  WH_MAX = 12;
  {$EXTERNALSYM WH_MAX}
  {$ENDIF WINNT4_UP}

  WH_MINHOOK = WH_MIN;
  {$EXTERNALSYM WH_MINHOOK}
  WH_MAXHOOK = WH_MAX;
  {$EXTERNALSYM WH_MAXHOOK}

//
// Hook Codes
//

  HC_ACTION      = 0;
  {$EXTERNALSYM HC_ACTION}
  HC_GETNEXT     = 1;
  {$EXTERNALSYM HC_GETNEXT}
  HC_SKIP        = 2;
  {$EXTERNALSYM HC_SKIP}
  HC_NOREMOVE    = 3;
  {$EXTERNALSYM HC_NOREMOVE}
  HC_NOREM       = HC_NOREMOVE;
  {$EXTERNALSYM HC_NOREM}
  HC_SYSMODALON  = 4;
  {$EXTERNALSYM HC_SYSMODALON}
  HC_SYSMODALOFF = 5;
  {$EXTERNALSYM HC_SYSMODALOFF}

//
// CBT Hook Codes
//

  HCBT_MOVESIZE     = 0;
  {$EXTERNALSYM HCBT_MOVESIZE}
  HCBT_MINMAX       = 1;
  {$EXTERNALSYM HCBT_MINMAX}
  HCBT_QS           = 2;
  {$EXTERNALSYM HCBT_QS}
  HCBT_CREATEWND    = 3;
  {$EXTERNALSYM HCBT_CREATEWND}
  HCBT_DESTROYWND   = 4;
  {$EXTERNALSYM HCBT_DESTROYWND}
  HCBT_ACTIVATE     = 5;
  {$EXTERNALSYM HCBT_ACTIVATE}
  HCBT_CLICKSKIPPED = 6;
  {$EXTERNALSYM HCBT_CLICKSKIPPED}
  HCBT_KEYSKIPPED   = 7;
  {$EXTERNALSYM HCBT_KEYSKIPPED}
  HCBT_SYSCOMMAND   = 8;
  {$EXTERNALSYM HCBT_SYSCOMMAND}
  HCBT_SETFOCUS     = 9;
  {$EXTERNALSYM HCBT_SETFOCUS}

//
// HCBT_ACTIVATE structure pointed to by lParam
//

type
  LPCBTACTIVATESTRUCT = ^CBTACTIVATESTRUCT;
  {$EXTERNALSYM LPCBTACTIVATESTRUCT}
  tagCBTACTIVATESTRUCT = record
    fMouse: BOOL;
    hWndActive: HWND;
  end;
  {$EXTERNALSYM tagCBTACTIVATESTRUCT}
  CBTACTIVATESTRUCT = tagCBTACTIVATESTRUCT;
  {$EXTERNALSYM CBTACTIVATESTRUCT}
  TCbtActivateStruct = CBTACTIVATESTRUCT;
  PCbtActivateStruct = LPCBTACTIVATESTRUCT;

{$IFDEF WINXP_UP}

//
// WTSSESSION_NOTIFICATION struct pointed by lParam, for WM_WTSSESSION_CHANGE
//

  tagWTSSESSION_NOTIFICATION = record
    cbSize: DWORD;
    dwSessionId: DWORD;
  end;
  {$EXTERNALSYM tagWTSSESSION_NOTIFICATION}
  WTSSESSION_NOTIFICATION = tagWTSSESSION_NOTIFICATION;
  {$EXTERNALSYM WTSSESSION_NOTIFICATION}
  PWTSSESSION_NOTIFICATION = ^WTSSESSION_NOTIFICATION;
  {$EXTERNALSYM PWTSSESSION_NOTIFICATION}
  TWtsSessionNotification = WTSSESSION_NOTIFICATION;
  PWtsSessionNotification = PWTSSESSION_NOTIFICATION;

//
// codes passed in WPARAM for WM_WTSSESSION_CHANGE
//

const
  WTS_CONSOLE_CONNECT     = $1;
  {$EXTERNALSYM WTS_CONSOLE_CONNECT}
  WTS_CONSOLE_DISCONNECT  = $2;
  {$EXTERNALSYM WTS_CONSOLE_DISCONNECT}
  WTS_REMOTE_CONNECT      = $3;
  {$EXTERNALSYM WTS_REMOTE_CONNECT}
  WTS_REMOTE_DISCONNECT   = $4;
  {$EXTERNALSYM WTS_REMOTE_DISCONNECT}
  WTS_SESSION_LOGON       = $5;
  {$EXTERNALSYM WTS_SESSION_LOGON}
  WTS_SESSION_LOGOFF      = $6;
  {$EXTERNALSYM WTS_SESSION_LOGOFF}
  WTS_SESSION_LOCK        = $7;
  {$EXTERNALSYM WTS_SESSION_LOCK}
  WTS_SESSION_UNLOCK      = $8;
  {$EXTERNALSYM WTS_SESSION_UNLOCK}
  WTS_SESSION_REMOTE_CONTROL = $9;
  {$EXTERNALSYM WTS_SESSION_REMOTE_CONTROL}

{$ENDIF WINXP_UP}

//
// WH_MSGFILTER Filter Proc Codes
//

const
  MSGF_DIALOGBOX  = 0;
  {$EXTERNALSYM MSGF_DIALOGBOX}
  MSGF_MESSAGEBOX = 1;
  {$EXTERNALSYM MSGF_MESSAGEBOX}
  MSGF_MENU       = 2;
  {$EXTERNALSYM MSGF_MENU}
  MSGF_SCROLLBAR  = 5;
  {$EXTERNALSYM MSGF_SCROLLBAR}
  MSGF_NEXTWINDOW = 6;
  {$EXTERNALSYM MSGF_NEXTWINDOW}
  MSGF_MAX        = 8; // unused
  {$EXTERNALSYM MSGF_MAX}
  MSGF_USER       = 4096;
  {$EXTERNALSYM MSGF_USER}

//
// Shell support
//

  HSHELL_WINDOWCREATED       = 1;
  {$EXTERNALSYM HSHELL_WINDOWCREATED}
  HSHELL_WINDOWDESTROYED     = 2;
  {$EXTERNALSYM HSHELL_WINDOWDESTROYED}
  HSHELL_ACTIVATESHELLWINDOW = 3;
  {$EXTERNALSYM HSHELL_ACTIVATESHELLWINDOW}

  HSHELL_WINDOWACTIVATED = 4;
  {$EXTERNALSYM HSHELL_WINDOWACTIVATED}
  HSHELL_GETMINRECT      = 5;
  {$EXTERNALSYM HSHELL_GETMINRECT}
  HSHELL_REDRAW          = 6;
  {$EXTERNALSYM HSHELL_REDRAW}
  HSHELL_TASKMAN         = 7;
  {$EXTERNALSYM HSHELL_TASKMAN}
  HSHELL_LANGUAGE        = 8;
  {$EXTERNALSYM HSHELL_LANGUAGE}
  HSHELL_SYSMENU            = 9;
  {$EXTERNALSYM HSHELL_SYSMENU}
  HSHELL_ENDTASK            = 10;
  {$EXTERNALSYM HSHELL_ENDTASK}
  {$IFDEF WIN2000_UP}
  HSHELL_ACCESSIBILITYSTATE = 11;
  {$EXTERNALSYM HSHELL_ACCESSIBILITYSTATE}
  HSHELL_APPCOMMAND      = 12;
  {$EXTERNALSYM HSHELL_APPCOMMAND}
  {$ENDIF WIN2000_UP}

  {$IFDEF WINXP_UP}
  HSHELL_WINDOWREPLACED  = 13;
  {$EXTERNALSYM HSHELL_WINDOWREPLACED}
  {$ENDIF WINXP_UP}
  HSHELL_WINDOWREPLACING = 14;
  {$EXTERNALSYM HSHELL_WINDOWREPLACING}

  HSHELL_HIGHBIT          = $8000;
  {$EXTERNALSYM HSHELL_HIGHBIT}
  HSHELL_FLASH            = HSHELL_REDRAW or HSHELL_HIGHBIT;
  {$EXTERNALSYM HSHELL_FLASH}
  HSHELL_RUDEAPPACTIVATED = HSHELL_WINDOWACTIVATED or HSHELL_HIGHBIT;
  {$EXTERNALSYM HSHELL_RUDEAPPACTIVATED}

{$IFDEF WIN2000_UP}

// wparam for HSHELL_ACCESSIBILITYSTATE//

  ACCESS_STICKYKEYS = $0001;
  {$EXTERNALSYM ACCESS_STICKYKEYS}
  ACCESS_FILTERKEYS = $0002;
  {$EXTERNALSYM ACCESS_FILTERKEYS}
  ACCESS_MOUSEKEYS  = $0003;
  {$EXTERNALSYM ACCESS_MOUSEKEYS}

// cmd for HSHELL_APPCOMMAND and WM_APPCOMMAND//

  APPCOMMAND_BROWSER_BACKWARD    = 1;
  {$EXTERNALSYM APPCOMMAND_BROWSER_BACKWARD}
  APPCOMMAND_BROWSER_FORWARD     = 2;
  {$EXTERNALSYM APPCOMMAND_BROWSER_FORWARD}
  APPCOMMAND_BROWSER_REFRESH     = 3;
  {$EXTERNALSYM APPCOMMAND_BROWSER_REFRESH}
  APPCOMMAND_BROWSER_STOP        = 4;
  {$EXTERNALSYM APPCOMMAND_BROWSER_STOP}
  APPCOMMAND_BROWSER_SEARCH      = 5;
  {$EXTERNALSYM APPCOMMAND_BROWSER_SEARCH}
  APPCOMMAND_BROWSER_FAVORITES   = 6;
  {$EXTERNALSYM APPCOMMAND_BROWSER_FAVORITES}
  APPCOMMAND_BROWSER_HOME        = 7;
  {$EXTERNALSYM APPCOMMAND_BROWSER_HOME}
  APPCOMMAND_VOLUME_MUTE         = 8;
  {$EXTERNALSYM APPCOMMAND_VOLUME_MUTE}
  APPCOMMAND_VOLUME_DOWN         = 9;
  {$EXTERNALSYM APPCOMMAND_VOLUME_DOWN}
  APPCOMMAND_VOLUME_UP           = 10;
  {$EXTERNALSYM APPCOMMAND_VOLUME_UP}
  APPCOMMAND_MEDIA_NEXTTRACK     = 11;
  {$EXTERNALSYM APPCOMMAND_MEDIA_NEXTTRACK}
  APPCOMMAND_MEDIA_PREVIOUSTRACK = 12;
  {$EXTERNALSYM APPCOMMAND_MEDIA_PREVIOUSTRACK}
  APPCOMMAND_MEDIA_STOP          = 13;
  {$EXTERNALSYM APPCOMMAND_MEDIA_STOP}
  APPCOMMAND_MEDIA_PLAY_PAUSE    = 14;
  {$EXTERNALSYM APPCOMMAND_MEDIA_PLAY_PAUSE}
  APPCOMMAND_LAUNCH_MAIL         = 15;
  {$EXTERNALSYM APPCOMMAND_LAUNCH_MAIL}
  APPCOMMAND_LAUNCH_MEDIA_SELECT = 16;
  {$EXTERNALSYM APPCOMMAND_LAUNCH_MEDIA_SELECT}
  APPCOMMAND_LAUNCH_APP1         = 17;
  {$EXTERNALSYM APPCOMMAND_LAUNCH_APP1}
  APPCOMMAND_LAUNCH_APP2         = 18;
  {$EXTERNALSYM APPCOMMAND_LAUNCH_APP2}
  APPCOMMAND_BASS_DOWN           = 19;
  {$EXTERNALSYM APPCOMMAND_BASS_DOWN}
  APPCOMMAND_BASS_BOOST          = 20;
  {$EXTERNALSYM APPCOMMAND_BASS_BOOST}
  APPCOMMAND_BASS_UP             = 21;
  {$EXTERNALSYM APPCOMMAND_BASS_UP}
  APPCOMMAND_TREBLE_DOWN         = 22;
  {$EXTERNALSYM APPCOMMAND_TREBLE_DOWN}
  APPCOMMAND_TREBLE_UP           = 23;
  {$EXTERNALSYM APPCOMMAND_TREBLE_UP}
  {$IFDEF WINXP_UP}
  APPCOMMAND_MICROPHONE_VOLUME_MUTE = 24;
  {$EXTERNALSYM APPCOMMAND_MICROPHONE_VOLUME_MUTE}
  APPCOMMAND_MICROPHONE_VOLUME_DOWN = 25;
  {$EXTERNALSYM APPCOMMAND_MICROPHONE_VOLUME_DOWN}
  APPCOMMAND_MICROPHONE_VOLUME_UP   = 26;
  {$EXTERNALSYM APPCOMMAND_MICROPHONE_VOLUME_UP}
  APPCOMMAND_HELP                   = 27;
  {$EXTERNALSYM APPCOMMAND_HELP}
  APPCOMMAND_FIND                   = 28;
  {$EXTERNALSYM APPCOMMAND_FIND}
  APPCOMMAND_NEW                    = 29;
  {$EXTERNALSYM APPCOMMAND_NEW}
  APPCOMMAND_OPEN                   = 30;
  {$EXTERNALSYM APPCOMMAND_OPEN}
  APPCOMMAND_CLOSE                  = 31;
  {$EXTERNALSYM APPCOMMAND_CLOSE}
  APPCOMMAND_SAVE                   = 32;
  {$EXTERNALSYM APPCOMMAND_SAVE}
  APPCOMMAND_PRINT                  = 33;
  {$EXTERNALSYM APPCOMMAND_PRINT}
  APPCOMMAND_UNDO                   = 34;
  {$EXTERNALSYM APPCOMMAND_UNDO}
  APPCOMMAND_REDO                   = 35;
  {$EXTERNALSYM APPCOMMAND_REDO}
  APPCOMMAND_COPY                   = 36;
  {$EXTERNALSYM APPCOMMAND_COPY}
  APPCOMMAND_CUT                    = 37;
  {$EXTERNALSYM APPCOMMAND_CUT}
  APPCOMMAND_PASTE                  = 38;
  {$EXTERNALSYM APPCOMMAND_PASTE}
  APPCOMMAND_REPLY_TO_MAIL          = 39;
  {$EXTERNALSYM APPCOMMAND_REPLY_TO_MAIL}
  APPCOMMAND_FORWARD_MAIL           = 40;
  {$EXTERNALSYM APPCOMMAND_FORWARD_MAIL}
  APPCOMMAND_SEND_MAIL              = 41;
  {$EXTERNALSYM APPCOMMAND_SEND_MAIL}
  APPCOMMAND_SPELL_CHECK            = 42;
  {$EXTERNALSYM APPCOMMAND_SPELL_CHECK}
  APPCOMMAND_DICTATE_OR_COMMAND_CONTROL_TOGGLE = 43;
  {$EXTERNALSYM APPCOMMAND_DICTATE_OR_COMMAND_CONTROL_TOGGLE}
  APPCOMMAND_MIC_ON_OFF_TOGGLE      = 44;
  {$EXTERNALSYM APPCOMMAND_MIC_ON_OFF_TOGGLE}
  APPCOMMAND_CORRECTION_LIST        = 45;
  {$EXTERNALSYM APPCOMMAND_CORRECTION_LIST}
  {$ENDIF WINXP_UP}
  APPCOMMAND_MEDIA_PLAY             = 46;
  {$EXTERNALSYM APPCOMMAND_MEDIA_PLAY}
  APPCOMMAND_MEDIA_PAUSE            = 47;
  {$EXTERNALSYM APPCOMMAND_MEDIA_PAUSE}
  APPCOMMAND_MEDIA_RECORD           = 48;
  {$EXTERNALSYM APPCOMMAND_MEDIA_RECORD}
  APPCOMMAND_MEDIA_FAST_FORWARD     = 49;
  {$EXTERNALSYM APPCOMMAND_MEDIA_FAST_FORWARD}
  APPCOMMAND_MEDIA_REWIND           = 50;
  {$EXTERNALSYM APPCOMMAND_MEDIA_REWIND}
  APPCOMMAND_MEDIA_CHANNEL_UP       = 51;
  {$EXTERNALSYM APPCOMMAND_MEDIA_CHANNEL_UP}
  APPCOMMAND_MEDIA_CHANNEL_DOWN     = 52;
  {$EXTERNALSYM APPCOMMAND_MEDIA_CHANNEL_DOWN}

  FAPPCOMMAND_MOUSE = $8000;
  {$EXTERNALSYM FAPPCOMMAND_MOUSE}
  FAPPCOMMAND_KEY   = 0;
  {$EXTERNALSYM FAPPCOMMAND_KEY}
  FAPPCOMMAND_OEM   = $1000;
  {$EXTERNALSYM FAPPCOMMAND_OEM}
  FAPPCOMMAND_MASK  = $F000;
  {$EXTERNALSYM FAPPCOMMAND_MASK}

function GET_APPCOMMAND_LPARAM(lParam: LPARAM): WORD;
{$EXTERNALSYM GET_APPCOMMAND_LPARAM}

function GET_DEVICE_LPARAM(lParam: LPARAM): WORD;
{$EXTERNALSYM GET_DEVICE_LPARAM}

function GET_MOUSEORKEY_LPARAM(lParam: LPARAM): WORD;
{$EXTERNALSYM GET_MOUSEORKEY_LPARAM}

function GET_FLAGS_LPARAM(lParam: LPARAM): Integer;
{$EXTERNALSYM GET_FLAGS_LPARAM}

function GET_KEYSTATE_LPARAM(lParam: LPARAM): Integer;
{$EXTERNALSYM GET_KEYSTATE_LPARAM}

{$ENDIF WIN2000_UP}

type
  SHELLHOOKINFO = record
    hwnd: HWND;
    rc: RECT;
  end;
  {$EXTERNALSYM SHELLHOOKINFO}
  LPSHELLHOOKINFO = ^SHELLHOOKINFO;
  {$EXTERNALSYM LPSHELLHOOKINFO}
  TShellHookInfo = SHELLHOOKINFO;
  PShellHookInfo = LPSHELLHOOKINFO;

//
// Message Structure used in Journaling
//

type
  LPEVENTMSG = ^EVENTMSG;
  {$EXTERNALSYM LPEVENTMSG}
  tagEVENTMSG = record
    message_: UINT;
    paramL: UINT;
    paramH: UINT;
    time: DWORD;
    hwnd: HWND;
  end;
  {$EXTERNALSYM tagEVENTMSG}
  EVENTMSG = tagEVENTMSG;
  {$EXTERNALSYM EVENTMSG}
  LPEVENTMSGMSG = ^EVENTMSG;
  {$EXTERNALSYM LPEVENTMSGMSG}
  PEVENTMSGMSG = ^EVENTMSG;
  {$EXTERNALSYM PEVENTMSGMSG}
  NPEVENTMSG = ^EVENTMSG;
  {$EXTERNALSYM NPEVENTMSG}
  NPEVENTMSGMSG = ^EVENTMSG;
  {$EXTERNALSYM NPEVENTMSGMSG}
  TEventMsg = EVENTMSG;
  PEventMsg = LPEVENTMSG;

//
// Message structure used by WH_CALLWNDPROC
//

  LPCWPSTRUCT = ^CWPSTRUCT;
  {$EXTERNALSYM LPCWPSTRUCT}
  tagCWPSTRUCT = record
    lParam: LPARAM;
    wParam: WPARAM;
    message: UINT;
    hwnd: HWND;
  end;
  {$EXTERNALSYM tagCWPSTRUCT}
  CWPSTRUCT = tagCWPSTRUCT;
  {$EXTERNALSYM CWPSTRUCT}
  NPCWPSTRUCT = ^CWPSTRUCT;
  {$EXTERNALSYM NPCWPSTRUCT}
  TCwpStruct = CWPSTRUCT;
  PCwpStruct = LPCWPSTRUCT;

//
// Message structure used by WH_CALLWNDPROCRET
//

  LPCWPRETSTRUCT = ^CWPRETSTRUCT;
  {$EXTERNALSYM LPCWPRETSTRUCT}
  tagCWPRETSTRUCT = record
    lResult: LRESULT;
    lParam: LPARAM;
    wParam: WPARAM;
    message: UINT;
    hwnd: HWND;
  end;
  {$EXTERNALSYM tagCWPRETSTRUCT}
  CWPRETSTRUCT = tagCWPRETSTRUCT;
  {$EXTERNALSYM CWPRETSTRUCT}
  NPCWPRETSTRUCT = ^CWPRETSTRUCT;
  {$EXTERNALSYM NPCWPRETSTRUCT}
  TCwpRetStruct = CWPRETSTRUCT;
  PCwpRetStruct = LPCWPRETSTRUCT;

//
// Low level hook flags
//

const
  LLKHF_EXTENDED = KF_EXTENDED shr 8;
  {$EXTERNALSYM LLKHF_EXTENDED}
  LLKHF_INJECTED = $00000010;
  {$EXTERNALSYM LLKHF_INJECTED}
  LLKHF_ALTDOWN  = KF_ALTDOWN shr 8;
  {$EXTERNALSYM LLKHF_ALTDOWN}
  LLKHF_UP       = KF_UP shr 8;
  {$EXTERNALSYM LLKHF_UP}

  LLMHF_INJECTED = $00000001;
  {$EXTERNALSYM LLMHF_INJECTED}

//
// Structure used by WH_KEYBOARD_LL
//

type
  LPKBDLLHOOKSTRUCT = ^KBDLLHOOKSTRUCT;
  {$EXTERNALSYM LPKBDLLHOOKSTRUCT}
  tagKBDLLHOOKSTRUCT = record
    vkCode: DWORD;
    scanCode: DWORD;
    flags: DWORD;
    time: DWORD;
    dwExtraInfo: ULONG_PTR;
  end;
  {$EXTERNALSYM tagKBDLLHOOKSTRUCT}
  KBDLLHOOKSTRUCT = tagKBDLLHOOKSTRUCT;
  {$EXTERNALSYM KBDLLHOOKSTRUCT}
  TKbDllHookStruct = KBDLLHOOKSTRUCT;
  PKbDllHookStruct = LPKBDLLHOOKSTRUCT;

//
// Structure used by WH_MOUSE_LL
//

  LPMSLLHOOKSTRUCT = ^MSLLHOOKSTRUCT;
  {$EXTERNALSYM LPMSLLHOOKSTRUCT}
  tagMSLLHOOKSTRUCT = record
    pt: POINT;
    mouseData: DWORD;
    flags: DWORD;
    time: DWORD;
    dwExtraInfo: ULONG_PTR;
  end;
  {$EXTERNALSYM tagMSLLHOOKSTRUCT}
  MSLLHOOKSTRUCT = tagMSLLHOOKSTRUCT;
  {$EXTERNALSYM MSLLHOOKSTRUCT}
  TMsllHookStruct = MSLLHOOKSTRUCT;
  PMsllHookStruct = LPMSLLHOOKSTRUCT;

//
// Structure used by WH_DEBUG
//

  LPDEBUGHOOKINFO = ^DEBUGHOOKINFO;
  {$EXTERNALSYM LPDEBUGHOOKINFO}
  tagDEBUGHOOKINFO = record
    idThread: DWORD;
    idThreadInstaller: DWORD;
    lParam: LPARAM;
    wParam: WPARAM;
    code: Integer;
  end;
  {$EXTERNALSYM tagDEBUGHOOKINFO}
  DEBUGHOOKINFO = tagDEBUGHOOKINFO;
  {$EXTERNALSYM DEBUGHOOKINFO}
  NPDEBUGHOOKINFO = ^DEBUGHOOKINFO;
  {$EXTERNALSYM NPDEBUGHOOKINFO}
  TDebugHookInfo = DEBUGHOOKINFO;
  PDebugHookInfo = LPDEBUGHOOKINFO;

//
// Structure used by WH_MOUSE
//

  LPMOUSEHOOKSTRUCT = ^MOUSEHOOKSTRUCT;
  {$EXTERNALSYM LPMOUSEHOOKSTRUCT}
  tagMOUSEHOOKSTRUCT = record
    pt: POINT;
    hwnd: HWND;
    wHitTestCode: UINT;
    dwExtraInfo: ULONG_PTR;
  end;
  {$EXTERNALSYM tagMOUSEHOOKSTRUCT}
  MOUSEHOOKSTRUCT = tagMOUSEHOOKSTRUCT;
  {$EXTERNALSYM MOUSEHOOKSTRUCT}
  TMouseHookStruct = MOUSEHOOKSTRUCT;
  PMouseHookStruct = LPMOUSEHOOKSTRUCT;

  LPMOUSEHOOKSTRUCTEX = ^MOUSEHOOKSTRUCTEX;
  {$EXTERNALSYM LPMOUSEHOOKSTRUCTEX}
  tagMOUSEHOOKSTRUCTEX = record
    mhs: MOUSEHOOKSTRUCT;
    mouseData: DWORD;
  end;
  {$EXTERNALSYM tagMOUSEHOOKSTRUCTEX}
  MOUSEHOOKSTRUCTEX = tagMOUSEHOOKSTRUCTEX;
  {$EXTERNALSYM MOUSEHOOKSTRUCTEX}
  TMouseHookStructEx = MOUSEHOOKSTRUCTEX;
  PMouseHookStructEx = LPMOUSEHOOKSTRUCTEX;

//
// Structure used by WH_HARDWARE
//

  LPHARDWAREHOOKSTRUCT = ^HARDWAREHOOKSTRUCT;
  {$EXTERNALSYM LPHARDWAREHOOKSTRUCT}
  tagHARDWAREHOOKSTRUCT = record
    hwnd: HWND;
    message: UINT;
    wParam: WPARAM;
    lParam: LPARAM;
  end;
  {$EXTERNALSYM tagHARDWAREHOOKSTRUCT}
  HARDWAREHOOKSTRUCT = tagHARDWAREHOOKSTRUCT;
  {$EXTERNALSYM HARDWAREHOOKSTRUCT}
  THardwareHookStruct = HARDWAREHOOKSTRUCT;
  PHardwareHookStruct = LPHARDWAREHOOKSTRUCT;

//
// Keyboard Layout API
//

const
  HKL_PREV = 0;
  {$EXTERNALSYM HKL_PREV}
  HKL_NEXT = 1;
  {$EXTERNALSYM HKL_NEXT}

  KLF_ACTIVATE      = $00000001;
  {$EXTERNALSYM KLF_ACTIVATE}
  KLF_SUBSTITUTE_OK = $00000002;
  {$EXTERNALSYM KLF_SUBSTITUTE_OK}
  KLF_REORDER       = $00000008;
  {$EXTERNALSYM KLF_REORDER}
  KLF_REPLACELANG   = $00000010;
  {$EXTERNALSYM KLF_REPLACELANG}
  KLF_NOTELLSHELL   = $00000080;
  {$EXTERNALSYM KLF_NOTELLSHELL}
  KLF_SETFORPROCESS = $00000100;
  {$EXTERNALSYM KLF_SETFORPROCESS}
  KLF_SHIFTLOCK     = $00010000;
  {$EXTERNALSYM KLF_SHIFTLOCK}
  KLF_RESET         = $40000000;
  {$EXTERNALSYM KLF_RESET}

//
// Bits in wParam of WM_INPUTLANGCHANGEREQUEST message
//

  INPUTLANGCHANGE_SYSCHARSET = $0001;
  {$EXTERNALSYM INPUTLANGCHANGE_SYSCHARSET}
  INPUTLANGCHANGE_FORWARD    = $0002;
  {$EXTERNALSYM INPUTLANGCHANGE_FORWARD}
  INPUTLANGCHANGE_BACKWARD   = $0004;
  {$EXTERNALSYM INPUTLANGCHANGE_BACKWARD}

//
// Size of KeyboardLayoutName (number of characters), including nul terminator
//

  KL_NAMELENGTH = 9;
  {$EXTERNALSYM KL_NAMELENGTH}

function LoadKeyboardLayoutA(pwszKLID: LPCSTR; Flags: UINT): HKL; stdcall;
{$EXTERNALSYM LoadKeyboardLayoutA}
function LoadKeyboardLayoutW(pwszKLID: LPCWSTR; Flags: UINT): HKL; stdcall;
{$EXTERNALSYM LoadKeyboardLayoutW}
function LoadKeyboardLayout(pwszKLID: LPCTSTR; Flags: UINT): HKL; stdcall;
{$EXTERNALSYM LoadKeyboardLayout}

function ActivateKeyboardLayout(hkl: HKL; Flags: UINT): HKL; stdcall;
{$EXTERNALSYM ActivateKeyboardLayout}

function ToUnicodeEx(wVirtKey, wScanCode: UINT; lpKeyState: PBYTE;
  pwszBuff: LPWSTR; cchBuff: Integer; wFlags: UINT; dwhkl: HKL): Integer; stdcall;
{$EXTERNALSYM ToUnicodeEx}

function UnloadKeyboardLayout(hkl: HKL): BOOL; stdcall;
{$EXTERNALSYM UnloadKeyboardLayout}

function GetKeyboardLayoutNameA(pwszKLID: LPSTR): BOOL; stdcall;
{$EXTERNALSYM GetKeyboardLayoutNameA}
function GetKeyboardLayoutNameW(pwszKLID: LPWSTR): BOOL; stdcall;
{$EXTERNALSYM GetKeyboardLayoutNameW}
function GetKeyboardLayoutName(pwszKLID: LPTSTR): BOOL; stdcall;
{$EXTERNALSYM GetKeyboardLayoutName}

function GetKeyboardLayoutList(nBuff: Integer; lpList: PHKL): Integer; stdcall;
{$EXTERNALSYM GetKeyboardLayoutList}

function GetKeyboardLayout(idThread: DWORD): HKL; stdcall;
{$EXTERNALSYM GetKeyboardLayout}

type
  LPMOUSEMOVEPOINT = ^MOUSEMOVEPOINT;
  {$EXTERNALSYM LPMOUSEMOVEPOINT}
  tagMOUSEMOVEPOINT = record
    x: Integer;
    y: Integer;
    time: DWORD;
    dwExtraInfo: ULONG_PTR;
  end;
  {$EXTERNALSYM tagMOUSEMOVEPOINT}
  MOUSEMOVEPOINT = tagMOUSEMOVEPOINT;
  {$EXTERNALSYM MOUSEMOVEPOINT}
  TMouseMovePoint = MOUSEMOVEPOINT;
  PMouseMovePoint = LPMOUSEMOVEPOINT;

//
// Values for resolution parameter of GetMouseMovePointsEx
//

const
  GMMP_USE_DISPLAY_POINTS         = 1;
  {$EXTERNALSYM GMMP_USE_DISPLAY_POINTS}
  GMMP_USE_HIGH_RESOLUTION_POINTS = 2;
  {$EXTERNALSYM GMMP_USE_HIGH_RESOLUTION_POINTS}

function GetMouseMovePointsEx(cbSize: UINT; lppt, lpptBuf: LPMOUSEMOVEPOINT;
  nBufPoints: Integer; resolution: DWORD): Integer; stdcall;
{$EXTERNALSYM GetMouseMovePointsEx}

//
// Desktop-specific access flags
//

const
  DESKTOP_READOBJECTS     = $0001;
  {$EXTERNALSYM DESKTOP_READOBJECTS}
  DESKTOP_CREATEWINDOW    = $0002;
  {$EXTERNALSYM DESKTOP_CREATEWINDOW}
  DESKTOP_CREATEMENU      = $0004;
  {$EXTERNALSYM DESKTOP_CREATEMENU}
  DESKTOP_HOOKCONTROL     = $0008;
  {$EXTERNALSYM DESKTOP_HOOKCONTROL}
  DESKTOP_JOURNALRECORD   = $0010;
  {$EXTERNALSYM DESKTOP_JOURNALRECORD}
  DESKTOP_JOURNALPLAYBACK = $0020;
  {$EXTERNALSYM DESKTOP_JOURNALPLAYBACK}
  DESKTOP_ENUMERATE       = $0040;
  {$EXTERNALSYM DESKTOP_ENUMERATE}
  DESKTOP_WRITEOBJECTS    = $0080;
  {$EXTERNALSYM DESKTOP_WRITEOBJECTS}
  DESKTOP_SWITCHDESKTOP   = $0100;
  {$EXTERNALSYM DESKTOP_SWITCHDESKTOP}

//
// Desktop-specific control flags
//

  DF_ALLOWOTHERACCOUNTHOOK = $0001;
  {$EXTERNALSYM DF_ALLOWOTHERACCOUNTHOOK}

function CreateDesktopA(lpszDesktop, lpszDevice: LPCSTR; pDevmode: LPDEVMODEA;
  dwFlags: DWORD; dwDesiredAccess: ACCESS_MASK; lpsa: LPSECURITY_ATTRIBUTES): HDESK; stdcall;
{$EXTERNALSYM CreateDesktopA}
function CreateDesktopW(lpszDesktop, lpszDevice: LPCWSTR; pDevmode: LPDEVMODEW;
  dwFlags: DWORD; dwDesiredAccess: ACCESS_MASK; lpsa: LPSECURITY_ATTRIBUTES): HDESK; stdcall;
{$EXTERNALSYM CreateDesktopW}
function CreateDesktop(lpszDesktop, lpszDevice: LPCTSTR; pDevmode: LPDEVMODE;
  dwFlags: DWORD; dwDesiredAccess: ACCESS_MASK; lpsa: LPSECURITY_ATTRIBUTES): HDESK; stdcall;
{$EXTERNALSYM CreateDesktop}

function OpenDesktopA(lpszDesktop: LPCSTR; dwFlags: DWORD; fInherit: BOOL;
  dwDesiredAccess: ACCESS_MASK): HDESK; stdcall;
{$EXTERNALSYM OpenDesktopA}
function OpenDesktopW(lpszDesktop: LPCWSTR; dwFlags: DWORD; fInherit: BOOL;
  dwDesiredAccess: ACCESS_MASK): HDESK; stdcall;
{$EXTERNALSYM OpenDesktopW}
function OpenDesktop(lpszDesktop: LPCTSTR; dwFlags: DWORD; fInherit: BOOL;
  dwDesiredAccess: ACCESS_MASK): HDESK; stdcall;
{$EXTERNALSYM OpenDesktop}

function OpenInputDesktop(dwFlags: DWORD; fInherit: BOOL;
  dwDesiredAccess: ACCESS_MASK): HDESK; stdcall;
{$EXTERNALSYM OpenInputDesktop}

function EnumDesktopsA(hwinsta: HWINSTA; lpEnumFunc: DESKTOPENUMPROCA;
  lParam: LPARAM): BOOL; stdcall;
{$EXTERNALSYM EnumDesktopsA}
function EnumDesktopsW(hwinsta: HWINSTA; lpEnumFunc: DESKTOPENUMPROCW;
  lParam: LPARAM): BOOL; stdcall;
{$EXTERNALSYM EnumDesktopsW}
function EnumDesktops(hwinsta: HWINSTA; lpEnumFunc: DESKTOPENUMPROC;
  lParam: LPARAM): BOOL; stdcall;
{$EXTERNALSYM EnumDesktops}

function EnumDesktopWindows(hDesktop: HDESK; lpfn: WNDENUMPROC; lParam: LPARAM): BOOL; stdcall;
{$EXTERNALSYM EnumDesktopWindows}

function SwitchDesktop(hDesktop: HDESK): BOOL; stdcall;
{$EXTERNALSYM SwitchDesktop}

function SetThreadDesktop(hDesktop: HDESK): BOOL; stdcall;
{$EXTERNALSYM SetThreadDesktop}

function CloseDesktop(hDesktop: HDESK): BOOL; stdcall;
{$EXTERNALSYM CloseDesktop}

function GetThreadDesktop(dwThreadId: DWORD): HDESK; stdcall;
{$EXTERNALSYM GetThreadDesktop}

//
// Windowstation-specific access flags
//

const
  WINSTA_ENUMDESKTOPS      = $0001;
  {$EXTERNALSYM WINSTA_ENUMDESKTOPS}
  WINSTA_READATTRIBUTES    = $0002;
  {$EXTERNALSYM WINSTA_READATTRIBUTES}
  WINSTA_ACCESSCLIPBOARD   = $0004;
  {$EXTERNALSYM WINSTA_ACCESSCLIPBOARD}
  WINSTA_CREATEDESKTOP     = $0008;
  {$EXTERNALSYM WINSTA_CREATEDESKTOP}
  WINSTA_WRITEATTRIBUTES   = $0010;
  {$EXTERNALSYM WINSTA_WRITEATTRIBUTES}
  WINSTA_ACCESSGLOBALATOMS = $0020;
  {$EXTERNALSYM WINSTA_ACCESSGLOBALATOMS}
  WINSTA_EXITWINDOWS       = $0040;
  {$EXTERNALSYM WINSTA_EXITWINDOWS}
  WINSTA_ENUMERATE         = $0100;
  {$EXTERNALSYM WINSTA_ENUMERATE}
  WINSTA_READSCREEN        = $0200;
  {$EXTERNALSYM WINSTA_READSCREEN}

  WINSTA_ALL_ACCESS        = (WINSTA_ENUMDESKTOPS or WINSTA_READATTRIBUTES or WINSTA_ACCESSCLIPBOARD or
                              WINSTA_CREATEDESKTOP or WINSTA_WRITEATTRIBUTES or WINSTA_ACCESSGLOBALATOMS or
                              WINSTA_EXITWINDOWS or WINSTA_ENUMERATE or WINSTA_READSCREEN);
  {$EXTERNALSYM WINSTA_ALL_ACCESS}

//
// Windowstation creation flags.
//

  CWF_CREATE_ONLY          = $0001;
  {$EXTERNALSYM CWF_CREATE_ONLY}

//
// Windowstation-specific attribute flags
//

  WSF_VISIBLE = $0001;
  {$EXTERNALSYM WSF_VISIBLE}

function CreateWindowStationA(lpwinsta: LPCSTR; dwFlags: DWORD;
  dwDesiredAccess: ACCESS_MASK; lpsa: LPSECURITY_ATTRIBUTES): HWINSTA; stdcall;
{$EXTERNALSYM CreateWindowStationA}
function CreateWindowStationW(lpwinsta: LPCWSTR; dwFlags: DWORD;
  dwDesiredAccess: ACCESS_MASK; lpsa: LPSECURITY_ATTRIBUTES): HWINSTA; stdcall;
{$EXTERNALSYM CreateWindowStationW}
function CreateWindowStation(lpwinsta: LPCTSTR; dwFlags: DWORD;
  dwDesiredAccess: ACCESS_MASK; lpsa: LPSECURITY_ATTRIBUTES): HWINSTA; stdcall;
{$EXTERNALSYM CreateWindowStation}

function OpenWindowStationA(lpszWinSta: LPCSTR; fInherit: BOOL;
  dwDesiredAccess: ACCESS_MASK): HWINSTA; stdcall;
{$EXTERNALSYM OpenWindowStationA}
function OpenWindowStationW(lpszWinSta: LPCWSTR; fInherit: BOOL;
  dwDesiredAccess: ACCESS_MASK): HWINSTA; stdcall;
{$EXTERNALSYM OpenWindowStationW}
function OpenWindowStation(lpszWinSta: LPCTSTR; fInherit: BOOL;
  dwDesiredAccess: ACCESS_MASK): HWINSTA; stdcall;
{$EXTERNALSYM OpenWindowStation}

function EnumWindowStationsA(lpEnumFunc: WINSTAENUMPROCA; lParam: LPARAM): BOOL; stdcall;
{$EXTERNALSYM EnumWindowStationsA}
function EnumWindowStationsW(lpEnumFunc: WINSTAENUMPROCW; lParam: LPARAM): BOOL; stdcall;
{$EXTERNALSYM EnumWindowStationsW}
function EnumWindowStations(lpEnumFunc: WINSTAENUMPROC; lParam: LPARAM): BOOL; stdcall;
{$EXTERNALSYM EnumWindowStations}

function CloseWindowStation(hWinSta: HWINSTA): BOOL; stdcall;
{$EXTERNALSYM CloseWindowStation}

function SetProcessWindowStation(hWinSta: HWINSTA): BOOL; stdcall;
{$EXTERNALSYM SetProcessWindowStation}

function GetProcessWindowStation: HWINSTA; stdcall;
{$EXTERNALSYM GetProcessWindowStation}

function SetUserObjectSecurity(hObj: HANDLE; var pSIRequested: SECURITY_INFORMATION;
  pSID: PSECURITY_DESCRIPTOR): BOOL; stdcall;
{$EXTERNALSYM SetUserObjectSecurity}

function GetUserObjectSecurity(hObj: HANDLE; var pSIRequested: SECURITY_INFORMATION;
  pSID: PSECURITY_DESCRIPTOR; nLength: DWORD; var lpnLengthNeeded: DWORD): BOOL; stdcall;
{$EXTERNALSYM GetUserObjectSecurity}

const
  UOI_FLAGS    = 1;
  {$EXTERNALSYM UOI_FLAGS}
  UOI_NAME     = 2;
  {$EXTERNALSYM UOI_NAME}
  UOI_TYPE     = 3;
  {$EXTERNALSYM UOI_TYPE}
  UOI_USER_SID = 4;
  {$EXTERNALSYM UOI_USER_SID}

type
  PUSEROBJECTFLAGS = ^USEROBJECTFLAGS;
  tagUSEROBJECTFLAGS = record
    fInherit: BOOL;
    fReserved: BOOL;
    dwFlags: DWORD;
  end;
  {$EXTERNALSYM tagUSEROBJECTFLAGS}
  USEROBJECTFLAGS = tagUSEROBJECTFLAGS;
  {$EXTERNALSYM USEROBJECTFLAGS}
  TUserObjectFlags = USEROBJECTFLAGS;

function GetUserObjectInformationA(hObj: HANDLE; nIndex: Integer; pvInfo: PVOID;
  nLength: DWORD; var lpnLengthNeeded: DWORD): BOOL; stdcall;
{$EXTERNALSYM GetUserObjectInformationA}
function GetUserObjectInformationW(hObj: HANDLE; nIndex: Integer; pvInfo: PVOID;
  nLength: DWORD; var lpnLengthNeeded: DWORD): BOOL; stdcall;
{$EXTERNALSYM GetUserObjectInformationW}
function GetUserObjectInformation(hObj: HANDLE; nIndex: Integer; pvInfo: PVOID;
  nLength: DWORD; var lpnLengthNeeded: DWORD): BOOL; stdcall;
{$EXTERNALSYM GetUserObjectInformation}

function SetUserObjectInformationA(hObj: HANDLE; nIndex: Integer; pvInfo: PVOID;
  nLength: DWORD): BOOL; stdcall;
{$EXTERNALSYM SetUserObjectInformationA}
function SetUserObjectInformationW(hObj: HANDLE; nIndex: Integer; pvInfo: PVOID;
  nLength: DWORD): BOOL; stdcall;
{$EXTERNALSYM SetUserObjectInformationW}
function SetUserObjectInformation(hObj: HANDLE; nIndex: Integer; pvInfo: PVOID;
  nLength: DWORD): BOOL; stdcall;
{$EXTERNALSYM SetUserObjectInformation}

type
  LPWNDCLASSEXA = ^WNDCLASSEXA;
  {$EXTERNALSYM LPWNDCLASSEXA}
  tagWNDCLASSEXA = record
    cbSize: UINT;
    // Win 3.x
    style: UINT;
    lpfnWndProc: WNDPROC;
    cbClsExtra: Integer;
    cbWndExtra: Integer;
    hInstance: HINST;
    hIcon: HICON;
    hCursor: HCURSOR;
    hbrBackground: HBRUSH;
    lpszMenuName: LPCSTR;
    lpszClassName: LPCSTR;
    // Win 4.0
    hIconSm: HICON;
  end;
  {$EXTERNALSYM tagWNDCLASSEXA}
  WNDCLASSEXA = tagWNDCLASSEXA;
  {$EXTERNALSYM WNDCLASSEXA}
  NPWNDCLASSEXA = ^WNDCLASSEXA;
  {$EXTERNALSYM NPWNDCLASSEXA}
  TWndClassExA = WNDCLASSEXA;
  PWndClassExA = LPWNDCLASSEXA;

  LPWNDCLASSEXW = ^WNDCLASSEXW;
  {$EXTERNALSYM LPWNDCLASSEXW}
  tagWNDCLASSEXW = record
    cbSize: UINT;
    // Win 3.x
    style: UINT;
    lpfnWndProc: WNDPROC;
    cbClsExtra: Integer;
    cbWndExtra: Integer;
    hInstance: HINST;
    hIcon: HICON;
    hCursor: HCURSOR;
    hbrBackground: HBRUSH;
    lpszMenuName: LPCWSTR;
    lpszClassName: LPCWSTR;
    // Win 4.0
    hIconSm: HICON;
  end;
  {$EXTERNALSYM tagWNDCLASSEXW}
  WNDCLASSEXW = tagWNDCLASSEXW;
  {$EXTERNALSYM WNDCLASSEXW}
  NPWNDCLASSEXW = ^WNDCLASSEXW;
  {$EXTERNALSYM NPWNDCLASSEXW}
  TWndClassExW = WNDCLASSEXW;
  PWndClassExW = LPWNDCLASSEXW;

  {$IFDEF UNICODE}
  WNDCLASSEX = WNDCLASSEXW;
  {$EXTERNALSYM WNDCLASSEX}
  NPWNDCLASSEX = NPWNDCLASSEXW;
  {$EXTERNALSYM NPWNDCLASSEX}
  LPWNDCLASSEX = LPWNDCLASSEXW;
  {$EXTERNALSYM LPWNDCLASSEX}
  TWndClassEx = TWndClassExW;
  PWndClassEx = PWndClassExW;
  {$ELSE}
  WNDCLASSEX = WNDCLASSEXA;
  {$EXTERNALSYM WNDCLASSEX}
  NPWNDCLASSEX = NPWNDCLASSEXA;
  {$EXTERNALSYM NPWNDCLASSEX}
  LPWNDCLASSEX = LPWNDCLASSEXA;
  {$EXTERNALSYM LPWNDCLASSEX}
  TWndClassEx = TWndClassExA;
  PWndClassEx = PWndClassExA;
  {$ENDIF UNICODE}

  LPWNDCLASSA = ^WNDCLASSA;
  {$EXTERNALSYM LPWNDCLASSA}
  tagWNDCLASSA = record
    style: UINT;
    lpfnWndProc: WNDPROC;
    cbClsExtra: Integer;
    cbWndExtra: Integer;
    hInstance: HINST;
    hIcon: HICON;
    hCursor: HCURSOR;
    hbrBackground: HBRUSH;
    lpszMenuName: LPCSTR;
    lpszClassName: LPCSTR;
  end;
  {$EXTERNALSYM tagWNDCLASSA}
  WNDCLASSA = tagWNDCLASSA;
  {$EXTERNALSYM WNDCLASSA}
  NPWNDCLASSA = ^WNDCLASSA;
  {$EXTERNALSYM NPWNDCLASSA}
  TWndClassA = WNDCLASSA;
  PWndClassA = LPWNDCLASSA;

  LPWNDCLASSW = ^WNDCLASSW;
  {$EXTERNALSYM LPWNDCLASSW}
  tagWNDCLASSW = record
    style: UINT;
    lpfnWndProc: WNDPROC;
    cbClsExtra: Integer;
    cbWndExtra: Integer;
    hInstance: HINST;
    hIcon: HICON;
    hCursor: HCURSOR;
    hbrBackground: HBRUSH;
    lpszMenuName: LPCWSTR;
    lpszClassName: LPCWSTR;
  end;
  {$EXTERNALSYM tagWNDCLASSW}
  WNDCLASSW = tagWNDCLASSW;
  {$EXTERNALSYM WNDCLASSW}
  NPWNDCLASSW = ^WNDCLASSW;
  {$EXTERNALSYM NPWNDCLASSW}
  TWndClassW = WNDCLASSW;
  PWndClassW = LPWNDCLASSW;

  {$IFDEF UNICODE}
  WNDCLASS = WNDCLASSW;
  {$EXTERNALSYM WNDCLASS}
  NPWNDCLASS = NPWNDCLASSW;
  {$EXTERNALSYM NPWNDCLASS}
  LPWNDCLASS = LPWNDCLASSW;
  {$EXTERNALSYM LPWNDCLASS}
  TWndClass = TWndClassW;
  PWndClass = PWndClassW;
  {$ELSE}
  WNDCLASS = WNDCLASSA;
  {$EXTERNALSYM WNDCLASS}
  NPWNDCLASS = NPWNDCLASSA;
  {$EXTERNALSYM NPWNDCLASS}
  LPWNDCLASS = LPWNDCLASSA;
  {$EXTERNALSYM LPWNDCLASS}
  TWndClass = TWndClassA;
  PWndClass = PWndClassA;
  {$ENDIF UNICODE}

function IsHungAppWindow(hwnd: HWND): BOOL; stdcall;
{$EXTERNALSYM IsHungAppWindow}

procedure DisableProcessWindowsGhosting; stdcall;
{$EXTERNALSYM DisableProcessWindowsGhosting}

//
// Message structure
//

type
  LPMSG = ^MSG;
  {$EXTERNALSYM LPMSG}
  tagMSG = record
    hwnd: HWND;
    message: UINT;
    wParam: WPARAM;
    lParam: LPARAM;
    time: DWORD;
    pt: POINT;
  end;
  {$EXTERNALSYM tagMSG}
  MSG = tagMSG;
  {$EXTERNALSYM MSG}
  NPMSG = ^MSG;
  {$EXTERNALSYM NPMSG}
  TMsg = MSG;
  PMsg = LPMSG;

function MAKEWPARAM(wLow, wHigh: WORD): WPARAM;
{$EXTERNALSYM MAKEWPARAM}

function MAKELPARAM(wLow, wHigh: WORD): LPARAM;
{$EXTERNALSYM MAKELPARAM}

function MAKELRESULT(wLow, wHigh: WORD): LRESULT;
{$EXTERNALSYM MAKELRESULT}

//
// Window field offsets for GetWindowLong()
//

const
  GWL_WNDPROC    = -4;
  {$EXTERNALSYM GWL_WNDPROC}
  GWL_HINSTANCE  = -6;
  {$EXTERNALSYM GWL_HINSTANCE}
  GWL_HWNDPARENT = -8;
  {$EXTERNALSYM GWL_HWNDPARENT}
  GWL_STYLE      = -16;
  {$EXTERNALSYM GWL_STYLE}
  GWL_EXSTYLE    = -20;
  {$EXTERNALSYM GWL_EXSTYLE}
  GWL_USERDATA   = -21;
  {$EXTERNALSYM GWL_USERDATA}
  GWL_ID         = -12;
  {$EXTERNALSYM GWL_ID}

  GWLP_WNDPROC    = -4;
  {$EXTERNALSYM GWLP_WNDPROC}
  GWLP_HINSTANCE  = -6;
  {$EXTERNALSYM GWLP_HINSTANCE}
  GWLP_HWNDPARENT = -8;
  {$EXTERNALSYM GWLP_HWNDPARENT}
  GWLP_USERDATA   = -21;
  {$EXTERNALSYM GWLP_USERDATA}
  GWLP_ID         = -12;
  {$EXTERNALSYM GWLP_ID}

//
// Class field offsets for GetClassLong()
//

  GCL_MENUNAME      = DWORD(-8);
  {$EXTERNALSYM GCL_MENUNAME}
  GCL_HBRBACKGROUND = DWORD(-10);
  {$EXTERNALSYM GCL_HBRBACKGROUND}
  GCL_HCURSOR       = DWORD(-12);
  {$EXTERNALSYM GCL_HCURSOR}
  GCL_HICON         = DWORD(-14);
  {$EXTERNALSYM GCL_HICON}
  GCL_HMODULE       = DWORD(-16);
  {$EXTERNALSYM GCL_HMODULE}
  GCL_CBWNDEXTRA    = DWORD(-18);
  {$EXTERNALSYM GCL_CBWNDEXTRA}
  GCL_CBCLSEXTRA    = DWORD(-20);
  {$EXTERNALSYM GCL_CBCLSEXTRA}
  GCL_WNDPROC       = DWORD(-24);
  {$EXTERNALSYM GCL_WNDPROC}
  GCL_STYLE         = DWORD(-26);
  {$EXTERNALSYM GCL_STYLE}
  GCW_ATOM          = DWORD(-32);
  {$EXTERNALSYM GCW_ATOM}

  GCL_HICONSM = DWORD(-34);
  {$EXTERNALSYM GCL_HICONSM}

  GCLP_MENUNAME      = DWORD(-8);
  {$EXTERNALSYM GCLP_MENUNAME}
  GCLP_HBRBACKGROUND = DWORD(-10);
  {$EXTERNALSYM GCLP_HBRBACKGROUND}
  GCLP_HCURSOR       = DWORD(-12);
  {$EXTERNALSYM GCLP_HCURSOR}
  GCLP_HICON         = DWORD(-14);
  {$EXTERNALSYM GCLP_HICON}
  GCLP_HMODULE       = DWORD(-16);
  {$EXTERNALSYM GCLP_HMODULE}
  GCLP_WNDPROC       = DWORD(-24);
  {$EXTERNALSYM GCLP_WNDPROC}
  GCLP_HICONSM       = DWORD(-34);
  {$EXTERNALSYM GCLP_HICONSM}

//
// Window Messages
//

  WM_NULL    = $0000;
  {$EXTERNALSYM WM_NULL}
  WM_CREATE  = $0001;
  {$EXTERNALSYM WM_CREATE}
  WM_DESTROY = $0002;
  {$EXTERNALSYM WM_DESTROY}
  WM_MOVE    = $0003;
  {$EXTERNALSYM WM_MOVE}
  WM_SIZE    = $0005;
  {$EXTERNALSYM WM_SIZE}

  WM_ACTIVATE = $0006;
  {$EXTERNALSYM WM_ACTIVATE}

//
// WM_ACTIVATE state values
//

  WA_INACTIVE    = 0;
  {$EXTERNALSYM WA_INACTIVE}
  WA_ACTIVE      = 1;
  {$EXTERNALSYM WA_ACTIVE}
  WA_CLICKACTIVE = 2;
  {$EXTERNALSYM WA_CLICKACTIVE}

  WM_SETFOCUS        = $0007;
  {$EXTERNALSYM WM_SETFOCUS}
  WM_KILLFOCUS       = $0008;
  {$EXTERNALSYM WM_KILLFOCUS}
  WM_ENABLE          = $000A;
  {$EXTERNALSYM WM_ENABLE}
  WM_SETREDRAW       = $000B;
  {$EXTERNALSYM WM_SETREDRAW}
  WM_SETTEXT         = $000C;
  {$EXTERNALSYM WM_SETTEXT}
  WM_GETTEXT         = $000D;
  {$EXTERNALSYM WM_GETTEXT}
  WM_GETTEXTLENGTH   = $000E;
  {$EXTERNALSYM WM_GETTEXTLENGTH}
  WM_PAINT           = $000F;
  {$EXTERNALSYM WM_PAINT}
  WM_CLOSE           = $0010;
  {$EXTERNALSYM WM_CLOSE}
  WM_QUERYENDSESSION = $0011;
  {$EXTERNALSYM WM_QUERYENDSESSION}
  WM_QUERYOPEN       = $0013;
  {$EXTERNALSYM WM_QUERYOPEN}
  WM_ENDSESSION      = $0016;
  {$EXTERNALSYM WM_ENDSESSION}
  WM_QUIT            = $0012;
  {$EXTERNALSYM WM_QUIT}
  WM_ERASEBKGND      = $0014;
  {$EXTERNALSYM WM_ERASEBKGND}
  WM_SYSCOLORCHANGE  = $0015;
  {$EXTERNALSYM WM_SYSCOLORCHANGE}
  WM_SHOWWINDOW      = $0018;
  {$EXTERNALSYM WM_SHOWWINDOW}
  WM_WININICHANGE    = $001A;
  {$EXTERNALSYM WM_WININICHANGE}
  WM_SETTINGCHANGE   = WM_WININICHANGE;
  {$EXTERNALSYM WM_SETTINGCHANGE}

  WM_DEVMODECHANGE = $001B;
  {$EXTERNALSYM WM_DEVMODECHANGE}
  WM_ACTIVATEAPP   = $001C;
  {$EXTERNALSYM WM_ACTIVATEAPP}
  WM_FONTCHANGE    = $001D;
  {$EXTERNALSYM WM_FONTCHANGE}
  WM_TIMECHANGE    = $001E;
  {$EXTERNALSYM WM_TIMECHANGE}
  WM_CANCELMODE    = $001F;
  {$EXTERNALSYM WM_CANCELMODE}
  WM_SETCURSOR     = $0020;
  {$EXTERNALSYM WM_SETCURSOR}
  WM_MOUSEACTIVATE = $0021;
  {$EXTERNALSYM WM_MOUSEACTIVATE}
  WM_CHILDACTIVATE = $0022;
  {$EXTERNALSYM WM_CHILDACTIVATE}
  WM_QUEUESYNC     = $0023;
  {$EXTERNALSYM WM_QUEUESYNC}

  WM_GETMINMAXINFO = $0024;
  {$EXTERNALSYM WM_GETMINMAXINFO}

//
// Struct pointed to by WM_GETMINMAXINFO lParam
//

type
  LPMINMAXINFO = ^MINMAXINFO;
  {$EXTERNALSYM LPMINMAXINFO}
  tagMINMAXINFO = record
    ptReserved: POINT;
    ptMaxSize: POINT;
    ptMaxPosition: POINT;
    ptMinTrackSize: POINT;
    ptMaxTrackSize: POINT;
  end;
  {$EXTERNALSYM tagMINMAXINFO}
  MINMAXINFO = tagMINMAXINFO;
  {$EXTERNALSYM MINMAXINFO}
  TMinMaxInfo = MINMAXINFO;
  PMinMaxInfo = LPMINMAXINFO;

const
  WM_PAINTICON         = $0026;
  {$EXTERNALSYM WM_PAINTICON}
  WM_ICONERASEBKGND    = $0027;
  {$EXTERNALSYM WM_ICONERASEBKGND}
  WM_NEXTDLGCTL        = $0028;
  {$EXTERNALSYM WM_NEXTDLGCTL}
  WM_SPOOLERSTATUS     = $002A;
  {$EXTERNALSYM WM_SPOOLERSTATUS}
  WM_DRAWITEM          = $002B;
  {$EXTERNALSYM WM_DRAWITEM}
  WM_MEASUREITEM       = $002C;
  {$EXTERNALSYM WM_MEASUREITEM}
  WM_DELETEITEM        = $002D;
  {$EXTERNALSYM WM_DELETEITEM}
  WM_VKEYTOITEM        = $002E;
  {$EXTERNALSYM WM_VKEYTOITEM}
  WM_CHARTOITEM        = $002F;
  {$EXTERNALSYM WM_CHARTOITEM}
  WM_SETFONT           = $0030;
  {$EXTERNALSYM WM_SETFONT}
  WM_GETFONT           = $0031;
  {$EXTERNALSYM WM_GETFONT}
  WM_SETHOTKEY         = $0032;
  {$EXTERNALSYM WM_SETHOTKEY}
  WM_GETHOTKEY         = $0033;
  {$EXTERNALSYM WM_GETHOTKEY}
  WM_QUERYDRAGICON     = $0037;
  {$EXTERNALSYM WM_QUERYDRAGICON}
  WM_COMPAREITEM       = $0039;
  {$EXTERNALSYM WM_COMPAREITEM}
  WM_GETOBJECT         = $003D;
  {$EXTERNALSYM WM_GETOBJECT}
  WM_COMPACTING        = $0041;
  {$EXTERNALSYM WM_COMPACTING}
  WM_COMMNOTIFY        = $0044; // no longer suported
  {$EXTERNALSYM WM_COMMNOTIFY}
  WM_WINDOWPOSCHANGING = $0046;
  {$EXTERNALSYM WM_WINDOWPOSCHANGING}
  WM_WINDOWPOSCHANGED  = $0047;
  {$EXTERNALSYM WM_WINDOWPOSCHANGED}

  WM_POWER = $0048;
  {$EXTERNALSYM WM_POWER}

//
// wParam for WM_POWER window message and DRV_POWER driver notification
//

  PWR_OK             = 1;
  {$EXTERNALSYM PWR_OK}
  PWR_FAIL           = DWORD(-1);
  {$EXTERNALSYM PWR_FAIL}
  PWR_SUSPENDREQUEST = 1;
  {$EXTERNALSYM PWR_SUSPENDREQUEST}
  PWR_SUSPENDRESUME  = 2;
  {$EXTERNALSYM PWR_SUSPENDRESUME}
  PWR_CRITICALRESUME = 3;
  {$EXTERNALSYM PWR_CRITICALRESUME}

  WM_COPYDATA      = $004A;
  {$EXTERNALSYM WM_COPYDATA}
  WM_CANCELJOURNAL = $004B;
  {$EXTERNALSYM WM_CANCELJOURNAL}

//
// lParam of WM_COPYDATA message points to...
//

type
  PCOPYDATASTRUCT = ^COPYDATASTRUCT;
  tagCOPYDATASTRUCT = record
    dwData: ULONG_PTR;
    cbData: DWORD;
    lpData: PVOID;
  end;
  {$EXTERNALSYM tagCOPYDATASTRUCT}
  COPYDATASTRUCT = tagCOPYDATASTRUCT;
  {$EXTERNALSYM COPYDATASTRUCT}
  TCopyDataStruct = COPYDATASTRUCT;

  LPMDINEXTMENU = ^MDINEXTMENU;
  {$EXTERNALSYM LPMDINEXTMENU}
  tagMDINEXTMENU = record
    hmenuIn: HMENU;
    hmenuNext: HMENU;
    hwndNext: HWND;
  end;
  {$EXTERNALSYM tagMDINEXTMENU}
  MDINEXTMENU = tagMDINEXTMENU;
  {$EXTERNALSYM MDINEXTMENU}
  TMdiNextMenu = MDINEXTMENU;
  PMdiNextMenu = LPMDINEXTMENU;

const
  WM_NOTIFY                 = $004E;
  {$EXTERNALSYM WM_NOTIFY}
  WM_INPUTLANGCHANGEREQUEST = $0050;
  {$EXTERNALSYM WM_INPUTLANGCHANGEREQUEST}
  WM_INPUTLANGCHANGE        = $0051;
  {$EXTERNALSYM WM_INPUTLANGCHANGE}
  WM_TCARD                  = $0052;
  {$EXTERNALSYM WM_TCARD}
  WM_HELP                   = $0053;
  {$EXTERNALSYM WM_HELP}
  WM_USERCHANGED            = $0054;
  {$EXTERNALSYM WM_USERCHANGED}
  WM_NOTIFYFORMAT           = $0055;
  {$EXTERNALSYM WM_NOTIFYFORMAT}

  NFR_ANSI    = 1;
  {$EXTERNALSYM NFR_ANSI}
  NFR_UNICODE = 2;
  {$EXTERNALSYM NFR_UNICODE}
  NF_QUERY    = 3;
  {$EXTERNALSYM NF_QUERY}
  NF_REQUERY  = 4;
  {$EXTERNALSYM NF_REQUERY}

  WM_CONTEXTMENU   = $007B;
  {$EXTERNALSYM WM_CONTEXTMENU}
  WM_STYLECHANGING = $007C;
  {$EXTERNALSYM WM_STYLECHANGING}
  WM_STYLECHANGED  = $007D;
  {$EXTERNALSYM WM_STYLECHANGED}
  WM_DISPLAYCHANGE = $007E;
  {$EXTERNALSYM WM_DISPLAYCHANGE}
  WM_GETICON       = $007F;
  {$EXTERNALSYM WM_GETICON}
  WM_SETICON       = $0080;
  {$EXTERNALSYM WM_SETICON}

  WM_NCCREATE        = $0081;
  {$EXTERNALSYM WM_NCCREATE}
  WM_NCDESTROY       = $0082;
  {$EXTERNALSYM WM_NCDESTROY}
  WM_NCCALCSIZE      = $0083;
  {$EXTERNALSYM WM_NCCALCSIZE}
  WM_NCHITTEST       = $0084;
  {$EXTERNALSYM WM_NCHITTEST}
  WM_NCPAINT         = $0085;
  {$EXTERNALSYM WM_NCPAINT}
  WM_NCACTIVATE      = $0086;
  {$EXTERNALSYM WM_NCACTIVATE}
  WM_GETDLGCODE      = $0087;
  {$EXTERNALSYM WM_GETDLGCODE}
  WM_SYNCPAINT       = $0088;
  {$EXTERNALSYM WM_SYNCPAINT}
  WM_NCMOUSEMOVE     = $00A0;
  {$EXTERNALSYM WM_NCMOUSEMOVE}
  WM_NCLBUTTONDOWN   = $00A1;
  {$EXTERNALSYM WM_NCLBUTTONDOWN}
  WM_NCLBUTTONUP     = $00A2;
  {$EXTERNALSYM WM_NCLBUTTONUP}
  WM_NCLBUTTONDBLCLK = $00A3;
  {$EXTERNALSYM WM_NCLBUTTONDBLCLK}
  WM_NCRBUTTONDOWN   = $00A4;
  {$EXTERNALSYM WM_NCRBUTTONDOWN}
  WM_NCRBUTTONUP     = $00A5;
  {$EXTERNALSYM WM_NCRBUTTONUP}
  WM_NCRBUTTONDBLCLK = $00A6;
  {$EXTERNALSYM WM_NCRBUTTONDBLCLK}
  WM_NCMBUTTONDOWN   = $00A7;
  {$EXTERNALSYM WM_NCMBUTTONDOWN}
  WM_NCMBUTTONUP     = $00A8;
  {$EXTERNALSYM WM_NCMBUTTONUP}
  WM_NCMBUTTONDBLCLK = $00A9;
  {$EXTERNALSYM WM_NCMBUTTONDBLCLK}

  WM_NCXBUTTONDOWN   = $00AB;
  {$EXTERNALSYM WM_NCXBUTTONDOWN}
  WM_NCXBUTTONUP     = $00AC;
  {$EXTERNALSYM WM_NCXBUTTONUP}
  WM_NCXBUTTONDBLCLK = $00AD;
  {$EXTERNALSYM WM_NCXBUTTONDBLCLK}

  WM_INPUT           = $00FF;
  {$EXTERNALSYM WM_INPUT}

  WM_KEYFIRST    = $0100;
  {$EXTERNALSYM WM_KEYFIRST}
  WM_KEYDOWN     = $0100;
  {$EXTERNALSYM WM_KEYDOWN}
  WM_KEYUP       = $0101;
  {$EXTERNALSYM WM_KEYUP}
  WM_CHAR        = $0102;
  {$EXTERNALSYM WM_CHAR}
  WM_DEADCHAR    = $0103;
  {$EXTERNALSYM WM_DEADCHAR}
  WM_SYSKEYDOWN  = $0104;
  {$EXTERNALSYM WM_SYSKEYDOWN}
  WM_SYSKEYUP    = $0105;
  {$EXTERNALSYM WM_SYSKEYUP}
  WM_SYSCHAR     = $0106;
  {$EXTERNALSYM WM_SYSCHAR}
  WM_SYSDEADCHAR = $0107;
  {$EXTERNALSYM WM_SYSDEADCHAR}
  {$IFDEF WINXP_UP}
  WM_UNICHAR     = $0109;
  {$EXTERNALSYM WM_UNICHAR}
  WM_KEYLAST     = $0109;
  {$EXTERNALSYM WM_KEYLAST}
  UNICODE_NOCHAR = $FFFF;
  {$EXTERNALSYM UNICODE_NOCHAR}
  {$ELSE}
  WM_KEYLAST     = $0108;
  {$EXTERNALSYM WM_KEYLAST}
  {$ENDIF WINXP_UP}

  WM_IME_STARTCOMPOSITION = $010D;
  {$EXTERNALSYM WM_IME_STARTCOMPOSITION}
  WM_IME_ENDCOMPOSITION   = $010E;
  {$EXTERNALSYM WM_IME_ENDCOMPOSITION}
  WM_IME_COMPOSITION      = $010F;
  {$EXTERNALSYM WM_IME_COMPOSITION}
  WM_IME_KEYLAST          = $010F;
  {$EXTERNALSYM WM_IME_KEYLAST}

  WM_INITDIALOG      = $0110;
  {$EXTERNALSYM WM_INITDIALOG}
  WM_COMMAND         = $0111;
  {$EXTERNALSYM WM_COMMAND}
  WM_SYSCOMMAND      = $0112;
  {$EXTERNALSYM WM_SYSCOMMAND}
  WM_TIMER           = $0113;
  {$EXTERNALSYM WM_TIMER}
  WM_HSCROLL         = $0114;
  {$EXTERNALSYM WM_HSCROLL}
  WM_VSCROLL         = $0115;
  {$EXTERNALSYM WM_VSCROLL}
  WM_INITMENU        = $0116;
  {$EXTERNALSYM WM_INITMENU}
  WM_INITMENUPOPUP   = $0117;
  {$EXTERNALSYM WM_INITMENUPOPUP}
  WM_MENUSELECT      = $011F;
  {$EXTERNALSYM WM_MENUSELECT}
  WM_MENUCHAR        = $0120;
  {$EXTERNALSYM WM_MENUCHAR}
  WM_ENTERIDLE       = $0121;
  {$EXTERNALSYM WM_ENTERIDLE}
  WM_MENURBUTTONUP   = $0122;
  {$EXTERNALSYM WM_MENURBUTTONUP}
  WM_MENUDRAG        = $0123;
  {$EXTERNALSYM WM_MENUDRAG}
  WM_MENUGETOBJECT   = $0124;
  {$EXTERNALSYM WM_MENUGETOBJECT}
  WM_UNINITMENUPOPUP = $0125;
  {$EXTERNALSYM WM_UNINITMENUPOPUP}
  WM_MENUCOMMAND     = $0126;
  {$EXTERNALSYM WM_MENUCOMMAND}

  WM_CHANGEUISTATE = $0127;
  {$EXTERNALSYM WM_CHANGEUISTATE}
  WM_UPDATEUISTATE = $0128;
  {$EXTERNALSYM WM_UPDATEUISTATE}
  WM_QUERYUISTATE  = $0129;
  {$EXTERNALSYM WM_QUERYUISTATE}

//
// LOWORD(wParam) values in WM_*UISTATE*
//

  UIS_SET        = 1;
  {$EXTERNALSYM UIS_SET}
  UIS_CLEAR      = 2;
  {$EXTERNALSYM UIS_CLEAR}
  UIS_INITIALIZE = 3;
  {$EXTERNALSYM UIS_INITIALIZE}

//
// HIWORD(wParam) values in WM_*UISTATE*
//

  UISF_HIDEFOCUS = $1;
  {$EXTERNALSYM UISF_HIDEFOCUS}
  UISF_HIDEACCEL = $2;
  {$EXTERNALSYM UISF_HIDEACCEL}
  UISF_ACTIVE    = $4;
  {$EXTERNALSYM UISF_ACTIVE}

  WM_CTLCOLORMSGBOX    = $0132;
  {$EXTERNALSYM WM_CTLCOLORMSGBOX}
  WM_CTLCOLOREDIT      = $0133;
  {$EXTERNALSYM WM_CTLCOLOREDIT}
  WM_CTLCOLORLISTBOX   = $0134;
  {$EXTERNALSYM WM_CTLCOLORLISTBOX}
  WM_CTLCOLORBTN       = $0135;
  {$EXTERNALSYM WM_CTLCOLORBTN}
  WM_CTLCOLORDLG       = $0136;
  {$EXTERNALSYM WM_CTLCOLORDLG}
  WM_CTLCOLORSCROLLBAR = $0137;
  {$EXTERNALSYM WM_CTLCOLORSCROLLBAR}
  WM_CTLCOLORSTATIC    = $0138;
  {$EXTERNALSYM WM_CTLCOLORSTATIC}
  MN_GETHMENU          = $01E1;
  {$EXTERNALSYM MN_GETHMENU}

  WM_MOUSEFIRST    = $0200;
  {$EXTERNALSYM WM_MOUSEFIRST}
  WM_MOUSEMOVE     = $0200;
  {$EXTERNALSYM WM_MOUSEMOVE}
  WM_LBUTTONDOWN   = $0201;
  {$EXTERNALSYM WM_LBUTTONDOWN}
  WM_LBUTTONUP     = $0202;
  {$EXTERNALSYM WM_LBUTTONUP}
  WM_LBUTTONDBLCLK = $0203;
  {$EXTERNALSYM WM_LBUTTONDBLCLK}
  WM_RBUTTONDOWN   = $0204;
  {$EXTERNALSYM WM_RBUTTONDOWN}
  WM_RBUTTONUP     = $0205;
  {$EXTERNALSYM WM_RBUTTONUP}
  WM_RBUTTONDBLCLK = $0206;
  {$EXTERNALSYM WM_RBUTTONDBLCLK}
  WM_MBUTTONDOWN   = $0207;
  {$EXTERNALSYM WM_MBUTTONDOWN}
  WM_MBUTTONUP     = $0208;
  {$EXTERNALSYM WM_MBUTTONUP}
  WM_MBUTTONDBLCLK = $0209;
  {$EXTERNALSYM WM_MBUTTONDBLCLK}
  WM_MOUSEWHEEL    = $020A;
  {$EXTERNALSYM WM_MOUSEWHEEL}
  WM_XBUTTONDOWN   = $020B;
  {$EXTERNALSYM WM_XBUTTONDOWN}
  WM_XBUTTONUP     = $020C;
  {$EXTERNALSYM WM_XBUTTONUP}
  WM_XBUTTONDBLCLK = $020D;
  {$EXTERNALSYM WM_XBUTTONDBLCLK}

  {$IFDEF WIN2000_UP}
  WM_MOUSELAST = $020D;
  {$EXTERNALSYM WM_MOUSELAST}
  {$ELSE}
  {$IFDEF WINNT4}
  WM_MOUSELAST = $020A;
  {$EXTERNALSYM WM_MOUSELAST}
  {$ELSE}
  {$IFDEF WIN95_UP}
  WM_MOUSELAST = $020A;
  {$EXTERNALSYM WM_MOUSELAST}
  {$ELSE}
  WM_MOUSELAST = $0209;
  {$EXTERNALSYM WM_MOUSELAST}
  {$ENDIF WIN95_UP}
  {$ENDIF WINNT4}
  {$ENDIF WIN2000_UP}

// Value for rolling one detent//

  WHEEL_DELTA                    = 120;
  {$EXTERNALSYM WHEEL_DELTA}

function GET_WHEEL_DELTA_WPARAM(wParam: WPARAM): SHORT;
{$EXTERNALSYM GET_WHEEL_DELTA_WPARAM(wParam)}

// Setting to scroll one page for SPI_GET/SETWHEELSCROLLLINES//

const
  WHEEL_PAGESCROLL = UINT_MAX;
  {$EXTERNALSYM WHEEL_PAGESCROLL}

function GET_KEYSTATE_WPARAM(wParam: WPARAM): Integer;
{$EXTERNALSYM GET_KEYSTATE_WPARAM}
function GET_NCHITTEST_WPARAM(wParam: WPARAM): Shortint;
{$EXTERNALSYM GET_NCHITTEST_WPARAM}
function GET_XBUTTON_WPARAM(wParam: WPARAM): Integer;
{$EXTERNALSYM GET_XBUTTON_WPARAM}

// XButton values are WORD flags//

const
  XBUTTON1 = $0001;
  {$EXTERNALSYM XBUTTON1}
  XBUTTON2 = $0002;
  {$EXTERNALSYM XBUTTON2}

// Were there to be an XBUTTON3, it's value would be 0x0004//

  WM_PARENTNOTIFY  = $0210;
  {$EXTERNALSYM WM_PARENTNOTIFY}
  WM_ENTERMENULOOP = $0211;
  {$EXTERNALSYM WM_ENTERMENULOOP}
  WM_EXITMENULOOP  = $0212;
  {$EXTERNALSYM WM_EXITMENULOOP}

  WM_NEXTMENU       = $0213;
  {$EXTERNALSYM WM_NEXTMENU}
  WM_SIZING         = $0214;
  {$EXTERNALSYM WM_SIZING}
  WM_CAPTURECHANGED = $0215;
  {$EXTERNALSYM WM_CAPTURECHANGED}
  WM_MOVING         = $0216;
  {$EXTERNALSYM WM_MOVING}

  WM_POWERBROADCAST = $0218;
  {$EXTERNALSYM WM_POWERBROADCAST}

  PBT_APMQUERYSUSPEND = $0000;
  {$EXTERNALSYM PBT_APMQUERYSUSPEND}
  PBT_APMQUERYSTANDBY = $0001;
  {$EXTERNALSYM PBT_APMQUERYSTANDBY}

  PBT_APMQUERYSUSPENDFAILED = $0002;
  {$EXTERNALSYM PBT_APMQUERYSUSPENDFAILED}
  PBT_APMQUERYSTANDBYFAILED = $0003;
  {$EXTERNALSYM PBT_APMQUERYSTANDBYFAILED}

  PBT_APMSUSPEND = $0004;
  {$EXTERNALSYM PBT_APMSUSPEND}
  PBT_APMSTANDBY = $0005;
  {$EXTERNALSYM PBT_APMSTANDBY}

  PBT_APMRESUMECRITICAL = $0006;
  {$EXTERNALSYM PBT_APMRESUMECRITICAL}
  PBT_APMRESUMESUSPEND  = $0007;
  {$EXTERNALSYM PBT_APMRESUMESUSPEND}
  PBT_APMRESUMESTANDBY  = $0008;
  {$EXTERNALSYM PBT_APMRESUMESTANDBY}

  PBTF_APMRESUMEFROMFAILURE = $00000001;
  {$EXTERNALSYM PBTF_APMRESUMEFROMFAILURE}

  PBT_APMBATTERYLOW        = $0009;
  {$EXTERNALSYM PBT_APMBATTERYLOW}
  PBT_APMPOWERSTATUSCHANGE = $000A;
  {$EXTERNALSYM PBT_APMPOWERSTATUSCHANGE}

  PBT_APMOEMEVENT = $000B;
  {$EXTERNALSYM PBT_APMOEMEVENT}
  PBT_APMRESUMEAUTOMATIC = $0012;
  {$EXTERNALSYM PBT_APMRESUMEAUTOMATIC}

  WM_DEVICECHANGE = $0219;
  {$EXTERNALSYM WM_DEVICECHANGE}

  WM_MDICREATE      = $0220;
  {$EXTERNALSYM WM_MDICREATE}
  WM_MDIDESTROY     = $0221;
  {$EXTERNALSYM WM_MDIDESTROY}
  WM_MDIACTIVATE    = $0222;
  {$EXTERNALSYM WM_MDIACTIVATE}
  WM_MDIRESTORE     = $0223;
  {$EXTERNALSYM WM_MDIRESTORE}
  WM_MDINEXT        = $0224;
  {$EXTERNALSYM WM_MDINEXT}
  WM_MDIMAXIMIZE    = $0225;
  {$EXTERNALSYM WM_MDIMAXIMIZE}
  WM_MDITILE        = $0226;
  {$EXTERNALSYM WM_MDITILE}
  WM_MDICASCADE     = $0227;
  {$EXTERNALSYM WM_MDICASCADE}
  WM_MDIICONARRANGE = $0228;
  {$EXTERNALSYM WM_MDIICONARRANGE}
  WM_MDIGETACTIVE   = $0229;
  {$EXTERNALSYM WM_MDIGETACTIVE}

  WM_MDISETMENU     = $0230;
  {$EXTERNALSYM WM_MDISETMENU}
  WM_ENTERSIZEMOVE  = $0231;
  {$EXTERNALSYM WM_ENTERSIZEMOVE}
  WM_EXITSIZEMOVE   = $0232;
  {$EXTERNALSYM WM_EXITSIZEMOVE}
  WM_DROPFILES      = $0233;
  {$EXTERNALSYM WM_DROPFILES}
  WM_MDIREFRESHMENU = $0234;
  {$EXTERNALSYM WM_MDIREFRESHMENU}

  WM_IME_SETCONTEXT      = $0281;
  {$EXTERNALSYM WM_IME_SETCONTEXT}
  WM_IME_NOTIFY          = $0282;
  {$EXTERNALSYM WM_IME_NOTIFY}
  WM_IME_CONTROL         = $0283;
  {$EXTERNALSYM WM_IME_CONTROL}
  WM_IME_COMPOSITIONFULL = $0284;
  {$EXTERNALSYM WM_IME_COMPOSITIONFULL}
  WM_IME_SELECT          = $0285;
  {$EXTERNALSYM WM_IME_SELECT}
  WM_IME_CHAR            = $0286;
  {$EXTERNALSYM WM_IME_CHAR}
  WM_IME_REQUEST         = $0288;
  {$EXTERNALSYM WM_IME_REQUEST}
  WM_IME_KEYDOWN         = $0290;
  {$EXTERNALSYM WM_IME_KEYDOWN}
  WM_IME_KEYUP           = $0291;
  {$EXTERNALSYM WM_IME_KEYUP}

  WM_MOUSEHOVER   = $02A1;
  {$EXTERNALSYM WM_MOUSEHOVER}
  WM_MOUSELEAVE   = $02A3;
  {$EXTERNALSYM WM_MOUSELEAVE}
  WM_NCMOUSEHOVER = $02A0;
  {$EXTERNALSYM WM_NCMOUSEHOVER}
  WM_NCMOUSELEAVE = $02A2;
  {$EXTERNALSYM WM_NCMOUSELEAVE}

  WM_WTSSESSION_CHANGE = $02B1;
  {$EXTERNALSYM WM_WTSSESSION_CHANGE}

  WM_TABLET_FIRST      = $02c0;
  {$EXTERNALSYM WM_TABLET_FIRST}
  WM_TABLET_LAST       = $02df;
  {$EXTERNALSYM WM_TABLET_LAST}

  WM_CUT               = $0300;
  {$EXTERNALSYM WM_CUT}
  WM_COPY              = $0301;
  {$EXTERNALSYM WM_COPY}
  WM_PASTE             = $0302;
  {$EXTERNALSYM WM_PASTE}
  WM_CLEAR             = $0303;
  {$EXTERNALSYM WM_CLEAR}
  WM_UNDO              = $0304;
  {$EXTERNALSYM WM_UNDO}
  WM_RENDERFORMAT      = $0305;
  {$EXTERNALSYM WM_RENDERFORMAT}
  WM_RENDERALLFORMATS  = $0306;
  {$EXTERNALSYM WM_RENDERALLFORMATS}
  WM_DESTROYCLIPBOARD  = $0307;
  {$EXTERNALSYM WM_DESTROYCLIPBOARD}
  WM_DRAWCLIPBOARD     = $0308;
  {$EXTERNALSYM WM_DRAWCLIPBOARD}
  WM_PAINTCLIPBOARD    = $0309;
  {$EXTERNALSYM WM_PAINTCLIPBOARD}
  WM_VSCROLLCLIPBOARD  = $030A;
  {$EXTERNALSYM WM_VSCROLLCLIPBOARD}
  WM_SIZECLIPBOARD     = $030B;
  {$EXTERNALSYM WM_SIZECLIPBOARD}
  WM_ASKCBFORMATNAME   = $030C;
  {$EXTERNALSYM WM_ASKCBFORMATNAME}
  WM_CHANGECBCHAIN     = $030D;
  {$EXTERNALSYM WM_CHANGECBCHAIN}
  WM_HSCROLLCLIPBOARD  = $030E;
  {$EXTERNALSYM WM_HSCROLLCLIPBOARD}
  WM_QUERYNEWPALETTE   = $030F;
  {$EXTERNALSYM WM_QUERYNEWPALETTE}
  WM_PALETTEISCHANGING = $0310;
  {$EXTERNALSYM WM_PALETTEISCHANGING}
  WM_PALETTECHANGED    = $0311;
  {$EXTERNALSYM WM_PALETTECHANGED}
  WM_HOTKEY            = $0312;
  {$EXTERNALSYM WM_HOTKEY}

  WM_PRINT       = $0317;
  {$EXTERNALSYM WM_PRINT}
  WM_PRINTCLIENT = $0318;
  {$EXTERNALSYM WM_PRINTCLIENT}

  WM_APPCOMMAND = $0319;
  {$EXTERNALSYM WM_APPCOMMAND}

  WM_THEMECHANGED  = $031A;
  {$EXTERNALSYM WM_THEMECHANGED}

  WM_HANDHELDFIRST = $0358;
  {$EXTERNALSYM WM_HANDHELDFIRST}
  WM_HANDHELDLAST  = $035F;
  {$EXTERNALSYM WM_HANDHELDLAST}

  WM_AFXFIRST = $0360;
  {$EXTERNALSYM WM_AFXFIRST}
  WM_AFXLAST  = $037F;
  {$EXTERNALSYM WM_AFXLAST}

  WM_PENWINFIRST = $0380;
  {$EXTERNALSYM WM_PENWINFIRST}
  WM_PENWINLAST  = $038F;
  {$EXTERNALSYM WM_PENWINLAST}

  WM_APP = $8000;
  {$EXTERNALSYM WM_APP}

//
// NOTE: All Message Numbers below 0x0400 are RESERVED.
//
// Private Window Messages Start Here:
//

  WM_USER = $0400;
  {$EXTERNALSYM WM_USER}

//  wParam for WM_SIZING message

  WMSZ_LEFT        = 1;
  {$EXTERNALSYM WMSZ_LEFT}
  WMSZ_RIGHT       = 2;
  {$EXTERNALSYM WMSZ_RIGHT}
  WMSZ_TOP         = 3;
  {$EXTERNALSYM WMSZ_TOP}
  WMSZ_TOPLEFT     = 4;
  {$EXTERNALSYM WMSZ_TOPLEFT}
  WMSZ_TOPRIGHT    = 5;
  {$EXTERNALSYM WMSZ_TOPRIGHT}
  WMSZ_BOTTOM      = 6;
  {$EXTERNALSYM WMSZ_BOTTOM}
  WMSZ_BOTTOMLEFT  = 7;
  {$EXTERNALSYM WMSZ_BOTTOMLEFT}
  WMSZ_BOTTOMRIGHT = 8;
  {$EXTERNALSYM WMSZ_BOTTOMRIGHT}

//
// WM_NCHITTEST and MOUSEHOOKSTRUCT Mouse Position Codes
//

  HTERROR       = DWORD(-2);
  {$EXTERNALSYM HTERROR}
  HTTRANSPARENT = DWORD(-1);
  {$EXTERNALSYM HTTRANSPARENT}
  HTNOWHERE     = 0;
  {$EXTERNALSYM HTNOWHERE}
  HTCLIENT      = 1;
  {$EXTERNALSYM HTCLIENT}
  HTCAPTION     = 2;
  {$EXTERNALSYM HTCAPTION}
  HTSYSMENU     = 3;
  {$EXTERNALSYM HTSYSMENU}
  HTGROWBOX     = 4;
  {$EXTERNALSYM HTGROWBOX}
  HTSIZE        = HTGROWBOX;
  {$EXTERNALSYM HTSIZE}
  HTMENU        = 5;
  {$EXTERNALSYM HTMENU}
  HTHSCROLL     = 6;
  {$EXTERNALSYM HTHSCROLL}
  HTVSCROLL     = 7;
  {$EXTERNALSYM HTVSCROLL}
  HTMINBUTTON   = 8;
  {$EXTERNALSYM HTMINBUTTON}
  HTMAXBUTTON   = 9;
  {$EXTERNALSYM HTMAXBUTTON}
  HTLEFT        = 10;
  {$EXTERNALSYM HTLEFT}
  HTRIGHT       = 11;
  {$EXTERNALSYM HTRIGHT}
  HTTOP         = 12;
  {$EXTERNALSYM HTTOP}
  HTTOPLEFT     = 13;
  {$EXTERNALSYM HTTOPLEFT}
  HTTOPRIGHT    = 14;
  {$EXTERNALSYM HTTOPRIGHT}
  HTBOTTOM      = 15;
  {$EXTERNALSYM HTBOTTOM}
  HTBOTTOMLEFT  = 16;
  {$EXTERNALSYM HTBOTTOMLEFT}
  HTBOTTOMRIGHT = 17;
  {$EXTERNALSYM HTBOTTOMRIGHT}
  HTBORDER      = 18;
  {$EXTERNALSYM HTBORDER}
  HTREDUCE      = HTMINBUTTON;
  {$EXTERNALSYM HTREDUCE}
  HTZOOM        = HTMAXBUTTON;
  {$EXTERNALSYM HTZOOM}
  HTSIZEFIRST   = HTLEFT;
  {$EXTERNALSYM HTSIZEFIRST}
  HTSIZELAST    = HTBOTTOMRIGHT;
  {$EXTERNALSYM HTSIZELAST}
  HTOBJECT      = 19;
  {$EXTERNALSYM HTOBJECT}
  HTCLOSE       = 20;
  {$EXTERNALSYM HTCLOSE}
  HTHELP        = 21;
  {$EXTERNALSYM HTHELP}

//
// SendMessageTimeout values
//

  SMTO_NORMAL             = $0000;
  {$EXTERNALSYM SMTO_NORMAL}
  SMTO_BLOCK              = $0001;
  {$EXTERNALSYM SMTO_BLOCK}
  SMTO_ABORTIFHUNG        = $0002;
  {$EXTERNALSYM SMTO_ABORTIFHUNG}
  SMTO_NOTIMEOUTIFNOTHUNG = $0008;
  {$EXTERNALSYM SMTO_NOTIMEOUTIFNOTHUNG}

//
// WM_MOUSEACTIVATE Return Codes
//

  MA_ACTIVATE         = 1;
  {$EXTERNALSYM MA_ACTIVATE}
  MA_ACTIVATEANDEAT   = 2;
  {$EXTERNALSYM MA_ACTIVATEANDEAT}
  MA_NOACTIVATE       = 3;
  {$EXTERNALSYM MA_NOACTIVATE}
  MA_NOACTIVATEANDEAT = 4;
  {$EXTERNALSYM MA_NOACTIVATEANDEAT}

//
// WM_SETICON / WM_GETICON Type Codes
//

  ICON_SMALL  = 0;
  {$EXTERNALSYM ICON_SMALL}
  ICON_BIG    = 1;
  {$EXTERNALSYM ICON_BIG}
  ICON_SMALL2 = 2;
  {$EXTERNALSYM ICON_SMALL2}

function RegisterWindowMessageA(lpString: LPCSTR): UINT; stdcall;
{$EXTERNALSYM RegisterWindowMessageA}
function RegisterWindowMessageW(lpString: LPCWSTR): UINT; stdcall;
{$EXTERNALSYM RegisterWindowMessageW}
function RegisterWindowMessage(lpString: LPCTSTR): UINT; stdcall;
{$EXTERNALSYM RegisterWindowMessage}

//
// WM_SIZE message wParam values
//

const
  SIZE_RESTORED  = 0;
  {$EXTERNALSYM SIZE_RESTORED}
  SIZE_MINIMIZED = 1;
  {$EXTERNALSYM SIZE_MINIMIZED}
  SIZE_MAXIMIZED = 2;
  {$EXTERNALSYM SIZE_MAXIMIZED}
  SIZE_MAXSHOW   = 3;
  {$EXTERNALSYM SIZE_MAXSHOW}
  SIZE_MAXHIDE   = 4;
  {$EXTERNALSYM SIZE_MAXHIDE}

//
// Obsolete constant names
//

  SIZENORMAL     = SIZE_RESTORED;
  {$EXTERNALSYM SIZENORMAL}
  SIZEICONIC     = SIZE_MINIMIZED;
  {$EXTERNALSYM SIZEICONIC}
  SIZEFULLSCREEN = SIZE_MAXIMIZED;
  {$EXTERNALSYM SIZEFULLSCREEN}
  SIZEZOOMSHOW   = SIZE_MAXSHOW;
  {$EXTERNALSYM SIZEZOOMSHOW}
  SIZEZOOMHIDE   = SIZE_MAXHIDE;
  {$EXTERNALSYM SIZEZOOMHIDE}

//
// WM_WINDOWPOSCHANGING/CHANGED struct pointed to by lParam
//

type
  LPWINDOWPOS = ^WINDOWPOS;
  {$EXTERNALSYM LPWINDOWPOS}
  tagWINDOWPOS = record
    hwnd: HWND;
    hwndInsertAfter: HWND;
    x: Integer;
    y: Integer;
    cx: Integer;
    cy: Integer;
    flags: UINT;
  end;
  {$EXTERNALSYM tagWINDOWPOS}
  WINDOWPOS = tagWINDOWPOS;
  {$EXTERNALSYM WINDOWPOS}
  TWindowPos = WINDOWPOS;
  PWindowPos = LPWINDOWPOS;

//
// WM_NCCALCSIZE parameter structure
//

  LPNCCALCSIZE_PARAMS = ^NCCALCSIZE_PARAMS;
  {$EXTERNALSYM LPNCCALCSIZE_PARAMS}
  NCCALCSIZE_PARAMS = record
    rgrc: array [0..2] of RECT;
    lppos: PWINDOWPOS;
  end;
  {$EXTERNALSYM NCCALCSIZE_PARAMS}
  TNcCalcSizeParams = NCCALCSIZE_PARAMS;
  PNcCalcSizeParams = LPNCCALCSIZE_PARAMS;

//
// WM_NCCALCSIZE "window valid rect" return values
//

const
  WVR_ALIGNTOP    = $0010;
  {$EXTERNALSYM WVR_ALIGNTOP}
  WVR_ALIGNLEFT   = $0020;
  {$EXTERNALSYM WVR_ALIGNLEFT}
  WVR_ALIGNBOTTOM = $0040;
  {$EXTERNALSYM WVR_ALIGNBOTTOM}
  WVR_ALIGNRIGHT  = $0080;
  {$EXTERNALSYM WVR_ALIGNRIGHT}
  WVR_HREDRAW     = $0100;
  {$EXTERNALSYM WVR_HREDRAW}
  WVR_VREDRAW     = $0200;
  {$EXTERNALSYM WVR_VREDRAW}
  WVR_REDRAW      = WVR_HREDRAW or WVR_VREDRAW;
  {$EXTERNALSYM WVR_REDRAW}
  WVR_VALIDRECTS  = $0400;
  {$EXTERNALSYM WVR_VALIDRECTS}

//
// Key State Masks for Mouse Messages
//

  MK_LBUTTON  = $0001;
  {$EXTERNALSYM MK_LBUTTON}
  MK_RBUTTON  = $0002;
  {$EXTERNALSYM MK_RBUTTON}
  MK_SHIFT    = $0004;
  {$EXTERNALSYM MK_SHIFT}
  MK_CONTROL  = $0008;
  {$EXTERNALSYM MK_CONTROL}
  MK_MBUTTON  = $0010;
  {$EXTERNALSYM MK_MBUTTON}
  MK_XBUTTON1 = $0020;
  {$EXTERNALSYM MK_XBUTTON1}
  MK_XBUTTON2 = $0040;
  {$EXTERNALSYM MK_XBUTTON2}

  TME_HOVER     = $00000001;
  {$EXTERNALSYM TME_HOVER}
  TME_LEAVE     = $00000002;
  {$EXTERNALSYM TME_LEAVE}
  TME_NONCLIENT = $00000010;
  {$EXTERNALSYM TME_NONCLIENT}
  TME_QUERY     = $40000000;
  {$EXTERNALSYM TME_QUERY}
  TME_CANCEL    = $80000000;
  {$EXTERNALSYM TME_CANCEL}

  HOVER_DEFAULT = $FFFFFFFF;
  {$EXTERNALSYM HOVER_DEFAULT}

type
  LPTRACKMOUSEEVENT = ^_TRACKMOUSEEVENT;
  {$EXTERNALSYM LPTRACKMOUSEEVENT}
  _TRACKMOUSEEVENT = record
    cbSize: DWORD;
    dwFlags: DWORD;
    hwndTrack: HWND;
    dwHoverTime: DWORD;
  end;
  //TRACKMOUSEEVENT = _TRACKMOUSEEVENT;
  //{$EXTERNALSYM TRACKMOUSEEVENT}
  TTrackMouseEvent = _TRACKMOUSEEVENT;
  PTrackMouseEvent = LPTRACKMOUSEEVENT;

function TrackMouseEvent(var lpEventTrack: TTrackMouseEvent): BOOL; stdcall;
{$EXTERNALSYM TrackMouseEvent}

//
// Window Styles
//

const
  WS_OVERLAPPED   = $00000000;
  {$EXTERNALSYM WS_OVERLAPPED}
  WS_POPUP        = $80000000;
  {$EXTERNALSYM WS_POPUP}
  WS_CHILD        = $40000000;
  {$EXTERNALSYM WS_CHILD}
  WS_MINIMIZE     = $20000000;
  {$EXTERNALSYM WS_MINIMIZE}
  WS_VISIBLE      = $10000000;
  {$EXTERNALSYM WS_VISIBLE}
  WS_DISABLED     = $08000000;
  {$EXTERNALSYM WS_DISABLED}
  WS_CLIPSIBLINGS = $04000000;
  {$EXTERNALSYM WS_CLIPSIBLINGS}
  WS_CLIPCHILDREN = $02000000;
  {$EXTERNALSYM WS_CLIPCHILDREN}
  WS_MAXIMIZE     = $01000000;
  {$EXTERNALSYM WS_MAXIMIZE}
  WS_CAPTION      = $00C00000; // WS_BORDER | WS_DLGFRAME
  {$EXTERNALSYM WS_CAPTION}
  WS_BORDER       = $00800000;
  {$EXTERNALSYM WS_BORDER}
  WS_DLGFRAME     = $00400000;
  {$EXTERNALSYM WS_DLGFRAME}
  WS_VSCROLL      = $00200000;
  {$EXTERNALSYM WS_VSCROLL}
  WS_HSCROLL      = $00100000;
  {$EXTERNALSYM WS_HSCROLL}
  WS_SYSMENU      = $00080000;
  {$EXTERNALSYM WS_SYSMENU}
  WS_THICKFRAME   = $00040000;
  {$EXTERNALSYM WS_THICKFRAME}
  WS_GROUP        = $00020000;
  {$EXTERNALSYM WS_GROUP}
  WS_TABSTOP      = $00010000;
  {$EXTERNALSYM WS_TABSTOP}

  WS_MINIMIZEBOX = $00020000;
  {$EXTERNALSYM WS_MINIMIZEBOX}
  WS_MAXIMIZEBOX = $00010000;
  {$EXTERNALSYM WS_MAXIMIZEBOX}

  WS_TILED       = WS_OVERLAPPED;
  {$EXTERNALSYM WS_TILED}
  WS_ICONIC      = WS_MINIMIZE;
  {$EXTERNALSYM WS_ICONIC}
  WS_SIZEBOX     = WS_THICKFRAME;
  {$EXTERNALSYM WS_SIZEBOX}

//
// Common Window Styles
//

  WS_OVERLAPPEDWINDOW = (WS_OVERLAPPED or WS_CAPTION or WS_SYSMENU or
                         WS_THICKFRAME or WS_MINIMIZEBOX or WS_MAXIMIZEBOX);
  {$EXTERNALSYM WS_OVERLAPPEDWINDOW}

  WS_POPUPWINDOW = WS_POPUP or WS_BORDER or WS_SYSMENU;
  {$EXTERNALSYM WS_POPUPWINDOW}

  WS_CHILDWINDOW = WS_CHILD;
  {$EXTERNALSYM WS_CHILDWINDOW}

  WS_TILEDWINDOW = WS_OVERLAPPEDWINDOW;
  {$EXTERNALSYM WS_TILEDWINDOW}

//
// Extended Window Styles
//

  WS_EX_DLGMODALFRAME  = $00000001;
  {$EXTERNALSYM WS_EX_DLGMODALFRAME}
  WS_EX_NOPARENTNOTIFY = $00000004;
  {$EXTERNALSYM WS_EX_NOPARENTNOTIFY}
  WS_EX_TOPMOST        = $00000008;
  {$EXTERNALSYM WS_EX_TOPMOST}
  WS_EX_ACCEPTFILES    = $00000010;
  {$EXTERNALSYM WS_EX_ACCEPTFILES}
  WS_EX_TRANSPARENT    = $00000020;
  {$EXTERNALSYM WS_EX_TRANSPARENT}
  WS_EX_MDICHILD       = $00000040;
  {$EXTERNALSYM WS_EX_MDICHILD}
  WS_EX_TOOLWINDOW     = $00000080;
  {$EXTERNALSYM WS_EX_TOOLWINDOW}
  WS_EX_WINDOWEDGE     = $00000100;
  {$EXTERNALSYM WS_EX_WINDOWEDGE}
  WS_EX_CLIENTEDGE     = $00000200;
  {$EXTERNALSYM WS_EX_CLIENTEDGE}
  WS_EX_CONTEXTHELP    = $00000400;
  {$EXTERNALSYM WS_EX_CONTEXTHELP}

  WS_EX_RIGHT          = $00001000;
  {$EXTERNALSYM WS_EX_RIGHT}
  WS_EX_LEFT           = $00000000;
  {$EXTERNALSYM WS_EX_LEFT}
  WS_EX_RTLREADING     = $00002000;
  {$EXTERNALSYM WS_EX_RTLREADING}
  WS_EX_LTRREADING     = $00000000;
  {$EXTERNALSYM WS_EX_LTRREADING}
  WS_EX_LEFTSCROLLBAR  = $00004000;
  {$EXTERNALSYM WS_EX_LEFTSCROLLBAR}
  WS_EX_RIGHTSCROLLBAR = $00000000;
  {$EXTERNALSYM WS_EX_RIGHTSCROLLBAR}
  WS_EX_CONTROLPARENT  = $00010000;
  {$EXTERNALSYM WS_EX_CONTROLPARENT}
  WS_EX_STATICEDGE     = $00020000;
  {$EXTERNALSYM WS_EX_STATICEDGE}
  WS_EX_APPWINDOW      = $00040000;
  {$EXTERNALSYM WS_EX_APPWINDOW}

  WS_EX_OVERLAPPEDWINDOW = WS_EX_WINDOWEDGE or WS_EX_CLIENTEDGE;
  {$EXTERNALSYM WS_EX_OVERLAPPEDWINDOW}
  WS_EX_PALETTEWINDOW    = WS_EX_WINDOWEDGE or WS_EX_TOOLWINDOW or WS_EX_TOPMOST;
  {$EXTERNALSYM WS_EX_PALETTEWINDOW}

  WS_EX_LAYERED = $00080000;
  {$EXTERNALSYM WS_EX_LAYERED}

  WS_EX_NOINHERITLAYOUT = $00100000; // Disable inheritence of mirroring by children
  {$EXTERNALSYM WS_EX_NOINHERITLAYOUT}
  WS_EX_LAYOUTRTL       = $00400000; // Right to left mirroring
  {$EXTERNALSYM WS_EX_LAYOUTRTL}

  WS_EX_COMPOSITED = $02000000;
  {$EXTERNALSYM WS_EX_COMPOSITED}
  WS_EX_NOACTIVATE = $08000000;
  {$EXTERNALSYM WS_EX_NOACTIVATE}

//
// Class styles
//

  CS_VREDRAW         = $0001;
  {$EXTERNALSYM CS_VREDRAW}
  CS_HREDRAW         = $0002;
  {$EXTERNALSYM CS_HREDRAW}
  CS_DBLCLKS         = $0008;
  {$EXTERNALSYM CS_DBLCLKS}
  CS_OWNDC           = $0020;
  {$EXTERNALSYM CS_OWNDC}
  CS_CLASSDC         = $0040;
  {$EXTERNALSYM CS_CLASSDC}
  CS_PARENTDC        = $0080;
  {$EXTERNALSYM CS_PARENTDC}
  CS_NOCLOSE         = $0200;
  {$EXTERNALSYM CS_NOCLOSE}
  CS_SAVEBITS        = $0800;
  {$EXTERNALSYM CS_SAVEBITS}
  CS_BYTEALIGNCLIENT = $1000;
  {$EXTERNALSYM CS_BYTEALIGNCLIENT}
  CS_BYTEALIGNWINDOW = $2000;
  {$EXTERNALSYM CS_BYTEALIGNWINDOW}
  CS_GLOBALCLASS     = $4000;
  {$EXTERNALSYM CS_GLOBALCLASS}

  CS_IME = $00010000;
  {$EXTERNALSYM CS_IME}
  CS_DROPSHADOW = $00020000;
  {$EXTERNALSYM CS_DROPSHADOW}

// WM_PRINT flags//

  PRF_CHECKVISIBLE = $00000001;
  {$EXTERNALSYM PRF_CHECKVISIBLE}
  PRF_NONCLIENT    = $00000002;
  {$EXTERNALSYM PRF_NONCLIENT}
  PRF_CLIENT       = $00000004;
  {$EXTERNALSYM PRF_CLIENT}
  PRF_ERASEBKGND   = $00000008;
  {$EXTERNALSYM PRF_ERASEBKGND}
  PRF_CHILDREN     = $00000010;
  {$EXTERNALSYM PRF_CHILDREN}
  PRF_OWNED        = $00000020;
  {$EXTERNALSYM PRF_OWNED}

// 3D border styles//

  BDR_RAISEDOUTER = $0001;
  {$EXTERNALSYM BDR_RAISEDOUTER}
  BDR_SUNKENOUTER = $0002;
  {$EXTERNALSYM BDR_SUNKENOUTER}
  BDR_RAISEDINNER = $0004;
  {$EXTERNALSYM BDR_RAISEDINNER}
  BDR_SUNKENINNER = $0008;
  {$EXTERNALSYM BDR_SUNKENINNER}

  BDR_OUTER  = BDR_RAISEDOUTER or BDR_SUNKENOUTER;
  {$EXTERNALSYM BDR_OUTER}
  BDR_INNER  = BDR_RAISEDINNER or BDR_SUNKENINNER;
  {$EXTERNALSYM BDR_INNER}
  BDR_RAISED = BDR_RAISEDOUTER or BDR_RAISEDINNER;
  {$EXTERNALSYM BDR_RAISED}
  BDR_SUNKEN = BDR_SUNKENOUTER or BDR_SUNKENINNER;
  {$EXTERNALSYM BDR_SUNKEN}

  EDGE_RAISED = BDR_RAISEDOUTER or BDR_RAISEDINNER;
  {$EXTERNALSYM EDGE_RAISED}
  EDGE_SUNKEN = BDR_SUNKENOUTER or BDR_SUNKENINNER;
  {$EXTERNALSYM EDGE_SUNKEN}
  EDGE_ETCHED = BDR_SUNKENOUTER or BDR_RAISEDINNER;
  {$EXTERNALSYM EDGE_ETCHED}
  EDGE_BUMP   = BDR_RAISEDOUTER or BDR_SUNKENINNER;
  {$EXTERNALSYM EDGE_BUMP}

// Border flags//

  BF_LEFT   = $0001;
  {$EXTERNALSYM BF_LEFT}
  BF_TOP    = $0002;
  {$EXTERNALSYM BF_TOP}
  BF_RIGHT  = $0004;
  {$EXTERNALSYM BF_RIGHT}
  BF_BOTTOM = $0008;
  {$EXTERNALSYM BF_BOTTOM}

  BF_TOPLEFT     = BF_TOP or BF_LEFT;
  {$EXTERNALSYM BF_TOPLEFT}
  BF_TOPRIGHT    = BF_TOP or BF_RIGHT;
  {$EXTERNALSYM BF_TOPRIGHT}
  BF_BOTTOMLEFT  = BF_BOTTOM or BF_LEFT;
  {$EXTERNALSYM BF_BOTTOMLEFT}
  BF_BOTTOMRIGHT = BF_BOTTOM or BF_RIGHT;
  {$EXTERNALSYM BF_BOTTOMRIGHT}
  BF_RECT        = BF_LEFT or BF_TOP or BF_RIGHT or BF_BOTTOM;
  {$EXTERNALSYM BF_RECT}

  BF_DIAGONAL = $0010;
  {$EXTERNALSYM BF_DIAGONAL}

// For diagonal lines, the BF_RECT flags specify the end point of the
// vector bounded by the rectangle parameter.

  BF_DIAGONAL_ENDTOPRIGHT    = BF_DIAGONAL or BF_TOP or BF_RIGHT;
  {$EXTERNALSYM BF_DIAGONAL_ENDTOPRIGHT}
  BF_DIAGONAL_ENDTOPLEFT     = BF_DIAGONAL or BF_TOP or BF_LEFT;
  {$EXTERNALSYM BF_DIAGONAL_ENDTOPLEFT}
  BF_DIAGONAL_ENDBOTTOMLEFT  = BF_DIAGONAL or BF_BOTTOM or BF_LEFT;
  {$EXTERNALSYM BF_DIAGONAL_ENDBOTTOMLEFT}
  BF_DIAGONAL_ENDBOTTOMRIGHT = BF_DIAGONAL or BF_BOTTOM or BF_RIGHT;
  {$EXTERNALSYM BF_DIAGONAL_ENDBOTTOMRIGHT}

  BF_MIDDLE = $0800; // Fill in the middle
  {$EXTERNALSYM BF_MIDDLE}
  BF_SOFT   = $1000; // For softer buttons
  {$EXTERNALSYM BF_SOFT}
  BF_ADJUST = $2000; // Calculate the space left over
  {$EXTERNALSYM BF_ADJUST}
  BF_FLAT   = $4000; // For flat rather than 3D borders
  {$EXTERNALSYM BF_FLAT}
  BF_MONO   = $8000; // For monochrome borders
  {$EXTERNALSYM BF_MONO}

function DrawEdge(hdc: HDC; var qrc: RECT; edge, grfFlags: UINT): BOOL; stdcall;
{$EXTERNALSYM DrawEdge}

// flags for DrawFrameControl//

const
  DFC_CAPTION   = 1;
  {$EXTERNALSYM DFC_CAPTION}
  DFC_MENU      = 2;
  {$EXTERNALSYM DFC_MENU}
  DFC_SCROLL    = 3;
  {$EXTERNALSYM DFC_SCROLL}
  DFC_BUTTON    = 4;
  {$EXTERNALSYM DFC_BUTTON}
  DFC_POPUPMENU = 5;
  {$EXTERNALSYM DFC_POPUPMENU}

  DFCS_CAPTIONCLOSE   = $0000;
  {$EXTERNALSYM DFCS_CAPTIONCLOSE}
  DFCS_CAPTIONMIN     = $0001;
  {$EXTERNALSYM DFCS_CAPTIONMIN}
  DFCS_CAPTIONMAX     = $0002;
  {$EXTERNALSYM DFCS_CAPTIONMAX}
  DFCS_CAPTIONRESTORE = $0003;
  {$EXTERNALSYM DFCS_CAPTIONRESTORE}
  DFCS_CAPTIONHELP    = $0004;
  {$EXTERNALSYM DFCS_CAPTIONHELP}

  DFCS_MENUARROW           = $0000;
  {$EXTERNALSYM DFCS_MENUARROW}
  DFCS_MENUCHECK           = $0001;
  {$EXTERNALSYM DFCS_MENUCHECK}
  DFCS_MENUBULLET          = $0002;
  {$EXTERNALSYM DFCS_MENUBULLET}
  DFCS_MENUARROWRIGHT      = $0004;
  {$EXTERNALSYM DFCS_MENUARROWRIGHT}
  DFCS_SCROLLUP            = $0000;
  {$EXTERNALSYM DFCS_SCROLLUP}
  DFCS_SCROLLDOWN          = $0001;
  {$EXTERNALSYM DFCS_SCROLLDOWN}
  DFCS_SCROLLLEFT          = $0002;
  {$EXTERNALSYM DFCS_SCROLLLEFT}
  DFCS_SCROLLRIGHT         = $0003;
  {$EXTERNALSYM DFCS_SCROLLRIGHT}
  DFCS_SCROLLCOMBOBOX      = $0005;
  {$EXTERNALSYM DFCS_SCROLLCOMBOBOX}
  DFCS_SCROLLSIZEGRIP      = $0008;
  {$EXTERNALSYM DFCS_SCROLLSIZEGRIP}
  DFCS_SCROLLSIZEGRIPRIGHT = $0010;
  {$EXTERNALSYM DFCS_SCROLLSIZEGRIPRIGHT}

  DFCS_BUTTONCHECK      = $0000;
  {$EXTERNALSYM DFCS_BUTTONCHECK}
  DFCS_BUTTONRADIOIMAGE = $0001;
  {$EXTERNALSYM DFCS_BUTTONRADIOIMAGE}
  DFCS_BUTTONRADIOMASK  = $0002;
  {$EXTERNALSYM DFCS_BUTTONRADIOMASK}
  DFCS_BUTTONRADIO      = $0004;
  {$EXTERNALSYM DFCS_BUTTONRADIO}
  DFCS_BUTTON3STATE     = $0008;
  {$EXTERNALSYM DFCS_BUTTON3STATE}
  DFCS_BUTTONPUSH       = $0010;
  {$EXTERNALSYM DFCS_BUTTONPUSH}

  DFCS_INACTIVE = $0100;
  {$EXTERNALSYM DFCS_INACTIVE}
  DFCS_PUSHED   = $0200;
  {$EXTERNALSYM DFCS_PUSHED}
  DFCS_CHECKED  = $0400;
  {$EXTERNALSYM DFCS_CHECKED}

  DFCS_TRANSPARENT = $0800;
  {$EXTERNALSYM DFCS_TRANSPARENT}
  DFCS_HOT         = $1000;
  {$EXTERNALSYM DFCS_HOT}

  DFCS_ADJUSTRECT = $2000;
  {$EXTERNALSYM DFCS_ADJUSTRECT}
  DFCS_FLAT       = $4000;
  {$EXTERNALSYM DFCS_FLAT}
  DFCS_MONO       = $8000;
  {$EXTERNALSYM DFCS_MONO}

function DrawFrameControl(hdc: HDC; const lprc: RECT; uType, uState: UINT): BOOL; stdcall;
{$EXTERNALSYM DrawFrameControl}

// flags for DrawCaption//

const
  DC_ACTIVE   = $0001;
  {$EXTERNALSYM DC_ACTIVE}
  DC_SMALLCAP = $0002;
  {$EXTERNALSYM DC_SMALLCAP}
  DC_ICON     = $0004;
  {$EXTERNALSYM DC_ICON}
  DC_TEXT     = $0008;
  {$EXTERNALSYM DC_TEXT}
  DC_INBUTTON = $0010;
  {$EXTERNALSYM DC_INBUTTON}
  DC_GRADIENT = $0020;
  {$EXTERNALSYM DC_GRADIENT}
  DC_BUTTONS  = $1000;
  {$EXTERNALSYM DC_BUTTONS}

function DrawCaption(hwnd: HWND; hdc: HDC; const lprc: RECT; uFlags: UINT): BOOL; stdcall;
{$EXTERNALSYM DrawCaption}

const
  IDANI_OPEN = 1;
  {$EXTERNALSYM IDANI_OPEN}
  IDANI_CAPTION = 3;
  {$EXTERNALSYM IDANI_CAPTION}

function DrawAnimatedRects(hwnd: HWND; idAni: Integer; const lprcFrom, lprcTo: RECT): BOOL; stdcall;
{$EXTERNALSYM DrawAnimatedRects}

//
// Predefined Clipboard Formats
//

const
  CF_TEXT         = 1;
  {$EXTERNALSYM CF_TEXT}
  CF_BITMAP       = 2;
  {$EXTERNALSYM CF_BITMAP}
  CF_METAFILEPICT = 3;
  {$EXTERNALSYM CF_METAFILEPICT}
  CF_SYLK         = 4;
  {$EXTERNALSYM CF_SYLK}
  CF_DIF          = 5;
  {$EXTERNALSYM CF_DIF}
  CF_TIFF         = 6;
  {$EXTERNALSYM CF_TIFF}
  CF_OEMTEXT      = 7;
  {$EXTERNALSYM CF_OEMTEXT}
  CF_DIB          = 8;
  {$EXTERNALSYM CF_DIB}
  CF_PALETTE      = 9;
  {$EXTERNALSYM CF_PALETTE}
  CF_PENDATA      = 10;
  {$EXTERNALSYM CF_PENDATA}
  CF_RIFF         = 11;
  {$EXTERNALSYM CF_RIFF}
  CF_WAVE         = 12;
  {$EXTERNALSYM CF_WAVE}
  CF_UNICODETEXT  = 13;
  {$EXTERNALSYM CF_UNICODETEXT}
  CF_ENHMETAFILE  = 14;
  {$EXTERNALSYM CF_ENHMETAFILE}
  CF_HDROP        = 15;
  {$EXTERNALSYM CF_HDROP}
  CF_LOCALE       = 16;
  {$EXTERNALSYM CF_LOCALE}
  CF_DIBV5        = 17;
  {$EXTERNALSYM CF_DIBV5}

  {$IFDEF WIN98ME_UP}
  CF_MAX = 18;
  {$EXTERNALSYM CF_MAX}
  {$ELSE}
  CF_MAX = 17;
  {$EXTERNALSYM CF_MAX}
  {$ENDIF WIN98ME_UP}

  CF_OWNERDISPLAY    = $0080;
  {$EXTERNALSYM CF_OWNERDISPLAY}
  CF_DSPTEXT         = $0081;
  {$EXTERNALSYM CF_DSPTEXT}
  CF_DSPBITMAP       = $0082;
  {$EXTERNALSYM CF_DSPBITMAP}
  CF_DSPMETAFILEPICT = $0083;
  {$EXTERNALSYM CF_DSPMETAFILEPICT}
  CF_DSPENHMETAFILE  = $008E;
  {$EXTERNALSYM CF_DSPENHMETAFILE}

//
// "Private" formats don't get GlobalFree()'d
//

  CF_PRIVATEFIRST = $0200;
  {$EXTERNALSYM CF_PRIVATEFIRST}
  CF_PRIVATELAST  = $02FF;
  {$EXTERNALSYM CF_PRIVATELAST}

//
// "GDIOBJ" formats do get DeleteObject()'d
//

  CF_GDIOBJFIRST = $0300;
  {$EXTERNALSYM CF_GDIOBJFIRST}
  CF_GDIOBJLAST  = $03FF;
  {$EXTERNALSYM CF_GDIOBJLAST}

//
// Defines for the fVirt field of the Accelerator table structure.
//

  FVIRTKEY  = TRUE; // Assumed to be == TRUE
  {$EXTERNALSYM FVIRTKEY}
  FNOINVERT = $02;
  {$EXTERNALSYM FNOINVERT}
  FSHIFT    = $04;
  {$EXTERNALSYM FSHIFT}
  FCONTROL  = $08;
  {$EXTERNALSYM FCONTROL}
  FALT      = $10;
  {$EXTERNALSYM FALT}

type
  LPACCEL = ^ACCEL;
  {$EXTERNALSYM LPACCEL}
  tagACCEL = record
    fVirt: BYTE; // Also called the flags field//
    key: WORD;
    cmd: WORD;
  end;
  {$EXTERNALSYM tagACCEL}
  ACCEL = tagACCEL;
  {$EXTERNALSYM ACCEL}
  TAccel = ACCEL;
  PAccel = LPACCEL;

  LPPAINTSTRUCT = ^PAINTSTRUCT;
  {$EXTERNALSYM LPPAINTSTRUCT}
  tagPAINTSTRUCT = record
    hdc: HDC;
    fErase: BOOL;
    rcPaint: RECT;
    fRestore: BOOL;
    fIncUpdate: BOOL;
    rgbReserved: array [0..31] of BYTE;
  end;
  {$EXTERNALSYM tagPAINTSTRUCT}
  PAINTSTRUCT = tagPAINTSTRUCT;
  {$EXTERNALSYM PAINTSTRUCT}
  NPPAINTSTRUCT = ^PAINTSTRUCT;
  {$EXTERNALSYM NPPAINTSTRUCT}
  TPaintStruct = PAINTSTRUCT;
  PPaintStruct = LPPAINTSTRUCT;

  LPCREATESTRUCTA = ^CREATESTRUCTA;
  {$EXTERNALSYM LPCREATESTRUCTA}
  tagCREATESTRUCTA = record
    lpCreateParams: LPVOID;
    hInstance: HINST;
    hMenu: HMENU;
    hwndParent: HWND;
    cy: Integer;
    cx: Integer;
    y: Integer;
    x: Integer;
    style: LONG;
    lpszName: LPCSTR;
    lpszClass: LPCSTR;
    dwExStyle: DWORD;
  end;
  {$EXTERNALSYM tagCREATESTRUCTA}
  CREATESTRUCTA = tagCREATESTRUCTA;
  {$EXTERNALSYM CREATESTRUCTA}
  TCreateStructA = CREATESTRUCTA;
  PCreateStructA = LPCREATESTRUCTA;

  LPCREATESTRUCTW = ^CREATESTRUCTW;
  {$EXTERNALSYM LPCREATESTRUCTW}
  tagCREATESTRUCTW = record
    lpCreateParams: LPVOID;
    hInstance: HINST;
    hMenu: HMENU;
    hwndParent: HWND;
    cy: Integer;
    cx: Integer;
    y: Integer;
    x: Integer;
    style: LONG;
    lpszName: LPCWSTR;
    lpszClass: LPCWSTR;
    dwExStyle: DWORD;
  end;
  {$EXTERNALSYM tagCREATESTRUCTW}
  CREATESTRUCTW = tagCREATESTRUCTW;
  {$EXTERNALSYM CREATESTRUCTW}
  TCreateStructW = CREATESTRUCTW;
  PCreateStructW = LPCREATESTRUCTW;

  {$IFDEF UNICODE}
  CREATESTRUCT = CREATESTRUCTW;
  {$EXTERNALSYM CREATESTRUCT}
  LPCREATESTRUCT = LPCREATESTRUCTW;
  {$EXTERNALSYM LPCREATESTRUCT}
  TCreateStruct = TCreateStructW;
  PCreateStruct = PCreateStructW;
  {$ELSE}
  CREATESTRUCT = CREATESTRUCTA;
  {$EXTERNALSYM CREATESTRUCT}
  LPCREATESTRUCT = LPCREATESTRUCTA;
  {$EXTERNALSYM LPCREATESTRUCT}
  TCreateStruct = TCreateStructA;
  PCreateStruct = PCreateStructA;
  {$ENDIF UNICODE}

//
// HCBT_CREATEWND parameters pointed to by lParam
//

type
  LPCBT_CREATEWNDA = ^CBT_CREATEWNDA;
  {$EXTERNALSYM LPCBT_CREATEWNDA}
  tagCBT_CREATEWNDA = record
    lpcs: LPCREATESTRUCTA;
    hwndInsertAfter: HWND;
  end;
  {$EXTERNALSYM tagCBT_CREATEWNDA}
  CBT_CREATEWNDA = tagCBT_CREATEWNDA;
  {$EXTERNALSYM CBT_CREATEWNDA}
  TCbtCreateWndA = CBT_CREATEWNDA;
  PCbtCreateWndA = LPCBT_CREATEWNDA;

//
// HCBT_CREATEWND parameters pointed to by lParam
//

  LPCBT_CREATEWNDW = ^CBT_CREATEWNDW;
  {$EXTERNALSYM LPCBT_CREATEWNDW}
  tagCBT_CREATEWNDW = record
    lpcs: LPCREATESTRUCTW;
    hwndInsertAfter: HWND;
  end;
  {$EXTERNALSYM tagCBT_CREATEWNDW}
  CBT_CREATEWNDW = tagCBT_CREATEWNDW;
  {$EXTERNALSYM CBT_CREATEWNDW}
  TCbtCreateWndW = CBT_CREATEWNDW;
  PCbtCreateWndW = LPCBT_CREATEWNDW;

  {$IFDEF UNICODE}
  CBT_CREATEWND = CBT_CREATEWNDW;
  {$EXTERNALSYM CBT_CREATEWND}
  LPCBT_CREATEWND = LPCBT_CREATEWNDW;
  {$EXTERNALSYM LPCBT_CREATEWND}
  {$ELSE}
  CBT_CREATEWND = CBT_CREATEWNDA;
  {$EXTERNALSYM CBT_CREATEWND}
  LPCBT_CREATEWND = LPCBT_CREATEWNDA;
  {$EXTERNALSYM LPCBT_CREATEWND}
  {$ENDIF UNICODE}

  LPWINDOWPLACEMENT = ^WINDOWPLACEMENT;
  {$EXTERNALSYM LPWINDOWPLACEMENT}
  tagWINDOWPLACEMENT = record
    length: UINT;
    flags: UINT;
    showCmd: UINT;
    ptMinPosition: POINT;
    ptMaxPosition: POINT;
    rcNormalPosition: RECT;
  end;
  {$EXTERNALSYM tagWINDOWPLACEMENT}
  WINDOWPLACEMENT = tagWINDOWPLACEMENT;
  {$EXTERNALSYM WINDOWPLACEMENT}
  TWindowPlacement = WINDOWPLACEMENT;
  PWindowPlacement = LPWINDOWPLACEMENT;

const
  WPF_SETMINPOSITION       = $0001;
  {$EXTERNALSYM WPF_SETMINPOSITION}
  WPF_RESTORETOMAXIMIZED   = $0002;
  {$EXTERNALSYM WPF_RESTORETOMAXIMIZED}
  WPF_ASYNCWINDOWPLACEMENT = $0004;
  {$EXTERNALSYM WPF_ASYNCWINDOWPLACEMENT}

type
  LPNMHDR = ^NMHDR;
  {$EXTERNALSYM LPNMHDR}
  tagNMHDR = record
    hwndFrom: HWND;
    idFrom: UINT_PTR;
    code: UINT; // NM_ code
  end;
  {$EXTERNALSYM tagNMHDR}
  NMHDR = tagNMHDR;
  {$EXTERNALSYM NMHDR}
  TNmHdr = NMHDR;
  PNmHdr = LPNMHDR;

  LPSTYLESTRUCT = ^STYLESTRUCT;
  {$EXTERNALSYM LPSTYLESTRUCT}
  tagSTYLESTRUCT = record
    styleOld: DWORD;
    styleNew: DWORD;
  end;
  {$EXTERNALSYM tagSTYLESTRUCT}
  STYLESTRUCT = tagSTYLESTRUCT;
  {$EXTERNALSYM STYLESTRUCT}
  TStyleStruct = STYLESTRUCT;
  PStyleStruct = LPSTYLESTRUCT;

//
// Owner draw control types
//

const
  ODT_MENU     = 1;
  {$EXTERNALSYM ODT_MENU}
  ODT_LISTBOX  = 2;
  {$EXTERNALSYM ODT_LISTBOX}
  ODT_COMBOBOX = 3;
  {$EXTERNALSYM ODT_COMBOBOX}
  ODT_BUTTON   = 4;
  {$EXTERNALSYM ODT_BUTTON}
  ODT_STATIC   = 5;
  {$EXTERNALSYM ODT_STATIC}

//
// Owner draw actions
//

  ODA_DRAWENTIRE = $0001;
  {$EXTERNALSYM ODA_DRAWENTIRE}
  ODA_SELECT     = $0002;
  {$EXTERNALSYM ODA_SELECT}
  ODA_FOCUS      = $0004;
  {$EXTERNALSYM ODA_FOCUS}

//
// Owner draw state
//

  ODS_SELECTED     = $0001;
  {$EXTERNALSYM ODS_SELECTED}
  ODS_GRAYED       = $0002;
  {$EXTERNALSYM ODS_GRAYED}
  ODS_DISABLED     = $0004;
  {$EXTERNALSYM ODS_DISABLED}
  ODS_CHECKED      = $0008;
  {$EXTERNALSYM ODS_CHECKED}
  ODS_FOCUS        = $0010;
  {$EXTERNALSYM ODS_FOCUS}
  ODS_DEFAULT      = $0020;
  {$EXTERNALSYM ODS_DEFAULT}
  ODS_COMBOBOXEDIT = $1000;
  {$EXTERNALSYM ODS_COMBOBOXEDIT}
  ODS_HOTLIGHT     = $0040;
  {$EXTERNALSYM ODS_HOTLIGHT}
  ODS_INACTIVE     = $0080;
  {$EXTERNALSYM ODS_INACTIVE}
  ODS_NOACCEL      = $0100;
  {$EXTERNALSYM ODS_NOACCEL}
  ODS_NOFOCUSRECT  = $0200;
  {$EXTERNALSYM ODS_NOFOCUSRECT}

//
// MEASUREITEMSTRUCT for ownerdraw
//

type
  LPMEASUREITEMSTRUCT = ^MEASUREITEMSTRUCT;
  {$EXTERNALSYM LPMEASUREITEMSTRUCT}
  tagMEASUREITEMSTRUCT = record
    CtlType: UINT;
    CtlID: UINT;
    itemID: UINT;
    itemWidth: UINT;
    itemHeight: UINT;
    itemData: ULONG_PTR;
  end;
  {$EXTERNALSYM tagMEASUREITEMSTRUCT}
  MEASUREITEMSTRUCT = tagMEASUREITEMSTRUCT;
  {$EXTERNALSYM MEASUREITEMSTRUCT}
  TMeasureItemStruct = MEASUREITEMSTRUCT;
  PMeasureItemStruct = LPMEASUREITEMSTRUCT;

//
// DRAWITEMSTRUCT for ownerdraw
//

  LPDRAWITEMSTRUCT = ^DRAWITEMSTRUCT;
  {$EXTERNALSYM LPDRAWITEMSTRUCT}
  tagDRAWITEMSTRUCT = record
    CtlType: UINT;
    CtlID: UINT;
    itemID: UINT;
    itemAction: UINT;
    itemState: UINT;
    hwndItem: HWND;
    hDC: HDC;
    rcItem: RECT;
    itemData: ULONG_PTR;
  end;
  {$EXTERNALSYM tagDRAWITEMSTRUCT}
  DRAWITEMSTRUCT = tagDRAWITEMSTRUCT;
  {$EXTERNALSYM DRAWITEMSTRUCT}
  TDrawItemStruct = DRAWITEMSTRUCT;
  PDrawItemStruct = LPDRAWITEMSTRUCT;

//
// DELETEITEMSTRUCT for ownerdraw
//

  LPDELETEITEMSTRUCT = ^DELETEITEMSTRUCT;
  {$EXTERNALSYM LPDELETEITEMSTRUCT}
  tagDELETEITEMSTRUCT = record
    CtlType: UINT;
    CtlID: UINT;
    itemID: UINT;
    hwndItem: HWND;
    itemData: ULONG_PTR;
  end;
  {$EXTERNALSYM tagDELETEITEMSTRUCT}
  DELETEITEMSTRUCT = tagDELETEITEMSTRUCT;
  {$EXTERNALSYM DELETEITEMSTRUCT}
  TDeleteItemStruct = DELETEITEMSTRUCT;
  PDeleteItemStruct = LPDELETEITEMSTRUCT;

//
// COMPAREITEMSTUCT for ownerdraw sorting
//

  LPCOMPAREITEMSTRUCT = ^COMPAREITEMSTRUCT;
  {$EXTERNALSYM LPCOMPAREITEMSTRUCT}
  tagCOMPAREITEMSTRUCT = record
    CtlType: UINT;
    CtlID: UINT;
    hwndItem: HWND;
    itemID1: UINT;
    itemData1: ULONG_PTR;
    itemID2: UINT;
    itemData2: ULONG_PTR;
    dwLocaleId: DWORD;
  end;
  {$EXTERNALSYM tagCOMPAREITEMSTRUCT}
  COMPAREITEMSTRUCT = tagCOMPAREITEMSTRUCT;
  {$EXTERNALSYM COMPAREITEMSTRUCT}
  TCompareItemStruct = COMPAREITEMSTRUCT;
  PCompareItemStruct = LPCOMPAREITEMSTRUCT;

//
// Message Function Templates
//

function GetMessageA(lpMsg: LPMSG; hWnd: HWND; wMsgFilterMin, wMsgFilterMax: UINT): BOOL; stdcall;
{$EXTERNALSYM GetMessageA}
function GetMessageW(lpMsg: LPMSG; hWnd: HWND; wMsgFilterMin, wMsgFilterMax: UINT): BOOL; stdcall;
{$EXTERNALSYM GetMessageW}
function GetMessage(lpMsg: LPMSG; hWnd: HWND; wMsgFilterMin, wMsgFilterMax: UINT): BOOL; stdcall;
{$EXTERNALSYM GetMessage}

function TranslateMessage(lpMsg: LPMSG): BOOL; stdcall;
{$EXTERNALSYM TranslateMessage}

function DispatchMessageA(lpMsg: LPMSG): LRESULT; stdcall;
{$EXTERNALSYM DispatchMessageA}
function DispatchMessageW(lpMsg: LPMSG): LRESULT; stdcall;
{$EXTERNALSYM DispatchMessageW}
function DispatchMessage(lpMsg: LPMSG): LRESULT; stdcall;
{$EXTERNALSYM DispatchMessage}

function SetMessageQueue(cMessagesMax: Integer): BOOL; stdcall;
{$EXTERNALSYM SetMessageQueue}

function PeekMessageA(var lpMsg: MSG; hWnd: HWND;
  wMsgFilterMin, wMsgFilterMax, wRemoveMsg: UINT): BOOL; stdcall;
{$EXTERNALSYM PeekMessageA}
function PeekMessageW(var lpMsg: MSG; hWnd: HWND;
  wMsgFilterMin, wMsgFilterMax, wRemoveMsg: UINT): BOOL; stdcall;
{$EXTERNALSYM PeekMessageW}
function PeekMessage(var lpMsg: MSG; hWnd: HWND;
  wMsgFilterMin, wMsgFilterMax, wRemoveMsg: UINT): BOOL; stdcall;
{$EXTERNALSYM PeekMessage}

//
// Queue status flags for GetQueueStatus() and MsgWaitForMultipleObjects()
//

const
  QS_KEY            = $0001;
  {$EXTERNALSYM QS_KEY}
  QS_MOUSEMOVE      = $0002;
  {$EXTERNALSYM QS_MOUSEMOVE}
  QS_MOUSEBUTTON    = $0004;
  {$EXTERNALSYM QS_MOUSEBUTTON}
  QS_POSTMESSAGE    = $0008;
  {$EXTERNALSYM QS_POSTMESSAGE}
  QS_TIMER          = $0010;
  {$EXTERNALSYM QS_TIMER}
  QS_PAINT          = $0020;
  {$EXTERNALSYM QS_PAINT}
  QS_SENDMESSAGE    = $0040;
  {$EXTERNALSYM QS_SENDMESSAGE}
  QS_HOTKEY         = $0080;
  {$EXTERNALSYM QS_HOTKEY}
  QS_ALLPOSTMESSAGE = $0100;
  {$EXTERNALSYM QS_ALLPOSTMESSAGE}
  QS_RAWINPUT       = $0400;
  {$EXTERNALSYM QS_RAWINPUT}

  QS_MOUSE = QS_MOUSEMOVE or QS_MOUSEBUTTON;
  {$EXTERNALSYM QS_MOUSE}

  QS_INPUT = QS_MOUSE or QS_KEY {$IFDEF WINXP_UP} or QS_RAWINPUT {$ENDIF};
  {$EXTERNALSYM QS_INPUT}

  QS_ALLEVENTS = QS_INPUT or QS_POSTMESSAGE or QS_TIMER or QS_PAINT or QS_HOTKEY;
  {$EXTERNALSYM QS_ALLEVENTS}

  QS_ALLINPUT = (QS_INPUT or QS_POSTMESSAGE or QS_TIMER or QS_PAINT or
    QS_HOTKEY or QS_SENDMESSAGE);
  {$EXTERNALSYM QS_ALLINPUT}

//
// PeekMessage() Options
//

const
  PM_NOREMOVE       = $0000;
  {$EXTERNALSYM PM_NOREMOVE}
  PM_REMOVE         = $0001;
  {$EXTERNALSYM PM_REMOVE}
  PM_NOYIELD        = $0002;
  {$EXTERNALSYM PM_NOYIELD}
  PM_QS_INPUT       = QS_INPUT shl 16;
  {$EXTERNALSYM PM_QS_INPUT}
  PM_QS_POSTMESSAGE = (QS_POSTMESSAGE or QS_HOTKEY or QS_TIMER) shl 16;
  {$EXTERNALSYM PM_QS_POSTMESSAGE}
  PM_QS_PAINT       = QS_PAINT shl 16;
  {$EXTERNALSYM PM_QS_PAINT}
  PM_QS_SENDMESSAGE = QS_SENDMESSAGE shl 16;
  {$EXTERNALSYM PM_QS_SENDMESSAGE}

function RegisterHotKey(hWnd: HWND; id: Integer; fsModifiers, vk: UINT): BOOL; stdcall;
{$EXTERNALSYM RegisterHotKey}

function UnregisterHotKey(hWnd: HWND; id: Integer): BOOL; stdcall;
{$EXTERNALSYM UnregisterHotKey}

const
  MOD_ALT     = $0001;
  {$EXTERNALSYM MOD_ALT}
  MOD_CONTROL = $0002;
  {$EXTERNALSYM MOD_CONTROL}
  MOD_SHIFT   = $0004;
  {$EXTERNALSYM MOD_SHIFT}
  MOD_WIN     = $0008;
  {$EXTERNALSYM MOD_WIN}

  IDHOT_SNAPWINDOW  = DWORD(-1); // SHIFT-PRINTSCRN
  {$EXTERNALSYM IDHOT_SNAPWINDOW}
  IDHOT_SNAPDESKTOP = DWORD(-2); // PRINTSCRN
  {$EXTERNALSYM IDHOT_SNAPDESKTOP}

const
  ENDSESSION_LOGOFF = DWORD($80000000);
  {$EXTERNALSYM ENDSESSION_LOGOFF}

  EWX_LOGOFF      = 0;
  {$EXTERNALSYM EWX_LOGOFF}
  EWX_SHUTDOWN    = $00000001;
  {$EXTERNALSYM EWX_SHUTDOWN}
  EWX_REBOOT      = $00000002;
  {$EXTERNALSYM EWX_REBOOT}
  EWX_FORCE       = $00000004;
  {$EXTERNALSYM EWX_FORCE}
  EWX_POWEROFF    = $00000008;
  {$EXTERNALSYM EWX_POWEROFF}
  EWX_FORCEIFHUNG = $00000010;
  {$EXTERNALSYM EWX_FORCEIFHUNG}

function ExitWindows(dwReserved: DWORD; uREserved: UINT): BOOL;
{$EXTERNALSYM ExitWindows}

function ExitWindowsEx(uFlags: UINT; dwReserved: DWORD): BOOL; stdcall;
{$EXTERNALSYM ExitWindowsEx}

function SwapMouseButton(fSwap: BOOL): BOOL; stdcall;
{$EXTERNALSYM SwapMouseButton}

function GetMessagePos: DWORD; stdcall;
{$EXTERNALSYM GetMessagePos}

function GetMessageTime: LONG; stdcall;
{$EXTERNALSYM GetMessageTime}

function GetMessageExtraInfo: LPARAM; stdcall;
{$EXTERNALSYM GetMessageExtraInfo}

function SetMessageExtraInfo(lParam: LPARAM): LPARAM; stdcall;
{$EXTERNALSYM SetMessageExtraInfo}

function SendMessageA(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
{$EXTERNALSYM SendMessageA}
function SendMessageW(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
{$EXTERNALSYM SendMessageW}
function SendMessage(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
{$EXTERNALSYM SendMessage}

function SendMessageTimeoutA(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM;
  fuFlags, uTimeout: UINT; var lpdwResult: DWORD_PTR): LRESULT; stdcall;
{$EXTERNALSYM SendMessageTimeoutA}
function SendMessageTimeoutW(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM;
  fuFlags, uTimeout: UINT; var lpdwResult: DWORD_PTR): LRESULT; stdcall;
{$EXTERNALSYM SendMessageTimeoutW}
function SendMessageTimeout(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM;
  fuFlags, uTimeout: UINT; var lpdwResult: DWORD_PTR): LRESULT; stdcall;
{$EXTERNALSYM SendMessageTimeout}

function SendNotifyMessageA(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): BOOL; stdcall;
{$EXTERNALSYM SendNotifyMessageA}
function SendNotifyMessageW(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): BOOL; stdcall;
{$EXTERNALSYM SendNotifyMessageW}
function SendNotifyMessage(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): BOOL; stdcall;
{$EXTERNALSYM SendNotifyMessage}

function SendMessageCallbackA(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM;
  lpResultCallBack: SENDASYNCPROC; dwData: ULONG_PTR): BOOL; stdcall;
{$EXTERNALSYM SendMessageCallbackA}
function SendMessageCallbackW(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM;
  lpResultCallBack: SENDASYNCPROC; dwData: ULONG_PTR): BOOL; stdcall;
{$EXTERNALSYM SendMessageCallbackW}
function SendMessageCallback(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM;
  lpResultCallBack: SENDASYNCPROC; dwData: ULONG_PTR): BOOL; stdcall;
{$EXTERNALSYM SendMessageCallback}

type
  BSMINFO = record
    cbSize: UINT;
    hdesk: HDESK;
    hwnd: HWND;
    luid: LUID;
  end;
  {$EXTERNALSYM BSMINFO}
  PBSMINFO = ^BSMINFO;
  TBsmInfo = BSMINFO;

function BroadcastSystemMessageExA(dwFlags: DWORD; lpwRecipients: LPDWORD; uiMessage: UINT;
  wParam: WPARAM; lParam: LPARAM; pBSMInfo: PBSMINFO): Longint; stdcall;
{$EXTERNALSYM BroadcastSystemMessageExA}
function BroadcastSystemMessageExW(dwFlags: DWORD; lpwRecipients: LPDWORD; uiMessage: UINT;
  wParam: WPARAM; lParam: LPARAM; pBSMInfo: PBSMINFO): Longint; stdcall;
{$EXTERNALSYM BroadcastSystemMessageExW}
function BroadcastSystemMessageEx(dwFlags: DWORD; lpwRecipients: LPDWORD; uiMessage: UINT;
  wParam: WPARAM; lParam: LPARAM; pBSMInfo: PBSMINFO): Longint; stdcall;
{$EXTERNALSYM BroadcastSystemMessageEx}

function BroadcastSystemMessageA(dwFlags: DWORD; lpdwRecipients: LPDWORD;
  uiMessage: UINT; wParam: WPARAM; lParam: LPARAM): Longint; stdcall;
{$EXTERNALSYM BroadcastSystemMessageA}
function BroadcastSystemMessageW(dwFlags: DWORD; lpdwRecipients: LPDWORD;
  uiMessage: UINT; wParam: WPARAM; lParam: LPARAM): Longint; stdcall;
{$EXTERNALSYM BroadcastSystemMessageW}
function BroadcastSystemMessage(dwFlags: DWORD; lpdwRecipients: LPDWORD;
  uiMessage: UINT; wParam: WPARAM; lParam: LPARAM): Longint; stdcall;
{$EXTERNALSYM BroadcastSystemMessage}

//Broadcast Special Message Recipient list

const
  BSM_ALLCOMPONENTS      = $00000000;
  {$EXTERNALSYM BSM_ALLCOMPONENTS}
  BSM_VXDS               = $00000001;
  {$EXTERNALSYM BSM_VXDS}
  BSM_NETDRIVER          = $00000002;
  {$EXTERNALSYM BSM_NETDRIVER}
  BSM_INSTALLABLEDRIVERS = $00000004;
  {$EXTERNALSYM BSM_INSTALLABLEDRIVERS}
  BSM_APPLICATIONS       = $00000008;
  {$EXTERNALSYM BSM_APPLICATIONS}
  BSM_ALLDESKTOPS        = $00000010;
  {$EXTERNALSYM BSM_ALLDESKTOPS}

//Broadcast Special Message Flags

  BSF_QUERY              = $00000001;
  {$EXTERNALSYM BSF_QUERY}
  BSF_IGNORECURRENTTASK  = $00000002;
  {$EXTERNALSYM BSF_IGNORECURRENTTASK}
  BSF_FLUSHDISK          = $00000004;
  {$EXTERNALSYM BSF_FLUSHDISK}
  BSF_NOHANG             = $00000008;
  {$EXTERNALSYM BSF_NOHANG}
  BSF_POSTMESSAGE        = $00000010;
  {$EXTERNALSYM BSF_POSTMESSAGE}
  BSF_FORCEIFHUNG        = $00000020;
  {$EXTERNALSYM BSF_FORCEIFHUNG}
  BSF_NOTIMEOUTIFNOTHUNG = $00000040;
  {$EXTERNALSYM BSF_NOTIMEOUTIFNOTHUNG}
  BSF_ALLOWSFW           = $00000080;
  {$EXTERNALSYM BSF_ALLOWSFW}
  BSF_SENDNOTIFYMESSAGE  = $00000100;
  {$EXTERNALSYM BSF_SENDNOTIFYMESSAGE}

  BSF_RETURNHDESK        = $00000200;
  {$EXTERNALSYM BSF_RETURNHDESK}
  BSF_LUID               = $00000400;
  {$EXTERNALSYM BSF_LUID}

  BROADCAST_QUERY_DENY = $424D5144; // Return this value to deny a query.
  {$EXTERNALSYM BROADCAST_QUERY_DENY}

// RegisterDeviceNotification

type
  HDEVNOTIFY = PVOID;
  {$EXTERNALSYM HDEVNOTIFY}
  PHDEVNOTIFY = ^HDEVNOTIFY;
  {$EXTERNALSYM PHDEVNOTIFY}

const
  DEVICE_NOTIFY_WINDOW_HANDLE  = $00000000;
  {$EXTERNALSYM DEVICE_NOTIFY_WINDOW_HANDLE}
  DEVICE_NOTIFY_SERVICE_HANDLE = $00000001;
  {$EXTERNALSYM DEVICE_NOTIFY_SERVICE_HANDLE}
  DEVICE_NOTIFY_ALL_INTERFACE_CLASSES = $00000004;
  {$EXTERNALSYM DEVICE_NOTIFY_ALL_INTERFACE_CLASSES}

function RegisterDeviceNotificationA(hRecipient: HANDLE; NotificationFilter: LPVOID;
  Flags: DWORD): HDEVNOTIFY; stdcall;
{$EXTERNALSYM RegisterDeviceNotificationA}
function RegisterDeviceNotificationW(hRecipient: HANDLE; NotificationFilter: LPVOID;
  Flags: DWORD): HDEVNOTIFY; stdcall;
{$EXTERNALSYM RegisterDeviceNotificationW}
function RegisterDeviceNotification(hRecipient: HANDLE; NotificationFilter: LPVOID;
  Flags: DWORD): HDEVNOTIFY; stdcall;
{$EXTERNALSYM RegisterDeviceNotification}

function UnregisterDeviceNotification(Handle: HDEVNOTIFY): BOOL; stdcall;
{$EXTERNALSYM UnregisterDeviceNotification}

function PostMessageA(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): BOOL; stdcall;
{$EXTERNALSYM PostMessageA}
function PostMessageW(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): BOOL; stdcall;
{$EXTERNALSYM PostMessageW}
function PostMessage(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): BOOL; stdcall;
{$EXTERNALSYM PostMessage}

function PostThreadMessageA(idThread: DWORD; Msg: UINT; wParam: WPARAM; lParam: LPARAM): BOOL; stdcall;
{$EXTERNALSYM PostThreadMessageA}
function PostThreadMessageW(idThread: DWORD; Msg: UINT; wParam: WPARAM; lParam: LPARAM): BOOL; stdcall;
{$EXTERNALSYM PostThreadMessageW}
function PostThreadMessage(idThread: DWORD; Msg: UINT; wParam: WPARAM; lParam: LPARAM): BOOL; stdcall;
{$EXTERNALSYM PostThreadMessage}

function PostAppMessageA(idThread: DWORD; wMsg: UINT; wParam: WPARAM; lParam: LPARAM): BOOL;
{$EXTERNALSYM PostAppMessageA}
function PostAppMessageW(idThread: DWORD; wMsg: UINT; wParam: WPARAM; lParam: LPARAM): BOOL;
{$EXTERNALSYM PostAppMessageW}
function PostAppMessage(idThread: DWORD; wMsg: UINT; wParam: WPARAM; lParam: LPARAM): BOOL;
{$EXTERNALSYM PostAppMessage}

//
// Special HWND value for use with PostMessage() and SendMessage()
//

const
  HWND_BROADCAST = HWND($ffff);
  {$EXTERNALSYM HWND_BROADCAST}

  HWND_MESSAGE = HWND(-3);
  {$EXTERNALSYM HWND_MESSAGE}

function AttachThreadInput(idAttach, idAttachTo: DWORD; fAttach: BOOL): BOOL; stdcall;
{$EXTERNALSYM AttachThreadInput}

function ReplyMessage(lResult: LRESULT): BOOL; stdcall;
{$EXTERNALSYM ReplyMessage}

function WaitMessage: BOOL; stdcall;
{$EXTERNALSYM WaitMessage}

function WaitForInputIdle(hProcess: HANDLE; dwMilliseconds: DWORD): DWORD; stdcall;
{$EXTERNALSYM WaitForInputIdle}

function DefWindowProcA(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
{$EXTERNALSYM DefWindowProcA}
function DefWindowProcW(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
{$EXTERNALSYM DefWindowProcW}
function DefWindowProc(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
{$EXTERNALSYM DefWindowProc}

procedure PostQuitMessage(nExitCode: Integer); stdcall;
{$EXTERNALSYM PostQuitMessage}

function CallWindowProcA(lpPrevWndFunc: WNDPROC; hWnd: HWND; Msg: UINT;
  wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
{$EXTERNALSYM CallWindowProcA}
function CallWindowProcW(lpPrevWndFunc: WNDPROC; hWnd: HWND; Msg: UINT;
  wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
{$EXTERNALSYM CallWindowProcW}
function CallWindowProc(lpPrevWndFunc: WNDPROC; hWnd: HWND; Msg: UINT;
  wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
{$EXTERNALSYM CallWindowProc}

function InSendMessage: BOOL; stdcall;
{$EXTERNALSYM InSendMessage}

function InSendMessageEx(lpReserved: LPVOID): DWORD; stdcall;
{$EXTERNALSYM InSendMessageEx}

//
// InSendMessageEx return value
//

const
  ISMEX_NOSEND   = $00000000;
  {$EXTERNALSYM ISMEX_NOSEND}
  ISMEX_SEND     = $00000001;
  {$EXTERNALSYM ISMEX_SEND}
  ISMEX_NOTIFY   = $00000002;
  {$EXTERNALSYM ISMEX_NOTIFY}
  ISMEX_CALLBACK = $00000004;
  {$EXTERNALSYM ISMEX_CALLBACK}
  ISMEX_REPLIED  = $00000008;
  {$EXTERNALSYM ISMEX_REPLIED}

function GetDoubleClickTime: UINT; stdcall;
{$EXTERNALSYM GetDoubleClickTime}

function SetDoubleClickTime(uInterval: UINT): BOOL; stdcall;
{$EXTERNALSYM SetDoubleClickTime}

function RegisterClassA(const lpWndClass: WNDCLASSA): ATOM; stdcall;
{$EXTERNALSYM RegisterClassA}
function RegisterClassW(const lpWndClass: WNDCLASSW): ATOM; stdcall;
{$EXTERNALSYM RegisterClassW}
function RegisterClass(const lpWndClass: WNDCLASS): ATOM; stdcall;
{$EXTERNALSYM RegisterClass}

function UnregisterClassA(lpClassName: LPCSTR; hInstance: HINST): BOOL; stdcall;
{$EXTERNALSYM UnregisterClassA}
function UnregisterClassW(lpClassName: LPCWSTR; hInstance: HINST): BOOL; stdcall;
{$EXTERNALSYM UnregisterClassW}
function UnregisterClass(lpClassName: LPCTSTR; hInstance: HINST): BOOL; stdcall;
{$EXTERNALSYM UnregisterClass}

function GetClassInfoA(hInstance: HINST; lpClassName: LPCSTR;
  var lpWndClass: WNDCLASSA): BOOL; stdcall;
{$EXTERNALSYM GetClassInfoA}
function GetClassInfoW(hInstance: HINST; lpClassName: LPCWSTR;
  var lpWndClass: WNDCLASSW): BOOL; stdcall;
{$EXTERNALSYM GetClassInfoW}
function GetClassInfo(hInstance: HINST; lpClassName: LPCTSTR;
  var lpWndClass: WNDCLASS): BOOL; stdcall;
{$EXTERNALSYM GetClassInfo}

function RegisterClassExA(const lpwcx: WNDCLASSEXA): ATOM; stdcall;
{$EXTERNALSYM RegisterClassExA}
function RegisterClassExW(const lpwcx: WNDCLASSEXW): ATOM; stdcall;
{$EXTERNALSYM RegisterClassExW}
function RegisterClassEx(const lpwcx: WNDCLASSEX): ATOM; stdcall;
{$EXTERNALSYM RegisterClassEx}

function GetClassInfoExA(hinst: HINST; lpszClass: LPCSTR; var lpwcx: WNDCLASSEXA): BOOL; stdcall;
{$EXTERNALSYM GetClassInfoExA}
function GetClassInfoExW(hinst: HINST; lpszClass: LPCWSTR; var lpwcx: WNDCLASSEXW): BOOL; stdcall;
{$EXTERNALSYM GetClassInfoExW}
function GetClassInfoEx(hinst: HINST; lpszClass: LPCTSTR; var lpwcx: WNDCLASSEX): BOOL; stdcall;
{$EXTERNALSYM GetClassInfoEx}

const
  CW_USEDEFAULT = Integer($80000000);
  {$EXTERNALSYM CW_USEDEFAULT}

//
// Special value for CreateWindow, et al.
//

const
  HWND_DESKTOP = HWND(0);
  {$EXTERNALSYM HWND_DESKTOP}

type
  PREGISTERCLASSNAMEW = function(p: LPCWSTR): LongBool; stdcall;
  {$EXTERNALSYM PREGISTERCLASSNAMEW}

function CreateWindowExA(dwExStyle: DWORD; lpClassName, lpWindowName: LPCSTR;
  dwStyle: DWORD; X, Y, nWidth, nHeight: Integer; hWndParent: HWND;
  hMenu: HMENU; hInstance: HINST; lpParam: LPVOID): HWND; stdcall;
{$EXTERNALSYM CreateWindowExA}
function CreateWindowExW(dwExStyle: DWORD; lpClassName, lpWindowName: LPCWSTR;
  dwStyle: DWORD; X, Y, nWidth, nHeight: Integer; hWndParent: HWND;
  hMenu: HMENU; hInstance: HINST; lpParam: LPVOID): HWND; stdcall;
{$EXTERNALSYM CreateWindowExW}
function CreateWindowEx(dwExStyle: DWORD; lpClassName, lpWindowName: LPCTSTR;
  dwStyle: DWORD; X, Y, nWidth, nHeight: Integer; hWndParent: HWND;
  hMenu: HMENU; hInstance: HINST; lpParam: LPVOID): HWND; stdcall;
{$EXTERNALSYM CreateWindowEx}

function CreateWindowA(lpClassName, lpWindowName: LPCSTR; dwStyle: DWORD;
  x, y, nWidth, nHeight: Integer; hWndParent: HWND; hMenu: HMENU;
  hInstance: HINST; lpParam: LPVOID): HWND;
{$EXTERNALSYM CreateWindowA}
function CreateWindowW(lpClassName, lpWindowName: LPCWSTR; dwStyle: DWORD;
  x, y, nWidth, nHeight: Integer; hWndParent: HWND; hMenu: HMENU;
  hInstance: HINST; lpParam: LPVOID): HWND;
{$EXTERNALSYM CreateWindowW}
function CreateWindow(lpClassName, lpWindowName: LPCTSTR; dwStyle: DWORD;
  x, y, nWidth, nHeight: Integer; hWndParent: HWND; hMenu: HMENU;
  hInstance: HINST; lpParam: LPVOID): HWND;
{$EXTERNALSYM CreateWindow}

function IsWindow(hWnd: HWND): BOOL; stdcall;
{$EXTERNALSYM IsWindow}

function IsMenu(hMenu: HMENU): BOOL; stdcall;
{$EXTERNALSYM IsMenu}

function IsChild(hWndParent, hWnd: HWND): BOOL; stdcall;
{$EXTERNALSYM IsChild}

function DestroyWindow(hWnd: HWND): BOOL; stdcall;
{$EXTERNALSYM DestroyWindow}

function ShowWindow(hWnd: HWND; nCmdShow: Integer): BOOL; stdcall;
{$EXTERNALSYM ShowWindow}

function AnimateWindow(hWnd: HWND; dwTime, dwFlags: DWORD): BOOL; stdcall;
{$EXTERNALSYM AnimateWindow}

function UpdateLayeredWindow(hWnd: HWND; hdcDst: HDC; pptDst: LPPOINT;
  psize: LPSIZE; hdcSrc: HDC; pptSrc: LPPOINT; crKey: COLORREF;
  pblend: LPBLENDFUNCTION; dwFlags: DWORD): BOOL; stdcall;
{$EXTERNALSYM UpdateLayeredWindow}

function GetLayeredWindowAttributes(hwnd: HWND; pcrKey: LPCOLORREF; pbAlpha: LPBYTE;
  pdwFlags: LPWORD): BOOL; stdcall;
{$EXTERNALSYM GetLayeredWindowAttributes}

const
  PW_CLIENTONLY = $00000001;
  {$EXTERNALSYM PW_CLIENTONLY}

function PrintWindow(hwnd: HWND; hdcBlt: HDC; nFlags: UINT): BOOL; stdcall;
{$EXTERNALSYM PrintWindow}

function SetLayeredWindowAttributes(hwnd: HWND; crKey: COLORREF; bAlpha: BYTE;
  dwFlags: DWORD): BOOL; stdcall;
{$EXTERNALSYM SetLayeredWindowAttributes}

const
  LWA_COLORKEY = $00000001;
  {$EXTERNALSYM LWA_COLORKEY}
  LWA_ALPHA    = $00000002;
  {$EXTERNALSYM LWA_ALPHA}

  ULW_COLORKEY = $00000001;
  {$EXTERNALSYM ULW_COLORKEY}
  ULW_ALPHA    = $00000002;
  {$EXTERNALSYM ULW_ALPHA}
  ULW_OPAQUE   = $00000004;
  {$EXTERNALSYM ULW_OPAQUE}

function ShowWindowAsync(hWnd: HWND; nCmdShow: Integer): BOOL; stdcall;
{$EXTERNALSYM ShowWindowAsync}

function FlashWindow(hWnd: HWND; bInvert: BOOL): BOOL; stdcall;
{$EXTERNALSYM FlashWindow}

type
  PFLASH_INFO = ^FLASH_INFO;
  {$EXTERNALSYM PFLASH_INFO}
  FLASH_INFO = record
    cbSize: UINT;
    hwnd: HWND;
    dwFlags: DWORD;
    uCount: UINT;
    dwTimeout: DWORD;
  end;
  {$EXTERNALSYM FLASH_INFO}
  TFlashInfo = FLASH_INFO;
  PFlashInfo = PFLASH_INFO;

function FlashWindowEx(var pfwi: FLASH_INFO): BOOL; stdcall;
{$EXTERNALSYM FlashWindowEx}

const
  FLASHW_STOP      = 0;
  {$EXTERNALSYM FLASHW_STOP}
  FLASHW_CAPTION   = $00000001;
  {$EXTERNALSYM FLASHW_CAPTION}
  FLASHW_TRAY      = $00000002;
  {$EXTERNALSYM FLASHW_TRAY}
  FLASHW_ALL       = FLASHW_CAPTION or FLASHW_TRAY;
  {$EXTERNALSYM FLASHW_ALL}
  FLASHW_TIMER     = $00000004;
  {$EXTERNALSYM FLASHW_TIMER}
  FLASHW_TIMERNOFG = $0000000C;
  {$EXTERNALSYM FLASHW_TIMERNOFG}

function ShowOwnedPopups(hWnd: HWND; fShow: BOOL): BOOL; stdcall;
{$EXTERNALSYM ShowOwnedPopups}

function OpenIcon(hWnd: HWND): BOOL; stdcall;
{$EXTERNALSYM OpenIcon}

function CloseWindow(hWnd: HWND): BOOL; stdcall;
{$EXTERNALSYM CloseWindow}

function MoveWindow(hWnd: HWND; X, Y, nWidth, nHeight: Integer; bRepaint: BOOL): BOOL; stdcall;
{$EXTERNALSYM MoveWindow}

function SetWindowPos(hWnd, hWndInsertAfter: HWND; X, Y, cx, cy: Integer;
  uFlags: UINT): BOOL; stdcall;
{$EXTERNALSYM SetWindowPos}

function GetWindowPlacement(hWnd: HWND; var lpwndpl: WINDOWPLACEMENT): BOOL; stdcall;
{$EXTERNALSYM GetWindowPlacement}

function SetWindowPlacement(hWnd: HWND; const lpwndpl: WINDOWPLACEMENT): BOOL; stdcall;
{$EXTERNALSYM SetWindowPlacement}

function BeginDeferWindowPos(nNumWindows: Integer): HDWP; stdcall;
{$EXTERNALSYM BeginDeferWindowPos}

function DeferWindowPos(hWinPosInfo: HDWP; hWnd, hWndInsertAfter: HWND;
  x, y, cx, cy: Integer; uFlags: UINT): HDWP; stdcall;
{$EXTERNALSYM DeferWindowPos}

function EndDeferWindowPos(hWinPosInfo: HDWP): BOOL; stdcall;
{$EXTERNALSYM EndDeferWindowPos}

function IsWindowVisible(hWnd: HWND): BOOL; stdcall;
{$EXTERNALSYM IsWindowVisible}

function IsIconic(hWnd: HWND): BOOL; stdcall;
{$EXTERNALSYM IsIconic}

function AnyPopup: BOOL; stdcall;
{$EXTERNALSYM AnyPopup}

function BringWindowToTop(hWnd: HWND): BOOL; stdcall;
{$EXTERNALSYM BringWindowToTop}

function IsZoomed(hWnd: HWND): BOOL; stdcall;
{$EXTERNALSYM IsZoomed}

//
// SetWindowPos Flags
//

const
  SWP_NOSIZE         = $0001;
  {$EXTERNALSYM SWP_NOSIZE}
  SWP_NOMOVE         = $0002;
  {$EXTERNALSYM SWP_NOMOVE}
  SWP_NOZORDER       = $0004;
  {$EXTERNALSYM SWP_NOZORDER}
  SWP_NOREDRAW       = $0008;
  {$EXTERNALSYM SWP_NOREDRAW}
  SWP_NOACTIVATE     = $0010;
  {$EXTERNALSYM SWP_NOACTIVATE}
  SWP_FRAMECHANGED   = $0020; // The frame changed: send WM_NCCALCSIZE
  {$EXTERNALSYM SWP_FRAMECHANGED}
  SWP_SHOWWINDOW     = $0040;
  {$EXTERNALSYM SWP_SHOWWINDOW}
  SWP_HIDEWINDOW     = $0080;
  {$EXTERNALSYM SWP_HIDEWINDOW}
  SWP_NOCOPYBITS     = $0100;
  {$EXTERNALSYM SWP_NOCOPYBITS}
  SWP_NOOWNERZORDER  = $0200; // Don't do owner Z ordering
  {$EXTERNALSYM SWP_NOOWNERZORDER}
  SWP_NOSENDCHANGING = $0400; // Don't send WM_WINDOWPOSCHANGING
  {$EXTERNALSYM SWP_NOSENDCHANGING}

  SWP_DRAWFRAME    = SWP_FRAMECHANGED;
  {$EXTERNALSYM SWP_DRAWFRAME}
  SWP_NOREPOSITION = SWP_NOOWNERZORDER;
  {$EXTERNALSYM SWP_NOREPOSITION}

  SWP_DEFERERASE     = $2000;
  {$EXTERNALSYM SWP_DEFERERASE}
  SWP_ASYNCWINDOWPOS = $4000;
  {$EXTERNALSYM SWP_ASYNCWINDOWPOS}

  HWND_TOP       = HWND(0);
  {$EXTERNALSYM HWND_TOP}
  HWND_BOTTOM    = HWND(1);
  {$EXTERNALSYM HWND_BOTTOM}
  HWND_TOPMOST   = HWND(-1);
  {$EXTERNALSYM HWND_TOPMOST}
  HWND_NOTOPMOST = HWND(-2);
  {$EXTERNALSYM HWND_NOTOPMOST}

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

type
  DLGTEMPLATE = packed record
    style: DWORD;
    dwExtendedStyle: DWORD;
    cdit: WORD;
    x: short;
    y: short;
    cx: short;
    cy: short;
  end;
  {$EXTERNALSYM DLGTEMPLATE}
  TDlgTemplate = DLGTEMPLATE;

  LPDLGTEMPLATEA = ^DLGTEMPLATE;
  {$EXTERNALSYM LPDLGTEMPLATEA}
  LPDLGTEMPLATEW = ^DLGTEMPLATE;
  {$EXTERNALSYM LPDLGTEMPLATEW}

  LPCDLGTEMPLATEA = ^DLGTEMPLATE;
  {$EXTERNALSYM LPCDLGTEMPLATEA}
  LPCDLGTEMPLATEW = ^DLGTEMPLATE;
  {$EXTERNALSYM LPCDLGTEMPLATEW}

  {$IFDEF UNICODE}
  LPDLGTEMPLATE = LPDLGTEMPLATEW;
  {$EXTERNALSYM LPDLGTEMPLATE}
  LPCDLGTEMPLATE = LPCDLGTEMPLATEW;
  {$EXTERNALSYM LPCDLGTEMPLATE}
  {$ELSE}
  LPDLGTEMPLATE = LPDLGTEMPLATEA;
  {$EXTERNALSYM LPDLGTEMPLATE}
  LPCDLGTEMPLATE = LPCDLGTEMPLATEA;
  {$EXTERNALSYM LPCDLGTEMPLATE}
  {$ENDIF UNICODE}

//
// 32 bit Dialog item template.
//

  DLGITEMTEMPLATE = packed record
    style: DWORD;
    dwExtendedStyle: DWORD;
    x: short;
    y: short;
    cx: short;
    cy: short;
    id: WORD;
  end;
  {$EXTERNALSYM DLGITEMTEMPLATE}
  TDlgItemTemplate = DLGITEMTEMPLATE;

  PDLGITEMTEMPLATEA = ^DLGITEMTEMPLATE;
  {$EXTERNALSYM PDLGITEMTEMPLATE}
  PDLGITEMTEMPLATEW = ^DLGITEMTEMPLATE;
  {$EXTERNALSYM PDLGITEMTEMPLATE}

  LPDLGITEMTEMPLATEA = ^DLGITEMTEMPLATE;
  {$EXTERNALSYM LPDLGITEMTEMPLATE}
  LPDLGITEMTEMPLATEW = ^DLGITEMTEMPLATE;
  {$EXTERNALSYM LPDLGITEMTEMPLATE}

  {$IFDEF UNICODE}
  PDLGITEMTEMPLATE = PDLGITEMTEMPLATEW;
  {$EXTERNALSYM PDLGITEMTEMPLATE}
  LPDLGITEMTEMPLATE = PDLGITEMTEMPLATEW;
  {$EXTERNALSYM LPDLGITEMTEMPLATE}
  {$ELSE}
  PDLGITEMTEMPLATE = PDLGITEMTEMPLATEA;
  {$EXTERNALSYM PDLGITEMTEMPLATE}
  LPDLGITEMTEMPLATE = PDLGITEMTEMPLATEA;
  {$EXTERNALSYM LPDLGITEMTEMPLATE}
  {$ENDIF UNICODE}

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

function CreateDialogParamA(hInstance: HINST; lpTemplateName: LPCSTR;
  hWndParent: HWND; lpDialogFunc: DLGPROC; dwInitParam: LPARAM): HWND; stdcall;
{$EXTERNALSYM CreateDialogParamA}
function CreateDialogParamW(hInstance: HINST; lpTemplateName: LPCWSTR;
  hWndParent: HWND; lpDialogFunc: DLGPROC; dwInitParam: LPARAM): HWND; stdcall;
{$EXTERNALSYM CreateDialogParamW}
function CreateDialogParam(hInstance: HINST; lpTemplateName: LPCTSTR;
  hWndParent: HWND; lpDialogFunc: DLGPROC; dwInitParam: LPARAM): HWND; stdcall;
{$EXTERNALSYM CreateDialogParam}

function CreateDialogIndirectParamA(hInstance: HINST; const lpTemplate: DLGTEMPLATE;
  hWndParent: HWND; lpDialogFunc: DLGPROC; dwInitParam: LPARAM): HWND; stdcall;
{$EXTERNALSYM CreateDialogIndirectParamA}
function CreateDialogIndirectParamW(hInstance: HINST; const lpTemplate: DLGTEMPLATE;
  hWndParent: HWND; lpDialogFunc: DLGPROC; dwInitParam: LPARAM): HWND; stdcall;
{$EXTERNALSYM CreateDialogIndirectParamW}
function CreateDialogIndirectParam(hInstance: HINST; const lpTemplate: DLGTEMPLATE;
  hWndParent: HWND; lpDialogFunc: DLGPROC; dwInitParam: LPARAM): HWND; stdcall;
{$EXTERNALSYM CreateDialogIndirectParam}

function CreateDialogA(hInstance: HINST; lpName: LPCSTR; hWndParent: HWND;
  lpDialogFunc: DLGPROC): HWND;
{$EXTERNALSYM CreateDialogA}
function CreateDialogW(hInstance: HINST; lpName: LPCWSTR; hWndParent: HWND;
  lpDialogFunc: DLGPROC): HWND;
{$EXTERNALSYM CreateDialogW}
function CreateDialog(hInstance: HINST; lpName: LPCTSTR; hWndParent: HWND;
  lpDialogFunc: DLGPROC): HWND;
{$EXTERNALSYM CreateDialog}

function CreateDialogIndirectA(hInstance: HINST; const lpTemplate: DLGTEMPLATE;
  hWndParent: HWND; lpDialogFunc: DLGPROC): HWND;
{$EXTERNALSYM CreateDialogIndirectA}
function CreateDialogIndirectW(hInstance: HINST; const lpTemplate: DLGTEMPLATE;
  hWndParent: HWND; lpDialogFunc: DLGPROC): HWND;
{$EXTERNALSYM CreateDialogIndirectW}
function CreateDialogIndirect(hInstance: HINST; const lpTemplate: DLGTEMPLATE;
  hWndParent: HWND; lpDialogFunc: DLGPROC): HWND;
{$EXTERNALSYM CreateDialogIndirect}

function DialogBoxParamA(hInstance: HINST; lpTemplateName: LPCSTR;
  hWndParent: HWND; lpDialogFunc: DLGPROC; dwInitParam: LPARAM): INT_PTR; stdcall;
{$EXTERNALSYM DialogBoxParamA}
function DialogBoxParamW(hInstance: HINST; lpTemplateName: LPCWSTR;
  hWndParent: HWND; lpDialogFunc: DLGPROC; dwInitParam: LPARAM): INT_PTR; stdcall;
{$EXTERNALSYM DialogBoxParamW}
function DialogBoxParam(hInstance: HINST; lpTemplateName: LPCTSTR;
  hWndParent: HWND; lpDialogFunc: DLGPROC; dwInitParam: LPARAM): INT_PTR; stdcall;
{$EXTERNALSYM DialogBoxParam}

function DialogBoxIndirectParamA(hInstance: HINST;
  const hDialogTemplate: DLGTEMPLATE; hWndParent: HWND; lpDialogFunc: DLGPROC;
  dwInitParam: LPARAM): INT_PTR; stdcall;
{$EXTERNALSYM DialogBoxIndirectParamA}
function DialogBoxIndirectParamW(hInstance: HINST;
  const hDialogTemplate: DLGTEMPLATE; hWndParent: HWND; lpDialogFunc: DLGPROC;
  dwInitParam: LPARAM): INT_PTR; stdcall;
{$EXTERNALSYM DialogBoxIndirectParamW}
function DialogBoxIndirectParam(hInstance: HINST;
  const hDialogTemplate: DLGTEMPLATE; hWndParent: HWND; lpDialogFunc: DLGPROC;
  dwInitParam: LPARAM): INT_PTR; stdcall;
{$EXTERNALSYM DialogBoxIndirectParam}

function DialogBoxA(hInstance: HINST; lpTemplate: LPCSTR; hWndParent: HWND;
  lpDialogFunc: DLGPROC): INT_PTR;
{$EXTERNALSYM DialogBoxA}
function DialogBoxW(hInstance: HINST; lpTemplate: LPCWSTR; hWndParent: HWND;
  lpDialogFunc: DLGPROC): INT_PTR;
{$EXTERNALSYM DialogBoxW}
function DialogBox(hInstance: HINST; lpTemplate: LPCTSTR; hWndParent: HWND;
  lpDialogFunc: DLGPROC): INT_PTR;
{$EXTERNALSYM DialogBox}

function DialogBoxIndirectA(hInstance: HINST; const lpTemplate: DLGTEMPLATE;
  hWndParent: HWND; lpDialogFunc: DLGPROC): INT_PTR;
{$EXTERNALSYM DialogBoxIndirectA}
function DialogBoxIndirectW(hInstance: HINST; const lpTemplate: DLGTEMPLATE;
  hWndParent: HWND; lpDialogFunc: DLGPROC): INT_PTR;
{$EXTERNALSYM DialogBoxIndirectW}
function DialogBoxIndirect(hInstance: HINST; const lpTemplate: DLGTEMPLATE;
  hWndParent: HWND; lpDialogFunc: DLGPROC): INT_PTR;
{$EXTERNALSYM DialogBoxIndirect}

function EndDialog(hDlg: HWND; nResult: INT_PTR): BOOL; stdcall;
{$EXTERNALSYM EndDialog}

function GetDlgItem(hDlg: HWND; nIDDlgItem: Integer): HWND; stdcall;
{$EXTERNALSYM GetDlgItem}

function SetDlgItemInt(hDlg: HWND; nIDDlgItem: Integer; uValue: UINT; bSigned: BOOL): BOOL; stdcall;
{$EXTERNALSYM SetDlgItemInt}

function GetDlgItemInt(hDlg: HWND; nIDDlgItem: Integer; lpTranslated: LPBOOL;
  bSigned: BOOL): UINT; stdcall;
{$EXTERNALSYM GetDlgItemInt}

function SetDlgItemTextA(hDlg: HWND; nIDDlgItem: Integer; lpString: LPCSTR): BOOL; stdcall;
{$EXTERNALSYM SetDlgItemTextA}
function SetDlgItemTextW(hDlg: HWND; nIDDlgItem: Integer; lpString: LPCWSTR): BOOL; stdcall;
{$EXTERNALSYM SetDlgItemTextW}
function SetDlgItemText(hDlg: HWND; nIDDlgItem: Integer; lpString: LPCTSTR): BOOL; stdcall;
{$EXTERNALSYM SetDlgItemText}

function GetDlgItemTextA(hDlg: HWND; nIDDlgItem: Integer; lpString: LPSTR;
  nMaxCount: Integer): UINT; stdcall;
{$EXTERNALSYM GetDlgItemTextA}
function GetDlgItemTextW(hDlg: HWND; nIDDlgItem: Integer; lpString: LPWSTR;
  nMaxCount: Integer): UINT; stdcall;
{$EXTERNALSYM GetDlgItemTextW}
function GetDlgItemText(hDlg: HWND; nIDDlgItem: Integer; lpString: LPTSTR;
  nMaxCount: Integer): UINT; stdcall;
{$EXTERNALSYM GetDlgItemText}

function CheckDlgButton(hDlg: HWND; nIDButton: Integer; uCheck: UINT): BOOL; stdcall;
{$EXTERNALSYM CheckDlgButton}

function CheckRadioButton(hDlg: HWND; nIDFirstButton, nIDLastButton: Integer;
  nIDCheckButton: Integer): BOOL; stdcall;
{$EXTERNALSYM CheckRadioButton}

function IsDlgButtonChecked(hDlg: HWND; nIDButton: Integer): UINT; stdcall;
{$EXTERNALSYM IsDlgButtonChecked}

function SendDlgItemMessageA(hDlg: HWND; nIDDlgItem: Integer; Msg: UINT;
  wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
{$EXTERNALSYM SendDlgItemMessageA}
function SendDlgItemMessageW(hDlg: HWND; nIDDlgItem: Integer; Msg: UINT;
  wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
{$EXTERNALSYM SendDlgItemMessageW}
function SendDlgItemMessage(hDlg: HWND; nIDDlgItem: Integer; Msg: UINT;
  wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
{$EXTERNALSYM SendDlgItemMessage}

function GetNextDlgGroupItem(hDlg: HWND; hCtl: HWND; bPrevious: BOOL): HWND; stdcall;
{$EXTERNALSYM GetNextDlgGroupItem}

function GetNextDlgTabItem(hDlg: HWND; hCtl: HWND; bPrevious: BOOL): HWND; stdcall;
{$EXTERNALSYM GetNextDlgTabItem}

function GetDlgCtrlID(hWnd: HWND): Integer; stdcall;
{$EXTERNALSYM GetDlgCtrlID}

function GetDialogBaseUnits: Longint; stdcall;
{$EXTERNALSYM GetDialogBaseUnits(VOID v)}

function DefDlgProcA(hDlg: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
{$EXTERNALSYM DefDlgProcA}
function DefDlgProcW(hDlg: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
{$EXTERNALSYM DefDlgProcW}
function DefDlgProc(hDlg: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
{$EXTERNALSYM DefDlgProc}

//
// Window extra byted needed for private dialog classes.
//

const
  DLGWINDOWEXTRA = 30;
  {$EXTERNALSYM DLGWINDOWEXTRA}

function CallMsgFilterA(lpMsg: LPMSG; nCode: Integer): BOOL; stdcall;
{$EXTERNALSYM CallMsgFilterA}
function CallMsgFilterW(lpMsg: LPMSG; nCode: Integer): BOOL; stdcall;
{$EXTERNALSYM CallMsgFilterW}
function CallMsgFilter(lpMsg: LPMSG; nCode: Integer): BOOL; stdcall;
{$EXTERNALSYM CallMsgFilter}

//
// Clipboard Manager Functions
//

function OpenClipboard(hWndNewOwner: HWND): BOOL; stdcall;
{$EXTERNALSYM OpenClipboard}

function CloseClipboard: BOOL; stdcall;
{$EXTERNALSYM CloseClipboard}

function GetClipboardSequenceNumber: DWORD; stdcall;
{$EXTERNALSYM GetClipboardSequenceNumber}

function GetClipboardOwner: HWND; stdcall;
{$EXTERNALSYM GetClipboardOwner}

function SetClipboardViewer(hWndNewViewer: HWND): HWND; stdcall;
{$EXTERNALSYM SetClipboardViewer}

function GetClipboardViewer: HWND; stdcall;
{$EXTERNALSYM GetClipboardViewer}

function ChangeClipboardChain(hWndRemove, hWndNewNext: HWND): BOOL; stdcall;
{$EXTERNALSYM ChangeClipboardChain}

function SetClipboardData(uFormat: UINT; hMem: HANDLE): HANDLE; stdcall;
{$EXTERNALSYM SetClipboardData}

function GetClipboardData(uFormat: UINT): HANDLE; stdcall;
{$EXTERNALSYM GetClipboardData}

function RegisterClipboardFormatA(lpszFormat: LPCSTR): UINT; stdcall;
{$EXTERNALSYM RegisterClipboardFormatA}
function RegisterClipboardFormatW(lpszFormat: LPCWSTR): UINT; stdcall;
{$EXTERNALSYM RegisterClipboardFormatW}
function RegisterClipboardFormat(lpszFormat: LPCTSTR): UINT; stdcall;
{$EXTERNALSYM RegisterClipboardFormat}

function CountClipboardFormats: Integer; stdcall;
{$EXTERNALSYM CountClipboardFormats}

function EnumClipboardFormats(format: UINT): UINT; stdcall;
{$EXTERNALSYM EnumClipboardFormats}

function GetClipboardFormatNameA(format: UINT; lpszFormatName: LPSTR;
  cchMaxCount: Integer): Integer; stdcall;
{$EXTERNALSYM GetClipboardFormatNameA}
function GetClipboardFormatNameW(format: UINT; lpszFormatName: LPWSTR;
  cchMaxCount: Integer): Integer; stdcall;
{$EXTERNALSYM GetClipboardFormatNameW}
function GetClipboardFormatName(format: UINT; lpszFormatName: LPTSTR;
  cchMaxCount: Integer): Integer; stdcall;
{$EXTERNALSYM GetClipboardFormatName}

function EmptyClipboard: BOOL; stdcall;
{$EXTERNALSYM EmptyClipboard}

function IsClipboardFormatAvailable(format: UINT): BOOL; stdcall;
{$EXTERNALSYM IsClipboardFormatAvailable}

function GetPriorityClipboardFormat(paFormatPriorityList: PUINT; cFormats: Integer): Integer; stdcall;
{$EXTERNALSYM GetPriorityClipboardFormat}

function GetOpenClipboardWindow: HWND; stdcall;
{$EXTERNALSYM GetOpenClipboardWindow}

//
// Character Translation Routines
//

function CharToOemA(lpszSrc: LPCSTR; lpszDst: LPSTR): BOOL; stdcall;
{$EXTERNALSYM CharToOemA}
function CharToOemW(lpszSrc: LPCWSTR; lpszDst: LPSTR): BOOL; stdcall;
{$EXTERNALSYM CharToOemW}
function CharToOem(lpszSrc: LPCTSTR; lpszDst: LPSTR): BOOL; stdcall;
{$EXTERNALSYM CharToOem}

function OemToCharA(lpszSrc: LPCSTR; lpszDst: LPSTR): BOOL; stdcall;
{$EXTERNALSYM OemToCharA}
function OemToCharW(lpszSrc: LPCSTR; lpszDst: LPWSTR): BOOL; stdcall;
{$EXTERNALSYM OemToCharW}
function OemToChar(lpszSrc: LPCSTR; lpszDst: LPTSTR): BOOL; stdcall;
{$EXTERNALSYM OemToChar}

function CharToOemBuffA(lpszSrc: LPCSTR; lpszDst: LPSTR; cchDstLength: DWORD): BOOL; stdcall;
{$EXTERNALSYM CharToOemBuffA}
function CharToOemBuffW(lpszSrc: LPCWSTR; lpszDst: LPSTR; cchDstLength: DWORD): BOOL; stdcall;
{$EXTERNALSYM CharToOemBuffW}
function CharToOemBuff(lpszSrc: LPCTSTR; lpszDst: LPSTR; cchDstLength: DWORD): BOOL; stdcall;
{$EXTERNALSYM CharToOemBuff}

function OemToCharBuffA(lpszSrc: LPCSTR; lpszDst: LPSTR; cchDstLength: DWORD): BOOL; stdcall;
{$EXTERNALSYM OemToCharBuffA}
function OemToCharBuffW(lpszSrc: LPCSTR; lpszDst: LPWSTR; cchDstLength: DWORD): BOOL; stdcall;
{$EXTERNALSYM OemToCharBuffW}
function OemToCharBuff(lpszSrc: LPCSTR; lpszDst: LPTSTR; cchDstLength: DWORD): BOOL; stdcall;
{$EXTERNALSYM OemToCharBuff}

function CharUpperA(lpsz: LPSTR): LPSTR; stdcall;
{$EXTERNALSYM CharUpperA}
function CharUpperW(lpsz: LPWSTR): LPWSTR; stdcall;
{$EXTERNALSYM CharUpperW}
function CharUpper(lpsz: LPTSTR): LPTSTR; stdcall;
{$EXTERNALSYM CharUpper}

function CharUpperBuffA(lpsz: LPSTR; cchLength: DWORD): DWORD; stdcall;
{$EXTERNALSYM CharUpperBuffA}
function CharUpperBuffW(lpsz: LPWSTR; cchLength: DWORD): DWORD; stdcall;
{$EXTERNALSYM CharUpperBuffW}
function CharUpperBuff(lpsz: LPTSTR; cchLength: DWORD): DWORD; stdcall;
{$EXTERNALSYM CharUpperBuff}

function CharLowerA(lpsz: LPSTR): LPSTR; stdcall;
{$EXTERNALSYM CharLowerA}
function CharLowerW(lpsz: LPWSTR): LPWSTR; stdcall;
{$EXTERNALSYM CharLowerW}
function CharLower(lpsz: LPTSTR): LPTSTR; stdcall;
{$EXTERNALSYM CharLower}

function CharLowerBuffA(lpsz: LPSTR; cchLength: DWORD): DWORD; stdcall;
{$EXTERNALSYM CharLowerBuffA}
function CharLowerBuffW(lpsz: LPWSTR; cchLength: DWORD): DWORD; stdcall;
{$EXTERNALSYM CharLowerBuffW}
function CharLowerBuff(lpsz: LPTSTR; cchLength: DWORD): DWORD; stdcall;
{$EXTERNALSYM CharLowerBuff}

function CharNextA(lpsz: LPCSTR): LPSTR; stdcall;
{$EXTERNALSYM CharNextA}
function CharNextW(lpsz: LPCWSTR): LPWSTR; stdcall;
{$EXTERNALSYM CharNextW}
function CharNext(lpsz: LPCTSTR): LPTSTR; stdcall;
{$EXTERNALSYM CharNext}

function CharPrevA(lpszStart: LPCSTR; lpszCurrent: LPCSTR): LPSTR; stdcall;
{$EXTERNALSYM CharPrevA}
function CharPrevW(lpszStart: LPCWSTR; lpszCurrent: LPCWSTR): LPWSTR; stdcall;
{$EXTERNALSYM CharPrevW}
function CharPrev(lpszStart: LPCTSTR; lpszCurrent: LPCTSTR): LPTSTR; stdcall;
{$EXTERNALSYM CharPrev}

function CharNextExA(CodePage: WORD; lpCurrentChar: LPCSTR; dwFlags: DWORD): LPSTR; stdcall;
{$EXTERNALSYM CharNextExA}

function CharPrevExA(CodePage: WORD; lpStart, lpCurrentChar: LPCSTR; dwFlags: DWORD): LPSTR; stdcall;
{$EXTERNALSYM CharPrevExA}

//
// Compatibility defines for character translation routines
//

function AnsiToOem(lpszSrc: LPCSTR; lpszDst: LPSTR): BOOL;
{$EXTERNALSYM AnsiToOem}

function OemToAnsi(lpszSrc: LPCSTR; lpszDst: LPSTR): BOOL;
{$EXTERNALSYM OemToAnsi}

function AnsiToOemBuff(lpszSrc: LPCSTR; lpszDst: LPSTR; cchDstLength: DWORD): BOOL;
{$EXTERNALSYM AnsiToOemBuff}

function OemToAnsiBuff(lpszSrc: LPCSTR; lpszDst: LPSTR; cchDstLength: DWORD): BOOL;
{$EXTERNALSYM OemToAnsiBuff}

function AnsiUpper(lpsz: LPSTR): LPSTR;
{$EXTERNALSYM AnsiUpper}

function AnsiUpperBuff(lpsz: LPSTR; cchLength: DWORD): DWORD;
{$EXTERNALSYM AnsiUpperBuff}

function AnsiLower(lpsz: LPSTR): LPSTR;
{$EXTERNALSYM AnsiLower}

function AnsiLowerBuff(lpsz: LPSTR; cchLength: DWORD): DWORD;
{$EXTERNALSYM AnsiLowerBuff}

function AnsiNext(lpsz: LPCSTR): LPSTR;
{$EXTERNALSYM AnsiNext}

function AnsiPrev(lpszStart: LPCSTR; lpszCurrent: LPCSTR): LPSTR;
{$EXTERNALSYM AnsiPrev}

//
// Language dependent Routines
//

function IsCharAlphaA(ch: CHAR): BOOL; stdcall;
{$EXTERNALSYM IsCharAlphaA}
function IsCharAlphaW(ch: WCHAR): BOOL; stdcall;
{$EXTERNALSYM IsCharAlphaW}
function IsCharAlpha(ch: TCHAR): BOOL; stdcall;
{$EXTERNALSYM IsCharAlpha}

function IsCharAlphaNumericA(ch: CHAR): BOOL; stdcall;
{$EXTERNALSYM IsCharAlphaNumericA}
function IsCharAlphaNumericW(ch: WCHAR): BOOL; stdcall;
{$EXTERNALSYM IsCharAlphaNumericW}
function IsCharAlphaNumeric(ch: TCHAR): BOOL; stdcall;
{$EXTERNALSYM IsCharAlphaNumeric}

function IsCharUpperA(ch: CHAR): BOOL; stdcall;
{$EXTERNALSYM IsCharUpperA}
function IsCharUpperW(ch: WCHAR): BOOL; stdcall;
{$EXTERNALSYM IsCharUpperW}
function IsCharUpper(ch: TCHAR): BOOL; stdcall;
{$EXTERNALSYM IsCharUpper}

function IsCharLowerA(ch: CHAR): BOOL; stdcall;
{$EXTERNALSYM IsCharLowerA}
function IsCharLowerW(ch: WCHAR): BOOL; stdcall;
{$EXTERNALSYM IsCharLowerW}
function IsCharLower(ch: TCHAR): BOOL; stdcall;
{$EXTERNALSYM IsCharLower}

function SetFocus(hWnd: HWND): HWND; stdcall;
{$EXTERNALSYM SetFocus}

function GetActiveWindow: HWND; stdcall;
{$EXTERNALSYM GetActiveWindow}

function GetFocus: HWND; stdcall;
{$EXTERNALSYM GetFocus}

function GetKBCodePage: UINT; stdcall;
{$EXTERNALSYM GetKBCodePage}

function GetKeyState(nVirtKey: Integer): SHORT; stdcall;
{$EXTERNALSYM GetKeyState}

function GetAsyncKeyState(vKey: Integer): SHORT; stdcall;
{$EXTERNALSYM GetAsyncKeyState}

function GetKeyboardState(lpKeyState: LPBYTE): BOOL; stdcall;
{$EXTERNALSYM GetKeyboardState}

function SetKeyboardState(lpKeyState: LPBYTE): BOOL; stdcall;
{$EXTERNALSYM SetKeyboardState}

function GetKeyNameTextA(lParam: LONG; lpString: LPSTR; nSize: Integer): Integer; stdcall;
{$EXTERNALSYM GetKeyNameTextA}
function GetKeyNameTextW(lParam: LONG; lpString: LPWSTR; nSize: Integer): Integer; stdcall;
{$EXTERNALSYM GetKeyNameTextW}
function GetKeyNameText(lParam: LONG; lpString: LPTSTR; nSize: Integer): Integer; stdcall;
{$EXTERNALSYM GetKeyNameText}

function GetKeyboardType(nTypeFlag: Integer): Integer; stdcall;
{$EXTERNALSYM GetKeyboardType}

function ToAscii(uVirtKey, uScanCode: UINT; lpKeyState: PBYTE; lpChar: LPWORD;
  uFlags: UINT): Integer; stdcall;
{$EXTERNALSYM ToAscii}

function ToAsciiEx(uVirtKey, uScanCode: UINT; lpKeyState: PBYTE; lpChar: LPWORD;
  uFlags: UINT; dwhkl: HKL): Integer; stdcall;
{$EXTERNALSYM ToAsciiEx}

function ToUnicode(wVirtKey, wScanCode: UINT; lpKeyState: PBYTE; pwszBuff: LPWSTR;
  cchBuff: Integer; wFlags: UINT): Integer; stdcall;
{$EXTERNALSYM ToUnicode}

function OemKeyScan(wOemChar: WORD): DWORD; stdcall;
{$EXTERNALSYM OemKeyScan}

function VkKeyScanA(ch: CHAR): SHORT; stdcall;
{$EXTERNALSYM VkKeyScanA}
function VkKeyScanW(ch: WCHAR): SHORT; stdcall;
{$EXTERNALSYM VkKeyScanW}
function VkKeyScan(ch: TCHAR): SHORT; stdcall;
{$EXTERNALSYM VkKeyScan}

function VkKeyScanExA(ch: CHAR; dwhkl: HKL): SHORT; stdcall;
{$EXTERNALSYM VkKeyScanExA}
function VkKeyScanExW(ch: WCHAR; dwhkl: HKL): SHORT; stdcall;
{$EXTERNALSYM VkKeyScanExW}
function VkKeyScanEx(ch: TCHAR; dwhkl: HKL): SHORT; stdcall;
{$EXTERNALSYM VkKeyScanEx}

const
  KEYEVENTF_EXTENDEDKEY = $0001;
  {$EXTERNALSYM KEYEVENTF_EXTENDEDKEY}
  KEYEVENTF_KEYUP       = $0002;
  {$EXTERNALSYM KEYEVENTF_KEYUP}

  KEYEVENTF_UNICODE  = $0004;
  {$EXTERNALSYM KEYEVENTF_UNICODE}
  KEYEVENTF_SCANCODE = $0008;
  {$EXTERNALSYM KEYEVENTF_SCANCODE}

procedure keybd_event(bVk, bScan: BYTE; dwFlags: DWORD; dwExtraInfo: ULONG_PTR); stdcall;
{$EXTERNALSYM keybd_event}

const
  MOUSEEVENTF_MOVE        = $0001; // mouse move
  {$EXTERNALSYM MOUSEEVENTF_MOVE}
  MOUSEEVENTF_LEFTDOWN    = $0002; // left button down
  {$EXTERNALSYM MOUSEEVENTF_LEFTDOWN}
  MOUSEEVENTF_LEFTUP      = $0004; // left button up
  {$EXTERNALSYM MOUSEEVENTF_LEFTUP}
  MOUSEEVENTF_RIGHTDOWN   = $0008; // right button down
  {$EXTERNALSYM MOUSEEVENTF_RIGHTDOWN}
  MOUSEEVENTF_RIGHTUP     = $0010; // right button up
  {$EXTERNALSYM MOUSEEVENTF_RIGHTUP}
  MOUSEEVENTF_MIDDLEDOWN  = $0020; // middle button down
  {$EXTERNALSYM MOUSEEVENTF_MIDDLEDOWN}
  MOUSEEVENTF_MIDDLEUP    = $0040; // middle button up
  {$EXTERNALSYM MOUSEEVENTF_MIDDLEUP}
  MOUSEEVENTF_XDOWN       = $0080; // x button down
  {$EXTERNALSYM MOUSEEVENTF_XDOWN}
  MOUSEEVENTF_XUP         = $0100; // x button down
  {$EXTERNALSYM MOUSEEVENTF_XUP}
  MOUSEEVENTF_WHEEL       = $0800; // wheel button rolled
  {$EXTERNALSYM MOUSEEVENTF_WHEEL}
  MOUSEEVENTF_VIRTUALDESK = $4000; // map to entire virtual desktop
  {$EXTERNALSYM MOUSEEVENTF_VIRTUALDESK}
  MOUSEEVENTF_ABSOLUTE    = $8000; // absolute move
  {$EXTERNALSYM MOUSEEVENTF_ABSOLUTE}

procedure mouse_event(dwFlags, dx, dy, dwData: DWORD; dwExtraInfo: ULONG_PTR); stdcall;
{$EXTERNALSYM mouse_event}

type
  LPMOUSEINPUT = ^MOUSEINPUT;
  {$EXTERNALSYM LPMOUSEINPUT}
  tagMOUSEINPUT = record
    dx: LONG;
    dy: LONG;
    mouseData: DWORD;
    dwFlags: DWORD;
    time: DWORD;
    dwExtraInfo: ULONG_PTR;
  end;
  {$EXTERNALSYM MOUSEINPUT}
  MOUSEINPUT = tagMOUSEINPUT;
  {$EXTERNALSYM MOUSEINPUT}
  TMouseInput = MOUSEINPUT;
  PMouseInput = LPMOUSEINPUT;

  LPKEYBDINPUT = ^KEYBDINPUT;
  {$EXTERNALSYM LPKEYBDINPUT}
  tagKEYBDINPUT = record
    wVk: WORD;
    wScan: WORD;
    dwFlags: DWORD;
    time: DWORD;
    dwExtraInfo: ULONG_PTR;
  end;
  {$EXTERNALSYM tagKEYBDINPUT}
  KEYBDINPUT = tagKEYBDINPUT;
  {$EXTERNALSYM KEYBDINPUT}
  TKeybdinput = KEYBDINPUT;
  PKeybdInput = LPKEYBDINPUT;

  LPHARDWAREINPUT = ^HARDWAREINPUT;
  {$EXTERNALSYM LPHARDWAREINPUT}
  tagHARDWAREINPUT = record
    uMsg: DWORD;
    wParamL: WORD;
    wParamH: WORD;
  end;
  {$EXTERNALSYM tagHARDWAREINPUT}
  HARDWAREINPUT = tagHARDWAREINPUT;
  {$EXTERNALSYM HARDWAREINPUT}
  THardwareInput = HARDWAREINPUT;
  PHardwareInput = LPHARDWAREINPUT;

const
  INPUT_MOUSE    = 0;
  {$EXTERNALSYM INPUT_MOUSE}
  INPUT_KEYBOARD = 1;
  {$EXTERNALSYM INPUT_KEYBOARD}
  INPUT_HARDWARE = 2;
  {$EXTERNALSYM INPUT_HARDWARE}

type
  LPINPUT = ^INPUT;
  {$EXTERNALSYM LPINPUT}
  tagINPUT = record
    type_: DWORD;
    case Integer of
      0: (mi: MOUSEINPUT);
      1: (ki: KEYBDINPUT);
      2: (hi: HARDWAREINPUT);
  end;
  {$EXTERNALSYM tagINPUT}
  INPUT = tagINPUT;
  {$EXTERNALSYM INPUT}
  TInput = INPUT;
  PInput = LPINPUT;

function SendInput(cInputs: UINT; pInputs: LPINPUT; cbSize: Integer): UINT; stdcall;
{$EXTERNALSYM SendInput}

type
  PLASTINPUTINFO = ^LASTINPUTINFO;
  tagLASTINPUTINFO = record
    cbSize: UINT;
    dwTime: DWORD;
  end;
  {$EXTERNALSYM tagLASTINPUTINFO}
  LASTINPUTINFO = tagLASTINPUTINFO;
  {$EXTERNALSYM LASTINPUTINFO}
  TLastInputInfo = LASTINPUTINFO;

function GetLastInputInfo(var plii: LASTINPUTINFO): BOOL; stdcall;
{$EXTERNALSYM GetLastInputInfo}

function MapVirtualKeyA(uCode, uMapType: UINT): UINT; stdcall;
{$EXTERNALSYM MapVirtualKeyA}
function MapVirtualKeyW(uCode, uMapType: UINT): UINT; stdcall;
{$EXTERNALSYM MapVirtualKeyW}
function MapVirtualKey(uCode, uMapType: UINT): UINT; stdcall;
{$EXTERNALSYM MapVirtualKey}

function MapVirtualKeyExA(uCode, uMapType: UINT; dwhkl: HKL): UINT; stdcall;
{$EXTERNALSYM MapVirtualKeyExA}
function MapVirtualKeyExW(uCode, uMapType: UINT; dwhkl: HKL): UINT; stdcall;
{$EXTERNALSYM MapVirtualKeyExW}
function MapVirtualKeyEx(uCode, uMapType: UINT; dwhkl: HKL): UINT; stdcall;
{$EXTERNALSYM MapVirtualKeyEx}

function GetInputState: BOOL; stdcall;
{$EXTERNALSYM GetInputState}

function GetQueueStatus(flags: UINT): DWORD; stdcall;
{$EXTERNALSYM GetQueueStatus}

function GetCapture: HWND; stdcall;
{$EXTERNALSYM GetCapture}

function SetCapture(hWnd: HWND): HWND; stdcall;
{$EXTERNALSYM SetCapture}

function ReleaseCapture: BOOL; stdcall;
{$EXTERNALSYM ReleaseCapture}

function MsgWaitForMultipleObjects(nCount: DWORD; pHandles: PHANDLE;
  fWaitAll: BOOL; dwMilliseconds: DWORD; dwWakeMask: DWORD): DWORD; stdcall;
{$EXTERNALSYM MsgWaitForMultipleObjects}

function MsgWaitForMultipleObjectsEx(nCount: DWORD; pHandles: PHANDLE;
  dwMilliseconds: DWORD; dwWakeMask: DWORD; dwFlags: DWORD): DWORD; stdcall;
{$EXTERNALSYM MsgWaitForMultipleObjectsEx}

const
  MWMO_WAITALL        = $0001;
  {$EXTERNALSYM MWMO_WAITALL}
  MWMO_ALERTABLE      = $0002;
  {$EXTERNALSYM MWMO_ALERTABLE}
  MWMO_INPUTAVAILABLE = $0004;
  {$EXTERNALSYM MWMO_INPUTAVAILABLE}

//
// Windows Functions
//

function SetTimer(hWnd: HWND; nIDEvent: UINT_PTR; uElapse: UINT;
  lpTimerFunc: TIMERPROC): UINT_PTR; stdcall;
{$EXTERNALSYM SetTimer}

function KillTimer(hWnd: HWND; uIDEvent: UINT_PTR): BOOL; stdcall;
{$EXTERNALSYM KillTimer}

function IsWindowUnicode(hWnd: HWND): BOOL; stdcall;
{$EXTERNALSYM IsWindowUnicode}

function EnableWindow(hWnd: HWND; bEnable: BOOL): BOOL; stdcall;
{$EXTERNALSYM EnableWindow}

function IsWindowEnabled(hWnd: HWND): BOOL; stdcall;
{$EXTERNALSYM IsWindowEnabled}

function LoadAcceleratorsA(hInstance: HINST; lpTableName: LPCSTR): HACCEL; stdcall;
{$EXTERNALSYM LoadAcceleratorsA}
function LoadAcceleratorsW(hInstance: HINST; lpTableName: LPCWSTR): HACCEL; stdcall;
{$EXTERNALSYM LoadAcceleratorsW}
function LoadAccelerators(hInstance: HINST; lpTableName: LPCTSTR): HACCEL; stdcall;
{$EXTERNALSYM LoadAccelerators}

function CreateAcceleratorTableA(lpaccl: LPACCEL; cEntries: Integer): HACCEL; stdcall;
{$EXTERNALSYM CreateAcceleratorTableA}
function CreateAcceleratorTableW(lpaccl: LPACCEL; cEntries: Integer): HACCEL; stdcall;
{$EXTERNALSYM CreateAcceleratorTableW}
function CreateAcceleratorTable(lpaccl: LPACCEL; cEntries: Integer): HACCEL; stdcall;
{$EXTERNALSYM CreateAcceleratorTable}

function DestroyAcceleratorTable(hAccel: HACCEL): BOOL; stdcall;
{$EXTERNALSYM DestroyAcceleratorTable}

function CopyAcceleratorTableA(hAccelSrc: HACCEL; lpAccelDst: LPACCEL;
  cAccelEntries: Integer): Integer; stdcall;
{$EXTERNALSYM CopyAcceleratorTableA}
function CopyAcceleratorTableW(hAccelSrc: HACCEL; lpAccelDst: LPACCEL;
  cAccelEntries: Integer): Integer; stdcall;
{$EXTERNALSYM CopyAcceleratorTableW}
function CopyAcceleratorTable(hAccelSrc: HACCEL; lpAccelDst: LPACCEL;
  cAccelEntries: Integer): Integer; stdcall;
{$EXTERNALSYM CopyAcceleratorTable}

function TranslateAcceleratorA(hWnd: HWND; hAccTable: HACCEL; lpMsg: LPMSG): Integer; stdcall;
{$EXTERNALSYM TranslateAcceleratorA}
function TranslateAcceleratorW(hWnd: HWND; hAccTable: HACCEL; lpMsg: LPMSG): Integer; stdcall;
{$EXTERNALSYM TranslateAcceleratorW}
function TranslateAccelerator(hWnd: HWND; hAccTable: HACCEL; lpMsg: LPMSG): Integer; stdcall;
{$EXTERNALSYM TranslateAccelerator}

//
// GetSystemMetrics() codes
//

const
  SM_CXSCREEN          = 0;
  {$EXTERNALSYM SM_CXSCREEN}
  SM_CYSCREEN          = 1;
  {$EXTERNALSYM SM_CYSCREEN}
  SM_CXVSCROLL         = 2;
  {$EXTERNALSYM SM_CXVSCROLL}
  SM_CYHSCROLL         = 3;
  {$EXTERNALSYM SM_CYHSCROLL}
  SM_CYCAPTION         = 4;
  {$EXTERNALSYM SM_CYCAPTION}
  SM_CXBORDER          = 5;
  {$EXTERNALSYM SM_CXBORDER}
  SM_CYBORDER          = 6;
  {$EXTERNALSYM SM_CYBORDER}
  SM_CXDLGFRAME        = 7;
  {$EXTERNALSYM SM_CXDLGFRAME}
  SM_CYDLGFRAME        = 8;
  {$EXTERNALSYM SM_CYDLGFRAME}
  SM_CYVTHUMB          = 9;
  {$EXTERNALSYM SM_CYVTHUMB}
  SM_CXHTHUMB          = 10;
  {$EXTERNALSYM SM_CXHTHUMB}
  SM_CXICON            = 11;
  {$EXTERNALSYM SM_CXICON}
  SM_CYICON            = 12;
  {$EXTERNALSYM SM_CYICON}
  SM_CXCURSOR          = 13;
  {$EXTERNALSYM SM_CXCURSOR}
  SM_CYCURSOR          = 14;
  {$EXTERNALSYM SM_CYCURSOR}
  SM_CYMENU            = 15;
  {$EXTERNALSYM SM_CYMENU}
  SM_CXFULLSCREEN      = 16;
  {$EXTERNALSYM SM_CXFULLSCREEN}
  SM_CYFULLSCREEN      = 17;
  {$EXTERNALSYM SM_CYFULLSCREEN}
  SM_CYKANJIWINDOW     = 18;
  {$EXTERNALSYM SM_CYKANJIWINDOW}
  SM_MOUSEPRESENT      = 19;
  {$EXTERNALSYM SM_MOUSEPRESENT}
  SM_CYVSCROLL         = 20;
  {$EXTERNALSYM SM_CYVSCROLL}
  SM_CXHSCROLL         = 21;
  {$EXTERNALSYM SM_CXHSCROLL}
  SM_DEBUG             = 22;
  {$EXTERNALSYM SM_DEBUG}
  SM_SWAPBUTTON        = 23;
  {$EXTERNALSYM SM_SWAPBUTTON}
  SM_RESERVED1         = 24;
  {$EXTERNALSYM SM_RESERVED1}
  SM_RESERVED2         = 25;
  {$EXTERNALSYM SM_RESERVED2}
  SM_RESERVED3         = 26;
  {$EXTERNALSYM SM_RESERVED3}
  SM_RESERVED4         = 27;
  {$EXTERNALSYM SM_RESERVED4}
  SM_CXMIN             = 28;
  {$EXTERNALSYM SM_CXMIN}
  SM_CYMIN             = 29;
  {$EXTERNALSYM SM_CYMIN}
  SM_CXSIZE            = 30;
  {$EXTERNALSYM SM_CXSIZE}
  SM_CYSIZE            = 31;
  {$EXTERNALSYM SM_CYSIZE}
  SM_CXFRAME           = 32;
  {$EXTERNALSYM SM_CXFRAME}
  SM_CYFRAME           = 33;
  {$EXTERNALSYM SM_CYFRAME}
  SM_CXMINTRACK        = 34;
  {$EXTERNALSYM SM_CXMINTRACK}
  SM_CYMINTRACK        = 35;
  {$EXTERNALSYM SM_CYMINTRACK}
  SM_CXDOUBLECLK       = 36;
  {$EXTERNALSYM SM_CXDOUBLECLK}
  SM_CYDOUBLECLK       = 37;
  {$EXTERNALSYM SM_CYDOUBLECLK}
  SM_CXICONSPACING     = 38;
  {$EXTERNALSYM SM_CXICONSPACING}
  SM_CYICONSPACING     = 39;
  {$EXTERNALSYM SM_CYICONSPACING}
  SM_MENUDROPALIGNMENT = 40;
  {$EXTERNALSYM SM_MENUDROPALIGNMENT}
  SM_PENWINDOWS        = 41;
  {$EXTERNALSYM SM_PENWINDOWS}
  SM_DBCSENABLED       = 42;
  {$EXTERNALSYM SM_DBCSENABLED}
  SM_CMOUSEBUTTONS     = 43;
  {$EXTERNALSYM SM_CMOUSEBUTTONS}

  SM_CXFIXEDFRAME = SM_CXDLGFRAME; // ;win40 name change
  {$EXTERNALSYM SM_CXFIXEDFRAME}
  SM_CYFIXEDFRAME = SM_CYDLGFRAME; // ;win40 name change
  {$EXTERNALSYM SM_CYFIXEDFRAME}
  SM_CXSIZEFRAME  = SM_CXFRAME; // ;win40 name change
  {$EXTERNALSYM SM_CXSIZEFRAME}
  SM_CYSIZEFRAME  = SM_CYFRAME; // ;win40 name change
  {$EXTERNALSYM SM_CYSIZEFRAME}

  SM_SECURE       = 44;
  {$EXTERNALSYM SM_SECURE}
  SM_CXEDGE       = 45;
  {$EXTERNALSYM SM_CXEDGE}
  SM_CYEDGE       = 46;
  {$EXTERNALSYM SM_CYEDGE}
  SM_CXMINSPACING = 47;
  {$EXTERNALSYM SM_CXMINSPACING}
  SM_CYMINSPACING = 48;
  {$EXTERNALSYM SM_CYMINSPACING}
  SM_CXSMICON     = 49;
  {$EXTERNALSYM SM_CXSMICON}
  SM_CYSMICON     = 50;
  {$EXTERNALSYM SM_CYSMICON}
  SM_CYSMCAPTION  = 51;
  {$EXTERNALSYM SM_CYSMCAPTION}
  SM_CXSMSIZE     = 52;
  {$EXTERNALSYM SM_CXSMSIZE}
  SM_CYSMSIZE     = 53;
  {$EXTERNALSYM SM_CYSMSIZE}
  SM_CXMENUSIZE   = 54;
  {$EXTERNALSYM SM_CXMENUSIZE}
  SM_CYMENUSIZE   = 55;
  {$EXTERNALSYM SM_CYMENUSIZE}
  SM_ARRANGE      = 56;
  {$EXTERNALSYM SM_ARRANGE}
  SM_CXMINIMIZED  = 57;
  {$EXTERNALSYM SM_CXMINIMIZED}
  SM_CYMINIMIZED  = 58;
  {$EXTERNALSYM SM_CYMINIMIZED}
  SM_CXMAXTRACK   = 59;
  {$EXTERNALSYM SM_CXMAXTRACK}
  SM_CYMAXTRACK   = 60;
  {$EXTERNALSYM SM_CYMAXTRACK}
  SM_CXMAXIMIZED  = 61;
  {$EXTERNALSYM SM_CXMAXIMIZED}
  SM_CYMAXIMIZED  = 62;
  {$EXTERNALSYM SM_CYMAXIMIZED}
  SM_NETWORK      = 63;
  {$EXTERNALSYM SM_NETWORK}
  SM_CLEANBOOT    = 67;
  {$EXTERNALSYM SM_CLEANBOOT}
  SM_CXDRAG       = 68;
  {$EXTERNALSYM SM_CXDRAG}
  SM_CYDRAG       = 69;
  {$EXTERNALSYM SM_CYDRAG}
  SM_SHOWSOUNDS = 70;
  {$EXTERNALSYM SM_SHOWSOUNDS}
  SM_CXMENUCHECK    = 71; // Use instead of GetMenuCheckMarkDimensions()!
  {$EXTERNALSYM SM_CXMENUCHECK}
  SM_CYMENUCHECK    = 72;
  {$EXTERNALSYM SM_CYMENUCHECK}
  SM_SLOWMACHINE    = 73;
  {$EXTERNALSYM SM_SLOWMACHINE}
  SM_MIDEASTENABLED = 74;
  {$EXTERNALSYM SM_MIDEASTENABLED}

  SM_MOUSEWHEELPRESENT = 75;
  {$EXTERNALSYM SM_MOUSEWHEELPRESENT}
  SM_XVIRTUALSCREEN    = 76;
  {$EXTERNALSYM SM_XVIRTUALSCREEN}
  SM_YVIRTUALSCREEN    = 77;
  {$EXTERNALSYM SM_YVIRTUALSCREEN}
  SM_CXVIRTUALSCREEN   = 78;
  {$EXTERNALSYM SM_CXVIRTUALSCREEN}
  SM_CYVIRTUALSCREEN   = 79;
  {$EXTERNALSYM SM_CYVIRTUALSCREEN}
  SM_CMONITORS         = 80;
  {$EXTERNALSYM SM_CMONITORS}
  SM_SAMEDISPLAYFORMAT = 81;
  {$EXTERNALSYM SM_SAMEDISPLAYFORMAT}
  SM_IMMENABLED        = 82;
  {$EXTERNALSYM SM_IMMENABLED}
  SM_CXFOCUSBORDER     = 83;
  {$EXTERNALSYM SM_CXFOCUSBORDER}
  SM_CYFOCUSBORDER     = 84;
  {$EXTERNALSYM SM_CYFOCUSBORDER}

//#if(_WIN32_WINNT >= 0x0501)

  SM_TABLETPC          = 86;
  {$EXTERNALSYM SM_TABLETPC}
  SM_MEDIACENTER       = 87;
  {$EXTERNALSYM SM_MEDIACENTER}

//#endif /* _WIN32_WINNT >= 0x0501 */

const
  {$IFNDEF WIN98ME_UP}
  SM_CMETRICS          = 76;
  {$ELSE}
  {$IFDEF WIN98ME}
  SM_CMETRICS          = 83;
  {$ELSE}
  SM_CMETRICS          = 88;
  {$ENDIF WIN98ME}
  {$ENDIF !WIN98ME_UP}
  {$EXTERNALSYM SM_CMETRICS}

  SM_REMOTESESSION = $1000;
  {$EXTERNALSYM SM_REMOTESESSION}
  SM_SHUTTINGDOWN  = $2000;
  {$EXTERNALSYM SM_SHUTTINGDOWN}
//#if(WINVER >= 0x0501)
  SM_REMOTECONTROL = $2001;
  {$EXTERNALSYM SM_REMOTECONTROL}
//#endif /* WINVER >= 0x0501 */

function GetSystemMetrics(nIndex: Integer): Integer; stdcall;
{$EXTERNALSYM GetSystemMetrics}

function LoadMenuA(hInstance: HINST; lpMenuName: LPCSTR): HMENU; stdcall;
{$EXTERNALSYM LoadMenuA}
function LoadMenuW(hInstance: HINST; lpMenuName: LPCWSTR): HMENU; stdcall;
{$EXTERNALSYM LoadMenuW}
function LoadMenu(hInstance: HINST; lpMenuName: LPCTSTR): HMENU; stdcall;
{$EXTERNALSYM LoadMenu}

function LoadMenuIndirectA(lpMenuTemplate: LPMENUTEMPLATEA): HMENU; stdcall;
{$EXTERNALSYM LoadMenuIndirectA}
function LoadMenuIndirectW(lpMenuTemplate: LPMENUTEMPLATEW): HMENU; stdcall;
{$EXTERNALSYM LoadMenuIndirectW}
function LoadMenuIndirect(lpMenuTemplate: LPMENUTEMPLATE): HMENU; stdcall;
{$EXTERNALSYM LoadMenuIndirect}

function GetMenu(hWnd: HWND): HMENU; stdcall;
{$EXTERNALSYM GetMenu}

function SetMenu(hWnd: HWND; hMenu: HMENU): BOOL; stdcall;
{$EXTERNALSYM SetMenu}

function ChangeMenuA(hMenu: HMENU; cmd: UINT; lpszNewItem: LPCSTR;
  cmdInsert: UINT; flags: UINT): BOOL; stdcall;
{$EXTERNALSYM ChangeMenuA}
function ChangeMenuW(hMenu: HMENU; cmd: UINT; lpszNewItem: LPCWSTR;
  cmdInsert: UINT; flags: UINT): BOOL; stdcall;
{$EXTERNALSYM ChangeMenuW}
function ChangeMenu(hMenu: HMENU; cmd: UINT; lpszNewItem: LPCTSTR;
  cmdInsert: UINT; flags: UINT): BOOL; stdcall;
{$EXTERNALSYM ChangeMenu}

function HiliteMenuItem(hWnd: HWND; hMenu: HMENU; uIDHiliteItem: UINT; uHilite: UINT): BOOL; stdcall;
{$EXTERNALSYM HiliteMenuItem}

function GetMenuStringA(hMenu: HMENU; uIDItem: UINT; lpString: LPSTR;
  nMaxCount: Integer; uFlag: UINT): Integer; stdcall;
{$EXTERNALSYM GetMenuStringA}
function GetMenuStringW(hMenu: HMENU; uIDItem: UINT; lpString: LPWSTR;
  nMaxCount: Integer; uFlag: UINT): Integer; stdcall;
{$EXTERNALSYM GetMenuStringW}
function GetMenuString(hMenu: HMENU; uIDItem: UINT; lpString: LPTSTR;
  nMaxCount: Integer; uFlag: UINT): Integer; stdcall;
{$EXTERNALSYM GetMenuString}

function GetMenuState(hMenu: HMENU; uId, uFlags: UINT): UINT; stdcall;
{$EXTERNALSYM GetMenuState}

function DrawMenuBar(hWnd: HWND): BOOL; stdcall;
{$EXTERNALSYM DrawMenuBar}

const
  PMB_ACTIVE = $00000001;
  {$EXTERNALSYM PMB_ACTIVE}
  
function GetSystemMenu(hWnd: HWND; bRevert: BOOL): HMENU; stdcall;
{$EXTERNALSYM GetSystemMenu}

function CreateMenu: HMENU; stdcall;
{$EXTERNALSYM CreateMenu}

function CreatePopupMenu: HMENU; stdcall;
{$EXTERNALSYM CreatePopupMenu}

function DestroyMenu(hMenu: HMENU): BOOL; stdcall;
{$EXTERNALSYM DestroyMenu}

function CheckMenuItem(hMenu: HMENU; uIDCheckItem, uCheck: UINT): DWORD; stdcall;
{$EXTERNALSYM CheckMenuItem}

function EnableMenuItem(hMenu: HMENU; uIDEnableItem, uEnable: UINT): BOOL; stdcall;
{$EXTERNALSYM EnableMenuItem}

function GetSubMenu(hMenu: HMENU; nPos: Integer): HMENU; stdcall;
{$EXTERNALSYM GetSubMenu}

function GetMenuItemID(hMenu: HMENU; nPos: Integer): UINT; stdcall;
{$EXTERNALSYM GetMenuItemID}

function GetMenuItemCount(hMenu: HMENU): Integer; stdcall;
{$EXTERNALSYM GetMenuItemCount}

function InsertMenuA(hMenu: HMENU; uPosition, uFlags: UINT; uIDNewItem: UINT_PTR;
  lpNewItem: LPCSTR): BOOL; stdcall;
{$EXTERNALSYM InsertMenuA}
function InsertMenuW(hMenu: HMENU; uPosition, uFlags: UINT; uIDNewItem: UINT_PTR;
  lpNewItem: LPCWSTR): BOOL; stdcall;
{$EXTERNALSYM InsertMenuW}
function InsertMenu(hMenu: HMENU; uPosition, uFlags: UINT; uIDNewItem: UINT_PTR;
  lpNewItem: LPCTSTR): BOOL; stdcall;
{$EXTERNALSYM InsertMenu}

function AppendMenuA(hMenu: HMENU; uFlags: UINT; uIDNewItem: UINT_PTR;
  lpNewItem: LPCSTR): BOOL; stdcall;
{$EXTERNALSYM AppendMenuA}
function AppendMenuW(hMenu: HMENU; uFlags: UINT; uIDNewItem: UINT_PTR;
  lpNewItem: LPCWSTR): BOOL; stdcall;
{$EXTERNALSYM AppendMenuW}
function AppendMenu(hMenu: HMENU; uFlags: UINT; uIDNewItem: UINT_PTR;
  lpNewItem: LPCTSTR): BOOL; stdcall;
{$EXTERNALSYM AppendMenu}

function ModifyMenuA(hMnu: HMENU; uPosition: UINT; uFlags: UINT;
  uIDNewItem: UINT_PTR; lpNewItem: LPCSTR): BOOL; stdcall;
{$EXTERNALSYM ModifyMenuA}
function ModifyMenuW(hMnu: HMENU; uPosition: UINT; uFlags: UINT;
  uIDNewItem: UINT_PTR; lpNewItem: LPCWSTR): BOOL; stdcall;
{$EXTERNALSYM ModifyMenuW}
function ModifyMenu(hMnu: HMENU; uPosition: UINT; uFlags: UINT;
  uIDNewItem: UINT_PTR; lpNewItem: LPCTSTR): BOOL; stdcall;
{$EXTERNALSYM ModifyMenu}

function RemoveMenu(hMenu: HMENU; uPosition: UINT; uFlags: UINT): BOOL; stdcall;
{$EXTERNALSYM RemoveMenu}

function DeleteMenu(hMenu: HMENU; uPosition: UINT; uFlags: UINT): BOOL; stdcall;
{$EXTERNALSYM DeleteMenu}

function SetMenuItemBitmaps(hMenu: HMENU; uPosition: UINT; uFlags: UINT;
  hBitmapUnchecked: HBITMAP; hBitmapChecked: HBITMAP): BOOL; stdcall;
{$EXTERNALSYM SetMenuItemBitmaps}

function GetMenuCheckMarkDimensions: LONG; stdcall;
{$EXTERNALSYM GetMenuCheckMarkDimensions}

function TrackPopupMenu(hMenu: HMENU; uFlags: UINT; x: Integer; y: Integer;
  nReserved: Integer; hWnd: HWND; prcRect: LPRECT): BOOL; stdcall;
{$EXTERNALSYM TrackPopupMenu}

// return codes for WM_MENUCHAR//

const
  MNC_IGNORE  = 0;
  {$EXTERNALSYM MNC_IGNORE}
  MNC_CLOSE   = 1;
  {$EXTERNALSYM MNC_CLOSE}
  MNC_EXECUTE = 2;
  {$EXTERNALSYM MNC_EXECUTE}
  MNC_SELECT  = 3;
  {$EXTERNALSYM MNC_SELECT}

type
  LPTPMPARAMS = ^TPMPARAMS;
  {$EXTERNALSYM LPTPMPARAMS}
  tagTPMPARAMS = record
    cbSize: UINT;    // Size of structure
    rcExclude: RECT; // Screen coordinates of rectangle to exclude when positioning
  end;
  {$EXTERNALSYM tagTPMPARAMS}
  TPMPARAMS = tagTPMPARAMS;
  {$EXTERNALSYM TPMPARAMS}
  TTPMParams = TPMPARAMS;
  PTPMParams = LPTPMPARAMS;

function TrackPopupMenuEx(hmenu: HMENU; fuflags: UINT; x, y: Integer;
  hwnd: HWND; lptpm: LPTPMPARAMS): BOOL; stdcall;
{$EXTERNALSYM TrackPopupMenuEx}

const
  MNS_NOCHECK     = $80000000;
  {$EXTERNALSYM MNS_NOCHECK}
  MNS_MODELESS    = $40000000;
  {$EXTERNALSYM MNS_MODELESS}
  MNS_DRAGDROP    = $20000000;
  {$EXTERNALSYM MNS_DRAGDROP}
  MNS_AUTODISMISS = $10000000;
  {$EXTERNALSYM MNS_AUTODISMISS}
  MNS_NOTIFYBYPOS = $08000000;
  {$EXTERNALSYM MNS_NOTIFYBYPOS}
  MNS_CHECKORBMP  = $04000000;
  {$EXTERNALSYM MNS_CHECKORBMP}

  MIM_MAXHEIGHT       = $00000001;
  {$EXTERNALSYM MIM_MAXHEIGHT}
  MIM_BACKGROUND      = $00000002;
  {$EXTERNALSYM MIM_BACKGROUND}
  MIM_HELPID          = $00000004;
  {$EXTERNALSYM MIM_HELPID}
  MIM_MENUDATA        = $00000008;
  {$EXTERNALSYM MIM_MENUDATA}
  MIM_STYLE           = $00000010;
  {$EXTERNALSYM MIM_STYLE}
  MIM_APPLYTOSUBMENUS = $80000000;
  {$EXTERNALSYM MIM_APPLYTOSUBMENUS}

type
  LPMENUINFO = ^MENUINFO;
  {$EXTERNALSYM LPMENUINFO}
  tagMENUINFO = record
    cbSize: DWORD;
    fMask: DWORD;
    dwStyle: DWORD;
    cyMax: UINT;
    hbrBack: HBRUSH;
    dwContextHelpID: DWORD;
    dwMenuData: ULONG_PTR;
  end;
  {$EXTERNALSYM tagMENUINFO}
  MENUINFO = tagMENUINFO;
  {$EXTERNALSYM MENUINFO}
  TMenuinfo = MENUINFO;
  PMenuinfo = LPMENUINFO;

  LPCMENUINFO = ^MENUINFO;
  {$EXTERNALSYM LPCMENUINFO}

function GetMenuInfo(hmenu: HMENU; var lpcmi: MENUINFO): BOOL; stdcall;
{$EXTERNALSYM GetMenuInfo}

function SetMenuInfo(hemnu: HMENU; const lpcmi: MENUINFO): BOOL; stdcall;
{$EXTERNALSYM SetMenuInfo}

function EndMenu: BOOL; stdcall;
{$EXTERNALSYM EndMenu}

//
// WM_MENUDRAG return values.
//

const
  MND_CONTINUE = 0;
  {$EXTERNALSYM MND_CONTINUE}
  MND_ENDMENU  = 1;
  {$EXTERNALSYM MND_ENDMENU}

type
  PMENUGETOBJECTINFO = ^MENUGETOBJECTINFO;
  tagMENUGETOBJECTINFO = record
    dwFlags: DWORD;
    uPos: UINT;
    hmenu: HMENU;
    riid: PVOID;
    pvObj: PVOID;
  end;
  {$EXTERNALSYM tagMENUGETOBJECTINFO}
  MENUGETOBJECTINFO = tagMENUGETOBJECTINFO;
  {$EXTERNALSYM MENUGETOBJECTINFO}
  TMenuGetObjectInfo = MENUGETOBJECTINFO;

//
// MENUGETOBJECTINFO dwFlags values
//

const
  MNGOF_TOPGAP    = $00000001;
  {$EXTERNALSYM MNGOF_TOPGAP}
  MNGOF_BOTTOMGAP = $00000002;
  {$EXTERNALSYM MNGOF_BOTTOMGAP}

//
// WM_MENUGETOBJECT return values
//

  MNGO_NOINTERFACE = $00000000;
  {$EXTERNALSYM MNGO_NOINTERFACE}
  MNGO_NOERROR     = $00000001;
  {$EXTERNALSYM MNGO_NOERROR}

  MIIM_STATE      = $00000001;
  {$EXTERNALSYM MIIM_STATE}
  MIIM_ID         = $00000002;
  {$EXTERNALSYM MIIM_ID}
  MIIM_SUBMENU    = $00000004;
  {$EXTERNALSYM MIIM_SUBMENU}
  MIIM_CHECKMARKS = $00000008;
  {$EXTERNALSYM MIIM_CHECKMARKS}
  MIIM_TYPE       = $00000010;
  {$EXTERNALSYM MIIM_TYPE}
  MIIM_DATA       = $00000020;
  {$EXTERNALSYM MIIM_DATA}

  MIIM_STRING = $00000040;
  {$EXTERNALSYM MIIM_STRING}
  MIIM_BITMAP = $00000080;
  {$EXTERNALSYM MIIM_BITMAP}
  MIIM_FTYPE  = $00000100;
  {$EXTERNALSYM MIIM_FTYPE}

  HBMMENU_CALLBACK        = HBITMAP(-1);
  {$EXTERNALSYM HBMMENU_CALLBACK}
  HBMMENU_SYSTEM          = HBITMAP(1);
  {$EXTERNALSYM HBMMENU_SYSTEM}
  HBMMENU_MBAR_RESTORE    = HBITMAP(2);
  {$EXTERNALSYM HBMMENU_MBAR_RESTORE}
  HBMMENU_MBAR_MINIMIZE   = HBITMAP(3);
  {$EXTERNALSYM HBMMENU_MBAR_MINIMIZE}
  HBMMENU_MBAR_CLOSE      = HBITMAP(5);
  {$EXTERNALSYM HBMMENU_MBAR_CLOSE}
  HBMMENU_MBAR_CLOSE_D    = HBITMAP(6);
  {$EXTERNALSYM HBMMENU_MBAR_CLOSE_D}
  HBMMENU_MBAR_MINIMIZE_D = HBITMAP(7);
  {$EXTERNALSYM HBMMENU_MBAR_MINIMIZE_D}
  HBMMENU_POPUP_CLOSE     = HBITMAP(8);
  {$EXTERNALSYM HBMMENU_POPUP_CLOSE}
  HBMMENU_POPUP_RESTORE   = HBITMAP(9);
  {$EXTERNALSYM HBMMENU_POPUP_RESTORE}
  HBMMENU_POPUP_MAXIMIZE  = HBITMAP(10);
  {$EXTERNALSYM HBMMENU_POPUP_MAXIMIZE}
  HBMMENU_POPUP_MINIMIZE  = HBITMAP(11);
  {$EXTERNALSYM HBMMENU_POPUP_MINIMIZE}

type
  LPMENUITEMINFOA = ^MENUITEMINFOA;
  {$EXTERNALSYM LPMENUITEMINFOA}
  tagMENUITEMINFOA = record
    cbSize: UINT;
    fMask: UINT;
    fType: UINT;            // used if MIIM_TYPE (4.0) or MIIM_FTYPE (>4.0)
    fState: UINT;           // used if MIIM_STATE
    wID: UINT;              // used if MIIM_ID
    hSubMenu: HMENU;        // used if MIIM_SUBMENU
    hbmpChecked: HBITMAP;   // used if MIIM_CHECKMARKS
    hbmpUnchecked: HBITMAP; // used if MIIM_CHECKMARKS
    dwItemData: ULONG_PTR;  // used if MIIM_DATA
    dwTypeData: LPSTR;      // used if MIIM_TYPE (4.0) or MIIM_STRING (>4.0)
    cch: UINT;              // used if MIIM_TYPE (4.0) or MIIM_STRING (>4.0)
    {$IFDEF WIN98ME_UP}
    hbmpItem: HBITMAP;      // used if MIIM_BITMAP
    {$ENDIF WIN98ME_UP}
  end;
  {$EXTERNALSYM tagMENUITEMINFOA}
  MENUITEMINFOA = tagMENUITEMINFOA;
  {$EXTERNALSYM MENUITEMINFOA}
  TMenuItemInfoA = MENUITEMINFOA;
  PMenuItemInfoA = LPMENUITEMINFOA;

  LPMENUITEMINFOW = ^MENUITEMINFOW;
  {$EXTERNALSYM LPMENUITEMINFOW}
  tagMENUITEMINFOW = record
    cbSize: UINT;
    fMask: UINT;
    fType: UINT;            // used if MIIM_TYPE (4.0) or MIIM_FTYPE (>4.0)
    fState: UINT;           // used if MIIM_STATE
    wID: UINT;              // used if MIIM_ID
    hSubMenu: HMENU;        // used if MIIM_SUBMENU
    hbmpChecked: HBITMAP;   // used if MIIM_CHECKMARKS
    hbmpUnchecked: HBITMAP; // used if MIIM_CHECKMARKS
    dwItemData: ULONG_PTR;  // used if MIIM_DATA
    dwTypeData: LPWSTR;     // used if MIIM_TYPE (4.0) or MIIM_STRING (>4.0)
    cch: UINT;              // used if MIIM_TYPE (4.0) or MIIM_STRING (>4.0)
    {$IFDEF WIN98ME_UP}
    hbmpItem: HBITMAP;      // used if MIIM_BITMAP
    {$ENDIF WIN98ME_UP}
  end;
  {$EXTERNALSYM tagMENUITEMINFOW}
  MENUITEMINFOW = tagMENUITEMINFOW;
  {$EXTERNALSYM MENUITEMINFOW}
  TMenuItemInfoW = MENUITEMINFOW;
  PMenuItemInfoW = LPMENUITEMINFOW;

  LPCMENUITEMINFOA = ^MENUITEMINFOA;
  {$EXTERNALSYM LPCMENUITEMINFOA}
  LPCMENUITEMINFOW = ^MENUITEMINFOW;
  {$EXTERNALSYM LPCMENUITEMINFOW}

  {$IFDEF UNICODE}
  MENUITEMINFO = MENUITEMINFOW;
  {$EXTERNALSYM MENUITEMINFO}
  LPMENUITEMINFO = LPMENUITEMINFOW;
  {$EXTERNALSYM LPMENUITEMINFO}
  TMenuItemInfo = TMenuItemInfoW;
  PMenuItemInfo = PMenuItemInfoW;
  LPCMENUITEMINFO = LPCMENUITEMINFOW;
  {$EXTERNALSYM LPCMENUITEMINFO}
  {$ELSE}
  MENUITEMINFO = MENUITEMINFOA;
  {$EXTERNALSYM MENUITEMINFO}
  LPMENUITEMINFO = LPMENUITEMINFOA;
  {$EXTERNALSYM LPMENUITEMINFO}
  TMenuItemInfo = TMenuItemInfoA;
  PMenuItemInfo = PMenuItemInfoA;
  LPCMENUITEMINFO = LPCMENUITEMINFOA;
  {$EXTERNALSYM LPCMENUITEMINFO}
  {$ENDIF UNICODE}

function InsertMenuItemA(hMenu: HMENU; uItem: UINT; fByPosition: BOOL;
  const lpmii: MENUITEMINFOA): BOOL; stdcall;
{$EXTERNALSYM InsertMenuItemA}
function InsertMenuItemW(hMenu: HMENU; uItem: UINT; fByPosition: BOOL;
  const lpmii: MENUITEMINFOW): BOOL; stdcall;
{$EXTERNALSYM InsertMenuItemW}
function InsertMenuItem(hMenu: HMENU; uItem: UINT; fByPosition: BOOL;
  const lpmii: MENUITEMINFO): BOOL; stdcall;
{$EXTERNALSYM InsertMenuItem}

function GetMenuItemInfoA(hMenu: HMENU; uItem: UINT; fByPosition: BOOL;
  var lpmii: MENUITEMINFOA): BOOL; stdcall;
{$EXTERNALSYM GetMenuItemInfoA}
function GetMenuItemInfoW(hMenu: HMENU; uItem: UINT; fByPosition: BOOL;
  var lpmii: MENUITEMINFOW): BOOL; stdcall;
{$EXTERNALSYM GetMenuItemInfoW}
function GetMenuItemInfo(hMenu: HMENU; uItem: UINT; fByPosition: BOOL;
  var lpmii: MENUITEMINFO): BOOL; stdcall;
{$EXTERNALSYM GetMenuItemInfo}

function SetMenuItemInfoA(hMenu: HMENU; uItem: UINT; fByPosition: BOOL;
  const lpmii: MENUITEMINFOA): BOOL; stdcall;
{$EXTERNALSYM SetMenuItemInfoA}
function SetMenuItemInfoW(hMenu: HMENU; uItem: UINT; fByPosition: BOOL;
  const lpmii: MENUITEMINFOW): BOOL; stdcall;
{$EXTERNALSYM SetMenuItemInfoW}
function SetMenuItemInfo(hMenu: HMENU; uItem: UINT; fByPosition: BOOL;
  const lpmii: MENUITEMINFO): BOOL; stdcall;
{$EXTERNALSYM SetMenuItemInfo}

const
  GMDI_USEDISABLED  = $0001;
  {$EXTERNALSYM GMDI_USEDISABLED}
  GMDI_GOINTOPOPUPS = $0002;
  {$EXTERNALSYM GMDI_GOINTOPOPUPS}

function GetMenuDefaultItem(hMenu: HMENU; fByPos, gmdiFlags: UINT): UINT; stdcall;
{$EXTERNALSYM GetMenuDefaultItem}

function SetMenuDefaultItem(hMenu: HMENU; uItem, fByPos: UINT): BOOL; stdcall;
{$EXTERNALSYM SetMenuDefaultItem}

function GetMenuItemRect(hWnd: HWND; hMenu: HMENU; uItem: UINT; var lprcItem: RECT): BOOL; stdcall;
{$EXTERNALSYM GetMenuItemRect}

function MenuItemFromPoint(hWnd: HWND; hMenu: HMENU; ptScreen: POINT): Integer; stdcall;
{$EXTERNALSYM MenuItemFromPoint}

//
// Flags for TrackPopupMenu
//

const
  TPM_LEFTBUTTON   = $0000;
  {$EXTERNALSYM TPM_LEFTBUTTON}
  TPM_RIGHTBUTTON  = $0002;
  {$EXTERNALSYM TPM_RIGHTBUTTON}
  TPM_LEFTALIGN    = $0000;
  {$EXTERNALSYM TPM_LEFTALIGN}
  TPM_CENTERALIGN  = $0004;
  {$EXTERNALSYM TPM_CENTERALIGN}
  TPM_RIGHTALIGN   = $0008;
  {$EXTERNALSYM TPM_RIGHTALIGN}
  TPM_TOPALIGN     = $0000;
  {$EXTERNALSYM TPM_TOPALIGN}
  TPM_VCENTERALIGN = $0010;
  {$EXTERNALSYM TPM_VCENTERALIGN}
  TPM_BOTTOMALIGN  = $0020;
  {$EXTERNALSYM TPM_BOTTOMALIGN}

  TPM_HORIZONTAL      = $0000; // Horz alignment matters more
  {$EXTERNALSYM TPM_HORIZONTAL}
  TPM_VERTICAL        = $0040; // Vert alignment matters more
  {$EXTERNALSYM TPM_VERTICAL}
  TPM_NONOTIFY        = $0080; // Don't send any notification msgs
  {$EXTERNALSYM TPM_NONOTIFY}
  TPM_RETURNCMD       = $0100;
  {$EXTERNALSYM TPM_RETURNCMD}
  TPM_RECURSE         = $0001;
  {$EXTERNALSYM TPM_RECURSE}
  TPM_HORPOSANIMATION = $0400;
  {$EXTERNALSYM TPM_HORPOSANIMATION}
  TPM_HORNEGANIMATION = $0800;
  {$EXTERNALSYM TPM_HORNEGANIMATION}
  TPM_VERPOSANIMATION = $1000;
  {$EXTERNALSYM TPM_VERPOSANIMATION}
  TPM_VERNEGANIMATION = $2000;
  {$EXTERNALSYM TPM_VERNEGANIMATION}
  TPM_NOANIMATION     = $4000;
  {$EXTERNALSYM TPM_NOANIMATION}
  TPM_LAYOUTRTL       = $8000;
  {$EXTERNALSYM TPM_LAYOUTRTL}
  
//
// Drag-and-drop support
// Obsolete - use OLE instead
//

type
  LPDROPSTRUCT = ^DROPSTRUCT;
  {$EXTERNALSYM LPDROPSTRUCT}
  tagDROPSTRUCT = record
    hwndSource: HWND;
    hwndSink: HWND;
    wFmt: DWORD;
    dwData: ULONG_PTR;
    ptDrop: POINT;
    dwControlData: DWORD;
  end;
  {$EXTERNALSYM tagDROPSTRUCT}
  DROPSTRUCT = tagDROPSTRUCT;
  {$EXTERNALSYM DROPSTRUCT}
  TDropStruct = DROPSTRUCT;
  PDropStruct = LPDROPSTRUCT;

const
  DOF_EXECUTABLE = $8001; // wFmt flags
  {$EXTERNALSYM DOF_EXECUTABLE}
  DOF_DOCUMENT   = $8002;
  {$EXTERNALSYM DOF_DOCUMENT}
  DOF_DIRECTORY  = $8003;
  {$EXTERNALSYM DOF_DIRECTORY}
  DOF_MULTIPLE   = $8004;
  {$EXTERNALSYM DOF_MULTIPLE}
  DOF_PROGMAN    = $0001;
  {$EXTERNALSYM DOF_PROGMAN}
  DOF_SHELLDATA  = $0002;
  {$EXTERNALSYM DOF_SHELLDATA}

  DO_DROPFILE  = $454C4946;
  {$EXTERNALSYM DO_DROPFILE}
  DO_PRINTFILE = $544E5250;
  {$EXTERNALSYM DO_PRINTFILE}

function DragObject(hwnd1, hwnd2: HWND; i: UINT; u: ULONG_PTR; hcursor: HCURSOR): DWORD; stdcall;
{$EXTERNALSYM DragObject}

function DragDetect(hwnd: HWND; pt: POINT): BOOL; stdcall;
{$EXTERNALSYM DragDetect}

function DrawIcon(hDC: HDC; X, Y: Integer; hIcon: HICON): BOOL; stdcall;
{$EXTERNALSYM DrawIcon}

//
// DrawText() Format Flags
//

const
  DT_TOP             = $00000000;
  {$EXTERNALSYM DT_TOP}
  DT_LEFT            = $00000000;
  {$EXTERNALSYM DT_LEFT}
  DT_CENTER          = $00000001;
  {$EXTERNALSYM DT_CENTER}
  DT_RIGHT           = $00000002;
  {$EXTERNALSYM DT_RIGHT}
  DT_VCENTER         = $00000004;
  {$EXTERNALSYM DT_VCENTER}
  DT_BOTTOM          = $00000008;
  {$EXTERNALSYM DT_BOTTOM}
  DT_WORDBREAK       = $00000010;
  {$EXTERNALSYM DT_WORDBREAK}
  DT_SINGLELINE      = $00000020;
  {$EXTERNALSYM DT_SINGLELINE}
  DT_EXPANDTABS      = $00000040;
  {$EXTERNALSYM DT_EXPANDTABS}
  DT_TABSTOP         = $00000080;
  {$EXTERNALSYM DT_TABSTOP}
  DT_NOCLIP          = $00000100;
  {$EXTERNALSYM DT_NOCLIP}
  DT_EXTERNALLEADING = $00000200;
  {$EXTERNALSYM DT_EXTERNALLEADING}
  DT_CALCRECT        = $00000400;
  {$EXTERNALSYM DT_CALCRECT}
  DT_NOPREFIX        = $00000800;
  {$EXTERNALSYM DT_NOPREFIX}
  DT_INTERNAL        = $00001000;
  {$EXTERNALSYM DT_INTERNAL}

  DT_EDITCONTROL          = $00002000;
  {$EXTERNALSYM DT_EDITCONTROL}
  DT_PATH_ELLIPSIS        = $00004000;
  {$EXTERNALSYM DT_PATH_ELLIPSIS}
  DT_END_ELLIPSIS         = $00008000;
  {$EXTERNALSYM DT_END_ELLIPSIS}
  DT_MODIFYSTRING         = $00010000;
  {$EXTERNALSYM DT_MODIFYSTRING}
  DT_RTLREADING           = $00020000;
  {$EXTERNALSYM DT_RTLREADING}
  DT_WORD_ELLIPSIS        = $00040000;
  {$EXTERNALSYM DT_WORD_ELLIPSIS}
  DT_NOFULLWIDTHCHARBREAK = $00080000;
  {$EXTERNALSYM DT_NOFULLWIDTHCHARBREAK}
  DT_HIDEPREFIX           = $00100000;
  {$EXTERNALSYM DT_HIDEPREFIX}
  DT_PREFIXONLY           = $00200000;
  {$EXTERNALSYM DT_PREFIXONLY}

type
  LPDRAWTEXTPARAMS = ^DRAWTEXTPARAMS;
  {$EXTERNALSYM LPDRAWTEXTPARAMS}
  tagDRAWTEXTPARAMS = record
    cbSize: UINT;
    iTabLength: Integer;
    iLeftMargin: Integer;
    iRightMargin: Integer;
    uiLengthDrawn: UINT;
  end;
  {$EXTERNALSYM tagDRAWTEXTPARAMS}
  DRAWTEXTPARAMS = tagDRAWTEXTPARAMS;
  {$EXTERNALSYM DRAWTEXTPARAMS}
  TDrawTextParams = DRAWTEXTPARAMS;
  PDrawTextParams = LPDRAWTEXTPARAMS;

function DrawTextA(hDC: HDC; lpString: LPCSTR; nCount: Integer;
  var lpRect: RECT; uFormat: UINT): Integer; stdcall;
{$EXTERNALSYM DrawTextA}
function DrawTextW(hDC: HDC; lpString: LPCWSTR; nCount: Integer;
  var lpRect: RECT; uFormat: UINT): Integer; stdcall;
{$EXTERNALSYM DrawTextW}
function DrawText(hDC: HDC; lpString: LPCTSTR; nCount: Integer;
  var lpRect: RECT; uFormat: UINT): Integer; stdcall;
{$EXTERNALSYM DrawText}

function DrawTextExA(hDc: HDC; lpchText: LPSTR; cchText: Integer;
  var lprc: RECT; dwDTFormat: UINT; lpDTParams: LPDRAWTEXTPARAMS): Integer; stdcall;
{$EXTERNALSYM DrawTextExA}
function DrawTextExW(hDc: HDC; lpchText: LPWSTR; cchText: Integer;
  var lprc: RECT; dwDTFormat: UINT; lpDTParams: LPDRAWTEXTPARAMS): Integer; stdcall;
{$EXTERNALSYM DrawTextExW}
function DrawTextEx(hDc: HDC; lpchText: LPTSTR; cchText: Integer;
  var lprc: RECT; dwDTFormat: UINT; lpDTParams: LPDRAWTEXTPARAMS): Integer; stdcall;
{$EXTERNALSYM DrawTextEx}

function GrayStringA(hDC: HDC; hBrush: HBRUSH; lpOutputFunc: GRAYSTRINGPROC;
  lpData: LPARAM; nCount, X, Y, nWidth, nHeight: Integer): BOOL; stdcall;
{$EXTERNALSYM GrayStringA}
function GrayStringW(hDC: HDC; hBrush: HBRUSH; lpOutputFunc: GRAYSTRINGPROC;
  lpData: LPARAM; nCount, X, Y, nWidth, nHeight: Integer): BOOL; stdcall;
{$EXTERNALSYM GrayStringW}
function GrayString(hDC: HDC; hBrush: HBRUSH; lpOutputFunc: GRAYSTRINGPROC;
  lpData: LPARAM; nCount, X, Y, nWidth, nHeight: Integer): BOOL; stdcall;
{$EXTERNALSYM GrayString}

// Monolithic state-drawing routine//
// Image type//

const
  DST_COMPLEX    = $0000;
  {$EXTERNALSYM DST_COMPLEX}
  DST_TEXT       = $0001;
  {$EXTERNALSYM DST_TEXT}
  DST_PREFIXTEXT = $0002;
  {$EXTERNALSYM DST_PREFIXTEXT}
  DST_ICON       = $0003;
  {$EXTERNALSYM DST_ICON}
  DST_BITMAP     = $0004;
  {$EXTERNALSYM DST_BITMAP}

// State type//

  DSS_NORMAL     = $0000;
  {$EXTERNALSYM DSS_NORMAL}
  DSS_UNION      = $0010; // Gray string appearance
  {$EXTERNALSYM DSS_UNION}
  DSS_DISABLED   = $0020;
  {$EXTERNALSYM DSS_DISABLED}
  DSS_MONO       = $0080;
  {$EXTERNALSYM DSS_MONO}
  DSS_HIDEPREFIX = $0200;
  {$EXTERNALSYM DSS_HIDEPREFIX}
  DSS_PREFIXONLY = $0400;
  {$EXTERNALSYM DSS_PREFIXONLY}
  DSS_RIGHT      = $8000;
  {$EXTERNALSYM DSS_RIGHT}

function DrawStateA(hdc: HDC; hbr: HBRUSH; lputputFunc: DRAWSTATEPROC;
  lData: LPARAM; wData: WPARAM; x, y, cx, cy: Integer; fuFlags: UINT): BOOL; stdcall;
{$EXTERNALSYM DrawStateA}
function DrawStateW(hdc: HDC; hbr: HBRUSH; lputputFunc: DRAWSTATEPROC;
  lData: LPARAM; wData: WPARAM; x, y, cx, cy: Integer; fuFlags: UINT): BOOL; stdcall;
{$EXTERNALSYM DrawStateW}
function DrawState(hdc: HDC; hbr: HBRUSH; lputputFunc: DRAWSTATEPROC;
  lData: LPARAM; wData: WPARAM; x, y, cx, cy: Integer; fuFlags: UINT): BOOL; stdcall;
{$EXTERNALSYM DrawState}

function TabbedTextOutA(hDC: HDC; X, Y: Integer; lpString: LPCSTR; nCount,
  nTabPositions: Integer; lpnTabStopPositions: LPINT; nTabOrigin: Integer): LONG; stdcall;
{$EXTERNALSYM TabbedTextOutA}
function TabbedTextOutW(hDC: HDC; X, Y: Integer; lpString: LPCWSTR; nCount,
  nTabPositions: Integer; lpnTabStopPositions: LPINT; nTabOrigin: Integer): LONG; stdcall;
{$EXTERNALSYM TabbedTextOutW}
function TabbedTextOut(hDC: HDC; X, Y: Integer; lpString: LPCTSTR; nCount,
  nTabPositions: Integer; lpnTabStopPositions: LPINT; nTabOrigin: Integer): LONG; stdcall;
{$EXTERNALSYM TabbedTextOut}

function GetTabbedTextExtentA(hDC: HDC; lpString: LPCSTR; nCount,
  nTabPositions: Integer; lpnTabStopPositions: LPINT): DWORD; stdcall;
{$EXTERNALSYM GetTabbedTextExtentA}
function GetTabbedTextExtentW(hDC: HDC; lpString: LPCWSTR; nCount,
  nTabPositions: Integer; lpnTabStopPositions: LPINT): DWORD; stdcall;
{$EXTERNALSYM GetTabbedTextExtentW}
function GetTabbedTextExtent(hDC: HDC; lpString: LPCTSTR; nCount,
  nTabPositions: Integer; lpnTabStopPositions: LPINT): DWORD; stdcall;
{$EXTERNALSYM GetTabbedTextExtent}

function UpdateWindow(hWnd: HWND): BOOL; stdcall;
{$EXTERNALSYM UpdateWindow}

function SetActiveWindow(hWnd: HWND): HWND; stdcall;
{$EXTERNALSYM SetActiveWindow}

function GetForegroundWindow: HWND; stdcall;
{$EXTERNALSYM GetForegroundWindow}

function PaintDesktop(hdc: HDC): BOOL; stdcall;
{$EXTERNALSYM PaintDesktop}

procedure SwitchToThisWindow(hwnd: HWND; fUnknown: BOOL); stdcall;
{$EXTERNALSYM SwitchToThisWindow}

function SetForegroundWindow(hWnd: HWND): BOOL; stdcall;
{$EXTERNALSYM SetForegroundWindow}

function AllowSetForegroundWindow(dwProcessId: DWORD): BOOL; stdcall;
{$EXTERNALSYM AllowSetForegroundWindow}

const
  ASFW_ANY = DWORD(-1);
  {$EXTERNALSYM ASFW_ANY}

function LockSetForegroundWindow(uLockCode: UINT): BOOL; stdcall;
{$EXTERNALSYM LockSetForegroundWindow}

const
  LSFW_LOCK   = 1;
  {$EXTERNALSYM LSFW_LOCK}
  LSFW_UNLOCK = 2;
  {$EXTERNALSYM LSFW_UNLOCK}

function WindowFromDC(hDC: HDC): HWND; stdcall;
{$EXTERNALSYM WindowFromDC}

function GetDC(hWnd: HWND): HDC; stdcall;
{$EXTERNALSYM GetDC}

function GetDCEx(hWnd: HWND; hrgnClip: HRGN; flags: DWORD): HDC; stdcall;
{$EXTERNALSYM GetDCEx}

//
// GetDCEx() flags
//

const
  DCX_WINDOW           = $00000001;
  {$EXTERNALSYM DCX_WINDOW}
  DCX_CACHE            = $00000002;
  {$EXTERNALSYM DCX_CACHE}
  DCX_NORESETATTRS     = $00000004;
  {$EXTERNALSYM DCX_NORESETATTRS}
  DCX_CLIPCHILDREN     = $00000008;
  {$EXTERNALSYM DCX_CLIPCHILDREN}
  DCX_CLIPSIBLINGS     = $00000010;
  {$EXTERNALSYM DCX_CLIPSIBLINGS}
  DCX_PARENTCLIP       = $00000020;
  {$EXTERNALSYM DCX_PARENTCLIP}
  DCX_EXCLUDERGN       = $00000040;
  {$EXTERNALSYM DCX_EXCLUDERGN}
  DCX_INTERSECTRGN     = $00000080;
  {$EXTERNALSYM DCX_INTERSECTRGN}
  DCX_EXCLUDEUPDATE    = $00000100;
  {$EXTERNALSYM DCX_EXCLUDEUPDATE}
  DCX_INTERSECTUPDATE  = $00000200;
  {$EXTERNALSYM DCX_INTERSECTUPDATE}
  DCX_LOCKWINDOWUPDATE = $00000400;
  {$EXTERNALSYM DCX_LOCKWINDOWUPDATE}

  DCX_VALIDATE = $00200000;
  {$EXTERNALSYM DCX_VALIDATE}

function GetWindowDC(hWnd: HWND): HDC; stdcall;
{$EXTERNALSYM GetWindowDC}

function ReleaseDC(hWnd: HWND; hDC: HDC): Integer; stdcall;
{$EXTERNALSYM ReleaseDC}

function BeginPaint(hWnd: HWND; var lpPaint: PAINTSTRUCT): HDC; stdcall;
{$EXTERNALSYM BeginPaint}

function EndPaint(hWnd: HWND; const lpPaint: PAINTSTRUCT): BOOL; stdcall;
{$EXTERNALSYM EndPaint}

function GetUpdateRect(hWnd: HWND; var lpRect: RECT; bErase: BOOL): BOOL; stdcall;
{$EXTERNALSYM GetUpdateRect}

function GetUpdateRgn(hWnd: HWND; hRgn: HRGN; bErase: BOOL): Integer; stdcall;
{$EXTERNALSYM GetUpdateRgn}

function SetWindowRgn(hWnd: HWND; hRgn: HRGN; bRedraw: BOOL): Integer; stdcall;
{$EXTERNALSYM SetWindowRgn}

function GetWindowRgn(hWnd: HWND; hRgn: HRGN): Integer; stdcall;
{$EXTERNALSYM GetWindowRgn}

function GetWindowRgnBox(hWnd: HWND; var lprc: RECT): Integer; stdcall;
{$EXTERNALSYM GetWindowRgnBox}

function ExcludeUpdateRgn(hDC: HDC; hWnd: HWND): Integer; stdcall;
{$EXTERNALSYM ExcludeUpdateRgn}

function InvalidateRect(hWnd: HWND; lpRect: LPRECT; bErase: BOOL): BOOL; stdcall;
{$EXTERNALSYM InvalidateRect}

function ValidateRect(hWnd: HWND; lpRect: LPRECT): BOOL; stdcall;
{$EXTERNALSYM ValidateRect}

function InvalidateRgn(hWnd: HWND; hRgn: HRGN; bErase: BOOL): BOOL; stdcall;
{$EXTERNALSYM InvalidateRgn}

function ValidateRgn(hWnd: HWND; hRgn: HRGN): BOOL; stdcall;
{$EXTERNALSYM ValidateRgn}

function RedrawWindow(hWnd: HWND; lprcUpdate: LPRECT; hrgnUpdate: HRGN; flags: UINT): BOOL; stdcall;
{$EXTERNALSYM RedrawWindow}

//
// RedrawWindow() flags
//

const
  RDW_INVALIDATE    = $0001;
  {$EXTERNALSYM RDW_INVALIDATE}
  RDW_INTERNALPAINT = $0002;
  {$EXTERNALSYM RDW_INTERNALPAINT}
  RDW_ERASE         = $0004;
  {$EXTERNALSYM RDW_ERASE}

  RDW_VALIDATE        = $0008;
  {$EXTERNALSYM RDW_VALIDATE}
  RDW_NOINTERNALPAINT = $0010;
  {$EXTERNALSYM RDW_NOINTERNALPAINT}
  RDW_NOERASE         = $0020;
  {$EXTERNALSYM RDW_NOERASE}

  RDW_NOCHILDREN  = $0040;
  {$EXTERNALSYM RDW_NOCHILDREN}
  RDW_ALLCHILDREN = $0080;
  {$EXTERNALSYM RDW_ALLCHILDREN}

  RDW_UPDATENOW = $0100;
  {$EXTERNALSYM RDW_UPDATENOW}
  RDW_ERASENOW  = $0200;
  {$EXTERNALSYM RDW_ERASENOW}

  RDW_FRAME   = $0400;
  {$EXTERNALSYM RDW_FRAME}
  RDW_NOFRAME = $0800;
  {$EXTERNALSYM RDW_NOFRAME}

//
// LockWindowUpdate API
//

function LockWindowUpdate(hWndLock: HWND): BOOL; stdcall;
{$EXTERNALSYM LockWindowUpdate}

function ScrollWindow(hWnd: HWND; XAmount, YAmount: Integer; lpRect, lpClipRect: LPRECT): BOOL; stdcall;
{$EXTERNALSYM ScrollWindow}

function ScrollDC(hDC: HDC; dx, dy: Integer; lprcScroll, lprcClip: LPRECT;
  hrgnUpdate: HRGN; lprcUpdate: LPRECT): BOOL; stdcall;
{$EXTERNALSYM ScrollDC}

function ScrollWindowEx(hWnd: HWND; dx, dy: Integer; prcScroll, prcClip: LPRECT;
  hrgnUpdate: HRGN; prcUpdate: LPRECT; flags: UINT): Integer; stdcall;
{$EXTERNALSYM ScrollWindowEx}

const
  SW_SCROLLCHILDREN = $0001; // Scroll children within *lprcScroll.
  {$EXTERNALSYM SW_SCROLLCHILDREN}
  SW_INVALIDATE     = $0002; // Invalidate after scrolling
  {$EXTERNALSYM SW_INVALIDATE}
  SW_ERASE          = $0004; // If SW_INVALIDATE, don't send WM_ERASEBACKGROUND
  {$EXTERNALSYM SW_ERASE}
  SW_SMOOTHSCROLL   = $0010; // Use smooth scrolling
  {$EXTERNALSYM SW_SMOOTHSCROLL}

function SetScrollPos(hWnd: HWND; nBar, nPos: Integer; bRedraw: BOOL): Integer; stdcall;
{$EXTERNALSYM SetScrollPos}

function GetScrollPos(hWnd: HWND; nBar: Integer): Integer; stdcall;
{$EXTERNALSYM GetScrollPos}

function SetScrollRange(hWnd: HWND; nBar, nMinPos, nMaxPos: Integer; bRedraw: BOOL): BOOL; stdcall;
{$EXTERNALSYM SetScrollRange}

function GetScrollRange(hWnd: HWND; nBar: Integer; var lpMinPos, lpMaxPos: Integer): BOOL; stdcall;
{$EXTERNALSYM GetScrollRange}

function ShowScrollBar(hWnd: HWND; wBar: Integer; bShow: BOOL): BOOL; stdcall;
{$EXTERNALSYM ShowScrollBar}

function EnableScrollBar(hWnd: HWND; wSBflags, wArrows: UINT): BOOL; stdcall;
{$EXTERNALSYM EnableScrollBar}

//
// EnableScrollBar() flags
//

const
  ESB_ENABLE_BOTH  = $0000;
  {$EXTERNALSYM ESB_ENABLE_BOTH}
  ESB_DISABLE_BOTH = $0003;
  {$EXTERNALSYM ESB_DISABLE_BOTH}

  ESB_DISABLE_LEFT  = $0001;
  {$EXTERNALSYM ESB_DISABLE_LEFT}
  ESB_DISABLE_RIGHT = $0002;
  {$EXTERNALSYM ESB_DISABLE_RIGHT}

  ESB_DISABLE_UP   = $0001;
  {$EXTERNALSYM ESB_DISABLE_UP}
  ESB_DISABLE_DOWN = $0002;
  {$EXTERNALSYM ESB_DISABLE_DOWN}

  ESB_DISABLE_LTUP = ESB_DISABLE_LEFT;
  {$EXTERNALSYM ESB_DISABLE_LTUP}
  ESB_DISABLE_RTDN = ESB_DISABLE_RIGHT;
  {$EXTERNALSYM ESB_DISABLE_RTDN}

function SetPropA(hWnd: HWND; lpString: LPCSTR; hData: HANDLE): BOOL; stdcall;
{$EXTERNALSYM SetPropA}
function SetPropW(hWnd: HWND; lpString: LPCWSTR; hData: HANDLE): BOOL; stdcall;
{$EXTERNALSYM SetPropW}
function SetProp(hWnd: HWND; lpString: LPCTSTR; hData: HANDLE): BOOL; stdcall;
{$EXTERNALSYM SetProp}

function GetPropA(hWnd: HWND; lpString: LPCSTR): HANDLE; stdcall;
{$EXTERNALSYM GetPropA}
function GetPropW(hWnd: HWND; lpString: LPCWSTR): HANDLE; stdcall;
{$EXTERNALSYM GetPropW}
function GetProp(hWnd: HWND; lpString: LPCTSTR): HANDLE; stdcall;
{$EXTERNALSYM GetProp}

function RemovePropA(hWnd: HWND; lpString: LPCSTR): HANDLE; stdcall;
{$EXTERNALSYM RemovePropA}
function RemovePropW(hWnd: HWND; lpString: LPCWSTR): HANDLE; stdcall;
{$EXTERNALSYM RemovePropW}
function RemoveProp(hWnd: HWND; lpString: LPCTSTR): HANDLE; stdcall;
{$EXTERNALSYM RemoveProp}

function EnumPropsExA(hWnd: HWND; lpEnumFunc: PROPENUMPROCEXA; lParam: LPARAM): Integer; stdcall;
{$EXTERNALSYM EnumPropsExA}
function EnumPropsExW(hWnd: HWND; lpEnumFunc: PROPENUMPROCEXW; lParam: LPARAM): Integer; stdcall;
{$EXTERNALSYM EnumPropsExW}
function EnumPropsEx(hWnd: HWND; lpEnumFunc: PROPENUMPROCEX; lParam: LPARAM): Integer; stdcall;
{$EXTERNALSYM EnumPropsEx}

function EnumPropsA(hWnd: HWND; lpEnumFunc: PROPENUMPROCA): Integer; stdcall;
{$EXTERNALSYM EnumPropsA}
function EnumPropsW(hWnd: HWND; lpEnumFunc: PROPENUMPROCW): Integer; stdcall;
{$EXTERNALSYM EnumPropsW}
function EnumProps(hWnd: HWND; lpEnumFunc: PROPENUMPROC): Integer; stdcall;
{$EXTERNALSYM EnumProps}

function SetWindowTextA(hWnd: HWND; lpString: LPCSTR): BOOL; stdcall;
{$EXTERNALSYM SetWindowTextA}
function SetWindowTextW(hWnd: HWND; lpString: LPCWSTR): BOOL; stdcall;
{$EXTERNALSYM SetWindowTextW}
function SetWindowText(hWnd: HWND; lpString: LPCTSTR): BOOL; stdcall;
{$EXTERNALSYM SetWindowText}

function GetWindowTextA(hWnd: HWND; lpString: LPSTR; nMaxCount: Integer): Integer; stdcall;
{$EXTERNALSYM GetWindowTextA}
function GetWindowTextW(hWnd: HWND; lpString: LPWSTR; nMaxCount: Integer): Integer; stdcall;
{$EXTERNALSYM GetWindowTextW}
function GetWindowText(hWnd: HWND; lpString: LPTSTR; nMaxCount: Integer): Integer; stdcall;
{$EXTERNALSYM GetWindowText}

function GetWindowTextLengthA(hWnd: HWND): Integer; stdcall;
{$EXTERNALSYM GetWindowTextLengthA}
function GetWindowTextLengthW(hWnd: HWND): Integer; stdcall;
{$EXTERNALSYM GetWindowTextLengthW}
function GetWindowTextLength(hWnd: HWND): Integer; stdcall;
{$EXTERNALSYM GetWindowTextLength}

function GetClientRect(hWnd: HWND; var lpRect: RECT): BOOL; stdcall;
{$EXTERNALSYM GetClientRect}

function GetWindowRect(hWnd: HWND; var lpRect: RECT): BOOL; stdcall;
{$EXTERNALSYM GetWindowRect}

function AdjustWindowRect(var lpRect: RECT; dwStyle: DWORD; bMenu: BOOL): BOOL; stdcall;
{$EXTERNALSYM AdjustWindowRect}

function AdjustWindowRectEx(var lpRect: RECT; dwStyle: DWORD;
  bMenu: BOOL; dwExStyle: DWORD): BOOL; stdcall;
{$EXTERNALSYM AdjustWindowRectEx}

const
  HELPINFO_WINDOW   = $0001;
  {$EXTERNALSYM HELPINFO_WINDOW}
  HELPINFO_MENUITEM = $0002;
  {$EXTERNALSYM HELPINFO_MENUITEM}

type
  LPHELPINFO = ^HELPINFO;
  {$EXTERNALSYM LPHELPINFO}
  tagHELPINFO = record      // Structure pointed to by lParam of WM_HELP//
    cbSize: UINT;           // Size in bytes of this struct //
    iContextType: Integer;  // Either HELPINFO_WINDOW or HELPINFO_MENUITEM//
    iCtrlId: Integer;       // Control Id or a Menu item Id.//
    hItemHandle: HANDLE;    // hWnd of control or hMenu.    //
    dwContextId: DWORD_PTR; // Context Id associated with this item//
    MousePos: POINT;        // Mouse Position in screen co-ordinates//
  end;
  {$EXTERNALSYM tagHELPINFO}
  HELPINFO = tagHELPINFO;
  {$EXTERNALSYM HELPINFO}
  THelpInfo = HELPINFO;
  PHelpInfo = LPHELPINFO;

function SetWindowContextHelpId(hwnd: HWND; dwContextHelpId: DWORD): BOOL; stdcall;
{$EXTERNALSYM SetWindowContextHelpId}

function GetWindowContextHelpId(hwnd: HWND): DWORD; stdcall;
{$EXTERNALSYM GetWindowContextHelpId}

function SetMenuContextHelpId(hmenu: HMENU; dwContextHelpId: DWORD): BOOL; stdcall;
{$EXTERNALSYM SetMenuContextHelpId}

function GetMenuContextHelpId(hmenu: HMENU): DWORD; stdcall;
{$EXTERNALSYM GetMenuContextHelpId}

//
// MessageBox() Flags
//

const
  MB_OK                = $00000000;
  {$EXTERNALSYM MB_OK}
  MB_OKCANCEL          = $00000001;
  {$EXTERNALSYM MB_OKCANCEL}
  MB_ABORTRETRYIGNORE  = $00000002;
  {$EXTERNALSYM MB_ABORTRETRYIGNORE}
  MB_YESNOCANCEL       = $00000003;
  {$EXTERNALSYM MB_YESNOCANCEL}
  MB_YESNO             = $00000004;
  {$EXTERNALSYM MB_YESNO}
  MB_RETRYCANCEL       = $00000005;
  {$EXTERNALSYM MB_RETRYCANCEL}
  MB_CANCELTRYCONTINUE = $00000006;
  {$EXTERNALSYM MB_CANCELTRYCONTINUE}

  MB_ICONHAND        = $00000010;
  {$EXTERNALSYM MB_ICONHAND}
  MB_ICONQUESTION    = $00000020;
  {$EXTERNALSYM MB_ICONQUESTION}
  MB_ICONEXCLAMATION = $00000030;
  {$EXTERNALSYM MB_ICONEXCLAMATION}
  MB_ICONASTERISK    = $00000040;
  {$EXTERNALSYM MB_ICONASTERISK}

  MB_USERICON    = $00000080;
  {$EXTERNALSYM MB_USERICON}
  MB_ICONWARNING = MB_ICONEXCLAMATION;
  {$EXTERNALSYM MB_ICONWARNING}
  MB_ICONERROR   = MB_ICONHAND;
  {$EXTERNALSYM MB_ICONERROR}

  MB_ICONINFORMATION = MB_ICONASTERISK;
  {$EXTERNALSYM MB_ICONINFORMATION}
  MB_ICONSTOP        = MB_ICONHAND;
  {$EXTERNALSYM MB_ICONSTOP}

  MB_DEFBUTTON1 = $00000000;
  {$EXTERNALSYM MB_DEFBUTTON1}
  MB_DEFBUTTON2 = $00000100;
  {$EXTERNALSYM MB_DEFBUTTON2}
  MB_DEFBUTTON3 = $00000200;
  {$EXTERNALSYM MB_DEFBUTTON3}
  MB_DEFBUTTON4 = $00000300;
  {$EXTERNALSYM MB_DEFBUTTON4}

  MB_APPLMODAL   = $00000000;
  {$EXTERNALSYM MB_APPLMODAL}
  MB_SYSTEMMODAL = $00001000;
  {$EXTERNALSYM MB_SYSTEMMODAL}
  MB_TASKMODAL   = $00002000;
  {$EXTERNALSYM MB_TASKMODAL}
  MB_HELP        = $00004000; // Help Button
  {$EXTERNALSYM MB_HELP}

  MB_NOFOCUS              = $00008000;
  {$EXTERNALSYM MB_NOFOCUS}
  MB_SETFOREGROUND        = $00010000;
  {$EXTERNALSYM MB_SETFOREGROUND}
  MB_DEFAULT_DESKTOP_ONLY = $00020000;
  {$EXTERNALSYM MB_DEFAULT_DESKTOP_ONLY}

  MB_TOPMOST    = $00040000;
  {$EXTERNALSYM MB_TOPMOST}
  MB_RIGHT      = $00080000;
  {$EXTERNALSYM MB_RIGHT}
  MB_RTLREADING = $00100000;
  {$EXTERNALSYM MB_RTLREADING}

const
  {$IFDEF WINNT4_UP}
  MB_SERVICE_NOTIFICATION = $00200000;
  {$EXTERNALSYM MB_SERVICE_NOTIFICATION}
  {$ELSE}
  MB_SERVICE_NOTIFICATION = $00040000;
  {$EXTERNALSYM MB_SERVICE_NOTIFICATION}
  {$ENDIF WINNT4_UP}

  MB_TYPEMASK = $0000000F;
  {$EXTERNALSYM MB_TYPEMASK}
  MB_ICONMASK = $000000F0;
  {$EXTERNALSYM MB_ICONMASK}
  MB_DEFMASK  = $00000F00;
  {$EXTERNALSYM MB_DEFMASK}
  MB_MODEMASK = $00003000;
  {$EXTERNALSYM MB_MODEMASK}
  MB_MISCMASK = $0000C000;
  {$EXTERNALSYM MB_MISCMASK}

function MessageBoxA(hWnd: HWND; lpText, lpCaption: LPCSTR; uType: UINT): Integer; stdcall;
{$EXTERNALSYM MessageBoxA}
function MessageBoxW(hWnd: HWND; lpText, lpCaption: LPCWSTR; uType: UINT): Integer; stdcall;
{$EXTERNALSYM MessageBoxW}
function MessageBox(hWnd: HWND; lpText, lpCaption: LPCTSTR; uType: UINT): Integer; stdcall;
{$EXTERNALSYM MessageBox}

function MessageBoxExA(hWnd: HWND; lpText, lpCaption: LPCSTR; uType: UINT;
  wLanguageId: WORD): Integer; stdcall;
{$EXTERNALSYM MessageBoxExA}
function MessageBoxExW(hWnd: HWND; lpText, lpCaption: LPCWSTR; uType: UINT;
  wLanguageId: WORD): Integer; stdcall;
{$EXTERNALSYM MessageBoxExW}
function MessageBoxEx(hWnd: HWND; lpText, lpCaption: LPCTSTR; uType: UINT;
  wLanguageId: WORD): Integer; stdcall;
{$EXTERNALSYM MessageBoxEx}

type
  MSGBOXCALLBACK = procedure(var lpHelpInfo: HELPINFO); stdcall;
  {$EXTERNALSYM MSGBOXCALLBACK}
  TMsgBoxCallback = MSGBOXCALLBACK;

  LPMSGBOXPARAMSA = ^MSGBOXPARAMSA;
  {$EXTERNALSYM LPMSGBOXPARAMSA}
  tagMSGBOXPARAMSA = record
    cbSize: UINT;
    hwndOwner: HWND;
    hInstance: HINST;
    lpszText: LPCSTR;
    lpszCaption: LPCSTR;
    dwStyle: DWORD;
    lpszIcon: LPCSTR;
    dwContextHelpId: DWORD_PTR;
    lpfnMsgBoxCallback: MSGBOXCALLBACK;
    dwLanguageId: DWORD;
  end;
  {$EXTERNALSYM tagMSGBOXPARAMSA}
  MSGBOXPARAMSA = tagMSGBOXPARAMSA;
  {$EXTERNALSYM MSGBOXPARAMSA}
  TMsgBoxParamsA = MSGBOXPARAMSA;
  PMsgBoxParamsA = LPMSGBOXPARAMSA;

  LPMSGBOXPARAMSW = ^MSGBOXPARAMSW;
  {$EXTERNALSYM LPMSGBOXPARAMSW}
  tagMSGBOXPARAMSW = record
    cbSize: UINT;
    hwndOwner: HWND;
    hInstance: HINST;
    lpszText: LPCWSTR;
    lpszCaption: LPCWSTR;
    dwStyle: DWORD;
    lpszIcon: LPCWSTR;
    dwContextHelpId: DWORD_PTR;
    lpfnMsgBoxCallback: MSGBOXCALLBACK;
    dwLanguageId: DWORD;
  end;
  {$EXTERNALSYM tagMSGBOXPARAMSW}
  MSGBOXPARAMSW = tagMSGBOXPARAMSW;
  {$EXTERNALSYM MSGBOXPARAMSW}
  TMsgBoxParamsW = MSGBOXPARAMSW;
  PMsgBoxParamsW = LPMSGBOXPARAMSW;

  {$IFDEF UNICODE}
  MSGBOXPARAMS = MSGBOXPARAMSW;
  {$EXTERNALSYM MSGBOXPARAMS}
  LPMSGBOXPARAMS = LPMSGBOXPARAMSW;
  {$EXTERNALSYM LPMSGBOXPARAMS}
  TMsgBoxParams = TMsgBoxParamsW;
  PMsgBoxParams = PMsgBoxParamsW;
  {$ELSE}
  MSGBOXPARAMS = MSGBOXPARAMSA;
  {$EXTERNALSYM MSGBOXPARAMS}
  LPMSGBOXPARAMS = LPMSGBOXPARAMSA;
  {$EXTERNALSYM LPMSGBOXPARAMS}
  TMsgBoxParams = TMsgBoxParamsA;
  PMsgBoxParams = PMsgBoxParamsA;
  {$ENDIF UNICODE}

function MessageBoxIndirectA(const lpMsgBoxParams: MSGBOXPARAMSA): Integer; stdcall;
{$EXTERNALSYM MessageBoxIndirectA}
function MessageBoxIndirectW(const lpMsgBoxParams: MSGBOXPARAMSW): Integer; stdcall;
{$EXTERNALSYM MessageBoxIndirectW}
function MessageBoxIndirect(const lpMsgBoxParams: MSGBOXPARAMS): Integer; stdcall;
{$EXTERNALSYM MessageBoxIndirect}

function MessageBeep(uType: UINT): BOOL; stdcall;
{$EXTERNALSYM MessageBeep}

function ShowCursor(bShow: BOOL): Integer; stdcall;
{$EXTERNALSYM ShowCursor}

function SetCursorPos(X, Y: Integer): BOOL; stdcall;
{$EXTERNALSYM SetCursorPos}

function SetCursor(hCursor: HCURSOR): HCURSOR; stdcall;
{$EXTERNALSYM SetCursor}

function GetCursorPos(var lpPoint: POINT): BOOL; stdcall;
{$EXTERNALSYM GetCursorPos}

function ClipCursor(lpRect: LPRECT): BOOL; stdcall;
{$EXTERNALSYM ClipCursor}

function GetClipCursor(var lpRect: RECT): BOOL; stdcall;
{$EXTERNALSYM GetClipCursor}

function GetCursor: HCURSOR; stdcall;
{$EXTERNALSYM GetCursor}

function CreateCaret(hWnd: HWND; hBitmap: HBITMAP; nWidth, nHeight: Integer): BOOL; stdcall;
{$EXTERNALSYM CreateCaret}

function GetCaretBlinkTime: UINT; stdcall;
{$EXTERNALSYM GetCaretBlinkTime}

function SetCaretBlinkTime(uMSeconds: UINT): BOOL; stdcall;
{$EXTERNALSYM SetCaretBlinkTime}

function DestroyCaret: BOOL; stdcall;
{$EXTERNALSYM DestroyCaret}

function HideCaret(hWnd: HWND): BOOL; stdcall;
{$EXTERNALSYM HideCaret}

function ShowCaret(hWnd: HWND): BOOL; stdcall;
{$EXTERNALSYM ShowCaret}

function SetCaretPos(X, Y: Integer): BOOL; stdcall;
{$EXTERNALSYM SetCaretPos}

function GetCaretPos(var lpPoint: POINT): BOOL; stdcall;
{$EXTERNALSYM GetCaretPos}

function ClientToScreen(hWnd: HWND; var lpPoint: POINT): BOOL; stdcall;
{$EXTERNALSYM ClientToScreen}

function ScreenToClient(hWnd: HWND; var lpPoint: POINT): BOOL; stdcall;
{$EXTERNALSYM ScreenToClient}

function MapWindowPoints(hWndFrom, hWndTo: HWND; lpPoints: LPPOINT; cPoints: UINT): Integer; stdcall;
{$EXTERNALSYM MapWindowPoints}

function WindowFromPoint(Point: POINT): HWND; stdcall;
{$EXTERNALSYM WindowFromPoint}

function ChildWindowFromPoint(hWndParent: HWND; Point: POINT): HWND; stdcall;
{$EXTERNALSYM ChildWindowFromPoint}

const
  CWP_ALL             = $0000;
  {$EXTERNALSYM CWP_ALL}
  CWP_SKIPINVISIBLE   = $0001;
  {$EXTERNALSYM CWP_SKIPINVISIBLE}
  CWP_SKIPDISABLED    = $0002;
  {$EXTERNALSYM CWP_SKIPDISABLED}
  CWP_SKIPTRANSPARENT = $0004;
  {$EXTERNALSYM CWP_SKIPTRANSPARENT}

function ChildWindowFromPointEx(hwndParent: HWND; pt: POINT; uFlags: UINT): HWND; stdcall;
{$EXTERNALSYM ChildWindowFromPointEx}

//
// Color Types
//

const
  CTLCOLOR_MSGBOX    = 0;
  {$EXTERNALSYM CTLCOLOR_MSGBOX}
  CTLCOLOR_EDIT      = 1;
  {$EXTERNALSYM CTLCOLOR_EDIT}
  CTLCOLOR_LISTBOX   = 2;
  {$EXTERNALSYM CTLCOLOR_LISTBOX}
  CTLCOLOR_BTN       = 3;
  {$EXTERNALSYM CTLCOLOR_BTN}
  CTLCOLOR_DLG       = 4;
  {$EXTERNALSYM CTLCOLOR_DLG}
  CTLCOLOR_SCROLLBAR = 5;
  {$EXTERNALSYM CTLCOLOR_SCROLLBAR}
  CTLCOLOR_STATIC    = 6;
  {$EXTERNALSYM CTLCOLOR_STATIC}
  CTLCOLOR_MAX       = 7;
  {$EXTERNALSYM CTLCOLOR_MAX}

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

  COLOR_3DDKSHADOW = 21;
  {$EXTERNALSYM COLOR_3DDKSHADOW}
  COLOR_3DLIGHT    = 22;
  {$EXTERNALSYM COLOR_3DLIGHT}
  COLOR_INFOTEXT   = 23;
  {$EXTERNALSYM COLOR_INFOTEXT}
  COLOR_INFOBK     = 24;
  {$EXTERNALSYM COLOR_INFOBK}

  COLOR_HOTLIGHT                = 26;
  {$EXTERNALSYM COLOR_HOTLIGHT}
  COLOR_GRADIENTACTIVECAPTION   = 27;
  {$EXTERNALSYM COLOR_GRADIENTACTIVECAPTION}
  COLOR_GRADIENTINACTIVECAPTION = 28;
  {$EXTERNALSYM COLOR_GRADIENTINACTIVECAPTION}
  COLOR_MENUHILIGHT             = 29;
  {$EXTERNALSYM COLOR_MENUHILIGHT}
  COLOR_MENUBAR                 = 30;
  {$EXTERNALSYM COLOR_MENUBAR}

  COLOR_DESKTOP     = COLOR_BACKGROUND;
  {$EXTERNALSYM COLOR_DESKTOP}
  COLOR_3DFACE      = COLOR_BTNFACE;
  {$EXTERNALSYM COLOR_3DFACE}
  COLOR_3DSHADOW    = COLOR_BTNSHADOW;
  {$EXTERNALSYM COLOR_3DSHADOW}
  COLOR_3DHIGHLIGHT = COLOR_BTNHIGHLIGHT;
  {$EXTERNALSYM COLOR_3DHIGHLIGHT}
  COLOR_3DHILIGHT   = COLOR_BTNHIGHLIGHT;
  {$EXTERNALSYM COLOR_3DHILIGHT}
  COLOR_BTNHILIGHT  = COLOR_BTNHIGHLIGHT;
  {$EXTERNALSYM COLOR_BTNHILIGHT}

function GetSysColor(nIndex: Integer): DWORD; stdcall;
{$EXTERNALSYM GetSysColor}

function GetSysColorBrush(nIndex: Integer): HBRUSH; stdcall;
{$EXTERNALSYM GetSysColorBrush}

function SetSysColors(cElements: Integer; lpaElements: LPINT;
  lpaRgbValues: LPCOLORREF): BOOL; stdcall;
{$EXTERNALSYM SetSysColors}

function DrawFocusRect(hDC: HDC; const lprc: RECT): BOOL; stdcall;
{$EXTERNALSYM DrawFocusRect}

function FillRect(hDC: HDC; const lprc: RECT; hbr: HBRUSH): Integer; stdcall;
{$EXTERNALSYM FillRect}

function FrameRect(hDC: HDC; const lprc: RECT; hbr: HBRUSH): Integer; stdcall;
{$EXTERNALSYM FrameRect}

function InvertRect(hDC: HDC; const lprc: RECT): BOOL; stdcall;
{$EXTERNALSYM InvertRect}

function SetRect(var lprc: RECT; xLeft, yTop, xRight, yBottom: Integer): BOOL; stdcall;
{$EXTERNALSYM SetRect}

function SetRectEmpty(var lprc: RECT): BOOL; stdcall;
{$EXTERNALSYM SetRectEmpty}

function CopyRect(var lprcDst: RECT; const lprcSrc: RECT): BOOL; stdcall;
{$EXTERNALSYM CopyRect}

function InflateRect(var lprc: RECT; dx, dy: Integer): BOOL; stdcall;
{$EXTERNALSYM InflateRect}

function IntersectRect(var lprcDst: RECT; const lprcSrc1, lprcSrc2: RECT): BOOL; stdcall;
{$EXTERNALSYM IntersectRect}

function UnionRect(var lprcDst: RECT; const lprcSrc1, lprcSrc2: RECT): BOOL; stdcall;
{$EXTERNALSYM UnionRect}

function SubtractRect(var lprcDst: RECT; const lprcSrc1, lprcSrc2: RECT): BOOL; stdcall;
{$EXTERNALSYM SubtractRect}

function OffsetRect(var lprc: RECT; dx, dy: Integer): BOOL; stdcall;
{$EXTERNALSYM OffsetRect}

function IsRectEmpty(const lprc: RECT): BOOL; stdcall;
{$EXTERNALSYM IsRectEmpty}

function EqualRect(const lprc1, lprc2: RECT): BOOL; stdcall;
{$EXTERNALSYM EqualRect}

function PtInRect(const lprc: RECT; pt: POINT): BOOL; stdcall;
{$EXTERNALSYM PtInRect}

function GetWindowWord(hWnd: HWND; nIndex: Integer): WORD; stdcall;
{$EXTERNALSYM GetWindowWord}

function SetWindowWord(hWnd: HWND; nIndex: Integer; wNewWord: WORD): WORD; stdcall;
{$EXTERNALSYM SetWindowWord}

function GetWindowLongA(hWnd: HWND; nIndex: Integer): LONG; stdcall;
{$EXTERNALSYM GetWindowLongA}
function GetWindowLongW(hWnd: HWND; nIndex: Integer): LONG; stdcall;
{$EXTERNALSYM GetWindowLongW}
function GetWindowLong(hWnd: HWND; nIndex: Integer): LONG; stdcall;
{$EXTERNALSYM GetWindowLong}

function SetWindowLongA(hWnd: HWND; nIndex: Integer; dwNewLong: LONG): LONG; stdcall;
{$EXTERNALSYM SetWindowLongA}
function SetWindowLongW(hWnd: HWND; nIndex: Integer; dwNewLong: LONG): LONG; stdcall;
{$EXTERNALSYM SetWindowLongW}
function SetWindowLong(hWnd: HWND; nIndex: Integer; dwNewLong: LONG): LONG; stdcall;
{$EXTERNALSYM SetWindowLong}

function GetWindowLongPtrA(hWnd: HWND; nIndex: Integer): LONG_PTR;
{$EXTERNALSYM GetWindowLongPtrA}
function GetWindowLongPtrW(hWnd: HWND; nIndex: Integer): LONG_PTR;
{$EXTERNALSYM GetWindowLongPtrW}
function GetWindowLongPtr(hWnd: HWND; nIndex: Integer): LONG_PTR;
{$EXTERNALSYM GetWindowLongPtr}

function SetWindowLongPtrA(hWnd: HWND; nIndex: Integer; dwNewLong: LONG_PTR): LONG_PTR;
{$EXTERNALSYM SetWindowLongPtrA}
function SetWindowLongPtrW(hWnd: HWND; nIndex: Integer; dwNewLong: LONG_PTR): LONG_PTR;
{$EXTERNALSYM SetWindowLongPtrW}
function SetWindowLongPtr(hWnd: HWND; nIndex: Integer; dwNewLong: LONG_PTR): LONG_PTR;
{$EXTERNALSYM SetWindowLongPtr}

function GetClassWord(hWnd: HWND; nIndex: Integer): WORD; stdcall;
{$EXTERNALSYM GetClassWord}

function SetClassWord(hWnd: HWND; nIndex: Integer; wNewWord: WORD): WORD; stdcall;
{$EXTERNALSYM SetClassWord}

function GetClassLongA(hWnd: HWND; nIndex: Integer): DWORD; stdcall;
{$EXTERNALSYM GetClassLongA}
function GetClassLongW(hWnd: HWND; nIndex: Integer): DWORD; stdcall;
{$EXTERNALSYM GetClassLongW}
function GetClassLong(hWnd: HWND; nIndex: Integer): DWORD; stdcall;
{$EXTERNALSYM GetClassLong}

function SetClassLongA(hWnd: HWND; nIndex: Integer; dwNewLong: LONG): DWORD; stdcall;
{$EXTERNALSYM SetClassLongA}
function SetClassLongW(hWnd: HWND; nIndex: Integer; dwNewLong: LONG): DWORD; stdcall;
{$EXTERNALSYM SetClassLongW}
function SetClassLong(hWnd: HWND; nIndex: Integer; dwNewLong: LONG): DWORD; stdcall;
{$EXTERNALSYM SetClassLong}

function GetClassLongPtrA(hWnd: HWND; nIndex: Integer): ULONG_PTR;
{$EXTERNALSYM GetClassLongPtrA}
function GetClassLongPtrW(hWnd: HWND; nIndex: Integer): ULONG_PTR;
{$EXTERNALSYM GetClassLongPtrW}
function GetClassLongPtr(hWnd: HWND; nIndex: Integer): ULONG_PTR;
{$EXTERNALSYM GetClassLongPtr}

function SetClassLongPtrA(hWnd: HWND; nIndex: Integer; dwNewLong: ULONG_PTR): ULONG_PTR;
{$EXTERNALSYM SetClassLongPtrA}
function SetClassLongPtrW(hWnd: HWND; nIndex: Integer; dwNewLong: ULONG_PTR): ULONG_PTR;
{$EXTERNALSYM SetClassLongPtrW}
function SetClassLongPtr(hWnd: HWND; nIndex: Integer; dwNewLong: ULONG_PTR): ULONG_PTR;
{$EXTERNALSYM SetClassLongPtr}

function GetProcessDefaultLayout(var pdwDefaultLayout: DWORD): BOOL; stdcall;
{$EXTERNALSYM GetProcessDefaultLayout}

function SetProcessDefaultLayout(dwDefaultLayout: DWORD): BOOL; stdcall;
{$EXTERNALSYM SetProcessDefaultLayout}

function GetDesktopWindow: HWND; stdcall;
{$EXTERNALSYM GetDesktopWindow}

function GetParent(hWnd: HWND): HWND; stdcall;
{$EXTERNALSYM GetParent}

function SetParent(hWndChild, hWndNewParent: HWND): HWND; stdcall;
{$EXTERNALSYM SetParent}

function EnumChildWindows(hWndParent: HWND; lpEnumFunc: WNDENUMPROC; lParam: LPARAM): BOOL; stdcall;
{$EXTERNALSYM EnumChildWindows}

function FindWindowA(lpClassName, lpWindowName: LPCSTR): HWND; stdcall;
{$EXTERNALSYM FindWindowA}
function FindWindowW(lpClassName, lpWindowName: LPCWSTR): HWND; stdcall;
{$EXTERNALSYM FindWindowW}
function FindWindow(lpClassName, lpWindowName: LPCTSTR): HWND; stdcall;
{$EXTERNALSYM FindWindow}

function FindWindowExA(hwndParent, hwndChildAfter: HWND; lpszClass, lpszWindow: LPCSTR): HWND; stdcall;
{$EXTERNALSYM FindWindowExA}
function FindWindowExW(hwndParent, hwndChildAfter: HWND; lpszClass, lpszWindow: LPCWSTR): HWND; stdcall;
{$EXTERNALSYM FindWindowExW}
function FindWindowEx(hwndParent, hwndChildAfter: HWND; lpszClass, lpszWindow: LPCTSTR): HWND; stdcall;
{$EXTERNALSYM FindWindowEx}

function GetShellWindow: HWND; stdcall;
{$EXTERNALSYM GetShellWindow}

function RegisterShellHookWindow(h: HWND): BOOL; stdcall;
{$EXTERNALSYM RegisterShellHookWindow}

function DeregisterShellHookWindow(h: HWND): BOOL; stdcall;
{$EXTERNALSYM DeregisterShellHookWindow}

function EnumWindows(lpEnumFunc: WNDENUMPROC; lParam: LPARAM): BOOL; stdcall;
{$EXTERNALSYM EnumWindows}

function EnumThreadWindows(dwThreadId: DWORD; lpfn: WNDENUMPROC; lParam: LPARAM): BOOL; stdcall;
{$EXTERNALSYM EnumThreadWindows}

function EnumTaskWindows(hTask: HANDLE; lpfn: WNDENUMPROC; lParam: LPARAM): BOOL;
{$EXTERNALSYM EnumTaskWindows}

function GetClassNameA(hWnd: HWND; lpClassName: LPSTR; nMaxCount: Integer): Integer; stdcall;
{$EXTERNALSYM GetClassNameA}
function GetClassNameW(hWnd: HWND; lpClassName: LPWSTR; nMaxCount: Integer): Integer; stdcall;
{$EXTERNALSYM GetClassNameW}
function GetClassName(hWnd: HWND; lpClassName: LPTSTR; nMaxCount: Integer): Integer; stdcall;
{$EXTERNALSYM GetClassName}

function GetTopWindow(hWnd: HWND): HWND; stdcall;
{$EXTERNALSYM GetTopWindow}

function GetNextWindow(hWnd: HWND; wCmd: UINT): HWND;
{$EXTERNALSYM GetNextWindow}

function GetWindowThreadProcessId(hWnd: HWND; lpdwProcessId: LPDWORD): DWORD; stdcall;
{$EXTERNALSYM GetWindowThreadProcessId}

function IsGUIThread(bConvert: BOOL): BOOL; stdcall;
{$EXTERNALSYM IsGUIThread}

function GetWindowTask(hWnd: HWND): HANDLE;
{$EXTERNALSYM GetWindowTask}

function GetLastActivePopup(hWnd: HWND): HWND; stdcall;
{$EXTERNALSYM GetLastActivePopup}

//
// GetWindow() Constants
//

const
  GW_HWNDFIRST    = 0;
  {$EXTERNALSYM GW_HWNDFIRST}
  GW_HWNDLAST     = 1;
  {$EXTERNALSYM GW_HWNDLAST}
  GW_HWNDNEXT     = 2;
  {$EXTERNALSYM GW_HWNDNEXT}
  GW_HWNDPREV     = 3;
  {$EXTERNALSYM GW_HWNDPREV}
  GW_OWNER        = 4;
  {$EXTERNALSYM GW_OWNER}
  GW_CHILD        = 5;
  {$EXTERNALSYM GW_CHILD}
  {$IFNDEF WIN98_UP} // #if(WINVER <= 0x0400)
  GW_MAX          = 5;
  {$EXTERNALSYM GW_MAX}
  {$ELSE}
  GW_ENABLEDPOPUP = 6;
  {$EXTERNALSYM GW_ENABLEDPOPUP}
  GW_MAX          = 6;
  {$EXTERNALSYM GW_MAX}
  {$ENDIF WIN98ME_UP}

function GetWindow(hWnd: HWND; uCmd: UINT): HWND; stdcall;
{$EXTERNALSYM GetWindow}

function SetWindowsHookA(nFilterType: Integer; pfnFilterProc: HOOKPROC): HHOOK; stdcall;
{$EXTERNALSYM SetWindowsHookA}
function SetWindowsHookW(nFilterType: Integer; pfnFilterProc: HOOKPROC): HHOOK; stdcall;
{$EXTERNALSYM SetWindowsHookW}
function SetWindowsHook(nFilterType: Integer; pfnFilterProc: HOOKPROC): HHOOK; stdcall;
{$EXTERNALSYM SetWindowsHook}

function UnhookWindowsHook(nCode: Integer; pfnFilterProc: HOOKPROC): BOOL; stdcall;
{$EXTERNALSYM UnhookWindowsHook}

function SetWindowsHookExA(idHook: Integer; lpfn: HOOKPROC; hmod: HINST;
  dwThreadId: DWORD): HHOOK; stdcall;
{$EXTERNALSYM SetWindowsHookExA}
function SetWindowsHookExW(idHook: Integer; lpfn: HOOKPROC; hmod: HINST;
  dwThreadId: DWORD): HHOOK; stdcall;
{$EXTERNALSYM SetWindowsHookExW}
function SetWindowsHookEx(idHook: Integer; lpfn: HOOKPROC; hmod: HINST;
  dwThreadId: DWORD): HHOOK; stdcall;
{$EXTERNALSYM SetWindowsHookEx}

function UnhookWindowsHookEx(hhk: HHOOK): BOOL; stdcall;
{$EXTERNALSYM UnhookWindowsHookEx}

function CallNextHookEx(hhk: HHOOK; nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
{$EXTERNALSYM CallNextHookEx}

//
// Macros for source-level compatibility with old functions.
//

function DefHookProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM; phhk: LPHHOOK): LRESULT;
{$EXTERNALSYM DefHookProc}

// ;win40  -- A lot of MF_* flags have been renamed as MFT_* and MFS_* flags//
//
// Menu flags for Add/Check/EnableMenuItem()
///)

const
  MF_INSERT = $00000000;
  {$EXTERNALSYM MF_INSERT}
  MF_CHANGE = $00000080;
  {$EXTERNALSYM MF_CHANGE}
  MF_APPEND = $00000100;
  {$EXTERNALSYM MF_APPEND}
  MF_DELETE = $00000200;
  {$EXTERNALSYM MF_DELETE}
  MF_REMOVE = $00001000;
  {$EXTERNALSYM MF_REMOVE}

  MF_BYCOMMAND  = $00000000;
  {$EXTERNALSYM MF_BYCOMMAND}
  MF_BYPOSITION = $00000400;
  {$EXTERNALSYM MF_BYPOSITION}

  MF_SEPARATOR = $00000800;
  {$EXTERNALSYM MF_SEPARATOR}

  MF_ENABLED  = $00000000;
  {$EXTERNALSYM MF_ENABLED}
  MF_GRAYED   = $00000001;
  {$EXTERNALSYM MF_GRAYED}
  MF_DISABLED = $00000002;
  {$EXTERNALSYM MF_DISABLED}

  MF_UNCHECKED       = $00000000;
  {$EXTERNALSYM MF_UNCHECKED}
  MF_CHECKED         = $00000008;
  {$EXTERNALSYM MF_CHECKED}
  MF_USECHECKBITMAPS = $00000200;
  {$EXTERNALSYM MF_USECHECKBITMAPS}

  MF_STRING    = $00000000;
  {$EXTERNALSYM MF_STRING}
  MF_BITMAP    = $00000004;
  {$EXTERNALSYM MF_BITMAP}
  MF_OWNERDRAW = $00000100;
  {$EXTERNALSYM MF_OWNERDRAW}

  MF_POPUP        = $00000010;
  {$EXTERNALSYM MF_POPUP}
  MF_MENUBARBREAK = $00000020;
  {$EXTERNALSYM MF_MENUBARBREAK}
  MF_MENUBREAK    = $00000040;
  {$EXTERNALSYM MF_MENUBREAK}

  MF_UNHILITE = $00000000;
  {$EXTERNALSYM MF_UNHILITE}
  MF_HILITE   = $00000080;
  {$EXTERNALSYM MF_HILITE}

  MF_DEFAULT      = $00001000;
  {$EXTERNALSYM MF_DEFAULT}
  MF_SYSMENU      = $00002000;
  {$EXTERNALSYM MF_SYSMENU}
  MF_HELP         = $00004000;
  {$EXTERNALSYM MF_HELP}
  MF_RIGHTJUSTIFY = $00004000;
  {$EXTERNALSYM MF_RIGHTJUSTIFY}

  MF_MOUSESELECT = $00008000;
  {$EXTERNALSYM MF_MOUSESELECT}
  MF_END         = $00000080; // Obsolete -- only used by old RES files
  {$EXTERNALSYM MF_END}

  MFT_STRING       = MF_STRING;
  {$EXTERNALSYM MFT_STRING}
  MFT_BITMAP       = MF_BITMAP;
  {$EXTERNALSYM MFT_BITMAP}
  MFT_MENUBARBREAK = MF_MENUBARBREAK;
  {$EXTERNALSYM MFT_MENUBARBREAK}
  MFT_MENUBREAK    = MF_MENUBREAK;
  {$EXTERNALSYM MFT_MENUBREAK}
  MFT_OWNERDRAW    = MF_OWNERDRAW;
  {$EXTERNALSYM MFT_OWNERDRAW}
  MFT_RADIOCHECK   = $00000200;
  {$EXTERNALSYM MFT_RADIOCHECK}
  MFT_SEPARATOR    = MF_SEPARATOR;
  {$EXTERNALSYM MFT_SEPARATOR}
  MFT_RIGHTORDER   = $00002000;
  {$EXTERNALSYM MFT_RIGHTORDER}
  MFT_RIGHTJUSTIFY = MF_RIGHTJUSTIFY;
  {$EXTERNALSYM MFT_RIGHTJUSTIFY}

// Menu flags for Add/Check/EnableMenuItem()

  MFS_GRAYED    = $00000003;
  {$EXTERNALSYM MFS_GRAYED}
  MFS_DISABLED  = MFS_GRAYED;
  {$EXTERNALSYM MFS_DISABLED}
  MFS_CHECKED   = MF_CHECKED;
  {$EXTERNALSYM MFS_CHECKED}
  MFS_HILITE    = MF_HILITE;
  {$EXTERNALSYM MFS_HILITE}
  MFS_ENABLED   = MF_ENABLED;
  {$EXTERNALSYM MFS_ENABLED}
  MFS_UNCHECKED = MF_UNCHECKED;
  {$EXTERNALSYM MFS_UNCHECKED}
  MFS_UNHILITE  = MF_UNHILITE;
  {$EXTERNALSYM MFS_UNHILITE}
  MFS_DEFAULT   = MF_DEFAULT;
  {$EXTERNALSYM MFS_DEFAULT}

function CheckMenuRadioItem(hmenu: HMENU; idFirst, idLast, idCheck, uFlags: UINT): BOOL; stdcall;
{$EXTERNALSYM CheckMenuRadioItem}

//
// Menu item resource format
//

type
  PMENUITEMTEMPLATEHEADER = ^MENUITEMTEMPLATEHEADER;
  MENUITEMTEMPLATEHEADER = record
    versionNumber: WORD;
    offset: WORD;
  end;
  {$EXTERNALSYM MENUITEMTEMPLATEHEADER}
  TMenuItemTemplateHeader = MENUITEMTEMPLATEHEADER;

  PMENUITEMTEMPLATE = ^MENUITEMTEMPLATE; // version 0
  MENUITEMTEMPLATE = record
    mtOption: WORD;
    mtID: WORD;
    mtString: array [0..0] of WCHAR;
  end;
  {$EXTERNALSYM MENUITEMTEMPLATE}
  TMenuItemTemplate = MENUITEMTEMPLATE;

//
// System Menu Command Values
//

const
  SC_SIZE         = $F000;
  {$EXTERNALSYM SC_SIZE}
  SC_MOVE         = $F010;
  {$EXTERNALSYM SC_MOVE}
  SC_MINIMIZE     = $F020;
  {$EXTERNALSYM SC_MINIMIZE}
  SC_MAXIMIZE     = $F030;
  {$EXTERNALSYM SC_MAXIMIZE}
  SC_NEXTWINDOW   = $F040;
  {$EXTERNALSYM SC_NEXTWINDOW}
  SC_PREVWINDOW   = $F050;
  {$EXTERNALSYM SC_PREVWINDOW}
  SC_CLOSE        = $F060;
  {$EXTERNALSYM SC_CLOSE}
  SC_VSCROLL      = $F070;
  {$EXTERNALSYM SC_VSCROLL}
  SC_HSCROLL      = $F080;
  {$EXTERNALSYM SC_HSCROLL}
  SC_MOUSEMENU    = $F090;
  {$EXTERNALSYM SC_MOUSEMENU}
  SC_KEYMENU      = $F100;
  {$EXTERNALSYM SC_KEYMENU}
  SC_ARRANGE      = $F110;
  {$EXTERNALSYM SC_ARRANGE}
  SC_RESTORE      = $F120;
  {$EXTERNALSYM SC_RESTORE}
  SC_TASKLIST     = $F130;
  {$EXTERNALSYM SC_TASKLIST}
  SC_SCREENSAVE   = $F140;
  {$EXTERNALSYM SC_SCREENSAVE}
  SC_HOTKEY       = $F150;
  {$EXTERNALSYM SC_HOTKEY}
  SC_DEFAULT      = $F160;
  {$EXTERNALSYM SC_DEFAULT}
  SC_MONITORPOWER = $F170;
  {$EXTERNALSYM SC_MONITORPOWER}
  SC_CONTEXTHELP  = $F180;
  {$EXTERNALSYM SC_CONTEXTHELP}
  SC_SEPARATOR    = $F00F;
  {$EXTERNALSYM SC_SEPARATOR}

//
// Obsolete names
//

const
  SC_ICON = SC_MINIMIZE;
  {$EXTERNALSYM SC_ICON}
  SC_ZOOM = SC_MAXIMIZE;
  {$EXTERNALSYM SC_ZOOM}

//
// Resource Loading Routines
//

function LoadBitmapA(hInstance: HINST; lpBitmapName: LPCSTR): HBITMAP; stdcall;
{$EXTERNALSYM LoadBitmapA}
function LoadBitmapW(hInstance: HINST; lpBitmapName: LPCWSTR): HBITMAP; stdcall;
{$EXTERNALSYM LoadBitmapW}
function LoadBitmap(hInstance: HINST; lpBitmapName: LPCTSTR): HBITMAP; stdcall;
{$EXTERNALSYM LoadBitmap}

function LoadCursorA(hInstance: HINST; lpCursorName: LPCSTR): HCURSOR; stdcall;
{$EXTERNALSYM LoadCursorA}
function LoadCursorW(hInstance: HINST; lpCursorName: LPCWSTR): HCURSOR; stdcall;
{$EXTERNALSYM LoadCursorW}
function LoadCursor(hInstance: HINST; lpCursorName: LPCTSTR): HCURSOR; stdcall;
{$EXTERNALSYM LoadCursor}

function LoadCursorFromFileA(lpFileName: LPCSTR): HCURSOR; stdcall;
{$EXTERNALSYM LoadCursorFromFileA}
function LoadCursorFromFileW(lpFileName: LPCWSTR): HCURSOR; stdcall;
{$EXTERNALSYM LoadCursorFromFileW}
function LoadCursorFromFile(lpFileName: LPCTSTR): HCURSOR; stdcall;
{$EXTERNALSYM LoadCursorFromFile}

function CreateCursor(hInst: HINST; xHotSpot, yHotSpot, nWidth, nHeight: Integer;
  pvANDPlane: PVOID; pvXORPlane: PVOID): HCURSOR; stdcall;
{$EXTERNALSYM CreateCursor}

function DestroyCursor(hCursor: HCURSOR): BOOL; stdcall;
{$EXTERNALSYM DestroyCursor}

function CopyCursor(pcur: HCURSOR): HCURSOR;
{$EXTERNALSYM CopyCursor}

//
// Standard Cursor IDs
//

const
  IDC_ARROW       = MAKEINTRESOURCE(32512);
  {$EXTERNALSYM IDC_ARROW}
  IDC_IBEAM       = MAKEINTRESOURCE(32513);
  {$EXTERNALSYM IDC_IBEAM}
  IDC_WAIT        = MAKEINTRESOURCE(32514);
  {$EXTERNALSYM IDC_WAIT}
  IDC_CROSS       = MAKEINTRESOURCE(32515);
  {$EXTERNALSYM IDC_CROSS}
  IDC_UPARROW     = MAKEINTRESOURCE(32516);
  {$EXTERNALSYM IDC_UPARROW}
  IDC_SIZE        = MAKEINTRESOURCE(32640); // OBSOLETE: use IDC_SIZEALL
  {$EXTERNALSYM IDC_SIZE}
  IDC_ICON        = MAKEINTRESOURCE(32641); // OBSOLETE: use IDC_ARROW
  {$EXTERNALSYM IDC_ICON}
  IDC_SIZENWSE    = MAKEINTRESOURCE(32642);
  {$EXTERNALSYM IDC_SIZENWSE}
  IDC_SIZENESW    = MAKEINTRESOURCE(32643);
  {$EXTERNALSYM IDC_SIZENESW}
  IDC_SIZEWE      = MAKEINTRESOURCE(32644);
  {$EXTERNALSYM IDC_SIZEWE}
  IDC_SIZENS      = MAKEINTRESOURCE(32645);
  {$EXTERNALSYM IDC_SIZENS}
  IDC_SIZEALL     = MAKEINTRESOURCE(32646);
  {$EXTERNALSYM IDC_SIZEALL}
  IDC_NO          = MAKEINTRESOURCE(32648); // not in win3.1
  {$EXTERNALSYM IDC_NO}
  IDC_HAND        = MAKEINTRESOURCE(32649);
  {$EXTERNALSYM IDC_HAND}
  IDC_APPSTARTING = MAKEINTRESOURCE(32650); // not in win3.1
  {$EXTERNALSYM IDC_APPSTARTING}
  IDC_HELP        = MAKEINTRESOURCE(32651);
  {$EXTERNALSYM IDC_HELP}

function SetSystemCursor(hcur: HCURSOR; id: DWORD): BOOL; stdcall;
{$EXTERNALSYM SetSystemCursor}

type
  PICONINFO = ^ICONINFO;
  _ICONINFO = record
    fIcon: BOOL;
    xHotspot: DWORD;
    yHotspot: DWORD;
    hbmMask: HBITMAP;
    hbmColor: HBITMAP;
  end;
  {$EXTERNALSYM _ICONINFO}
  ICONINFO = _ICONINFO;
  {$EXTERNALSYM ICONINFO}
  TIconInfo = ICONINFO;

function LoadIconA(hInstance: HINST; lpIconName: LPCSTR): HICON; stdcall;
{$EXTERNALSYM LoadIconA}
function LoadIconW(hInstance: HINST; lpIconName: LPCWSTR): HICON; stdcall;
{$EXTERNALSYM LoadIconW}
function LoadIcon(hInstance: HINST; lpIconName: LPCTSTR): HICON; stdcall;
{$EXTERNALSYM LoadIcon}

function PrivateExtractIconsA(szFileName: LPCSTR; nIconIndex, cxIcon, cyIcon: Integer; var phicon: HICON;
  var piconid: UINT; nIcons, flags: UINT): UINT; stdcall;
{$EXTERNALSYM PrivateExtractIconsA}
function PrivateExtractIconsW(szFileName: LPCWSTR; nIconIndex, cxIcon, cyIcon: Integer; var phicon: HICON;
  var piconid: UINT; nIcons, flags: UINT): UINT; stdcall;
{$EXTERNALSYM PrivateExtractIconsW}
function PrivateExtractIcons(szFileName: LPCTSTR; nIconIndex, cxIcon, cyIcon: Integer; var phicon: HICON;
  var piconid: UINT; nIcons, flags: UINT): UINT; stdcall;
{$EXTERNALSYM PrivateExtractIcons}

function CreateIcon(hInstance: HINST; nWidth, nHeight: Integer; cPlanes,
  cBitsPixel: BYTE; lpbANDbits: LPBYTE; lpbXORbits: LPBYTE): HICON; stdcall;
{$EXTERNALSYM CreateIcon}

function DestroyIcon(hIcon: HICON): BOOL; stdcall;
{$EXTERNALSYM DestroyIcon}

function LookupIconIdFromDirectory(presbits: PBYTE; fIcon: BOOL): Integer; stdcall;
{$EXTERNALSYM LookupIconIdFromDirectory}

function LookupIconIdFromDirectoryEx(presbits: PBYTE; fIcon: BOOL;
  cxDesired, cyDesired: Integer; Flags: UINT): Integer; stdcall;
{$EXTERNALSYM LookupIconIdFromDirectoryEx}

function CreateIconFromResource(presbits: PBYTE; dwResSize: DWORD;
  fIcon: BOOL; dwVer: DWORD): HICON; stdcall;
{$EXTERNALSYM CreateIconFromResource}

function CreateIconFromResourceEx(presbits: PBYTE; dwResSize: DWORD; fIcon: BOOL;
  dwVer: DWORD; cxDesired, cyDesired: Integer; Flags: UINT): HICON; stdcall;
{$EXTERNALSYM CreateIconFromResourceEx}

// Icon/Cursor header//

type
  LPCURSORSHAPE = ^CURSORSHAPE;
  {$EXTERNALSYM LPCURSORSHAPE}
  tagCURSORSHAPE = record
    xHotSpot: Integer;
    yHotSpot: Integer;
    cx: Integer;
    cy: Integer;
    cbWidth: Integer;
    Planes: BYTE;
    BitsPixel: BYTE;
  end;
  {$EXTERNALSYM tagCURSORSHAPE}
  CURSORSHAPE = tagCURSORSHAPE;
  {$EXTERNALSYM CURSORSHAPE}
  TCursorShape = CURSORSHAPE;
  PCursorShape = LPCURSORSHAPE;

const
  IMAGE_BITMAP      = 0;
  {$EXTERNALSYM IMAGE_BITMAP}
  IMAGE_ICON        = 1;
  {$EXTERNALSYM IMAGE_ICON}
  IMAGE_CURSOR      = 2;
  {$EXTERNALSYM IMAGE_CURSOR}
  IMAGE_ENHMETAFILE = 3;
  {$EXTERNALSYM IMAGE_ENHMETAFILE}

  LR_DEFAULTCOLOR     = $0000;
  {$EXTERNALSYM LR_DEFAULTCOLOR}
  LR_MONOCHROME       = $0001;
  {$EXTERNALSYM LR_MONOCHROME}
  LR_COLOR            = $0002;
  {$EXTERNALSYM LR_COLOR}
  LR_COPYRETURNORG    = $0004;
  {$EXTERNALSYM LR_COPYRETURNORG}
  LR_COPYDELETEORG    = $0008;
  {$EXTERNALSYM LR_COPYDELETEORG}
  LR_LOADFROMFILE     = $0010;
  {$EXTERNALSYM LR_LOADFROMFILE}
  LR_LOADTRANSPARENT  = $0020;
  {$EXTERNALSYM LR_LOADTRANSPARENT}
  LR_DEFAULTSIZE      = $0040;
  {$EXTERNALSYM LR_DEFAULTSIZE}
  LR_VGACOLOR         = $0080;
  {$EXTERNALSYM LR_VGACOLOR}
  LR_LOADMAP3DCOLORS  = $1000;
  {$EXTERNALSYM LR_LOADMAP3DCOLORS}
  LR_CREATEDIBSECTION = $2000;
  {$EXTERNALSYM LR_CREATEDIBSECTION}
  LR_COPYFROMRESOURCE = $4000;
  {$EXTERNALSYM LR_COPYFROMRESOURCE}
  LR_SHARED           = $8000;
  {$EXTERNALSYM LR_SHARED}

function LoadImageA(hinst: HINST; lpszName: LPCSTR; uType: UINT;
  cxDesired, cyDesired: Integer; fuLoad: UINT): HANDLE; stdcall;
{$EXTERNALSYM LoadImageA}
function LoadImageW(hinst: HINST; lpszName: LPCWSTR; uType: UINT;
  cxDesired, cyDesired: Integer; fuLoad: UINT): HANDLE; stdcall;
{$EXTERNALSYM LoadImageW}
function LoadImage(hinst: HINST; lpszName: LPCTSTR; uType: UINT;
  cxDesired, cyDesired: Integer; fuLoad: UINT): HANDLE; stdcall;
{$EXTERNALSYM LoadImage}

function CopyImage(hinst: HANDLE; lpszName: UINT; cxDesired, cyDesired: Integer;
  fuFlags: UINT): HANDLE; stdcall;
{$EXTERNALSYM CopyImage}

const
  DI_MASK        = $0001;
  {$EXTERNALSYM DI_MASK}
  DI_IMAGE       = $0002;
  {$EXTERNALSYM DI_IMAGE}
  DI_NORMAL      = $0003;
  {$EXTERNALSYM DI_NORMAL}
  DI_COMPAT      = $0004;
  {$EXTERNALSYM DI_COMPAT}
  DI_DEFAULTSIZE = $0008;
  {$EXTERNALSYM DI_DEFAULTSIZE}
  DI_NOMIRROR    = $0010;
  {$EXTERNALSYM DI_NOMIRROR}

function DrawIconEx(hdc: HDC; xLeft, yTop: Integer; hIcon: HICON;
  cxWidth, cyWidth: Integer; istepIfAniCur: UINT; hbrFlickerFreeDraw: HBRUSH;
  diFlags: UINT): BOOL; stdcall;
{$EXTERNALSYM DrawIconEx}

function CreateIconIndirect(const piconinfo: ICONINFO): HICON; stdcall;
{$EXTERNALSYM CreateIconIndirect}

function CopyIcon(hIcon: HICON): HICON; stdcall;
{$EXTERNALSYM CopyIcon}

function GetIconInfo(hIcon: HICON; var piconinfo: ICONINFO): BOOL; stdcall;
{$EXTERNALSYM GetIconInfo}

const
  RES_ICON   = 1;
  {$EXTERNALSYM RES_ICON}
  RES_CURSOR = 2;
  {$EXTERNALSYM RES_CURSOR}

//
// OEM Resource Ordinal Numbers
//

  OBM_CLOSE    = 32754;
  {$EXTERNALSYM OBM_CLOSE}
  OBM_UPARROW  = 32753;
  {$EXTERNALSYM OBM_UPARROW}
  OBM_DNARROW  = 32752;
  {$EXTERNALSYM OBM_DNARROW}
  OBM_RGARROW  = 32751;
  {$EXTERNALSYM OBM_RGARROW}
  OBM_LFARROW  = 32750;
  {$EXTERNALSYM OBM_LFARROW}
  OBM_REDUCE   = 32749;
  {$EXTERNALSYM OBM_REDUCE}
  OBM_ZOOM     = 32748;
  {$EXTERNALSYM OBM_ZOOM}
  OBM_RESTORE  = 32747;
  {$EXTERNALSYM OBM_RESTORE}
  OBM_REDUCED  = 32746;
  {$EXTERNALSYM OBM_REDUCED}
  OBM_ZOOMD    = 32745;
  {$EXTERNALSYM OBM_ZOOMD}
  OBM_RESTORED = 32744;
  {$EXTERNALSYM OBM_RESTORED}
  OBM_UPARROWD = 32743;
  {$EXTERNALSYM OBM_UPARROWD}
  OBM_DNARROWD = 32742;
  {$EXTERNALSYM OBM_DNARROWD}
  OBM_RGARROWD = 32741;
  {$EXTERNALSYM OBM_RGARROWD}
  OBM_LFARROWD = 32740;
  {$EXTERNALSYM OBM_LFARROWD}
  OBM_MNARROW  = 32739;
  {$EXTERNALSYM OBM_MNARROW}
  OBM_COMBO    = 32738;
  {$EXTERNALSYM OBM_COMBO}
  OBM_UPARROWI = 32737;
  {$EXTERNALSYM OBM_UPARROWI}
  OBM_DNARROWI = 32736;
  {$EXTERNALSYM OBM_DNARROWI}
  OBM_RGARROWI = 32735;
  {$EXTERNALSYM OBM_RGARROWI}
  OBM_LFARROWI = 32734;
  {$EXTERNALSYM OBM_LFARROWI}

  OBM_OLD_CLOSE   = 32767;
  {$EXTERNALSYM OBM_OLD_CLOSE}
  OBM_SIZE        = 32766;
  {$EXTERNALSYM OBM_SIZE}
  OBM_OLD_UPARROW = 32765;
  {$EXTERNALSYM OBM_OLD_UPARROW}
  OBM_OLD_DNARROW = 32764;
  {$EXTERNALSYM OBM_OLD_DNARROW}
  OBM_OLD_RGARROW = 32763;
  {$EXTERNALSYM OBM_OLD_RGARROW}
  OBM_OLD_LFARROW = 32762;
  {$EXTERNALSYM OBM_OLD_LFARROW}
  OBM_BTSIZE      = 32761;
  {$EXTERNALSYM OBM_BTSIZE}
  OBM_CHECK       = 32760;
  {$EXTERNALSYM OBM_CHECK}
  OBM_CHECKBOXES  = 32759;
  {$EXTERNALSYM OBM_CHECKBOXES}
  OBM_BTNCORNERS  = 32758;
  {$EXTERNALSYM OBM_BTNCORNERS}
  OBM_OLD_REDUCE  = 32757;
  {$EXTERNALSYM OBM_OLD_REDUCE}
  OBM_OLD_ZOOM    = 32756;
  {$EXTERNALSYM OBM_OLD_ZOOM}
  OBM_OLD_RESTORE = 32755;
  {$EXTERNALSYM OBM_OLD_RESTORE}

  OCR_NORMAL      = 32512;
  {$EXTERNALSYM OCR_NORMAL}
  OCR_IBEAM       = 32513;
  {$EXTERNALSYM OCR_IBEAM}
  OCR_WAIT        = 32514;
  {$EXTERNALSYM OCR_WAIT}
  OCR_CROSS       = 32515;
  {$EXTERNALSYM OCR_CROSS}
  OCR_UP          = 32516;
  {$EXTERNALSYM OCR_UP}
  OCR_SIZE        = 32640; // OBSOLETE: use OCR_SIZEALL
  {$EXTERNALSYM OCR_SIZE}
  OCR_ICON        = 32641; // OBSOLETE: use OCR_NORMAL
  {$EXTERNALSYM OCR_ICON}
  OCR_SIZENWSE    = 32642;
  {$EXTERNALSYM OCR_SIZENWSE}
  OCR_SIZENESW    = 32643;
  {$EXTERNALSYM OCR_SIZENESW}
  OCR_SIZEWE      = 32644;
  {$EXTERNALSYM OCR_SIZEWE}
  OCR_SIZENS      = 32645;
  {$EXTERNALSYM OCR_SIZENS}
  OCR_SIZEALL     = 32646;
  {$EXTERNALSYM OCR_SIZEALL}
  OCR_ICOCUR      = 32647; // OBSOLETE: use OIC_WINLOGO
  {$EXTERNALSYM OCR_ICOCUR}
  OCR_NO          = 32648;
  {$EXTERNALSYM OCR_NO}
  OCR_HAND        = 32649;
  {$EXTERNALSYM OCR_HAND}
  OCR_APPSTARTING = 32650;
  {$EXTERNALSYM OCR_APPSTARTING}

  OIC_SAMPLE      = 32512;
  {$EXTERNALSYM OIC_SAMPLE}
  OIC_HAND        = 32513;
  {$EXTERNALSYM OIC_HAND}
  OIC_QUES        = 32514;
  {$EXTERNALSYM OIC_QUES}
  OIC_BANG        = 32515;
  {$EXTERNALSYM OIC_BANG}
  OIC_NOTE        = 32516;
  {$EXTERNALSYM OIC_NOTE}
  OIC_WINLOGO     = 32517;
  {$EXTERNALSYM OIC_WINLOGO}
  OIC_WARNING     = OIC_BANG;
  {$EXTERNALSYM OIC_WARNING}
  OIC_ERROR       = OIC_HAND;
  {$EXTERNALSYM OIC_ERROR}
  OIC_INFORMATION = OIC_NOTE;
  {$EXTERNALSYM OIC_INFORMATION}

  ORD_LANGDRIVER = 1; // The ordinal number for the entry point of language drivers.
  {$EXTERNALSYM ORD_LANGDRIVER}

//
// Standard Icon IDs
//

  IDI_APPLICATION = MAKEINTRESOURCE(32512);
  {$EXTERNALSYM IDI_APPLICATION}
  IDI_HAND        = MAKEINTRESOURCE(32513);
  {$EXTERNALSYM IDI_HAND}
  IDI_QUESTION    = MAKEINTRESOURCE(32514);
  {$EXTERNALSYM IDI_QUESTION}
  IDI_EXCLAMATION = MAKEINTRESOURCE(32515);
  {$EXTERNALSYM IDI_EXCLAMATION}
  IDI_ASTERISK    = MAKEINTRESOURCE(32516);
  {$EXTERNALSYM IDI_ASTERISK}
  IDI_WINLOGO = MAKEINTRESOURCE(32517);
  {$EXTERNALSYM IDI_WINLOGO}

  IDI_WARNING     = IDI_EXCLAMATION;
  {$EXTERNALSYM IDI_WARNING}
  IDI_ERROR       = IDI_HAND;
  {$EXTERNALSYM IDI_ERROR}
  IDI_INFORMATION = IDI_ASTERISK;
  {$EXTERNALSYM IDI_INFORMATION}

function LoadStringA(hInstance: HINST; uID: UINT; lpBuffer: LPSTR;
  nBufferMax: Integer): Integer; stdcall;
{$EXTERNALSYM LoadStringA}
function LoadStringW(hInstance: HINST; uID: UINT; lpBuffer: LPWSTR;
  nBufferMax: Integer): Integer; stdcall;
{$EXTERNALSYM LoadStringW}
function LoadString(hInstance: HINST; uID: UINT; lpBuffer: LPTSTR;
  nBufferMax: Integer): Integer; stdcall;
{$EXTERNALSYM LoadString}

//
// Dialog Box Command IDs
//

const
  IDOK     = 1;
  {$EXTERNALSYM IDOK}
  IDCANCEL = 2;
  {$EXTERNALSYM IDCANCEL}
  IDABORT  = 3;
  {$EXTERNALSYM IDABORT}
  IDRETRY  = 4;
  {$EXTERNALSYM IDRETRY}
  IDIGNORE = 5;
  {$EXTERNALSYM IDIGNORE}
  IDYES    = 6;
  {$EXTERNALSYM IDYES}
  IDNO     = 7;
  {$EXTERNALSYM IDNO}
  IDCLOSE  = 8;
  {$EXTERNALSYM IDCLOSE}
  IDHELP   = 9;
  {$EXTERNALSYM IDHELP}

  IDTRYAGAIN = 10;
  {$EXTERNALSYM IDTRYAGAIN}
  IDCONTINUE = 11;
  {$EXTERNALSYM IDCONTINUE}

  IDTIMEOUT  = 32000;
  {$EXTERNALSYM IDTIMEOUT}

//
// Control Manager Structures and Definitions
//

//
// Edit Control Styles
//

  ES_LEFT        = $0000;
  {$EXTERNALSYM ES_LEFT}
  ES_CENTER      = $0001;
  {$EXTERNALSYM ES_CENTER}
  ES_RIGHT       = $0002;
  {$EXTERNALSYM ES_RIGHT}
  ES_MULTILINE   = $0004;
  {$EXTERNALSYM ES_MULTILINE}
  ES_UPPERCASE   = $0008;
  {$EXTERNALSYM ES_UPPERCASE}
  ES_LOWERCASE   = $0010;
  {$EXTERNALSYM ES_LOWERCASE}
  ES_PASSWORD    = $0020;
  {$EXTERNALSYM ES_PASSWORD}
  ES_AUTOVSCROLL = $0040;
  {$EXTERNALSYM ES_AUTOVSCROLL}
  ES_AUTOHSCROLL = $0080;
  {$EXTERNALSYM ES_AUTOHSCROLL}
  ES_NOHIDESEL   = $0100;
  {$EXTERNALSYM ES_NOHIDESEL}
  ES_OEMCONVERT  = $0400;
  {$EXTERNALSYM ES_OEMCONVERT}
  ES_READONLY    = $0800;
  {$EXTERNALSYM ES_READONLY}
  ES_WANTRETURN  = $1000;
  {$EXTERNALSYM ES_WANTRETURN}
  ES_NUMBER      = $2000;
  {$EXTERNALSYM ES_NUMBER}

//
// Edit Control Notification Codes
//

  EN_SETFOCUS  = $0100;
  {$EXTERNALSYM EN_SETFOCUS}
  EN_KILLFOCUS = $0200;
  {$EXTERNALSYM EN_KILLFOCUS}
  EN_CHANGE    = $0300;
  {$EXTERNALSYM EN_CHANGE}
  EN_UPDATE    = $0400;
  {$EXTERNALSYM EN_UPDATE}
  EN_ERRSPACE  = $0500;
  {$EXTERNALSYM EN_ERRSPACE}
  EN_MAXTEXT   = $0501;
  {$EXTERNALSYM EN_MAXTEXT}
  EN_HSCROLL   = $0601;
  {$EXTERNALSYM EN_HSCROLL}
  EN_VSCROLL   = $0602;
  {$EXTERNALSYM EN_VSCROLL}

  EN_ALIGN_LTR_EC = $0700;
  {$EXTERNALSYM EN_ALIGN_LTR_EC}
  EN_ALIGN_RTL_EC = $0701;
  {$EXTERNALSYM EN_ALIGN_RTL_EC}

// Edit control EM_SETMARGIN parameters//

  EC_LEFTMARGIN  = $0001;
  {$EXTERNALSYM EC_LEFTMARGIN}
  EC_RIGHTMARGIN = $0002;
  {$EXTERNALSYM EC_RIGHTMARGIN}
  EC_USEFONTINFO = $ffff;
  {$EXTERNALSYM EC_USEFONTINFO}

// wParam of EM_GET/SETIMESTATUS //

  EMSIS_COMPOSITIONSTRING = $0001;
  {$EXTERNALSYM EMSIS_COMPOSITIONSTRING}

// lParam for EMSIS_COMPOSITIONSTRING //

  EIMES_GETCOMPSTRATONCE         = $0001;
  {$EXTERNALSYM EIMES_GETCOMPSTRATONCE}
  EIMES_CANCELCOMPSTRINFOCUS     = $0002;
  {$EXTERNALSYM EIMES_CANCELCOMPSTRINFOCUS}
  EIMES_COMPLETECOMPSTRKILLFOCUS = $0004;
  {$EXTERNALSYM EIMES_COMPLETECOMPSTRKILLFOCUS}

//
// Edit Control Messages
//

  EM_GETSEL              = $00B0;
  {$EXTERNALSYM EM_GETSEL}
  EM_SETSEL              = $00B1;
  {$EXTERNALSYM EM_SETSEL}
  EM_GETRECT             = $00B2;
  {$EXTERNALSYM EM_GETRECT}
  EM_SETRECT             = $00B3;
  {$EXTERNALSYM EM_SETRECT}
  EM_SETRECTNP           = $00B4;
  {$EXTERNALSYM EM_SETRECTNP}
  EM_SCROLL              = $00B5;
  {$EXTERNALSYM EM_SCROLL}
  EM_LINESCROLL          = $00B6;
  {$EXTERNALSYM EM_LINESCROLL}
  EM_SCROLLCARET         = $00B7;
  {$EXTERNALSYM EM_SCROLLCARET}
  EM_GETMODIFY           = $00B8;
  {$EXTERNALSYM EM_GETMODIFY}
  EM_SETMODIFY           = $00B9;
  {$EXTERNALSYM EM_SETMODIFY}
  EM_GETLINECOUNT        = $00BA;
  {$EXTERNALSYM EM_GETLINECOUNT}
  EM_LINEINDEX           = $00BB;
  {$EXTERNALSYM EM_LINEINDEX}
  EM_SETHANDLE           = $00BC;
  {$EXTERNALSYM EM_SETHANDLE}
  EM_GETHANDLE           = $00BD;
  {$EXTERNALSYM EM_GETHANDLE}
  EM_GETTHUMB            = $00BE;
  {$EXTERNALSYM EM_GETTHUMB}
  EM_LINELENGTH          = $00C1;
  {$EXTERNALSYM EM_LINELENGTH}
  EM_REPLACESEL          = $00C2;
  {$EXTERNALSYM EM_REPLACESEL}
  EM_GETLINE             = $00C4;
  {$EXTERNALSYM EM_GETLINE}
  EM_LIMITTEXT           = $00C5;
  {$EXTERNALSYM EM_LIMITTEXT}
  EM_CANUNDO             = $00C6;
  {$EXTERNALSYM EM_CANUNDO}
  EM_UNDO                = $00C7;
  {$EXTERNALSYM EM_UNDO}
  EM_FMTLINES            = $00C8;
  {$EXTERNALSYM EM_FMTLINES}
  EM_LINEFROMCHAR        = $00C9;
  {$EXTERNALSYM EM_LINEFROMCHAR}
  EM_SETTABSTOPS         = $00CB;
  {$EXTERNALSYM EM_SETTABSTOPS}
  EM_SETPASSWORDCHAR     = $00CC;
  {$EXTERNALSYM EM_SETPASSWORDCHAR}
  EM_EMPTYUNDOBUFFER     = $00CD;
  {$EXTERNALSYM EM_EMPTYUNDOBUFFER}
  EM_GETFIRSTVISIBLELINE = $00CE;
  {$EXTERNALSYM EM_GETFIRSTVISIBLELINE}
  EM_SETREADONLY         = $00CF;
  {$EXTERNALSYM EM_SETREADONLY}
  EM_SETWORDBREAKPROC    = $00D0;
  {$EXTERNALSYM EM_SETWORDBREAKPROC}
  EM_GETWORDBREAKPROC    = $00D1;
  {$EXTERNALSYM EM_GETWORDBREAKPROC}
  EM_GETPASSWORDCHAR     = $00D2;
  {$EXTERNALSYM EM_GETPASSWORDCHAR}
  EM_SETMARGINS          = $00D3;
  {$EXTERNALSYM EM_SETMARGINS}
  EM_GETMARGINS          = $00D4;
  {$EXTERNALSYM EM_GETMARGINS}
  EM_SETLIMITTEXT        = EM_LIMITTEXT; // ;win40 Name change
  {$EXTERNALSYM EM_SETLIMITTEXT}
  EM_GETLIMITTEXT        = $00D5;
  {$EXTERNALSYM EM_GETLIMITTEXT}
  EM_POSFROMCHAR         = $00D6;
  {$EXTERNALSYM EM_POSFROMCHAR}
  EM_CHARFROMPOS         = $00D7;
  {$EXTERNALSYM EM_CHARFROMPOS}

  EM_SETIMESTATUS = $00D8;
  {$EXTERNALSYM EM_SETIMESTATUS}
  EM_GETIMESTATUS = $00D9;
  {$EXTERNALSYM EM_GETIMESTATUS}

//
// EDITWORDBREAKPROC code values
//

  WB_LEFT        = 0;
  {$EXTERNALSYM WB_LEFT}
  WB_RIGHT       = 1;
  {$EXTERNALSYM WB_RIGHT}
  WB_ISDELIMITER = 2;
  {$EXTERNALSYM WB_ISDELIMITER}

//
// Button Control Styles
//

  BS_PUSHBUTTON      = $00000000;
  {$EXTERNALSYM BS_PUSHBUTTON}
  BS_DEFPUSHBUTTON   = $00000001;
  {$EXTERNALSYM BS_DEFPUSHBUTTON}
  BS_CHECKBOX        = $00000002;
  {$EXTERNALSYM BS_CHECKBOX}
  BS_AUTOCHECKBOX    = $00000003;
  {$EXTERNALSYM BS_AUTOCHECKBOX}
  BS_RADIOBUTTON     = $00000004;
  {$EXTERNALSYM BS_RADIOBUTTON}
  BS_3STATE          = $00000005;
  {$EXTERNALSYM BS_3STATE}
  BS_AUTO3STATE      = $00000006;
  {$EXTERNALSYM BS_AUTO3STATE}
  BS_GROUPBOX        = $00000007;
  {$EXTERNALSYM BS_GROUPBOX}
  BS_USERBUTTON      = $00000008;
  {$EXTERNALSYM BS_USERBUTTON}
  BS_AUTORADIOBUTTON = $00000009;
  {$EXTERNALSYM BS_AUTORADIOBUTTON}
  BS_PUSHBOX         = $0000000A;
  {$EXTERNALSYM BS_PUSHBOX}
  BS_OWNERDRAW       = $0000000B;
  {$EXTERNALSYM BS_OWNERDRAW}
  BS_TYPEMASK        = $0000000F;
  {$EXTERNALSYM BS_TYPEMASK}
  BS_LEFTTEXT        = $00000020;
  {$EXTERNALSYM BS_LEFTTEXT}
  BS_TEXT            = $00000000;
  {$EXTERNALSYM BS_TEXT}
  BS_ICON            = $00000040;
  {$EXTERNALSYM BS_ICON}
  BS_BITMAP          = $00000080;
  {$EXTERNALSYM BS_BITMAP}
  BS_LEFT            = $00000100;
  {$EXTERNALSYM BS_LEFT}
  BS_RIGHT           = $00000200;
  {$EXTERNALSYM BS_RIGHT}
  BS_CENTER          = $00000300;
  {$EXTERNALSYM BS_CENTER}
  BS_TOP             = $00000400;
  {$EXTERNALSYM BS_TOP}
  BS_BOTTOM          = $00000800;
  {$EXTERNALSYM BS_BOTTOM}
  BS_VCENTER         = $00000C00;
  {$EXTERNALSYM BS_VCENTER}
  BS_PUSHLIKE        = $00001000;
  {$EXTERNALSYM BS_PUSHLIKE}
  BS_MULTILINE       = $00002000;
  {$EXTERNALSYM BS_MULTILINE}
  BS_NOTIFY          = $00004000;
  {$EXTERNALSYM BS_NOTIFY}
  BS_FLAT            = $00008000;
  {$EXTERNALSYM BS_FLAT}
  BS_RIGHTBUTTON     = BS_LEFTTEXT;
  {$EXTERNALSYM BS_RIGHTBUTTON}

//
// User Button Notification Codes
//

  BN_CLICKED       = 0;
  {$EXTERNALSYM BN_CLICKED}
  BN_PAINT         = 1;
  {$EXTERNALSYM BN_PAINT}
  BN_HILITE        = 2;
  {$EXTERNALSYM BN_HILITE}
  BN_UNHILITE      = 3;
  {$EXTERNALSYM BN_UNHILITE}
  BN_DISABLE       = 4;
  {$EXTERNALSYM BN_DISABLE}
  BN_DOUBLECLICKED = 5;
  {$EXTERNALSYM BN_DOUBLECLICKED}
  BN_PUSHED        = BN_HILITE;
  {$EXTERNALSYM BN_PUSHED}
  BN_UNPUSHED      = BN_UNHILITE;
  {$EXTERNALSYM BN_UNPUSHED}
  BN_DBLCLK        = BN_DOUBLECLICKED;
  {$EXTERNALSYM BN_DBLCLK}
  BN_SETFOCUS      = 6;
  {$EXTERNALSYM BN_SETFOCUS}
  BN_KILLFOCUS     = 7;
  {$EXTERNALSYM BN_KILLFOCUS}

//
// Button Control Messages
//

  BM_GETCHECK = $00F0;
  {$EXTERNALSYM BM_GETCHECK}
  BM_SETCHECK = $00F1;
  {$EXTERNALSYM BM_SETCHECK}
  BM_GETSTATE = $00F2;
  {$EXTERNALSYM BM_GETSTATE}
  BM_SETSTATE = $00F3;
  {$EXTERNALSYM BM_SETSTATE}
  BM_SETSTYLE = $00F4;
  {$EXTERNALSYM BM_SETSTYLE}
  BM_CLICK    = $00F5;
  {$EXTERNALSYM BM_CLICK}
  BM_GETIMAGE = $00F6;
  {$EXTERNALSYM BM_GETIMAGE}
  BM_SETIMAGE = $00F7;
  {$EXTERNALSYM BM_SETIMAGE}

  BST_UNCHECKED     = $0000;
  {$EXTERNALSYM BST_UNCHECKED}
  BST_CHECKED       = $0001;
  {$EXTERNALSYM BST_CHECKED}
  BST_INDETERMINATE = $0002;
  {$EXTERNALSYM BST_INDETERMINATE}
  BST_PUSHED        = $0004;
  {$EXTERNALSYM BST_PUSHED}
  BST_FOCUS         = $0008;
  {$EXTERNALSYM BST_FOCUS}

//
// Static Control Constants
//

  SS_LEFT           = $00000000;
  {$EXTERNALSYM SS_LEFT}
  SS_CENTER         = $00000001;
  {$EXTERNALSYM SS_CENTER}
  SS_RIGHT          = $00000002;
  {$EXTERNALSYM SS_RIGHT}
  SS_ICON           = $00000003;
  {$EXTERNALSYM SS_ICON}
  SS_BLACKRECT      = $00000004;
  {$EXTERNALSYM SS_BLACKRECT}
  SS_GRAYRECT       = $00000005;
  {$EXTERNALSYM SS_GRAYRECT}
  SS_WHITERECT      = $00000006;
  {$EXTERNALSYM SS_WHITERECT}
  SS_BLACKFRAME     = $00000007;
  {$EXTERNALSYM SS_BLACKFRAME}
  SS_GRAYFRAME      = $00000008;
  {$EXTERNALSYM SS_GRAYFRAME}
  SS_WHITEFRAME     = $00000009;
  {$EXTERNALSYM SS_WHITEFRAME}
  SS_USERITEM       = $0000000A;
  {$EXTERNALSYM SS_USERITEM}
  SS_SIMPLE         = $0000000B;
  {$EXTERNALSYM SS_SIMPLE}
  SS_LEFTNOWORDWRAP = $0000000C;
  {$EXTERNALSYM SS_LEFTNOWORDWRAP}
  SS_OWNERDRAW      = $0000000D;
  {$EXTERNALSYM SS_OWNERDRAW}
  SS_BITMAP         = $0000000E;
  {$EXTERNALSYM SS_BITMAP}
  SS_ENHMETAFILE    = $0000000F;
  {$EXTERNALSYM SS_ENHMETAFILE}
  SS_ETCHEDHORZ     = $00000010;
  {$EXTERNALSYM SS_ETCHEDHORZ}
  SS_ETCHEDVERT     = $00000011;
  {$EXTERNALSYM SS_ETCHEDVERT}
  SS_ETCHEDFRAME    = $00000012;
  {$EXTERNALSYM SS_ETCHEDFRAME}
  SS_TYPEMASK       = $0000001F;
  {$EXTERNALSYM SS_TYPEMASK}
  SS_REALSIZECONTROL = $00000040;
  {$EXTERNALSYM SS_REALSIZECONTROL}
  SS_NOPREFIX       = $00000080; // Don't do "&" character translation
  {$EXTERNALSYM SS_NOPREFIX}
  SS_NOTIFY         = $00000100;
  {$EXTERNALSYM SS_NOTIFY}
  SS_CENTERIMAGE    = $00000200;
  {$EXTERNALSYM SS_CENTERIMAGE}
  SS_RIGHTJUST      = $00000400;
  {$EXTERNALSYM SS_RIGHTJUST}
  SS_REALSIZEIMAGE  = $00000800;
  {$EXTERNALSYM SS_REALSIZEIMAGE}
  SS_SUNKEN         = $00001000;
  {$EXTERNALSYM SS_SUNKEN}
  SS_EDITCONTROL    = $00002000;
  {$EXTERNALSYM SS_EDITCONTROL}
  SS_ENDELLIPSIS    = $00004000;
  {$EXTERNALSYM SS_ENDELLIPSIS}
  SS_PATHELLIPSIS   = $00008000;
  {$EXTERNALSYM SS_PATHELLIPSIS}
  SS_WORDELLIPSIS   = $0000C000;
  {$EXTERNALSYM SS_WORDELLIPSIS}
  SS_ELLIPSISMASK   = $0000C000;
  {$EXTERNALSYM SS_ELLIPSISMASK}

//
// Static Control Mesages
//

  STM_SETICON  = $0170;
  {$EXTERNALSYM STM_SETICON}
  STM_GETICON  = $0171;
  {$EXTERNALSYM STM_GETICON}
  STM_SETIMAGE = $0172;
  {$EXTERNALSYM STM_SETIMAGE}
  STM_GETIMAGE = $0173;
  {$EXTERNALSYM STM_GETIMAGE}
  STN_CLICKED  = 0;
  {$EXTERNALSYM STN_CLICKED}
  STN_DBLCLK   = 1;
  {$EXTERNALSYM STN_DBLCLK}
  STN_ENABLE   = 2;
  {$EXTERNALSYM STN_ENABLE}
  STN_DISABLE  = 3;
  {$EXTERNALSYM STN_DISABLE}
  STM_MSGMAX   = $0174;
  {$EXTERNALSYM STM_MSGMAX}

//
// Dialog window class
//

  WC_DIALOG = MAKEINTATOM($8002);
  {$EXTERNALSYM WC_DIALOG}

//
// Get/SetWindowWord/Long offsets for use with WC_DIALOG windows
//

  DWL_MSGRESULT = 0;
  {$EXTERNALSYM DWL_MSGRESULT}
  DWL_DLGPROC   = 4;
  {$EXTERNALSYM DWL_DLGPROC}
  DWL_USER      = 8;
  {$EXTERNALSYM DWL_USER}

  DWLP_MSGRESULT = 0;
  {$EXTERNALSYM DWLP_MSGRESULT}
  DWLP_DLGPROC   = DWLP_MSGRESULT + SizeOf(LRESULT);
  {$EXTERNALSYM DWLP_DLGPROC}
  DWLP_USER      = DWLP_DLGPROC + SizeOf(DLGPROC);
  {$EXTERNALSYM DWLP_USER}

//
// Dialog Manager Routines
//

function IsDialogMessageA(hDlg: HWND; const lpMsg: MSG): BOOL; stdcall;
{$EXTERNALSYM IsDialogMessageA}
function IsDialogMessageW(hDlg: HWND; const lpMsg: MSG): BOOL; stdcall;
{$EXTERNALSYM IsDialogMessageW}
function IsDialogMessage(hDlg: HWND; const lpMsg: MSG): BOOL; stdcall;
{$EXTERNALSYM IsDialogMessage}

function MapDialogRect(hDlg: HWND; var lpRect: RECT): BOOL; stdcall;
{$EXTERNALSYM MapDialogRect}

function DlgDirListA(hDlg: HWND; lpPathSpec: LPSTR; nIDListBox: Integer;
  nIDStaticPath: Integer; uFileType: UINT): Integer; stdcall;
{$EXTERNALSYM DlgDirListA}
function DlgDirListW(hDlg: HWND; lpPathSpec: LPWSTR; nIDListBox: Integer;
  nIDStaticPath: Integer; uFileType: UINT): Integer; stdcall;
{$EXTERNALSYM DlgDirListW}
function DlgDirList(hDlg: HWND; lpPathSpec: LPTSTR; nIDListBox: Integer;
  nIDStaticPath: Integer; uFileType: UINT): Integer; stdcall;
{$EXTERNALSYM DlgDirList}

//
// DlgDirList, DlgDirListComboBox flags values
//

const
  DDL_READWRITE = $0000;
  {$EXTERNALSYM DDL_READWRITE}
  DDL_READONLY  = $0001;
  {$EXTERNALSYM DDL_READONLY}
  DDL_HIDDEN    = $0002;
  {$EXTERNALSYM DDL_HIDDEN}
  DDL_SYSTEM    = $0004;
  {$EXTERNALSYM DDL_SYSTEM}
  DDL_DIRECTORY = $0010;
  {$EXTERNALSYM DDL_DIRECTORY}
  DDL_ARCHIVE   = $0020;
  {$EXTERNALSYM DDL_ARCHIVE}

  DDL_POSTMSGS  = $2000;
  {$EXTERNALSYM DDL_POSTMSGS}
  DDL_DRIVES    = $4000;
  {$EXTERNALSYM DDL_DRIVES}
  DDL_EXCLUSIVE = $8000;
  {$EXTERNALSYM DDL_EXCLUSIVE}

function DlgDirSelectExA(hDlg: HWND; lpString: LPSTR; nCount, nIDListBox: Integer): BOOL; stdcall;
{$EXTERNALSYM DlgDirSelectExA}
function DlgDirSelectExW(hDlg: HWND; lpString: LPWSTR; nCount, nIDListBox: Integer): BOOL; stdcall;
{$EXTERNALSYM DlgDirSelectExW}
function DlgDirSelectEx(hDlg: HWND; lpString: LPTSTR; nCount, nIDListBox: Integer): BOOL; stdcall;
{$EXTERNALSYM DlgDirSelectEx}

function DlgDirListComboBoxA(hDlg: HWND; lpPathSpec: LPSTR; nIDComboBox: Integer;
  nIDStaticPath: Integer; uFiletype: UINT): Integer; stdcall;
{$EXTERNALSYM DlgDirListComboBoxA}
function DlgDirListComboBoxW(hDlg: HWND; lpPathSpec: LPWSTR; nIDComboBox: Integer;
  nIDStaticPath: Integer; uFiletype: UINT): Integer; stdcall;
{$EXTERNALSYM DlgDirListComboBoxW}
function DlgDirListComboBox(hDlg: HWND; lpPathSpec: LPTSTR; nIDComboBox: Integer;
  nIDStaticPath: Integer; uFiletype: UINT): Integer; stdcall;
{$EXTERNALSYM DlgDirListComboBox}

function DlgDirSelectComboBoxExA(hDlg: HWND; lpString: LPSTR; nCount: Integer;
  nIDComboBox: Integer): BOOL; stdcall;
{$EXTERNALSYM DlgDirSelectComboBoxExA}
function DlgDirSelectComboBoxExW(hDlg: HWND; lpString: LPWSTR; nCount: Integer;
  nIDComboBox: Integer): BOOL; stdcall;
{$EXTERNALSYM DlgDirSelectComboBoxExW}
function DlgDirSelectComboBoxEx(hDlg: HWND; lpString: LPTSTR; nCount: Integer;
  nIDComboBox: Integer): BOOL; stdcall;
{$EXTERNALSYM DlgDirSelectComboBoxEx}

//
// Dialog Styles
//

const
  DS_ABSALIGN      = $01;
  {$EXTERNALSYM DS_ABSALIGN}
  DS_SYSMODAL      = $02;
  {$EXTERNALSYM DS_SYSMODAL}
  DS_LOCALEDIT     = $20; // Edit items get Local storage.
  {$EXTERNALSYM DS_LOCALEDIT}
  DS_SETFONT       = $40; // User specified font for Dlg controls
  {$EXTERNALSYM DS_SETFONT}
  DS_MODALFRAME    = $80; // Can be combined with WS_CAPTION
  {$EXTERNALSYM DS_MODALFRAME}
  DS_NOIDLEMSG     = $100; // WM_ENTERIDLE message will not be sent
  {$EXTERNALSYM DS_NOIDLEMSG}
  DS_SETFOREGROUND = $200; // not in win3.1
  {$EXTERNALSYM DS_SETFOREGROUND}

  DS_3DLOOK       = $0004;
  {$EXTERNALSYM DS_3DLOOK}
  DS_FIXEDSYS     = $0008;
  {$EXTERNALSYM DS_FIXEDSYS}
  DS_NOFAILCREATE = $0010;
  {$EXTERNALSYM DS_NOFAILCREATE}
  DS_CONTROL      = $0400;
  {$EXTERNALSYM DS_CONTROL}
  DS_CENTER       = $0800;
  {$EXTERNALSYM DS_CENTER}
  DS_CENTERMOUSE  = $1000;
  {$EXTERNALSYM DS_CENTERMOUSE}
  DS_CONTEXTHELP  = $2000;
  {$EXTERNALSYM DS_CONTEXTHELP}

  DS_SHELLFONT = DS_SETFONT or DS_FIXEDSYS;
  {$EXTERNALSYM DS_SHELLFONT}

//#if(_WIN32_WCE >= 0x0500)
  DS_USEPIXELS = $8000;
  {$EXTERNALSYM DS_USEPIXELS}
//#endif

  DM_GETDEFID = WM_USER + 0;
  {$EXTERNALSYM DM_GETDEFID}
  DM_SETDEFID = WM_USER + 1;
  {$EXTERNALSYM DM_SETDEFID}

  DM_REPOSITION = WM_USER + 2;
  {$EXTERNALSYM DM_REPOSITION}

//
// Returned in HIWORD() of DM_GETDEFID result if msg is supported
//

  DC_HASDEFID = $534B;
  {$EXTERNALSYM DC_HASDEFID}

//
// Dialog Codes
//

  DLGC_WANTARROWS      = $0001; // Control wants arrow keys
  {$EXTERNALSYM DLGC_WANTARROWS}
  DLGC_WANTTAB         = $0002; // Control wants tab keys
  {$EXTERNALSYM DLGC_WANTTAB}
  DLGC_WANTALLKEYS     = $0004; // Control wants all keys
  {$EXTERNALSYM DLGC_WANTALLKEYS}
  DLGC_WANTMESSAGE     = $0004; // Pass message to control
  {$EXTERNALSYM DLGC_WANTMESSAGE}
  DLGC_HASSETSEL       = $0008; // Understands EM_SETSEL message
  {$EXTERNALSYM DLGC_HASSETSEL}
  DLGC_DEFPUSHBUTTON   = $0010; // Default pushbutton
  {$EXTERNALSYM DLGC_DEFPUSHBUTTON}
  DLGC_UNDEFPUSHBUTTON = $0020; // Non-default pushbutton
  {$EXTERNALSYM DLGC_UNDEFPUSHBUTTON}
  DLGC_RADIOBUTTON     = $0040; // Radio button
  {$EXTERNALSYM DLGC_RADIOBUTTON}
  DLGC_WANTCHARS       = $0080; // Want WM_CHAR messages
  {$EXTERNALSYM DLGC_WANTCHARS}
  DLGC_STATIC          = $0100; // Static item: don't include
  {$EXTERNALSYM DLGC_STATIC}
  DLGC_BUTTON          = $2000; // Button item: can be checked
  {$EXTERNALSYM DLGC_BUTTON}

  LB_CTLCODE = 0;
  {$EXTERNALSYM LB_CTLCODE}

//
// Listbox Return Values
//

  LB_OKAY     = 0;
  {$EXTERNALSYM LB_OKAY}
  LB_ERR      = DWORD(-1);
  {$EXTERNALSYM LB_ERR}
  LB_ERRSPACE = DWORD(-2);
  {$EXTERNALSYM LB_ERRSPACE}

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

  LBN_ERRSPACE  = DWORD(-2);
  {$EXTERNALSYM LBN_ERRSPACE}
  LBN_SELCHANGE = 1;
  {$EXTERNALSYM LBN_SELCHANGE}
  LBN_DBLCLK    = 2;
  {$EXTERNALSYM LBN_DBLCLK}
  LBN_SELCANCEL = 3;
  {$EXTERNALSYM LBN_SELCANCEL}
  LBN_SETFOCUS  = 4;
  {$EXTERNALSYM LBN_SETFOCUS}
  LBN_KILLFOCUS = 5;
  {$EXTERNALSYM LBN_KILLFOCUS}

//
// Listbox messages
//

  LB_ADDSTRING           = $0180;
  {$EXTERNALSYM LB_ADDSTRING}
  LB_INSERTSTRING        = $0181;
  {$EXTERNALSYM LB_INSERTSTRING}
  LB_DELETESTRING        = $0182;
  {$EXTERNALSYM LB_DELETESTRING}
  LB_SELITEMRANGEEX      = $0183;
  {$EXTERNALSYM LB_SELITEMRANGEEX}
  LB_RESETCONTENT        = $0184;
  {$EXTERNALSYM LB_RESETCONTENT}
  LB_SETSEL              = $0185;
  {$EXTERNALSYM LB_SETSEL}
  LB_SETCURSEL           = $0186;
  {$EXTERNALSYM LB_SETCURSEL}
  LB_GETSEL              = $0187;
  {$EXTERNALSYM LB_GETSEL}
  LB_GETCURSEL           = $0188;
  {$EXTERNALSYM LB_GETCURSEL}
  LB_GETTEXT             = $0189;
  {$EXTERNALSYM LB_GETTEXT}
  LB_GETTEXTLEN          = $018A;
  {$EXTERNALSYM LB_GETTEXTLEN}
  LB_GETCOUNT            = $018B;
  {$EXTERNALSYM LB_GETCOUNT}
  LB_SELECTSTRING        = $018C;
  {$EXTERNALSYM LB_SELECTSTRING}
  LB_DIR                 = $018D;
  {$EXTERNALSYM LB_DIR}
  LB_GETTOPINDEX         = $018E;
  {$EXTERNALSYM LB_GETTOPINDEX}
  LB_FINDSTRING          = $018F;
  {$EXTERNALSYM LB_FINDSTRING}
  LB_GETSELCOUNT         = $0190;
  {$EXTERNALSYM LB_GETSELCOUNT}
  LB_GETSELITEMS         = $0191;
  {$EXTERNALSYM LB_GETSELITEMS}
  LB_SETTABSTOPS         = $0192;
  {$EXTERNALSYM LB_SETTABSTOPS}
  LB_GETHORIZONTALEXTENT = $0193;
  {$EXTERNALSYM LB_GETHORIZONTALEXTENT}
  LB_SETHORIZONTALEXTENT = $0194;
  {$EXTERNALSYM LB_SETHORIZONTALEXTENT}
  LB_SETCOLUMNWIDTH      = $0195;
  {$EXTERNALSYM LB_SETCOLUMNWIDTH}
  LB_ADDFILE             = $0196;
  {$EXTERNALSYM LB_ADDFILE}
  LB_SETTOPINDEX         = $0197;
  {$EXTERNALSYM LB_SETTOPINDEX}
  LB_GETITEMRECT         = $0198;
  {$EXTERNALSYM LB_GETITEMRECT}
  LB_GETITEMDATA         = $0199;
  {$EXTERNALSYM LB_GETITEMDATA}
  LB_SETITEMDATA         = $019A;
  {$EXTERNALSYM LB_SETITEMDATA}
  LB_SELITEMRANGE        = $019B;
  {$EXTERNALSYM LB_SELITEMRANGE}
  LB_SETANCHORINDEX      = $019C;
  {$EXTERNALSYM LB_SETANCHORINDEX}
  LB_GETANCHORINDEX      = $019D;
  {$EXTERNALSYM LB_GETANCHORINDEX}
  LB_SETCARETINDEX       = $019E;
  {$EXTERNALSYM LB_SETCARETINDEX}
  LB_GETCARETINDEX       = $019F;
  {$EXTERNALSYM LB_GETCARETINDEX}
  LB_SETITEMHEIGHT       = $01A0;
  {$EXTERNALSYM LB_SETITEMHEIGHT}
  LB_GETITEMHEIGHT       = $01A1;
  {$EXTERNALSYM LB_GETITEMHEIGHT}
  LB_FINDSTRINGEXACT     = $01A2;
  {$EXTERNALSYM LB_FINDSTRINGEXACT}
  LB_SETLOCALE           = $01A5;
  {$EXTERNALSYM LB_SETLOCALE}
  LB_GETLOCALE           = $01A6;
  {$EXTERNALSYM LB_GETLOCALE}
  LB_SETCOUNT            = $01A7;
  {$EXTERNALSYM LB_SETCOUNT}
  LB_INITSTORAGE   = $01A8;
  {$EXTERNALSYM LB_INITSTORAGE}
  LB_ITEMFROMPOINT = $01A9;
  {$EXTERNALSYM LB_ITEMFROMPOINT}
  LB_MULTIPLEADDSTRING = $01B1;
  {$EXTERNALSYM LB_MULTIPLEADDSTRING}
  LB_GETLISTBOXINFO    = $01B2;
  {$EXTERNALSYM LB_GETLISTBOXINFO}

  {$IFDEF WINXP_UP}
  LB_MSGMAX = $01B3;
  {$EXTERNALSYM LB_MSGMAX}
  {$ELSE}
  LB_MSGMAX = $01B0;
  {$EXTERNALSYM LB_MSGMAX}
  {$ENDIF WINXP_UP}

//
// Listbox Styles
//

  LBS_NOTIFY            = $0001;
  {$EXTERNALSYM LBS_NOTIFY}
  LBS_SORT              = $0002;
  {$EXTERNALSYM LBS_SORT}
  LBS_NOREDRAW          = $0004;
  {$EXTERNALSYM LBS_NOREDRAW}
  LBS_MULTIPLESEL       = $0008;
  {$EXTERNALSYM LBS_MULTIPLESEL}
  LBS_OWNERDRAWFIXED    = $0010;
  {$EXTERNALSYM LBS_OWNERDRAWFIXED}
  LBS_OWNERDRAWVARIABLE = $0020;
  {$EXTERNALSYM LBS_OWNERDRAWVARIABLE}
  LBS_HASSTRINGS        = $0040;
  {$EXTERNALSYM LBS_HASSTRINGS}
  LBS_USETABSTOPS       = $0080;
  {$EXTERNALSYM LBS_USETABSTOPS}
  LBS_NOINTEGRALHEIGHT  = $0100;
  {$EXTERNALSYM LBS_NOINTEGRALHEIGHT}
  LBS_MULTICOLUMN       = $0200;
  {$EXTERNALSYM LBS_MULTICOLUMN}
  LBS_WANTKEYBOARDINPUT = $0400;
  {$EXTERNALSYM LBS_WANTKEYBOARDINPUT}
  LBS_EXTENDEDSEL       = $0800;
  {$EXTERNALSYM LBS_EXTENDEDSEL}
  LBS_DISABLENOSCROLL   = $1000;
  {$EXTERNALSYM LBS_DISABLENOSCROLL}
  LBS_NODATA            = $2000;
  {$EXTERNALSYM LBS_NODATA}
  LBS_NOSEL             = $4000;
  {$EXTERNALSYM LBS_NOSEL}
  LBS_COMBOBOX          = $8000;
  {$EXTERNALSYM LBS_COMBOBOX}
  
  LBS_STANDARD          = LBS_NOTIFY or LBS_SORT or WS_VSCROLL or WS_BORDER;
  {$EXTERNALSYM LBS_STANDARD}

//
// Combo Box return Values
//

  CB_OKAY     = 0;
  {$EXTERNALSYM CB_OKAY}
  CB_ERR      = DWORD(-1);
  {$EXTERNALSYM CB_ERR}
  CB_ERRSPACE = DWORD(-2);
  {$EXTERNALSYM CB_ERRSPACE}

//
// Combo Box Notification Codes
//

  CBN_ERRSPACE     = DWORD(-1);
  {$EXTERNALSYM CBN_ERRSPACE}
  CBN_SELCHANGE    = 1;
  {$EXTERNALSYM CBN_SELCHANGE}
  CBN_DBLCLK       = 2;
  {$EXTERNALSYM CBN_DBLCLK}
  CBN_SETFOCUS     = 3;
  {$EXTERNALSYM CBN_SETFOCUS}
  CBN_KILLFOCUS    = 4;
  {$EXTERNALSYM CBN_KILLFOCUS}
  CBN_EDITCHANGE   = 5;
  {$EXTERNALSYM CBN_EDITCHANGE}
  CBN_EDITUPDATE   = 6;
  {$EXTERNALSYM CBN_EDITUPDATE}
  CBN_DROPDOWN     = 7;
  {$EXTERNALSYM CBN_DROPDOWN}
  CBN_CLOSEUP      = 8;
  {$EXTERNALSYM CBN_CLOSEUP}
  CBN_SELENDOK     = 9;
  {$EXTERNALSYM CBN_SELENDOK}
  CBN_SELENDCANCEL = 10;
  {$EXTERNALSYM CBN_SELENDCANCEL}

//
// Combo Box styles
//

  CBS_SIMPLE            = $0001;
  {$EXTERNALSYM CBS_SIMPLE}
  CBS_DROPDOWN          = $0002;
  {$EXTERNALSYM CBS_DROPDOWN}
  CBS_DROPDOWNLIST      = $0003;
  {$EXTERNALSYM CBS_DROPDOWNLIST}
  CBS_OWNERDRAWFIXED    = $0010;
  {$EXTERNALSYM CBS_OWNERDRAWFIXED}
  CBS_OWNERDRAWVARIABLE = $0020;
  {$EXTERNALSYM CBS_OWNERDRAWVARIABLE}
  CBS_AUTOHSCROLL       = $0040;
  {$EXTERNALSYM CBS_AUTOHSCROLL}
  CBS_OEMCONVERT        = $0080;
  {$EXTERNALSYM CBS_OEMCONVERT}
  CBS_SORT              = $0100;
  {$EXTERNALSYM CBS_SORT}
  CBS_HASSTRINGS        = $0200;
  {$EXTERNALSYM CBS_HASSTRINGS}
  CBS_NOINTEGRALHEIGHT  = $0400;
  {$EXTERNALSYM CBS_NOINTEGRALHEIGHT}
  CBS_DISABLENOSCROLL   = $0800;
  {$EXTERNALSYM CBS_DISABLENOSCROLL}
  CBS_UPPERCASE         = $2000;
  {$EXTERNALSYM CBS_UPPERCASE}
  CBS_LOWERCASE         = $4000;
  {$EXTERNALSYM CBS_LOWERCASE}

//
// Combo Box messages
//

  CB_GETEDITSEL            = $0140;
  {$EXTERNALSYM CB_GETEDITSEL}
  CB_LIMITTEXT             = $0141;
  {$EXTERNALSYM CB_LIMITTEXT}
  CB_SETEDITSEL            = $0142;
  {$EXTERNALSYM CB_SETEDITSEL}
  CB_ADDSTRING             = $0143;
  {$EXTERNALSYM CB_ADDSTRING}
  CB_DELETESTRING          = $0144;
  {$EXTERNALSYM CB_DELETESTRING}
  CB_DIR                   = $0145;
  {$EXTERNALSYM CB_DIR}
  CB_GETCOUNT              = $0146;
  {$EXTERNALSYM CB_GETCOUNT}
  CB_GETCURSEL             = $0147;
  {$EXTERNALSYM CB_GETCURSEL}
  CB_GETLBTEXT             = $0148;
  {$EXTERNALSYM CB_GETLBTEXT}
  CB_GETLBTEXTLEN          = $0149;
  {$EXTERNALSYM CB_GETLBTEXTLEN}
  CB_INSERTSTRING          = $014A;
  {$EXTERNALSYM CB_INSERTSTRING}
  CB_RESETCONTENT          = $014B;
  {$EXTERNALSYM CB_RESETCONTENT}
  CB_FINDSTRING            = $014C;
  {$EXTERNALSYM CB_FINDSTRING}
  CB_SELECTSTRING          = $014D;
  {$EXTERNALSYM CB_SELECTSTRING}
  CB_SETCURSEL             = $014E;
  {$EXTERNALSYM CB_SETCURSEL}
  CB_SHOWDROPDOWN          = $014F;
  {$EXTERNALSYM CB_SHOWDROPDOWN}
  CB_GETITEMDATA           = $0150;
  {$EXTERNALSYM CB_GETITEMDATA}
  CB_SETITEMDATA           = $0151;
  {$EXTERNALSYM CB_SETITEMDATA}
  CB_GETDROPPEDCONTROLRECT = $0152;
  {$EXTERNALSYM CB_GETDROPPEDCONTROLRECT}
  CB_SETITEMHEIGHT         = $0153;
  {$EXTERNALSYM CB_SETITEMHEIGHT}
  CB_GETITEMHEIGHT         = $0154;
  {$EXTERNALSYM CB_GETITEMHEIGHT}
  CB_SETEXTENDEDUI         = $0155;
  {$EXTERNALSYM CB_SETEXTENDEDUI}
  CB_GETEXTENDEDUI         = $0156;
  {$EXTERNALSYM CB_GETEXTENDEDUI}
  CB_GETDROPPEDSTATE       = $0157;
  {$EXTERNALSYM CB_GETDROPPEDSTATE}
  CB_FINDSTRINGEXACT       = $0158;
  {$EXTERNALSYM CB_FINDSTRINGEXACT}
  CB_SETLOCALE             = $0159;
  {$EXTERNALSYM CB_SETLOCALE}
  CB_GETLOCALE             = $015A;
  {$EXTERNALSYM CB_GETLOCALE}
  CB_GETTOPINDEX           = $015b;
  {$EXTERNALSYM CB_GETTOPINDEX}
  CB_SETTOPINDEX           = $015c;
  {$EXTERNALSYM CB_SETTOPINDEX}
  CB_GETHORIZONTALEXTENT   = $015d;
  {$EXTERNALSYM CB_GETHORIZONTALEXTENT}
  CB_SETHORIZONTALEXTENT   = $015e;
  {$EXTERNALSYM CB_SETHORIZONTALEXTENT}
  CB_GETDROPPEDWIDTH       = $015f;
  {$EXTERNALSYM CB_GETDROPPEDWIDTH}
  CB_SETDROPPEDWIDTH       = $0160;
  {$EXTERNALSYM CB_SETDROPPEDWIDTH}
  CB_INITSTORAGE           = $0161;
  {$EXTERNALSYM CB_INITSTORAGE}
  CB_MULTIPLEADDSTRING     = $0163;
  {$EXTERNALSYM CB_MULTIPLEADDSTRING}
  CB_GETCOMBOBOXINFO       = $0164;
  {$EXTERNALSYM CB_GETCOMBOBOXINFO}

  {$IFDEF WINXP_UP}
  CB_MSGMAX = $0165;
  {$EXTERNALSYM CB_MSGMAX}
  {$ELSE}
  CB_MSGMAX = $0162;
  {$EXTERNALSYM CB_MSGMAX}
  {$ENDIF WINXP_UP}

//
// Scroll Bar Styles
//

  SBS_HORZ                    = $0000;
  {$EXTERNALSYM SBS_HORZ}
  SBS_VERT                    = $0001;
  {$EXTERNALSYM SBS_VERT}
  SBS_TOPALIGN                = $0002;
  {$EXTERNALSYM SBS_TOPALIGN}
  SBS_LEFTALIGN               = $0002;
  {$EXTERNALSYM SBS_LEFTALIGN}
  SBS_BOTTOMALIGN             = $0004;
  {$EXTERNALSYM SBS_BOTTOMALIGN}
  SBS_RIGHTALIGN              = $0004;
  {$EXTERNALSYM SBS_RIGHTALIGN}
  SBS_SIZEBOXTOPLEFTALIGN     = $0002;
  {$EXTERNALSYM SBS_SIZEBOXTOPLEFTALIGN}
  SBS_SIZEBOXBOTTOMRIGHTALIGN = $0004;
  {$EXTERNALSYM SBS_SIZEBOXBOTTOMRIGHTALIGN}
  SBS_SIZEBOX                 = $0008;
  {$EXTERNALSYM SBS_SIZEBOX}
  SBS_SIZEGRIP                = $0010;
  {$EXTERNALSYM SBS_SIZEGRIP}

//
// Scroll bar messages
//

  SBM_SETPOS         = $00E0; // not in win3.1
  {$EXTERNALSYM SBM_SETPOS}
  SBM_GETPOS         = $00E1; // not in win3.1
  {$EXTERNALSYM SBM_GETPOS}
  SBM_SETRANGE       = $00E2; // not in win3.1
  {$EXTERNALSYM SBM_SETRANGE}
  SBM_SETRANGEREDRAW = $00E6; // not in win3.1
  {$EXTERNALSYM SBM_SETRANGEREDRAW}
  SBM_GETRANGE       = $00E3; // not in win3.1
  {$EXTERNALSYM SBM_GETRANGE}
  SBM_ENABLE_ARROWS  = $00E4; // not in win3.1
  {$EXTERNALSYM SBM_ENABLE_ARROWS}
  SBM_SETSCROLLINFO  = $00E9;
  {$EXTERNALSYM SBM_SETSCROLLINFO}
  SBM_GETSCROLLINFO  = $00EA;
  {$EXTERNALSYM SBM_GETSCROLLINFO}
  
  SBM_GETSCROLLBARINFO = $00EB;
  {$EXTERNALSYM SBM_GETSCROLLBARINFO}

  SIF_RANGE           = $0001;
  {$EXTERNALSYM SIF_RANGE}
  SIF_PAGE            = $0002;
  {$EXTERNALSYM SIF_PAGE}
  SIF_POS             = $0004;
  {$EXTERNALSYM SIF_POS}
  SIF_DISABLENOSCROLL = $0008;
  {$EXTERNALSYM SIF_DISABLENOSCROLL}
  SIF_TRACKPOS        = $0010;
  {$EXTERNALSYM SIF_TRACKPOS}
  SIF_ALL             = SIF_RANGE or SIF_PAGE or SIF_POS or SIF_TRACKPOS;
  {$EXTERNALSYM SIF_ALL}

type
  LPSCROLLINFO = ^SCROLLINFO;
  {$EXTERNALSYM LPSCROLLINFO}
  tagSCROLLINFO = record
    cbSize: UINT;
    fMask: UINT;
    nMin: Integer;
    nMax: Integer;
    nPage: UINT;
    nPos: Integer;
    nTrackPos: Integer;
  end;
  {$EXTERNALSYM tagSCROLLINFO}
  SCROLLINFO = tagSCROLLINFO;
  {$EXTERNALSYM SCROLLINFO}
  TScrollInfo = SCROLLINFO;
  PScrollInfo = LPSCROLLINFO;

function SetScrollInfo(hwnd: HWND; fnBar: Integer; const lpsi: SCROLLINFO;
  fRedraw: BOOL): Integer; stdcall;
{$EXTERNALSYM SetScrollInfo}

function GetScrollInfo(hwnd: HWND; fnBar: Integer; var lpsi: SCROLLINFO): BOOL; stdcall;
{$EXTERNALSYM GetScrollInfo}

//
// MDI client style bits
//

const
  MDIS_ALLCHILDSTYLES = $0001;
  {$EXTERNALSYM MDIS_ALLCHILDSTYLES}

//
// wParam Flags for WM_MDITILE and WM_MDICASCADE messages.
//

const
  MDITILE_VERTICAL     = $0000; // not in win3.1
  {$EXTERNALSYM MDITILE_VERTICAL}
  MDITILE_HORIZONTAL   = $0001; // not in win3.1
  {$EXTERNALSYM MDITILE_HORIZONTAL}
  MDITILE_SKIPDISABLED = $0002; // not in win3.1
  {$EXTERNALSYM MDITILE_SKIPDISABLED}
  MDITILE_ZORDER       = $0004;
  {$EXTERNALSYM MDITILE_ZORDER}

type
  LPMDICREATESTRUCTA = ^MDICREATESTRUCTA;
  {$EXTERNALSYM LPMDICREATESTRUCTA}
  tagMDICREATESTRUCTA = record
    szClass: LPCSTR;
    szTitle: LPCSTR;
    hOwner: HANDLE;
    x: Integer;
    y: Integer;
    cx: Integer;
    cy: Integer;
    style: DWORD;
    lParam: LPARAM; // app-defined stuff//
  end;
  {$EXTERNALSYM tagMDICREATESTRUCTA}
  MDICREATESTRUCTA = tagMDICREATESTRUCTA;
  {$EXTERNALSYM MDICREATESTRUCTA}
  TMdiCreateStructA = MDICREATESTRUCTA;
  PMdiCreateStructA = LPMDICREATESTRUCTA;

  LPMDICREATESTRUCTW = ^MDICREATESTRUCTW;
  {$EXTERNALSYM LPMDICREATESTRUCTW}
  tagMDICREATESTRUCTW = record
    szClass: LPCWSTR;
    szTitle: LPCWSTR;
    hOwner: HANDLE;
    x: Integer;
    y: Integer;
    cx: Integer;
    cy: Integer;
    style: DWORD;
    lParam: LPARAM; // app-defined stuff//
  end;
  {$EXTERNALSYM tagMDICREATESTRUCTW}
  MDICREATESTRUCTW = tagMDICREATESTRUCTW;
  {$EXTERNALSYM MDICREATESTRUCTW}
  TMdiCreateStructW = MDICREATESTRUCTW;
  PMdiCreateStructW = LPMDICREATESTRUCTW;

  {$IFDEF UNICODE}
  MDICREATESTRUCT = MDICREATESTRUCTW;
  {$EXTERNALSYM MDICREATESTRUCT}
  LPMDICREATESTRUCT = LPMDICREATESTRUCTW;
  {$EXTERNALSYM LPMDICREATESTRUCT}
  TMdiCreateStruct = TMdiCreateStructW;
  PMdiCreateStruct = PMdiCreateStructW;
  {$ELSE}
  MDICREATESTRUCT = MDICREATESTRUCTA;
  {$EXTERNALSYM MDICREATESTRUCT}
  LPMDICREATESTRUCT = LPMDICREATESTRUCTA;
  {$EXTERNALSYM LPMDICREATESTRUCT}
  TMdiCreateStruct = TMdiCreateStructA;
  PMdiCreateStruct = PMdiCreateStructA;
  {$ENDIF UNICODE}

  LPCLIENTCREATESTRUCT = ^CLIENTCREATESTRUCT;
  {$EXTERNALSYM LPCLIENTCREATESTRUCT}
  tagCLIENTCREATESTRUCT = record
    hWindowMenu: HANDLE;
    idFirstChild: UINT;
  end;
  {$EXTERNALSYM tagCLIENTCREATESTRUCT}
  CLIENTCREATESTRUCT = tagCLIENTCREATESTRUCT;
  {$EXTERNALSYM CLIENTCREATESTRUCT}
  TClientCreateStruct = CLIENTCREATESTRUCT;
  PClientCreateStruct = LPCLIENTCREATESTRUCT;

function DefFrameProcA(hWnd: HWND; hWndMDIClient: HWND; uMsg: UINT;
  wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
{$EXTERNALSYM DefFrameProcA}
function DefFrameProcW(hWnd: HWND; hWndMDIClient: HWND; uMsg: UINT;
  wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
{$EXTERNALSYM DefFrameProcW}
function DefFrameProc(hWnd: HWND; hWndMDIClient: HWND; uMsg: UINT;
  wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
{$EXTERNALSYM DefFrameProc}

function DefMDIChildProcA(hWnd: HWND; uMsg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
{$EXTERNALSYM DefMDIChildProcA}
function DefMDIChildProcW(hWnd: HWND; uMsg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
{$EXTERNALSYM DefMDIChildProcW}
function DefMDIChildProc(hWnd: HWND; uMsg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
{$EXTERNALSYM DefMDIChildProc}

function TranslateMDISysAccel(hWndClient: HWND; const lpMsg: MSG): BOOL; stdcall;
{$EXTERNALSYM TranslateMDISysAccel}

function ArrangeIconicWindows(hWnd: HWND): UINT; stdcall;
{$EXTERNALSYM ArrangeIconicWindows}

function CreateMDIWindowA(lpClassName, lpWindowName: LPCSTR; dwStyle: DWORD;
  X, Y, nWidth, nHeight: Integer; hWndParent: HWND; hInstance: HINST;
  lParam: LPARAM): HWND; stdcall;
{$EXTERNALSYM CreateMDIWindowA}
function CreateMDIWindowW(lpClassName, lpWindowName: LPCWSTR; dwStyle: DWORD;
  X, Y, nWidth, nHeight: Integer; hWndParent: HWND; hInstance: HINST;
  lParam: LPARAM): HWND; stdcall;
{$EXTERNALSYM CreateMDIWindowW}
function CreateMDIWindow(lpClassName, lpWindowName: LPCTSTR; dwStyle: DWORD;
  X, Y, nWidth, nHeight: Integer; hWndParent: HWND; hInstance: HINST;
  lParam: LPARAM): HWND; stdcall;
{$EXTERNALSYM CreateMDIWindow}

function TileWindows(hwndParent: HWND; wHow: UINT; lpRect: LPRECT; cKids: UINT;
  hwnd: HWND; lpKids: LPHWND): WORD; stdcall;
{$EXTERNALSYM TileWindows}

function CascadeWindows(hwndParent: HWND; wHow: UINT; lpRect: LPRECT;
  cKids: UINT; lpKids: LPHWND): WORD; stdcall;
{$EXTERNALSYM CascadeWindows}

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

type
  HELPPOLY = DWORD;
  {$EXTERNALSYM HELPPOLY}

  LPMULTIKEYHELPA = ^MULTIKEYHELPA;
  {$EXTERNALSYM LPMULTIKEYHELPA}
  tagMULTIKEYHELPA = record
    mkSize: DWORD;
    mkKeylist: CHAR;
    szKeyphrase: array [0..0] of CHAR;
  end;
  {$EXTERNALSYM tagMULTIKEYHELPA}
  MULTIKEYHELPA = tagMULTIKEYHELPA;
  {$EXTERNALSYM MULTIKEYHELPA}
  TMultiKeyHelpA = MULTIKEYHELPA;
  PMultiKeyHelpA = LPMULTIKEYHELPA;

  LPMULTIKEYHELPW = ^MULTIKEYHELPW;
  {$EXTERNALSYM LPMULTIKEYHELPW}
  tagMULTIKEYHELPW = record
    mkSize: DWORD;
    mkKeylist: WCHAR;
    szKeyphrase: array [0..0] of WCHAR;
  end;
  {$EXTERNALSYM tagMULTIKEYHELPW}
  MULTIKEYHELPW = tagMULTIKEYHELPW;
  {$EXTERNALSYM MULTIKEYHELPW}
  TMultiKeyHelpW = MULTIKEYHELPW;
  PMultiKeyHelpW = LPMULTIKEYHELPW;

  {$IFDEF UNICODE}
  MULTIKEYHELP = MULTIKEYHELPW;
  {$EXTERNALSYM MULTIKEYHELP}
  LPMULTIKEYHELP = LPMULTIKEYHELPW;
  {$EXTERNALSYM LPMULTIKEYHELP}
  TMultiKeyHelp = TMultiKeyHelpW;
  PMultiKeyHelp = PMultiKeyHelpW;
  {$ELSE}
  MULTIKEYHELP = MULTIKEYHELPA;
  {$EXTERNALSYM MULTIKEYHELP}
  LPMULTIKEYHELP = LPMULTIKEYHELPA;
  {$EXTERNALSYM LPMULTIKEYHELP}
  TMultiKeyHelp = TMultiKeyHelpA;
  PMultiKeyHelp = PMultiKeyHelpA;
  {$ENDIF UNICODE}

  LPHELPWININFOA = ^HELPWININFOA;
  {$EXTERNALSYM LPHELPWININFOA}
  tagHELPWININFOA = record
    wStructSize: Integer;
    x: Integer;
    y: Integer;
    dx: Integer;
    dy: Integer;
    wMax: Integer;
    rgchMember: array [0..1] of CHAR;
  end;
  {$EXTERNALSYM tagHELPWININFOA}
  HELPWININFOA = tagHELPWININFOA;
  {$EXTERNALSYM HELPWININFOA}
  THelpWinInfoA = HELPWININFOA;
  PHelpWinInfoA = LPHELPWININFOA;

  LPHELPWININFOW = ^HELPWININFOW;
  {$EXTERNALSYM LPHELPWININFOW}
  tagHELPWININFOW = record
    wStructSize: Integer;
    x: Integer;
    y: Integer;
    dx: Integer;
    dy: Integer;
    wMax: Integer;
    rgchMember: array [0..1] of WCHAR;
  end;
  {$EXTERNALSYM tagHELPWININFOW}
  HELPWININFOW = tagHELPWININFOW;
  {$EXTERNALSYM HELPWININFOW}
  THelpWinInfoW = HELPWININFOW;
  PHelpWinInfoW = LPHELPWININFOW;

  {$IFDEF UNICODE}
  HELPWININFO = HELPWININFOW;
  {$EXTERNALSYM HELPWININFO}
  LPHELPWININFO = LPHELPWININFOW;
  {$EXTERNALSYM LPHELPWININFO}
  THelpWinInfo = THelpWinInfoW;
  PHelpWinInfo = PHelpWinInfoW;
  {$ELSE}
  HELPWININFO = HELPWININFOA;
  {$EXTERNALSYM HELPWININFO}
  LPHELPWININFO = LPHELPWININFOA;
  {$EXTERNALSYM LPHELPWININFO}
  THelpWinInfo = THelpWinInfoA;
  PHelpWinInfo = PHelpWinInfoA;
  {$ENDIF UNICODE}

//
// Commands to pass to WinHelp()
//

const
  HELP_CONTEXT      = $0001; // Display topic in ulTopic
  {$EXTERNALSYM HELP_CONTEXT}
  HELP_QUIT         = $0002; // Terminate help
  {$EXTERNALSYM HELP_QUIT}
  HELP_INDEX        = $0003; // Display index
  {$EXTERNALSYM HELP_INDEX}
  HELP_CONTENTS     = $0003;
  {$EXTERNALSYM HELP_CONTENTS}
  HELP_HELPONHELP   = $0004; // Display help on using help
  {$EXTERNALSYM HELP_HELPONHELP}
  HELP_SETINDEX     = $0005; // Set current Index for multi index help
  {$EXTERNALSYM HELP_SETINDEX}
  HELP_SETCONTENTS  = $0005;
  {$EXTERNALSYM HELP_SETCONTENTS}
  HELP_CONTEXTPOPUP = $0008;
  {$EXTERNALSYM HELP_CONTEXTPOPUP}
  HELP_FORCEFILE    = $0009;
  {$EXTERNALSYM HELP_FORCEFILE}
  HELP_KEY          = $0101; // Display topic for keyword in offabData
  {$EXTERNALSYM HELP_KEY}
  HELP_COMMAND      = $0102;
  {$EXTERNALSYM HELP_COMMAND}
  HELP_PARTIALKEY   = $0105;
  {$EXTERNALSYM HELP_PARTIALKEY}
  HELP_MULTIKEY     = $0201;
  {$EXTERNALSYM HELP_MULTIKEY}
  HELP_SETWINPOS    = $0203;
  {$EXTERNALSYM HELP_SETWINPOS}

  HELP_CONTEXTMENU  = $000a;
  {$EXTERNALSYM HELP_CONTEXTMENU}
  HELP_FINDER       = $000b;
  {$EXTERNALSYM HELP_FINDER}
  HELP_WM_HELP      = $000c;
  {$EXTERNALSYM HELP_WM_HELP}
  HELP_SETPOPUP_POS = $000d;
  {$EXTERNALSYM HELP_SETPOPUP_POS}

  HELP_TCARD              = $8000;
  {$EXTERNALSYM HELP_TCARD}
  HELP_TCARD_DATA         = $0010;
  {$EXTERNALSYM HELP_TCARD_DATA}
  HELP_TCARD_OTHER_CALLER = $0011;
  {$EXTERNALSYM HELP_TCARD_OTHER_CALLER}

// These are in winhelp.h in Win95.

  IDH_NO_HELP             = 28440;
  {$EXTERNALSYM IDH_NO_HELP}
  IDH_MISSING_CONTEXT     = 28441; // Control doesn't have matching help context
  {$EXTERNALSYM IDH_MISSING_CONTEXT}
  IDH_GENERIC_HELP_BUTTON = 28442; // Property sheet help button
  {$EXTERNALSYM IDH_GENERIC_HELP_BUTTON}
  IDH_OK                  = 28443;
  {$EXTERNALSYM IDH_OK}
  IDH_CANCEL              = 28444;
  {$EXTERNALSYM IDH_CANCEL}
  IDH_HELP                = 28445;
  {$EXTERNALSYM IDH_HELP}

function WinHelpA(hWndMain: HWND; lpszHelp: LPCSTR; uCommand: UINT; dwData: ULONG_PTR): BOOL; stdcall;
{$EXTERNALSYM WinHelpA}
function WinHelpW(hWndMain: HWND; lpszHelp: LPCWSTR; uCommand: UINT; dwData: ULONG_PTR): BOOL; stdcall;
{$EXTERNALSYM WinHelpW}
function WinHelp(hWndMain: HWND; lpszHelp: LPCTSTR; uCommand: UINT; dwData: ULONG_PTR): BOOL; stdcall;
{$EXTERNALSYM WinHelp}

const
  GR_GDIOBJECTS  = 0; // Count of GDI objects
  {$EXTERNALSYM GR_GDIOBJECTS}
  GR_USEROBJECTS = 1; // Count of USER objects
  {$EXTERNALSYM GR_USEROBJECTS}

function GetGuiResources(hProcess: HANDLE; uiFlags: DWORD): DWORD; stdcall;
{$EXTERNALSYM GetGuiResources}

//
// Parameter for SystemParametersInfo()
//

const
  SPI_GETBEEP               = 1;
  {$EXTERNALSYM SPI_GETBEEP}
  SPI_SETBEEP               = 2;
  {$EXTERNALSYM SPI_SETBEEP}
  SPI_GETMOUSE              = 3;
  {$EXTERNALSYM SPI_GETMOUSE}
  SPI_SETMOUSE              = 4;
  {$EXTERNALSYM SPI_SETMOUSE}
  SPI_GETBORDER             = 5;
  {$EXTERNALSYM SPI_GETBORDER}
  SPI_SETBORDER             = 6;
  {$EXTERNALSYM SPI_SETBORDER}
  SPI_GETKEYBOARDSPEED      = 10;
  {$EXTERNALSYM SPI_GETKEYBOARDSPEED}
  SPI_SETKEYBOARDSPEED      = 11;
  {$EXTERNALSYM SPI_SETKEYBOARDSPEED}
  SPI_LANGDRIVER            = 12;
  {$EXTERNALSYM SPI_LANGDRIVER}
  SPI_ICONHORIZONTALSPACING = 13;
  {$EXTERNALSYM SPI_ICONHORIZONTALSPACING}
  SPI_GETSCREENSAVETIMEOUT  = 14;
  {$EXTERNALSYM SPI_GETSCREENSAVETIMEOUT}
  SPI_SETSCREENSAVETIMEOUT  = 15;
  {$EXTERNALSYM SPI_SETSCREENSAVETIMEOUT}
  SPI_GETSCREENSAVEACTIVE   = 16;
  {$EXTERNALSYM SPI_GETSCREENSAVEACTIVE}
  SPI_SETSCREENSAVEACTIVE   = 17;
  {$EXTERNALSYM SPI_SETSCREENSAVEACTIVE}
  SPI_GETGRIDGRANULARITY    = 18;
  {$EXTERNALSYM SPI_GETGRIDGRANULARITY}
  SPI_SETGRIDGRANULARITY    = 19;
  {$EXTERNALSYM SPI_SETGRIDGRANULARITY}
  SPI_SETDESKWALLPAPER      = 20;
  {$EXTERNALSYM SPI_SETDESKWALLPAPER}
  SPI_SETDESKPATTERN        = 21;
  {$EXTERNALSYM SPI_SETDESKPATTERN}
  SPI_GETKEYBOARDDELAY      = 22;
  {$EXTERNALSYM SPI_GETKEYBOARDDELAY}
  SPI_SETKEYBOARDDELAY      = 23;
  {$EXTERNALSYM SPI_SETKEYBOARDDELAY}
  SPI_ICONVERTICALSPACING   = 24;
  {$EXTERNALSYM SPI_ICONVERTICALSPACING}
  SPI_GETICONTITLEWRAP      = 25;
  {$EXTERNALSYM SPI_GETICONTITLEWRAP}
  SPI_SETICONTITLEWRAP      = 26;
  {$EXTERNALSYM SPI_SETICONTITLEWRAP}
  SPI_GETMENUDROPALIGNMENT  = 27;
  {$EXTERNALSYM SPI_GETMENUDROPALIGNMENT}
  SPI_SETMENUDROPALIGNMENT  = 28;
  {$EXTERNALSYM SPI_SETMENUDROPALIGNMENT}
  SPI_SETDOUBLECLKWIDTH     = 29;
  {$EXTERNALSYM SPI_SETDOUBLECLKWIDTH}
  SPI_SETDOUBLECLKHEIGHT    = 30;
  {$EXTERNALSYM SPI_SETDOUBLECLKHEIGHT}
  SPI_GETICONTITLELOGFONT   = 31;
  {$EXTERNALSYM SPI_GETICONTITLELOGFONT}
  SPI_SETDOUBLECLICKTIME    = 32;
  {$EXTERNALSYM SPI_SETDOUBLECLICKTIME}
  SPI_SETMOUSEBUTTONSWAP    = 33;
  {$EXTERNALSYM SPI_SETMOUSEBUTTONSWAP}
  SPI_SETICONTITLELOGFONT   = 34;
  {$EXTERNALSYM SPI_SETICONTITLELOGFONT}
  SPI_GETFASTTASKSWITCH     = 35;
  {$EXTERNALSYM SPI_GETFASTTASKSWITCH}
  SPI_SETFASTTASKSWITCH     = 36;
  {$EXTERNALSYM SPI_SETFASTTASKSWITCH}
  SPI_SETDRAGFULLWINDOWS    = 37;
  {$EXTERNALSYM SPI_SETDRAGFULLWINDOWS}
  SPI_GETDRAGFULLWINDOWS    = 38;
  {$EXTERNALSYM SPI_GETDRAGFULLWINDOWS}
  SPI_GETNONCLIENTMETRICS   = 41;
  {$EXTERNALSYM SPI_GETNONCLIENTMETRICS}
  SPI_SETNONCLIENTMETRICS   = 42;
  {$EXTERNALSYM SPI_SETNONCLIENTMETRICS}
  SPI_GETMINIMIZEDMETRICS   = 43;
  {$EXTERNALSYM SPI_GETMINIMIZEDMETRICS}
  SPI_SETMINIMIZEDMETRICS   = 44;
  {$EXTERNALSYM SPI_SETMINIMIZEDMETRICS}
  SPI_GETICONMETRICS        = 45;
  {$EXTERNALSYM SPI_GETICONMETRICS}
  SPI_SETICONMETRICS        = 46;
  {$EXTERNALSYM SPI_SETICONMETRICS}
  SPI_SETWORKAREA           = 47;
  {$EXTERNALSYM SPI_SETWORKAREA}
  SPI_GETWORKAREA           = 48;
  {$EXTERNALSYM SPI_GETWORKAREA}
  SPI_SETPENWINDOWS         = 49;
  {$EXTERNALSYM SPI_SETPENWINDOWS}

  SPI_GETHIGHCONTRAST       = 66;
  {$EXTERNALSYM SPI_GETHIGHCONTRAST}
  SPI_SETHIGHCONTRAST       = 67;
  {$EXTERNALSYM SPI_SETHIGHCONTRAST}
  SPI_GETKEYBOARDPREF       = 68;
  {$EXTERNALSYM SPI_GETKEYBOARDPREF}
  SPI_SETKEYBOARDPREF       = 69;
  {$EXTERNALSYM SPI_SETKEYBOARDPREF}
  SPI_GETSCREENREADER       = 70;
  {$EXTERNALSYM SPI_GETSCREENREADER}
  SPI_SETSCREENREADER       = 71;
  {$EXTERNALSYM SPI_SETSCREENREADER}
  SPI_GETANIMATION          = 72;
  {$EXTERNALSYM SPI_GETANIMATION}
  SPI_SETANIMATION          = 73;
  {$EXTERNALSYM SPI_SETANIMATION}
  SPI_GETFONTSMOOTHING      = 74;
  {$EXTERNALSYM SPI_GETFONTSMOOTHING}
  SPI_SETFONTSMOOTHING      = 75;
  {$EXTERNALSYM SPI_SETFONTSMOOTHING}
  SPI_SETDRAGWIDTH          = 76;
  {$EXTERNALSYM SPI_SETDRAGWIDTH}
  SPI_SETDRAGHEIGHT         = 77;
  {$EXTERNALSYM SPI_SETDRAGHEIGHT}
  SPI_SETHANDHELD           = 78;
  {$EXTERNALSYM SPI_SETHANDHELD}
  SPI_GETLOWPOWERTIMEOUT    = 79;
  {$EXTERNALSYM SPI_GETLOWPOWERTIMEOUT}
  SPI_GETPOWEROFFTIMEOUT    = 80;
  {$EXTERNALSYM SPI_GETPOWEROFFTIMEOUT}
  SPI_SETLOWPOWERTIMEOUT    = 81;
  {$EXTERNALSYM SPI_SETLOWPOWERTIMEOUT}
  SPI_SETPOWEROFFTIMEOUT    = 82;
  {$EXTERNALSYM SPI_SETPOWEROFFTIMEOUT}
  SPI_GETLOWPOWERACTIVE     = 83;
  {$EXTERNALSYM SPI_GETLOWPOWERACTIVE}
  SPI_GETPOWEROFFACTIVE     = 84;
  {$EXTERNALSYM SPI_GETPOWEROFFACTIVE}
  SPI_SETLOWPOWERACTIVE     = 85;
  {$EXTERNALSYM SPI_SETLOWPOWERACTIVE}
  SPI_SETPOWEROFFACTIVE     = 86;
  {$EXTERNALSYM SPI_SETPOWEROFFACTIVE}
  SPI_SETCURSORS            = 87;
  {$EXTERNALSYM SPI_SETCURSORS}
  SPI_SETICONS              = 88;
  {$EXTERNALSYM SPI_SETICONS}
  SPI_GETDEFAULTINPUTLANG   = 89;
  {$EXTERNALSYM SPI_GETDEFAULTINPUTLANG}
  SPI_SETDEFAULTINPUTLANG   = 90;
  {$EXTERNALSYM SPI_SETDEFAULTINPUTLANG}
  SPI_SETLANGTOGGLE         = 91;
  {$EXTERNALSYM SPI_SETLANGTOGGLE}
  SPI_GETWINDOWSEXTENSION   = 92;
  {$EXTERNALSYM SPI_GETWINDOWSEXTENSION}
  SPI_SETMOUSETRAILS        = 93;
  {$EXTERNALSYM SPI_SETMOUSETRAILS}
  SPI_GETMOUSETRAILS        = 94;
  {$EXTERNALSYM SPI_GETMOUSETRAILS}
  SPI_SETSCREENSAVERRUNNING = 97;
  {$EXTERNALSYM SPI_SETSCREENSAVERRUNNING}
  SPI_SCREENSAVERRUNNING    = SPI_SETSCREENSAVERRUNNING;
  {$EXTERNALSYM SPI_SCREENSAVERRUNNING}
  SPI_GETFILTERKEYS         = 50;
  {$EXTERNALSYM SPI_GETFILTERKEYS}
  SPI_SETFILTERKEYS         = 51;
  {$EXTERNALSYM SPI_SETFILTERKEYS}
  SPI_GETTOGGLEKEYS         = 52;
  {$EXTERNALSYM SPI_GETTOGGLEKEYS}
  SPI_SETTOGGLEKEYS         = 53;
  {$EXTERNALSYM SPI_SETTOGGLEKEYS}
  SPI_GETMOUSEKEYS          = 54;
  {$EXTERNALSYM SPI_GETMOUSEKEYS}
  SPI_SETMOUSEKEYS          = 55;
  {$EXTERNALSYM SPI_SETMOUSEKEYS}
  SPI_GETSHOWSOUNDS         = 56;
  {$EXTERNALSYM SPI_GETSHOWSOUNDS}
  SPI_SETSHOWSOUNDS         = 57;
  {$EXTERNALSYM SPI_SETSHOWSOUNDS}
  SPI_GETSTICKYKEYS         = 58;
  {$EXTERNALSYM SPI_GETSTICKYKEYS}
  SPI_SETSTICKYKEYS         = 59;
  {$EXTERNALSYM SPI_SETSTICKYKEYS}
  SPI_GETACCESSTIMEOUT      = 60;
  {$EXTERNALSYM SPI_GETACCESSTIMEOUT}
  SPI_SETACCESSTIMEOUT      = 61;
  {$EXTERNALSYM SPI_SETACCESSTIMEOUT}
  SPI_GETSERIALKEYS         = 62;
  {$EXTERNALSYM SPI_GETSERIALKEYS}
  SPI_SETSERIALKEYS         = 63;
  {$EXTERNALSYM SPI_SETSERIALKEYS}
  SPI_GETSOUNDSENTRY        = 64;
  {$EXTERNALSYM SPI_GETSOUNDSENTRY}
  SPI_SETSOUNDSENTRY        = 65;
  {$EXTERNALSYM SPI_SETSOUNDSENTRY}
  SPI_GETSNAPTODEFBUTTON    = 95;
  {$EXTERNALSYM SPI_GETSNAPTODEFBUTTON}
  SPI_SETSNAPTODEFBUTTON    = 96;
  {$EXTERNALSYM SPI_SETSNAPTODEFBUTTON}
  SPI_GETMOUSEHOVERWIDTH    = 98;
  {$EXTERNALSYM SPI_GETMOUSEHOVERWIDTH}
  SPI_SETMOUSEHOVERWIDTH    = 99;
  {$EXTERNALSYM SPI_SETMOUSEHOVERWIDTH}
  SPI_GETMOUSEHOVERHEIGHT   = 100;
  {$EXTERNALSYM SPI_GETMOUSEHOVERHEIGHT}
  SPI_SETMOUSEHOVERHEIGHT   = 101;
  {$EXTERNALSYM SPI_SETMOUSEHOVERHEIGHT}
  SPI_GETMOUSEHOVERTIME     = 102;
  {$EXTERNALSYM SPI_GETMOUSEHOVERTIME}
  SPI_SETMOUSEHOVERTIME     = 103;
  {$EXTERNALSYM SPI_SETMOUSEHOVERTIME}
  SPI_GETWHEELSCROLLLINES   = 104;
  {$EXTERNALSYM SPI_GETWHEELSCROLLLINES}
  SPI_SETWHEELSCROLLLINES   = 105;
  {$EXTERNALSYM SPI_SETWHEELSCROLLLINES}
  SPI_GETMENUSHOWDELAY      = 106;
  {$EXTERNALSYM SPI_GETMENUSHOWDELAY}
  SPI_SETMENUSHOWDELAY      = 107;
  {$EXTERNALSYM SPI_SETMENUSHOWDELAY}

  SPI_GETSHOWIMEUI = 110;
  {$EXTERNALSYM SPI_GETSHOWIMEUI}
  SPI_SETSHOWIMEUI = 111;
  {$EXTERNALSYM SPI_SETSHOWIMEUI}

  SPI_GETMOUSESPEED         = 112;
  {$EXTERNALSYM SPI_GETMOUSESPEED}
  SPI_SETMOUSESPEED         = 113;
  {$EXTERNALSYM SPI_SETMOUSESPEED}
  SPI_GETSCREENSAVERRUNNING = 114;
  {$EXTERNALSYM SPI_GETSCREENSAVERRUNNING}
  SPI_GETDESKWALLPAPER      = 115;
  {$EXTERNALSYM SPI_GETDESKWALLPAPER}

  SPI_GETACTIVEWINDOWTRACKING   = $1000;
  {$EXTERNALSYM SPI_GETACTIVEWINDOWTRACKING}
  SPI_SETACTIVEWINDOWTRACKING   = $1001;
  {$EXTERNALSYM SPI_SETACTIVEWINDOWTRACKING}
  SPI_GETMENUANIMATION          = $1002;
  {$EXTERNALSYM SPI_GETMENUANIMATION}
  SPI_SETMENUANIMATION          = $1003;
  {$EXTERNALSYM SPI_SETMENUANIMATION}
  SPI_GETCOMBOBOXANIMATION      = $1004;
  {$EXTERNALSYM SPI_GETCOMBOBOXANIMATION}
  SPI_SETCOMBOBOXANIMATION      = $1005;
  {$EXTERNALSYM SPI_SETCOMBOBOXANIMATION}
  SPI_GETLISTBOXSMOOTHSCROLLING = $1006;
  {$EXTERNALSYM SPI_GETLISTBOXSMOOTHSCROLLING}
  SPI_SETLISTBOXSMOOTHSCROLLING = $1007;
  {$EXTERNALSYM SPI_SETLISTBOXSMOOTHSCROLLING}
  SPI_GETGRADIENTCAPTIONS       = $1008;
  {$EXTERNALSYM SPI_GETGRADIENTCAPTIONS}
  SPI_SETGRADIENTCAPTIONS       = $1009;
  {$EXTERNALSYM SPI_SETGRADIENTCAPTIONS}
  SPI_GETKEYBOARDCUES           = $100A;
  {$EXTERNALSYM SPI_GETKEYBOARDCUES}
  SPI_SETKEYBOARDCUES           = $100B;
  {$EXTERNALSYM SPI_SETKEYBOARDCUES}
  SPI_GETMENUUNDERLINES         = SPI_GETKEYBOARDCUES;
  {$EXTERNALSYM SPI_GETMENUUNDERLINES}
  SPI_SETMENUUNDERLINES         = SPI_SETKEYBOARDCUES;
  {$EXTERNALSYM SPI_SETMENUUNDERLINES}
  SPI_GETACTIVEWNDTRKZORDER     = $100C;
  {$EXTERNALSYM SPI_GETACTIVEWNDTRKZORDER}
  SPI_SETACTIVEWNDTRKZORDER     = $100D;
  {$EXTERNALSYM SPI_SETACTIVEWNDTRKZORDER}
  SPI_GETHOTTRACKING            = $100E;
  {$EXTERNALSYM SPI_GETHOTTRACKING}
  SPI_SETHOTTRACKING            = $100F;
  {$EXTERNALSYM SPI_SETHOTTRACKING}
  SPI_GETMENUFADE               = $1012;
  {$EXTERNALSYM SPI_GETMENUFADE}
  SPI_SETMENUFADE               = $1013;
  {$EXTERNALSYM SPI_SETMENUFADE}
  SPI_GETSELECTIONFADE          = $1014;
  {$EXTERNALSYM SPI_GETSELECTIONFADE}
  SPI_SETSELECTIONFADE          = $1015;
  {$EXTERNALSYM SPI_SETSELECTIONFADE}
  SPI_GETTOOLTIPANIMATION       = $1016;
  {$EXTERNALSYM SPI_GETTOOLTIPANIMATION}
  SPI_SETTOOLTIPANIMATION       = $1017;
  {$EXTERNALSYM SPI_SETTOOLTIPANIMATION}
  SPI_GETTOOLTIPFADE            = $1018;
  {$EXTERNALSYM SPI_GETTOOLTIPFADE}
  SPI_SETTOOLTIPFADE            = $1019;
  {$EXTERNALSYM SPI_SETTOOLTIPFADE}
  SPI_GETCURSORSHADOW           = $101A;
  {$EXTERNALSYM SPI_GETCURSORSHADOW}
  SPI_SETCURSORSHADOW           = $101B;
  {$EXTERNALSYM SPI_SETCURSORSHADOW}

  SPI_GETMOUSESONAR             = $101C;
  {$EXTERNALSYM SPI_GETMOUSESONAR}
  SPI_SETMOUSESONAR             = $101D;
  {$EXTERNALSYM SPI_SETMOUSESONAR}
  SPI_GETMOUSECLICKLOCK         = $101E;
  {$EXTERNALSYM SPI_GETMOUSECLICKLOCK}
  SPI_SETMOUSECLICKLOCK         = $101F;
  {$EXTERNALSYM SPI_SETMOUSECLICKLOCK}
  SPI_GETMOUSEVANISH            = $1020;
  {$EXTERNALSYM SPI_GETMOUSEVANISH}
  SPI_SETMOUSEVANISH            = $1021;
  {$EXTERNALSYM SPI_SETMOUSEVANISH}
  SPI_GETFLATMENU               = $1022;
  {$EXTERNALSYM SPI_GETFLATMENU}
  SPI_SETFLATMENU               = $1023;
  {$EXTERNALSYM SPI_SETFLATMENU}
  SPI_GETDROPSHADOW             = $1024;
  {$EXTERNALSYM SPI_GETDROPSHADOW}
  SPI_SETDROPSHADOW             = $1025;
  {$EXTERNALSYM SPI_SETDROPSHADOW}
  SPI_GETBLOCKSENDINPUTRESETS   = $1026;
  {$EXTERNALSYM SPI_GETBLOCKSENDINPUTRESETS}
  SPI_SETBLOCKSENDINPUTRESETS   = $1027;
  {$EXTERNALSYM SPI_SETBLOCKSENDINPUTRESETS}

  SPI_GETUIEFFECTS = $103E;
  {$EXTERNALSYM SPI_GETUIEFFECTS}
  SPI_SETUIEFFECTS = $103F;
  {$EXTERNALSYM SPI_SETUIEFFECTS}

  SPI_GETFOREGROUNDLOCKTIMEOUT = $2000;
  {$EXTERNALSYM SPI_GETFOREGROUNDLOCKTIMEOUT}
  SPI_SETFOREGROUNDLOCKTIMEOUT = $2001;
  {$EXTERNALSYM SPI_SETFOREGROUNDLOCKTIMEOUT}
  SPI_GETACTIVEWNDTRKTIMEOUT   = $2002;
  {$EXTERNALSYM SPI_GETACTIVEWNDTRKTIMEOUT}
  SPI_SETACTIVEWNDTRKTIMEOUT   = $2003;
  {$EXTERNALSYM SPI_SETACTIVEWNDTRKTIMEOUT}
  SPI_GETFOREGROUNDFLASHCOUNT  = $2004;
  {$EXTERNALSYM SPI_GETFOREGROUNDFLASHCOUNT}
  SPI_SETFOREGROUNDFLASHCOUNT  = $2005;
  {$EXTERNALSYM SPI_SETFOREGROUNDFLASHCOUNT}
  SPI_GETCARETWIDTH            = $2006;
  {$EXTERNALSYM SPI_GETCARETWIDTH}
  SPI_SETCARETWIDTH            = $2007;
  {$EXTERNALSYM SPI_SETCARETWIDTH}

  SPI_GETMOUSECLICKLOCKTIME    = $2008;
  {$EXTERNALSYM SPI_GETMOUSECLICKLOCKTIME}
  SPI_SETMOUSECLICKLOCKTIME    = $2009;
  {$EXTERNALSYM SPI_SETMOUSECLICKLOCKTIME}
  SPI_GETFONTSMOOTHINGTYPE     = $200A;
  {$EXTERNALSYM SPI_GETFONTSMOOTHINGTYPE}
  SPI_SETFONTSMOOTHINGTYPE     = $200B;
  {$EXTERNALSYM SPI_SETFONTSMOOTHINGTYPE}

// constants for SPI_GETFONTSMOOTHINGTYPE and SPI_SETFONTSMOOTHINGTYPE

  FE_FONTSMOOTHINGSTANDARD     = $0001;
  {$EXTERNALSYM FE_FONTSMOOTHINGSTANDARD}
  FE_FONTSMOOTHINGCLEARTYPE    = $0002;
  {$EXTERNALSYM FE_FONTSMOOTHINGCLEARTYPE}
  FE_FONTSMOOTHINGDOCKING      = $8000;
  {$EXTERNALSYM FE_FONTSMOOTHINGDOCKING}

  SPI_GETFONTSMOOTHINGCONTRAST = $200C;
  {$EXTERNALSYM SPI_GETFONTSMOOTHINGCONTRAST}
  SPI_SETFONTSMOOTHINGCONTRAST = $200D;
  {$EXTERNALSYM SPI_SETFONTSMOOTHINGCONTRAST}

  SPI_GETFOCUSBORDERWIDTH      = $200E;
  {$EXTERNALSYM SPI_GETFOCUSBORDERWIDTH}
  SPI_SETFOCUSBORDERWIDTH      = $200F;
  {$EXTERNALSYM SPI_SETFOCUSBORDERWIDTH}
  SPI_GETFOCUSBORDERHEIGHT     = $2010;
  {$EXTERNALSYM SPI_GETFOCUSBORDERHEIGHT}
  SPI_SETFOCUSBORDERHEIGHT     = $2011;
  {$EXTERNALSYM SPI_SETFOCUSBORDERHEIGHT}

  SPI_GETFONTSMOOTHINGORIENTATION = $2012;
  {$EXTERNALSYM SPI_GETFONTSMOOTHINGORIENTATION}
  SPI_SETFONTSMOOTHINGORIENTATION = $2013;
  {$EXTERNALSYM SPI_SETFONTSMOOTHINGORIENTATION}

// constants for SPI_GETFONTSMOOTHINGORIENTATION and SPI_SETFONTSMOOTHINGORIENTATION:

  FE_FONTSMOOTHINGORIENTATIONBGR = $0000;
  {$EXTERNALSYM FE_FONTSMOOTHINGORIENTATIONBGR}
  FE_FONTSMOOTHINGORIENTATIONRGB = $0001;
  {$EXTERNALSYM FE_FONTSMOOTHINGORIENTATIONRGB}

//
// Flags
//

  SPIF_UPDATEINIFILE    = $0001;
  {$EXTERNALSYM SPIF_UPDATEINIFILE}
  SPIF_SENDWININICHANGE = $0002;
  {$EXTERNALSYM SPIF_SENDWININICHANGE}
  SPIF_SENDCHANGE       = SPIF_SENDWININICHANGE;
  {$EXTERNALSYM SPIF_SENDCHANGE}

  METRICS_USEDEFAULT = DWORD(-1);
  {$EXTERNALSYM METRICS_USEDEFAULT}

type
  LPNONCLIENTMETRICSA = ^NONCLIENTMETRICSA;
  {$EXTERNALSYM LPNONCLIENTMETRICSA}
  tagNONCLIENTMETRICSA = record
    cbSize: UINT;
    iBorderWidth: Integer;
    iScrollWidth: Integer;
    iScrollHeight: Integer;
    iCaptionWidth: Integer;
    iCaptionHeight: Integer;
    lfCaptionFont: LOGFONTA;
    iSmCaptionWidth: Integer;
    iSmCaptionHeight: Integer;
    lfSmCaptionFont: LOGFONTA;
    iMenuWidth: Integer;
    iMenuHeight: Integer;
    lfMenuFont: LOGFONTA;
    lfStatusFont: LOGFONTA;
    lfMessageFont: LOGFONTA;
  end;
  {$EXTERNALSYM tagNONCLIENTMETRICSA}
  NONCLIENTMETRICSA = tagNONCLIENTMETRICSA;
  {$EXTERNALSYM NONCLIENTMETRICSA}
  TNonClientMetricsA = NONCLIENTMETRICSA;
  PNonClientMetricsA = LPNONCLIENTMETRICSA;

  LPNONCLIENTMETRICSW = ^NONCLIENTMETRICSW;
  {$EXTERNALSYM LPNONCLIENTMETRICSW}
  tagNONCLIENTMETRICSW = record
    cbSize: UINT;
    iBorderWidth: Integer;
    iScrollWidth: Integer;
    iScrollHeight: Integer;
    iCaptionWidth: Integer;
    iCaptionHeight: Integer;
    lfCaptionFont: LOGFONTW;
    iSmCaptionWidth: Integer;
    iSmCaptionHeight: Integer;
    lfSmCaptionFont: LOGFONTW;
    iMenuWidth: Integer;
    iMenuHeight: Integer;
    lfMenuFont: LOGFONTW;
    lfStatusFont: LOGFONTW;
    lfMessageFont: LOGFONTW;
  end;
  {$EXTERNALSYM tagNONCLIENTMETRICSW}
  NONCLIENTMETRICSW = tagNONCLIENTMETRICSW;
  {$EXTERNALSYM NONCLIENTMETRICSW}
  TNonClientMetricsW = NONCLIENTMETRICSW;
  PNonClientMetricsW = LPNONCLIENTMETRICSW;

  {$IFDEF UNICODE}
  NONCLIENTMETRICS = NONCLIENTMETRICSW;
  {$EXTERNALSYM NONCLIENTMETRICS}
  LPNONCLIENTMETRICS = LPNONCLIENTMETRICSW;
  {$EXTERNALSYM LPNONCLIENTMETRICS}
  TNonClientMetrics = TNonClientMetricsW;
  PNonClientMetrics = PNonClientMetricsW;
  {$ELSE}
  NONCLIENTMETRICS = NONCLIENTMETRICSA;
  {$EXTERNALSYM NONCLIENTMETRICS}
  LPNONCLIENTMETRICS = LPNONCLIENTMETRICSA;
  {$EXTERNALSYM LPNONCLIENTMETRICS}
  TNonClientMetrics = TNonClientMetricsA;
  PNonClientMetrics = PNonClientMetricsA;
  {$ENDIF UNICODE}

const
  ARW_BOTTOMLEFT  = $0000;
  {$EXTERNALSYM ARW_BOTTOMLEFT}
  ARW_BOTTOMRIGHT = $0001;
  {$EXTERNALSYM ARW_BOTTOMRIGHT}
  ARW_TOPLEFT     = $0002;
  {$EXTERNALSYM ARW_TOPLEFT}
  ARW_TOPRIGHT    = $0003;
  {$EXTERNALSYM ARW_TOPRIGHT}
  ARW_STARTMASK   = $0003;
  {$EXTERNALSYM ARW_STARTMASK}
  ARW_STARTRIGHT  = $0001;
  {$EXTERNALSYM ARW_STARTRIGHT}
  ARW_STARTTOP    = $0002;
  {$EXTERNALSYM ARW_STARTTOP}

  ARW_LEFT  = $0000;
  {$EXTERNALSYM ARW_LEFT}
  ARW_RIGHT = $0000;
  {$EXTERNALSYM ARW_RIGHT}
  ARW_UP    = $0004;
  {$EXTERNALSYM ARW_UP}
  ARW_DOWN  = $0004;
  {$EXTERNALSYM ARW_DOWN}
  ARW_HIDE  = $0008;
  {$EXTERNALSYM ARW_HIDE}

type
  LPMINIMIZEDMETRICS = ^MINIMIZEDMETRICS;
  {$EXTERNALSYM LPMINIMIZEDMETRICS}
  tagMINIMIZEDMETRICS = record
    cbSize: UINT;
    iWidth: Integer;
    iHorzGap: Integer;
    iVertGap: Integer;
    iArrange: Integer;
  end;
  {$EXTERNALSYM tagMINIMIZEDMETRICS}
  MINIMIZEDMETRICS = tagMINIMIZEDMETRICS;
  {$EXTERNALSYM MINIMIZEDMETRICS}
  TMinimizedMetrics = MINIMIZEDMETRICS;
  PMinimizedMetrics = LPMINIMIZEDMETRICS;

  LPICONMETRICSA = ^ICONMETRICSA;
  {$EXTERNALSYM LPICONMETRICSA}
  tagICONMETRICSA = record
    cbSize: UINT;
    iHorzSpacing: Integer;
    iVertSpacing: Integer;
    iTitleWrap: Integer;
    lfFont: LOGFONTA;
  end;
  {$EXTERNALSYM tagICONMETRICSA}
  ICONMETRICSA = tagICONMETRICSA;
  {$EXTERNALSYM ICONMETRICSA}
  TIconMetricsA = ICONMETRICSA;
  PIconMetricsA = LPICONMETRICSA;

  LPICONMETRICSW = ^ICONMETRICSW;
  {$EXTERNALSYM LPICONMETRICSW}
  tagICONMETRICSW = record
    cbSize: UINT;
    iHorzSpacing: Integer;
    iVertSpacing: Integer;
    iTitleWrap: Integer;
    lfFont: LOGFONTW;
  end;
  {$EXTERNALSYM tagICONMETRICSW}
  ICONMETRICSW = tagICONMETRICSW;
  {$EXTERNALSYM ICONMETRICSW}
  TIconMetricsW = ICONMETRICSW;
  PIconMetricsW = LPICONMETRICSW;

  {$IFDEF UNICODE}
  ICONMETRICS = ICONMETRICSW;
  {$EXTERNALSYM ICONMETRICS}
  LPICONMETRICS = LPICONMETRICSW;
  {$EXTERNALSYM LPICONMETRICS}
  TIconMetrics = TIconMetricsW;
  PIconMetrics = PIconMetricsW;
  {$ELSE}
  ICONMETRICS = ICONMETRICSA;
  {$EXTERNALSYM ICONMETRICS}
  LPICONMETRICS = LPICONMETRICSA;
  {$EXTERNALSYM LPICONMETRICS}
  TIconMetrics = TIconMetricsA;
  PIconMetrics = PIconMetricsA;
  {$ENDIF UNICODE}

  LPANIMATIONINFO = ^ANIMATIONINFO;
  {$EXTERNALSYM LPANIMATIONINFO}
  tagANIMATIONINFO = record
    cbSize: UINT;
    iMinAnimate: Integer;
  end;
  {$EXTERNALSYM tagANIMATIONINFO}
  ANIMATIONINFO = tagANIMATIONINFO;
  {$EXTERNALSYM ANIMATIONINFO}
  TAnimationInfo = ANIMATIONINFO;
  PAnimationInfo = LPANIMATIONINFO;

  LPSERIALKEYSA = ^SERIALKEYSA;
  {$EXTERNALSYM LPSERIALKEYSA}
  tagSERIALKEYSA = record
    cbSize: UINT;
    dwFlags: DWORD;
    lpszActivePort: LPSTR;
    lpszPort: LPSTR;
    iBaudRate: UINT;
    iPortState: UINT;
    iActive: UINT;
  end;
  {$EXTERNALSYM tagSERIALKEYSA}
  SERIALKEYSA = tagSERIALKEYSA;
  {$EXTERNALSYM SERIALKEYSA}
  TSerialKeysA = SERIALKEYSA;
  PSerialKeysA = LPSERIALKEYSA;

  LPSERIALKEYSW = ^SERIALKEYSW;
  {$EXTERNALSYM LPSERIALKEYSW}
  tagSERIALKEYSW = record
    cbSize: UINT;
    dwFlags: DWORD;
    lpszActivePort: LPWSTR;
    lpszPort: LPWSTR;
    iBaudRate: UINT;
    iPortState: UINT;
    iActive: UINT;
  end;
  {$EXTERNALSYM tagSERIALKEYSW}
  SERIALKEYSW = tagSERIALKEYSW;
  {$EXTERNALSYM SERIALKEYSW}
  TSerialKeysW = SERIALKEYSW;
  PSerialKeysW = LPSERIALKEYSW;

  {$IFDEF UNICODE}
  SERIALKEYS = SERIALKEYSW;
  {$EXTERNALSYM SERIALKEYS}
  LPSERIALKEYS = LPSERIALKEYSW;
  {$EXTERNALSYM LPSERIALKEYS}
  TSerialKeys = TSerialKeysW;
  PSerialKeys = PSerialKeysW;
  {$ELSE}
  SERIALKEYS = SERIALKEYSA;
  {$EXTERNALSYM SERIALKEYS}
  LPSERIALKEYS = LPSERIALKEYSA;
  {$EXTERNALSYM LPSERIALKEYS}
  TSerialKeys = TSerialKeysA;
  PSerialKeys = PSerialKeysA;
  {$ENDIF UNICODE}

// flags for SERIALKEYS dwFlags field//

const
  SERKF_SERIALKEYSON = $00000001;
  {$EXTERNALSYM SERKF_SERIALKEYSON}
  SERKF_AVAILABLE    = $00000002;
  {$EXTERNALSYM SERKF_AVAILABLE}
  SERKF_INDICATOR    = $00000004;
  {$EXTERNALSYM SERKF_INDICATOR}

type
  LPHIGHCONTRASTA = ^HIGHCONTRASTA;
  {$EXTERNALSYM LPHIGHCONTRASTA}
  tagHIGHCONTRASTA = record
    cbSize: UINT;
    dwFlags: DWORD;
    lpszDefaultScheme: LPSTR;
  end;
  {$EXTERNALSYM tagHIGHCONTRASTA}
  HIGHCONTRASTA = tagHIGHCONTRASTA;
  {$EXTERNALSYM HIGHCONTRASTA}
  THighContrastA = HIGHCONTRASTA;
  PHighContrastA = LPHIGHCONTRASTA;

  LPHIGHCONTRASTW = ^HIGHCONTRASTW;
  {$EXTERNALSYM LPHIGHCONTRASTW}
  tagHIGHCONTRASTW = record
    cbSize: UINT;
    dwFlags: DWORD;
    lpszDefaultScheme: LPWSTR;
  end;
  {$EXTERNALSYM tagHIGHCONTRASTW}
  HIGHCONTRASTW = tagHIGHCONTRASTW;
  {$EXTERNALSYM HIGHCONTRASTW}
  THighContrastW = HIGHCONTRASTW;
  PHighContrastW = LPHIGHCONTRASTW;

  {$IFDEF UNICODE}
  HIGHCONTRAST = HIGHCONTRASTW;
  {$EXTERNALSYM HIGHCONTRAST}
  LPHIGHCONTRAST = LPHIGHCONTRASTW;
  {$EXTERNALSYM LPHIGHCONTRAST}
  THighContrast = THighContrastW;
  PHighContrast = PHighContrastW;
  {$ELSE}
  HIGHCONTRAST = HIGHCONTRASTA;
  {$EXTERNALSYM HIGHCONTRAST}
  LPHIGHCONTRAST = LPHIGHCONTRASTA;
  {$EXTERNALSYM LPHIGHCONTRAST}
  THighContrast = THighContrastA;
  PHighContrast = PHighContrastA;
  {$ENDIF UNICODE}

// flags for HIGHCONTRAST dwFlags field//

const
  HCF_HIGHCONTRASTON  = $00000001;
  {$EXTERNALSYM HCF_HIGHCONTRASTON}
  HCF_AVAILABLE       = $00000002;
  {$EXTERNALSYM HCF_AVAILABLE}
  HCF_HOTKEYACTIVE    = $00000004;
  {$EXTERNALSYM HCF_HOTKEYACTIVE}
  HCF_CONFIRMHOTKEY   = $00000008;
  {$EXTERNALSYM HCF_CONFIRMHOTKEY}
  HCF_HOTKEYSOUND     = $00000010;
  {$EXTERNALSYM HCF_HOTKEYSOUND}
  HCF_INDICATOR       = $00000020;
  {$EXTERNALSYM HCF_INDICATOR}
  HCF_HOTKEYAVAILABLE = $00000040;
  {$EXTERNALSYM HCF_HOTKEYAVAILABLE}

// Flags for ChangeDisplaySettings//

  CDS_UPDATEREGISTRY  = $00000001;
  {$EXTERNALSYM CDS_UPDATEREGISTRY}
  CDS_TEST            = $00000002;
  {$EXTERNALSYM CDS_TEST}
  CDS_FULLSCREEN      = $00000004;
  {$EXTERNALSYM CDS_FULLSCREEN}
  CDS_GLOBAL          = $00000008;
  {$EXTERNALSYM CDS_GLOBAL}
  CDS_SET_PRIMARY     = $00000010;
  {$EXTERNALSYM CDS_SET_PRIMARY}
  CDS_VIDEOPARAMETERS = $00000020;
  {$EXTERNALSYM CDS_VIDEOPARAMETERS}
  CDS_RESET           = $40000000;
  {$EXTERNALSYM CDS_RESET}
  CDS_NORESET         = $10000000;
  {$EXTERNALSYM CDS_NORESET}

// #include <tvout.h>

// Return values for ChangeDisplaySettings

  DISP_CHANGE_SUCCESSFUL = 0;
  {$EXTERNALSYM DISP_CHANGE_SUCCESSFUL}
  DISP_CHANGE_RESTART    = 1;
  {$EXTERNALSYM DISP_CHANGE_RESTART}
  DISP_CHANGE_FAILED     = DWORD(-1);
  {$EXTERNALSYM DISP_CHANGE_FAILED}
  DISP_CHANGE_BADMODE    = DWORD(-2);
  {$EXTERNALSYM DISP_CHANGE_BADMODE}
  DISP_CHANGE_NOTUPDATED = DWORD(-3);
  {$EXTERNALSYM DISP_CHANGE_NOTUPDATED}
  DISP_CHANGE_BADFLAGS   = DWORD(-4);
  {$EXTERNALSYM DISP_CHANGE_BADFLAGS}
  DISP_CHANGE_BADPARAM   = DWORD(-5);
  {$EXTERNALSYM DISP_CHANGE_BADPARAM}
  DISP_CHANGE_BADDUALVIEW = DWORD(-6);
  {$EXTERNALSYM DISP_CHANGE_BADDUALVIEW}

function ChangeDisplaySettingsA(lpDevMode: LPDEVMODEA; dwFlags: DWORD): LONG; stdcall;
{$EXTERNALSYM ChangeDisplaySettingsA}
function ChangeDisplaySettingsW(lpDevMode: LPDEVMODEW; dwFlags: DWORD): LONG; stdcall;
{$EXTERNALSYM ChangeDisplaySettingsW}
function ChangeDisplaySettings(lpDevMode: LPDEVMODE; dwFlags: DWORD): LONG; stdcall;
{$EXTERNALSYM ChangeDisplaySettings}

function ChangeDisplaySettingsExA(lpszDeviceName: LPCSTR; lpDevMode: LPDEVMODEA;
  hwnd: HWND; dwflags: DWORD; lParam: LPVOID): LONG; stdcall;
{$EXTERNALSYM ChangeDisplaySettingsExA}
function ChangeDisplaySettingsExW(lpszDeviceName: LPCWSTR; lpDevMode: LPDEVMODEW;
  hwnd: HWND; dwflags: DWORD; lParam: LPVOID): LONG; stdcall;
{$EXTERNALSYM ChangeDisplaySettingsExW}
function ChangeDisplaySettingsEx(lpszDeviceName: LPCTSTR; lpDevMode: LPDEVMODE;
  hwnd: HWND; dwflags: DWORD; lParam: LPVOID): LONG; stdcall;
{$EXTERNALSYM ChangeDisplaySettingsEx}

const
  ENUM_CURRENT_SETTINGS  = DWORD(-1);
  {$EXTERNALSYM ENUM_CURRENT_SETTINGS}
  ENUM_REGISTRY_SETTINGS = DWORD(-2);
  {$EXTERNALSYM ENUM_REGISTRY_SETTINGS}

function EnumDisplaySettingsA(lpszDeviceName: LPCSTR; iModeNum: DWORD;
  var lpDevMode: DEVMODEA): BOOL; stdcall;
{$EXTERNALSYM EnumDisplaySettingsA}
function EnumDisplaySettingsW(lpszDeviceName: LPCWSTR; iModeNum: DWORD;
  var lpDevMode: DEVMODEW): BOOL; stdcall;
{$EXTERNALSYM EnumDisplaySettingsW}
function EnumDisplaySettings(lpszDeviceName: LPCTSTR; iModeNum: DWORD;
  var lpDevMode: DEVMODE): BOOL; stdcall;
{$EXTERNALSYM EnumDisplaySettings}

function EnumDisplaySettingsExA(lpszDeviceName: LPCSTR; iModeNum: DWORD;
  var lpDevMode: DEVMODEA; dwFlags: DWORD): BOOL; stdcall;
{$EXTERNALSYM EnumDisplaySettingsExA}
function EnumDisplaySettingsExW(lpszDeviceName: LPCWSTR; iModeNum: DWORD;
  var lpDevMode: DEVMODEW; dwFlags: DWORD): BOOL; stdcall;
{$EXTERNALSYM EnumDisplaySettingsExW}
function EnumDisplaySettingsEx(lpszDeviceName: LPCTSTR; iModeNum: DWORD;
  var lpDevMode: DEVMODE; dwFlags: DWORD): BOOL; stdcall;
{$EXTERNALSYM EnumDisplaySettingsEx}

// Flags for EnumDisplaySettingsEx//

const
  EDS_RAWMODE = $00000002;
  {$EXTERNALSYM EDS_RAWMODE}

function EnumDisplayDevicesA(lpDevice: LPCSTR; iDevNum: DWORD;
  var lpDisplayDevice: DISPLAY_DEVICEA; dwFlags: DWORD): BOOL; stdcall;
{$EXTERNALSYM EnumDisplayDevicesA}
function EnumDisplayDevicesW(lpDevice: LPCWSTR; iDevNum: DWORD;
  var lpDisplayDevice: DISPLAY_DEVICEW; dwFlags: DWORD): BOOL; stdcall;
{$EXTERNALSYM EnumDisplayDevicesW}
function EnumDisplayDevices(lpDevice: LPCTSTR; iDevNum: DWORD;
  var lpDisplayDevice: DISPLAY_DEVICE; dwFlags: DWORD): BOOL; stdcall;
{$EXTERNALSYM EnumDisplayDevices}

function SystemParametersInfoA(uiAction: UINT; uiParam: UINT;
  pvParam: PVOID; fWinIni: UINT): BOOL; stdcall;
{$EXTERNALSYM SystemParametersInfoA}
function SystemParametersInfoW(uiAction: UINT; uiParam: UINT;
  pvParam: PVOID; fWinIni: UINT): BOOL; stdcall;
{$EXTERNALSYM SystemParametersInfoW}
function SystemParametersInfo(uiAction: UINT; uiParam: UINT;
  pvParam: PVOID; fWinIni: UINT): BOOL; stdcall;
{$EXTERNALSYM SystemParametersInfo}

//
// Accessibility support
//

type
  LPFILTERKEYS = ^FILTERKEYS;
  {$EXTERNALSYM LPFILTERKEYS}
  tagFILTERKEYS = record
    cbSize: UINT;
    dwFlags: DWORD;
    iWaitMSec: DWORD;   // Acceptance Delay
    iDelayMSec: DWORD;  // Delay Until Repeat
    iRepeatMSec: DWORD; // Repeat Rate
    iBounceMSec: DWORD; // Debounce Time
  end;
  {$EXTERNALSYM tagFILTERKEYS}
  FILTERKEYS = tagFILTERKEYS;
  {$EXTERNALSYM FILTERKEYS}
  TFilterKeys = FILTERKEYS;
  PFilterKeys = LPFILTERKEYS;

//
// FILTERKEYS dwFlags field
//

const
  FKF_FILTERKEYSON  = $00000001;
  {$EXTERNALSYM FKF_FILTERKEYSON}
  FKF_AVAILABLE     = $00000002;
  {$EXTERNALSYM FKF_AVAILABLE}
  FKF_HOTKEYACTIVE  = $00000004;
  {$EXTERNALSYM FKF_HOTKEYACTIVE}
  FKF_CONFIRMHOTKEY = $00000008;
  {$EXTERNALSYM FKF_CONFIRMHOTKEY}
  FKF_HOTKEYSOUND   = $00000010;
  {$EXTERNALSYM FKF_HOTKEYSOUND}
  FKF_INDICATOR     = $00000020;
  {$EXTERNALSYM FKF_INDICATOR}
  FKF_CLICKON       = $00000040;
  {$EXTERNALSYM FKF_CLICKON}

type
  LPSTICKYKEYS = ^STICKYKEYS;
  {$EXTERNALSYM LPSTICKYKEYS}
  tagSTICKYKEYS = record
    cbSize: UINT;
    dwFlags: DWORD;
  end;
  {$EXTERNALSYM tagSTICKYKEYS}
  STICKYKEYS = tagSTICKYKEYS;
  {$EXTERNALSYM STICKYKEYS}
  TStickyKeys = STICKYKEYS;
  PStickyKeys = LPSTICKYKEYS;

//
// STICKYKEYS dwFlags field
//

const
  SKF_STICKYKEYSON    = $00000001;
  {$EXTERNALSYM SKF_STICKYKEYSON}
  SKF_AVAILABLE       = $00000002;
  {$EXTERNALSYM SKF_AVAILABLE}
  SKF_HOTKEYACTIVE    = $00000004;
  {$EXTERNALSYM SKF_HOTKEYACTIVE}
  SKF_CONFIRMHOTKEY   = $00000008;
  {$EXTERNALSYM SKF_CONFIRMHOTKEY}
  SKF_HOTKEYSOUND     = $00000010;
  {$EXTERNALSYM SKF_HOTKEYSOUND}
  SKF_INDICATOR       = $00000020;
  {$EXTERNALSYM SKF_INDICATOR}
  SKF_AUDIBLEFEEDBACK = $00000040;
  {$EXTERNALSYM SKF_AUDIBLEFEEDBACK}
  SKF_TRISTATE        = $00000080;
  {$EXTERNALSYM SKF_TRISTATE}
  SKF_TWOKEYSOFF      = $00000100;
  {$EXTERNALSYM SKF_TWOKEYSOFF}
  SKF_LALTLATCHED     = $10000000;
  {$EXTERNALSYM SKF_LALTLATCHED}
  SKF_LCTLLATCHED     = $04000000;
  {$EXTERNALSYM SKF_LCTLLATCHED}
  SKF_LSHIFTLATCHED   = $01000000;
  {$EXTERNALSYM SKF_LSHIFTLATCHED}
  SKF_RALTLATCHED     = $20000000;
  {$EXTERNALSYM SKF_RALTLATCHED}
  SKF_RCTLLATCHED     = $08000000;
  {$EXTERNALSYM SKF_RCTLLATCHED}
  SKF_RSHIFTLATCHED   = $02000000;
  {$EXTERNALSYM SKF_RSHIFTLATCHED}
  SKF_LWINLATCHED     = $40000000;
  {$EXTERNALSYM SKF_LWINLATCHED}
  SKF_RWINLATCHED     = $80000000;
  {$EXTERNALSYM SKF_RWINLATCHED}
  SKF_LALTLOCKED      = $00100000;
  {$EXTERNALSYM SKF_LALTLOCKED}
  SKF_LCTLLOCKED      = $00040000;
  {$EXTERNALSYM SKF_LCTLLOCKED}
  SKF_LSHIFTLOCKED    = $00010000;
  {$EXTERNALSYM SKF_LSHIFTLOCKED}
  SKF_RALTLOCKED      = $00200000;
  {$EXTERNALSYM SKF_RALTLOCKED}
  SKF_RCTLLOCKED      = $00080000;
  {$EXTERNALSYM SKF_RCTLLOCKED}
  SKF_RSHIFTLOCKED    = $00020000;
  {$EXTERNALSYM SKF_RSHIFTLOCKED}
  SKF_LWINLOCKED      = $00400000;
  {$EXTERNALSYM SKF_LWINLOCKED}
  SKF_RWINLOCKED      = $00800000;
  {$EXTERNALSYM SKF_RWINLOCKED}

type
  LPMOUSEKEYS = ^MOUSEKEYS;
  {$EXTERNALSYM LPMOUSEKEYS}
  tagMOUSEKEYS = record
    cbSize: UINT;
    dwFlags: DWORD;
    iMaxSpeed: DWORD;
    iTimeToMaxSpeed: DWORD;
    iCtrlSpeed: DWORD;
    dwReserved1: DWORD;
    dwReserved2: DWORD;
  end;
  {$EXTERNALSYM tagMOUSEKEYS}
  MOUSEKEYS = tagMOUSEKEYS;
  {$EXTERNALSYM MOUSEKEYS}
  TMouseKeys = MOUSEKEYS;
  PMouseKeys = LPMOUSEKEYS;

//
// MOUSEKEYS dwFlags field
//

const
  MKF_MOUSEKEYSON     = $00000001;
  {$EXTERNALSYM MKF_MOUSEKEYSON}
  MKF_AVAILABLE       = $00000002;
  {$EXTERNALSYM MKF_AVAILABLE}
  MKF_HOTKEYACTIVE    = $00000004;
  {$EXTERNALSYM MKF_HOTKEYACTIVE}
  MKF_CONFIRMHOTKEY   = $00000008;
  {$EXTERNALSYM MKF_CONFIRMHOTKEY}
  MKF_HOTKEYSOUND     = $00000010;
  {$EXTERNALSYM MKF_HOTKEYSOUND}
  MKF_INDICATOR       = $00000020;
  {$EXTERNALSYM MKF_INDICATOR}
  MKF_MODIFIERS       = $00000040;
  {$EXTERNALSYM MKF_MODIFIERS}
  MKF_REPLACENUMBERS  = $00000080;
  {$EXTERNALSYM MKF_REPLACENUMBERS}
  MKF_LEFTBUTTONSEL   = $10000000;
  {$EXTERNALSYM MKF_LEFTBUTTONSEL}
  MKF_RIGHTBUTTONSEL  = $20000000;
  {$EXTERNALSYM MKF_RIGHTBUTTONSEL}
  MKF_LEFTBUTTONDOWN  = $01000000;
  {$EXTERNALSYM MKF_LEFTBUTTONDOWN}
  MKF_RIGHTBUTTONDOWN = $02000000;
  {$EXTERNALSYM MKF_RIGHTBUTTONDOWN}
  MKF_MOUSEMODE       = $80000000;
  {$EXTERNALSYM MKF_MOUSEMODE}

type
  LPACCESSTIMEOUT = ^ACCESSTIMEOUT;
  {$EXTERNALSYM LPACCESSTIMEOUT}
  tagACCESSTIMEOUT = record
    cbSize: UINT;
    dwFlags: DWORD;
    iTimeOutMSec: DWORD;
  end;
  {$EXTERNALSYM tagACCESSTIMEOUT}
  ACCESSTIMEOUT = tagACCESSTIMEOUT;
  {$EXTERNALSYM ACCESSTIMEOUT}
  TAccessTimeout = ACCESSTIMEOUT;
  PAccessTimeout = LPACCESSTIMEOUT;

//
// ACCESSTIMEOUT dwFlags field
//

const
  ATF_TIMEOUTON     = $00000001;
  {$EXTERNALSYM ATF_TIMEOUTON}
  ATF_ONOFFFEEDBACK = $00000002;
  {$EXTERNALSYM ATF_ONOFFFEEDBACK}

// values for SOUNDSENTRY iFSGrafEffect field//

  SSGF_NONE    = 0;
  {$EXTERNALSYM SSGF_NONE}
  SSGF_DISPLAY = 3;
  {$EXTERNALSYM SSGF_DISPLAY}

// values for SOUNDSENTRY iFSTextEffect field//

  SSTF_NONE    = 0;
  {$EXTERNALSYM SSTF_NONE}
  SSTF_CHARS   = 1;
  {$EXTERNALSYM SSTF_CHARS}
  SSTF_BORDER  = 2;
  {$EXTERNALSYM SSTF_BORDER}
  SSTF_DISPLAY = 3;
  {$EXTERNALSYM SSTF_DISPLAY}

// values for SOUNDSENTRY iWindowsEffect field//

  SSWF_NONE    = 0;
  {$EXTERNALSYM SSWF_NONE}
  SSWF_TITLE   = 1;
  {$EXTERNALSYM SSWF_TITLE}
  SSWF_WINDOW  = 2;
  {$EXTERNALSYM SSWF_WINDOW}
  SSWF_DISPLAY = 3;
  {$EXTERNALSYM SSWF_DISPLAY}
  SSWF_CUSTOM  = 4;
  {$EXTERNALSYM SSWF_CUSTOM}

type
  LPSOUNDSENTRYA = ^SOUNDSENTRYA;
  {$EXTERNALSYM LPSOUNDSENTRYA}
  tagSOUNDSENTRYA = record
    cbSize: UINT;
    dwFlags: DWORD;
    iFSTextEffect: DWORD;
    iFSTextEffectMSec: DWORD;
    iFSTextEffectColorBits: DWORD;
    iFSGrafEffect: DWORD;
    iFSGrafEffectMSec: DWORD;
    iFSGrafEffectColor: DWORD;
    iWindowsEffect: DWORD;
    iWindowsEffectMSec: DWORD;
    lpszWindowsEffectDLL: LPSTR;
    iWindowsEffectOrdinal: DWORD;
  end;
  {$EXTERNALSYM tagSOUNDSENTRYA}
  SOUNDSENTRYA = tagSOUNDSENTRYA;
  {$EXTERNALSYM SOUNDSENTRYA}
  TSoundsEntryA = SOUNDSENTRYA;
  PSoundsEntryA = LPSOUNDSENTRYA;

  LPSOUNDSENTRYW = ^SOUNDSENTRYW;
  {$EXTERNALSYM LPSOUNDSENTRYW}
  tagSOUNDSENTRYW = record
    cbSize: UINT;
    dwFlags: DWORD;
    iFSTextEffect: DWORD;
    iFSTextEffectMSec: DWORD;
    iFSTextEffectColorBits: DWORD;
    iFSGrafEffect: DWORD;
    iFSGrafEffectMSec: DWORD;
    iFSGrafEffectColor: DWORD;
    iWindowsEffect: DWORD;
    iWindowsEffectMSec: DWORD;
    lpszWindowsEffectDLL: LPWSTR;
    iWindowsEffectOrdinal: DWORD;
  end;
  {$EXTERNALSYM tagSOUNDSENTRYW}
  SOUNDSENTRYW = tagSOUNDSENTRYW;
  {$EXTERNALSYM SOUNDSENTRYW}
  TSoundsEntryW = SOUNDSENTRYW;
  PSoundsEntryW = LPSOUNDSENTRYW;

  {$IFDEF UNICODE}
  SOUNDSENTRY = SOUNDSENTRYW;
  {$EXTERNALSYM SOUNDSENTRY}
  LPSOUNDSENTRY = LPSOUNDSENTRYW;
  {$EXTERNALSYM LPSOUNDSENTRY}
  TSoundsEntry = TSoundsEntryW;
  PSoundsEntry = PSoundsEntryW;
  {$ELSE}
  SOUNDSENTRY = SOUNDSENTRYA;
  {$EXTERNALSYM SOUNDSENTRY}
  LPSOUNDSENTRY = LPSOUNDSENTRYA;
  {$EXTERNALSYM LPSOUNDSENTRY}
  TSoundsEntry = TSoundsEntryA;
  PSoundsEntry = PSoundsEntryA;
  {$ENDIF UNICODE}

//
// SOUNDSENTRY dwFlags field
//

const
  SSF_SOUNDSENTRYON = $00000001;
  {$EXTERNALSYM SSF_SOUNDSENTRYON}
  SSF_AVAILABLE     = $00000002;
  {$EXTERNALSYM SSF_AVAILABLE}
  SSF_INDICATOR     = $00000004;
  {$EXTERNALSYM SSF_INDICATOR}

type
  LPTOGGLEKEYS = ^TOGGLEKEYS;
  {$EXTERNALSYM LPTOGGLEKEYS}
  tagTOGGLEKEYS = record
    cbSize: UINT;
    dwFlags: DWORD;
  end;
  {$EXTERNALSYM tagTOGGLEKEYS}
  TOGGLEKEYS = tagTOGGLEKEYS;
  {$EXTERNALSYM TOGGLEKEYS}
  TToggleKeys = TOGGLEKEYS;
  PToggleKeys = LPTOGGLEKEYS;

//
// TOGGLEKEYS dwFlags field
//

const
  TKF_TOGGLEKEYSON  = $00000001;
  {$EXTERNALSYM TKF_TOGGLEKEYSON}
  TKF_AVAILABLE     = $00000002;
  {$EXTERNALSYM TKF_AVAILABLE}
  TKF_HOTKEYACTIVE  = $00000004;
  {$EXTERNALSYM TKF_HOTKEYACTIVE}
  TKF_CONFIRMHOTKEY = $00000008;
  {$EXTERNALSYM TKF_CONFIRMHOTKEY}
  TKF_HOTKEYSOUND   = $00000010;
  {$EXTERNALSYM TKF_HOTKEYSOUND}
  TKF_INDICATOR     = $00000020;
  {$EXTERNALSYM TKF_INDICATOR}

//
// Set debug level
//

procedure SetDebugErrorLevel(dwLevel: DWORD); stdcall;
{$EXTERNALSYM SetDebugErrorLevel}

//
// SetLastErrorEx() types.
//

const
  SLE_ERROR      = $00000001;
  {$EXTERNALSYM SLE_ERROR}
  SLE_MINORERROR = $00000002;
  {$EXTERNALSYM SLE_MINORERROR}
  SLE_WARNING    = $00000003;
  {$EXTERNALSYM SLE_WARNING}

procedure SetLastErrorEx(dwErrCode, dwType: DWORD); stdcall;
{$EXTERNALSYM SetLastErrorEx}

function InternalGetWindowText(hWnd: HWND; lpString: LPWSTR; nMaxCount: Integer): Integer; stdcall;
{$EXTERNALSYM InternalGetWindowText}

function EndTask(hWnd: HWND; fShutDown, fForce: BOOL): BOOL; stdcall;
{$EXTERNALSYM EndTask}

//
// Multimonitor API.
//

const
  MONITOR_DEFAULTTONULL    = $00000000;
  {$EXTERNALSYM MONITOR_DEFAULTTONULL}
  MONITOR_DEFAULTTOPRIMARY = $00000001;
  {$EXTERNALSYM MONITOR_DEFAULTTOPRIMARY}
  MONITOR_DEFAULTTONEAREST = $00000002;
  {$EXTERNALSYM MONITOR_DEFAULTTONEAREST}

function MonitorFromPoint(pt: POINT; dwFlags: DWORD): HMONITOR; stdcall;
{$EXTERNALSYM MonitorFromPoint}

function MonitorFromRect(const lprc: RECT; dwFlags: DWORD): HMONITOR; stdcall;
{$EXTERNALSYM MonitorFromRect}

function MonitorFromWindow(hwnd: HWND; dwFlags: DWORD): HMONITOR; stdcall;
{$EXTERNALSYM MonitorFromWindow}

const
  MONITORINFOF_PRIMARY = $00000001;
  {$EXTERNALSYM MONITORINFOF_PRIMARY}

  {$IFNDEF JWA_INCLUDEMODE}
  CCHDEVICENAME = 32;
  {$EXTERNALSYM CCHDEVICENAME}
  {$ENDIF JWA_INCLUDEMODE}  

type
  LPMONITORINFO = ^MONITORINFO;
  {$EXTERNALSYM LPMONITORINFO}
  tagMONITORINFO = record
    cbSize: DWORD;
    rcMonitor: RECT;
    rcWork: RECT;
    dwFlags: DWORD;
  end;
  {$EXTERNALSYM tagMONITORINFO}
  MONITORINFO = tagMONITORINFO;
  {$EXTERNALSYM MONITORINFO}
  TMonitorInfo = MONITORINFO;
  PMonitorInfo = LPMONITORINFO;

  LPMONITORINFOEXA = ^MONITORINFOEXA;
  {$EXTERNALSYM LPMONITORINFOEXA}
  tagMONITORINFOEXA = record
    MonitorInfo: MONITORINFO;
    szDevice: array [0..CCHDEVICENAME - 1] of CHAR;
  end;
  {$EXTERNALSYM tagMONITORINFOEXA}
  MONITORINFOEXA = tagMONITORINFOEXA;
  {$EXTERNALSYM MONITORINFOEXA}
  TMonitorinfoexa = MONITORINFOEXA;
  PMonitorInfoExA = LPMONITORINFOEXA;

  LPMONITORINFOEXW = ^MONITORINFOEXW;
  {$EXTERNALSYM LPMONITORINFOEXW}
  tagMONITORINFOEXW = record
    MonitorInfo: MONITORINFO;
    szDevice: array [0..CCHDEVICENAME - 1] of WCHAR;
  end;
  {$EXTERNALSYM tagMONITORINFOEXW}
  MONITORINFOEXW = tagMONITORINFOEXW;
  {$EXTERNALSYM MONITORINFOEXW}
  TMonitorInfoExW = MONITORINFOEXW;
  PMonitorInfoExW = LPMONITORINFOEXW;

  {$IFDEF UNICODE}
  MONITORINFOEX = MONITORINFOEXW;
  {$EXTERNALSYM MONITORINFOEX}
  LPMONITORINFOEX = LPMONITORINFOEXW;
  {$EXTERNALSYM LPMONITORINFOEX}
  TMonitorInfoEx = TMonitorInfoExW;
  PMonitorInfoEx = PMonitorInfoExW;
  {$ELSE}
  MONITORINFOEX = MONITORINFOEXA;
  {$EXTERNALSYM MONITORINFOEX}
  LPMONITORINFOEX = LPMONITORINFOEXA;
  {$EXTERNALSYM LPMONITORINFOEX}
  TMonitorInfoEx = TMonitorInfoExA;
  PMonitorInfoEx = PMonitorInfoExA;
  {$ENDIF UNICODE}

function GetMonitorInfoA(hMonitor: HMONITOR; lpmi: LPMONITORINFO): BOOL; stdcall;
{$EXTERNALSYM GetMonitorInfoA}
function GetMonitorInfoW(hMonitor: HMONITOR; lpmi: LPMONITORINFO): BOOL; stdcall;
{$EXTERNALSYM GetMonitorInfoW}
function GetMonitorInfo(hMonitor: HMONITOR; lpmi: LPMONITORINFO): BOOL; stdcall;
{$EXTERNALSYM GetMonitorInfo}

type
  MONITORENUMPROC = function(hMonitor: HMONITOR; hdcMonitor: HDC;
    lprcMonitor: LPRECT; dwData: LPARAM): BOOL; stdcall;
  {$EXTERNALSYM MONITORENUMPROC}
  TMonitorEnumProc = MONITORENUMPROC;

function EnumDisplayMonitors(hdc: HDC; lprcClip: LPCRECT;
  lpfnEnum: MONITORENUMPROC; dwData: LPARAM): BOOL; stdcall;
{$EXTERNALSYM EnumDisplayMonitors}

//
// WinEvents - Active Accessibility hooks
//

procedure NotifyWinEvent(event: DWORD; hwnd: HWND; idObject: LONG; idChild: LONG); stdcall;
{$EXTERNALSYM NotifyWinEvent}

type
  WINEVENTPROC = procedure(hWinEventHook: HWINEVENTHOOK; event: DWORD; hwnd: HWND;
    idObject, idChild: LONG; idEventThread, dwmsEventTime: DWORD); stdcall;
  {$EXTERNALSYM WINEVENTPROC}
  TWinEventProc = WINEVENTPROC;

function SetWinEventHook(eventMin: DWORD; eventMax: DWORD;
  hmodWinEventProc: HMODULE; pfnWinEventProc: WINEVENTPROC; idProcess: DWORD;
  idThread: DWORD; dwFlags: DWORD): HWINEVENTHOOK; stdcall;
{$EXTERNALSYM SetWinEventHook}

function IsWinEventHookInstalled(event: DWORD): BOOL; stdcall;
{$EXTERNALSYM IsWinEventHookInstalled}

//
// dwFlags for SetWinEventHook
//

const
  WINEVENT_OUTOFCONTEXT   = $0000; // Events are ASYNC
  {$EXTERNALSYM WINEVENT_OUTOFCONTEXT}
  WINEVENT_SKIPOWNTHREAD  = $0001; // Don't call back for events on installer's thread
  {$EXTERNALSYM WINEVENT_SKIPOWNTHREAD}
  WINEVENT_SKIPOWNPROCESS = $0002; // Don't call back for events on installer's process
  {$EXTERNALSYM WINEVENT_SKIPOWNPROCESS}
  WINEVENT_INCONTEXT      = $0004; // Events are SYNC, this causes your dll to be injected into every process
  {$EXTERNALSYM WINEVENT_INCONTEXT}

function UnhookWinEvent(hWinEventHook: HWINEVENTHOOK): BOOL; stdcall;
{$EXTERNALSYM UnhookWinEvent}

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

const
  CHILDID_SELF      = 0;
  {$EXTERNALSYM CHILDID_SELF}
  INDEXID_OBJECT    = 0;
  {$EXTERNALSYM INDEXID_OBJECT}
  INDEXID_CONTAINER = 0;
  {$EXTERNALSYM INDEXID_CONTAINER}

//
// Reserved IDs for system objects
//

const
  OBJID_WINDOW            = DWORD($00000000);
  {$EXTERNALSYM OBJID_WINDOW}
  OBJID_SYSMENU           = DWORD($FFFFFFFF);
  {$EXTERNALSYM OBJID_SYSMENU}
  OBJID_TITLEBAR          = DWORD($FFFFFFFE);
  {$EXTERNALSYM OBJID_TITLEBAR}
  OBJID_MENU              = DWORD($FFFFFFFD);
  {$EXTERNALSYM OBJID_MENU}
  OBJID_CLIENT            = DWORD($FFFFFFFC);
  {$EXTERNALSYM OBJID_CLIENT}
  OBJID_VSCROLL           = DWORD($FFFFFFFB);
  {$EXTERNALSYM OBJID_VSCROLL}
  OBJID_HSCROLL           = DWORD($FFFFFFFA);
  {$EXTERNALSYM OBJID_HSCROLL}
  OBJID_SIZEGRIP          = DWORD($FFFFFFF9);
  {$EXTERNALSYM OBJID_SIZEGRIP}
  OBJID_CARET             = DWORD($FFFFFFF8);
  {$EXTERNALSYM OBJID_CARET}
  OBJID_CURSOR            = DWORD($FFFFFFF7);
  {$EXTERNALSYM OBJID_CURSOR}
  OBJID_ALERT             = DWORD($FFFFFFF6);
  {$EXTERNALSYM OBJID_ALERT}
  OBJID_SOUND             = DWORD($FFFFFFF5);
  {$EXTERNALSYM OBJID_SOUND}
  OBJID_QUERYCLASSNAMEIDX = DWORD($FFFFFFF4);
  {$EXTERNALSYM OBJID_QUERYCLASSNAMEIDX}
  OBJID_NATIVEOM          = DWORD($FFFFFFF0);
  {$EXTERNALSYM OBJID_NATIVEOM}

//
// EVENT DEFINITION
//

  EVENT_MIN = $00000001;
  {$EXTERNALSYM EVENT_MIN}
  EVENT_MAX = $7FFFFFFF;
  {$EXTERNALSYM EVENT_MAX}

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

  EVENT_SYSTEM_SOUND = $0001;
  {$EXTERNALSYM EVENT_SYSTEM_SOUND}

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

  EVENT_SYSTEM_ALERT = $0002;
  {$EXTERNALSYM EVENT_SYSTEM_ALERT}

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

  EVENT_SYSTEM_FOREGROUND = $0003;
  {$EXTERNALSYM EVENT_SYSTEM_FOREGROUND}

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

  EVENT_SYSTEM_MENUSTART = $0004;
  {$EXTERNALSYM EVENT_SYSTEM_MENUSTART}
  EVENT_SYSTEM_MENUEND   = $0005;
  {$EXTERNALSYM EVENT_SYSTEM_MENUEND}

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

  EVENT_SYSTEM_MENUPOPUPSTART = $0006;
  {$EXTERNALSYM EVENT_SYSTEM_MENUPOPUPSTART}
  EVENT_SYSTEM_MENUPOPUPEND   = $0007;
  {$EXTERNALSYM EVENT_SYSTEM_MENUPOPUPEND}

//
// EVENT_SYSTEM_CAPTURESTART
// EVENT_SYSTEM_CAPTUREEND
// Sent when a window takes the capture and releases the capture.
//

  EVENT_SYSTEM_CAPTURESTART = $0008;
  {$EXTERNALSYM EVENT_SYSTEM_CAPTURESTART}
  EVENT_SYSTEM_CAPTUREEND   = $0009;
  {$EXTERNALSYM EVENT_SYSTEM_CAPTUREEND}

//
// Move Size
// EVENT_SYSTEM_MOVESIZESTART
// EVENT_SYSTEM_MOVESIZEEND
// Sent when a window enters and leaves move-size dragging mode.
//

  EVENT_SYSTEM_MOVESIZESTART = $000A;
  {$EXTERNALSYM EVENT_SYSTEM_MOVESIZESTART}
  EVENT_SYSTEM_MOVESIZEEND   = $000B;
  {$EXTERNALSYM EVENT_SYSTEM_MOVESIZEEND}

//
// Context Help
// EVENT_SYSTEM_CONTEXTHELPSTART
// EVENT_SYSTEM_CONTEXTHELPEND
// Sent when a window enters and leaves context sensitive help mode.
//

  EVENT_SYSTEM_CONTEXTHELPSTART = $000C;
  {$EXTERNALSYM EVENT_SYSTEM_CONTEXTHELPSTART}
  EVENT_SYSTEM_CONTEXTHELPEND   = $000D;
  {$EXTERNALSYM EVENT_SYSTEM_CONTEXTHELPEND}

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

  EVENT_SYSTEM_DRAGDROPSTART = $000E;
  {$EXTERNALSYM EVENT_SYSTEM_DRAGDROPSTART}
  EVENT_SYSTEM_DRAGDROPEND   = $000F;
  {$EXTERNALSYM EVENT_SYSTEM_DRAGDROPEND}

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

  EVENT_SYSTEM_DIALOGSTART = $0010;
  {$EXTERNALSYM EVENT_SYSTEM_DIALOGSTART}
  EVENT_SYSTEM_DIALOGEND   = $0011;
  {$EXTERNALSYM EVENT_SYSTEM_DIALOGEND}

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

  EVENT_SYSTEM_SCROLLINGSTART = $0012;
  {$EXTERNALSYM EVENT_SYSTEM_SCROLLINGSTART}
  EVENT_SYSTEM_SCROLLINGEND   = $0013;
  {$EXTERNALSYM EVENT_SYSTEM_SCROLLINGEND}

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

  EVENT_SYSTEM_SWITCHSTART = $0014;
  {$EXTERNALSYM EVENT_SYSTEM_SWITCHSTART}
  EVENT_SYSTEM_SWITCHEND   = $0015;
  {$EXTERNALSYM EVENT_SYSTEM_SWITCHEND}

//
// EVENT_SYSTEM_MINIMIZESTART
// EVENT_SYSTEM_MINIMIZEEND
// Sent when a window minimizes and just before it restores.
//

  EVENT_SYSTEM_MINIMIZESTART = $0016;
  {$EXTERNALSYM EVENT_SYSTEM_MINIMIZESTART}
  EVENT_SYSTEM_MINIMIZEEND   = $0017;
  {$EXTERNALSYM EVENT_SYSTEM_MINIMIZEEND}

  EVENT_CONSOLE_CARET             = $4001;
  {$EXTERNALSYM EVENT_CONSOLE_CARET}
  EVENT_CONSOLE_UPDATE_REGION     = $4002;
  {$EXTERNALSYM EVENT_CONSOLE_UPDATE_REGION}
  EVENT_CONSOLE_UPDATE_SIMPLE     = $4003;
  {$EXTERNALSYM EVENT_CONSOLE_UPDATE_SIMPLE}
  EVENT_CONSOLE_UPDATE_SCROLL     = $4004;
  {$EXTERNALSYM EVENT_CONSOLE_UPDATE_SCROLL}
  EVENT_CONSOLE_LAYOUT            = $4005;
  {$EXTERNALSYM EVENT_CONSOLE_LAYOUT}
  EVENT_CONSOLE_START_APPLICATION = $4006;
  {$EXTERNALSYM EVENT_CONSOLE_START_APPLICATION}
  EVENT_CONSOLE_END_APPLICATION   = $4007;
  {$EXTERNALSYM EVENT_CONSOLE_END_APPLICATION}

//
// Flags for EVENT_CONSOLE_START/END_APPLICATION.
//

  CONSOLE_APPLICATION_16BIT       = $0001;
  {$EXTERNALSYM CONSOLE_APPLICATION_16BIT}

//
// Flags for EVENT_CONSOLE_CARET
//

  CONSOLE_CARET_SELECTION         = $0001;
  {$EXTERNALSYM CONSOLE_CARET_SELECTION}
  CONSOLE_CARET_VISIBLE           = $0002;
  {$EXTERNALSYM CONSOLE_CARET_VISIBLE}

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

  EVENT_OBJECT_CREATE  = $8000; // hwnd + ID + idChild is created item
  {$EXTERNALSYM EVENT_OBJECT_CREATE}
  EVENT_OBJECT_DESTROY = $8001; // hwnd + ID + idChild is destroyed item
  {$EXTERNALSYM EVENT_OBJECT_DESTROY}
  EVENT_OBJECT_SHOW    = $8002; // hwnd + ID + idChild is shown item
  {$EXTERNALSYM EVENT_OBJECT_SHOW}
  EVENT_OBJECT_HIDE    = $8003; // hwnd + ID + idChild is hidden item
  {$EXTERNALSYM EVENT_OBJECT_HIDE}
  EVENT_OBJECT_REORDER = $8004; // hwnd + ID + idChild is parent of zordering children
  {$EXTERNALSYM EVENT_OBJECT_REORDER}

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

  EVENT_OBJECT_FOCUS           = $8005; // hwnd + ID + idChild is focused item
  {$EXTERNALSYM EVENT_OBJECT_FOCUS}
  EVENT_OBJECT_SELECTION       = $8006; // hwnd + ID + idChild is selected item (if only one), or idChild is OBJID_WINDOW if complex
  {$EXTERNALSYM EVENT_OBJECT_SELECTION}
  EVENT_OBJECT_SELECTIONADD    = $8007; // hwnd + ID + idChild is item added
  {$EXTERNALSYM EVENT_OBJECT_SELECTIONADD}
  EVENT_OBJECT_SELECTIONREMOVE = $8008; // hwnd + ID + idChild is item removed
  {$EXTERNALSYM EVENT_OBJECT_SELECTIONREMOVE}
  EVENT_OBJECT_SELECTIONWITHIN = $8009; // hwnd + ID + idChild is parent of changed selected items
  {$EXTERNALSYM EVENT_OBJECT_SELECTIONWITHIN}

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

  EVENT_OBJECT_STATECHANGE = $800A; // hwnd + ID + idChild is item w/ state change
  {$EXTERNALSYM EVENT_OBJECT_STATECHANGE}

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

  EVENT_OBJECT_LOCATIONCHANGE = $800B; // hwnd + ID + idChild is moved/sized item
  {$EXTERNALSYM EVENT_OBJECT_LOCATIONCHANGE}

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

  EVENT_OBJECT_NAMECHANGE        = $800C; // hwnd + ID + idChild is item w/ name change
  {$EXTERNALSYM EVENT_OBJECT_NAMECHANGE}
  EVENT_OBJECT_DESCRIPTIONCHANGE = $800D; // hwnd + ID + idChild is item w/ desc change
  {$EXTERNALSYM EVENT_OBJECT_DESCRIPTIONCHANGE}
  EVENT_OBJECT_VALUECHANGE       = $800E; // hwnd + ID + idChild is item w/ value change
  {$EXTERNALSYM EVENT_OBJECT_VALUECHANGE}
  EVENT_OBJECT_PARENTCHANGE      = $800F; // hwnd + ID + idChild is item w/ new parent
  {$EXTERNALSYM EVENT_OBJECT_PARENTCHANGE}
  EVENT_OBJECT_HELPCHANGE        = $8010; // hwnd + ID + idChild is item w/ help change
  {$EXTERNALSYM EVENT_OBJECT_HELPCHANGE}
  EVENT_OBJECT_DEFACTIONCHANGE   = $8011; // hwnd + ID + idChild is item w/ def action change
  {$EXTERNALSYM EVENT_OBJECT_DEFACTIONCHANGE}
  EVENT_OBJECT_ACCELERATORCHANGE = $8012; // hwnd + ID + idChild is item w/ keybd accel change
  {$EXTERNALSYM EVENT_OBJECT_ACCELERATORCHANGE}

//
// Child IDs
//

//
// System Sounds (idChild of system SOUND notification)
//

  SOUND_SYSTEM_STARTUP     = 1;
  {$EXTERNALSYM SOUND_SYSTEM_STARTUP}
  SOUND_SYSTEM_SHUTDOWN    = 2;
  {$EXTERNALSYM SOUND_SYSTEM_SHUTDOWN}
  SOUND_SYSTEM_BEEP        = 3;
  {$EXTERNALSYM SOUND_SYSTEM_BEEP}
  SOUND_SYSTEM_ERROR       = 4;
  {$EXTERNALSYM SOUND_SYSTEM_ERROR}
  SOUND_SYSTEM_QUESTION    = 5;
  {$EXTERNALSYM SOUND_SYSTEM_QUESTION}
  SOUND_SYSTEM_WARNING     = 6;
  {$EXTERNALSYM SOUND_SYSTEM_WARNING}
  SOUND_SYSTEM_INFORMATION = 7;
  {$EXTERNALSYM SOUND_SYSTEM_INFORMATION}
  SOUND_SYSTEM_MAXIMIZE    = 8;
  {$EXTERNALSYM SOUND_SYSTEM_MAXIMIZE}
  SOUND_SYSTEM_MINIMIZE    = 9;
  {$EXTERNALSYM SOUND_SYSTEM_MINIMIZE}
  SOUND_SYSTEM_RESTOREUP   = 10;
  {$EXTERNALSYM SOUND_SYSTEM_RESTOREUP}
  SOUND_SYSTEM_RESTOREDOWN = 11;
  {$EXTERNALSYM SOUND_SYSTEM_RESTOREDOWN}
  SOUND_SYSTEM_APPSTART    = 12;
  {$EXTERNALSYM SOUND_SYSTEM_APPSTART}
  SOUND_SYSTEM_FAULT       = 13;
  {$EXTERNALSYM SOUND_SYSTEM_FAULT}
  SOUND_SYSTEM_APPEND      = 14;
  {$EXTERNALSYM SOUND_SYSTEM_APPEND}
  SOUND_SYSTEM_MENUCOMMAND = 15;
  {$EXTERNALSYM SOUND_SYSTEM_MENUCOMMAND}
  SOUND_SYSTEM_MENUPOPUP   = 16;
  {$EXTERNALSYM SOUND_SYSTEM_MENUPOPUP}
  CSOUND_SYSTEM            = 16;
  {$EXTERNALSYM CSOUND_SYSTEM}

//
// System Alerts (indexChild of system ALERT notification)
//

  ALERT_SYSTEM_INFORMATIONAL = 1; // MB_INFORMATION
  {$EXTERNALSYM ALERT_SYSTEM_INFORMATIONAL}
  ALERT_SYSTEM_WARNING       = 2; // MB_WARNING
  {$EXTERNALSYM ALERT_SYSTEM_WARNING}
  ALERT_SYSTEM_ERROR         = 3; // MB_ERROR
  {$EXTERNALSYM ALERT_SYSTEM_ERROR}
  ALERT_SYSTEM_QUERY         = 4; // MB_QUESTION
  {$EXTERNALSYM ALERT_SYSTEM_QUERY}
  ALERT_SYSTEM_CRITICAL      = 5; // HardSysErrBox
  {$EXTERNALSYM ALERT_SYSTEM_CRITICAL}
  CALERT_SYSTEM              = 6;
  {$EXTERNALSYM CALERT_SYSTEM}

type
  LPGUITHREADINFO = ^GUITHREADINFO;
  {$EXTERNALSYM LPGUITHREADINFO}
  tagGUITHREADINFO = record
    cbSize: DWORD;
    flags: DWORD;
    hwndActive: HWND;
    hwndFocus: HWND;
    hwndCapture: HWND;
    hwndMenuOwner: HWND;
    hwndMoveSize: HWND;
    hwndCaret: HWND;
    rcCaret: RECT;
  end;
  {$EXTERNALSYM tagGUITHREADINFO}
  GUITHREADINFO = tagGUITHREADINFO;
  {$EXTERNALSYM GUITHREADINFO}
  TGuiThreadInfo = GUITHREADINFO;
  PGuiThreadInfo = LPGUITHREADINFO;

const
  GUI_CARETBLINKING  = $00000001;
  {$EXTERNALSYM GUI_CARETBLINKING}
  GUI_INMOVESIZE     = $00000002;
  {$EXTERNALSYM GUI_INMOVESIZE}
  GUI_INMENUMODE     = $00000004;
  {$EXTERNALSYM GUI_INMENUMODE}
  GUI_SYSTEMMENUMODE = $00000008;
  {$EXTERNALSYM GUI_SYSTEMMENUMODE}
  GUI_POPUPMENUMODE  = $00000010;
  {$EXTERNALSYM GUI_POPUPMENUMODE}
  GUI_16BITTASK      = $00000020;
  {$EXTERNALSYM GUI_16BITTASK}

function GetGUIThreadInfo(idThread: DWORD; var pgui: GUITHREADINFO): BOOL; stdcall;
{$EXTERNALSYM GetGUIThreadInfo}

function GetWindowModuleFileNameA(hwnd: HWND; pszFileName: LPSTR; cchFileNameMax: UINT): UINT; stdcall;
{$EXTERNALSYM GetWindowModuleFileNameA}
function GetWindowModuleFileNameW(hwnd: HWND; pszFileName: LPWSTR; cchFileNameMax: UINT): UINT; stdcall;
{$EXTERNALSYM GetWindowModuleFileNameW}
function GetWindowModuleFileName(hwnd: HWND; pszFileName: LPTSTR; cchFileNameMax: UINT): UINT; stdcall;
{$EXTERNALSYM GetWindowModuleFileName}

const
  STATE_SYSTEM_UNAVAILABLE     = $00000001; // Disabled
  {$EXTERNALSYM STATE_SYSTEM_UNAVAILABLE}
  STATE_SYSTEM_SELECTED        = $00000002;
  {$EXTERNALSYM STATE_SYSTEM_SELECTED}
  STATE_SYSTEM_FOCUSED         = $00000004;
  {$EXTERNALSYM STATE_SYSTEM_FOCUSED}
  STATE_SYSTEM_PRESSED         = $00000008;
  {$EXTERNALSYM STATE_SYSTEM_PRESSED}
  STATE_SYSTEM_CHECKED         = $00000010;
  {$EXTERNALSYM STATE_SYSTEM_CHECKED}
  STATE_SYSTEM_MIXED           = $00000020; // 3-state checkbox or toolbar button
  {$EXTERNALSYM STATE_SYSTEM_MIXED}
  STATE_SYSTEM_INDETERMINATE   = STATE_SYSTEM_MIXED;
  {$EXTERNALSYM STATE_SYSTEM_INDETERMINATE}
  STATE_SYSTEM_READONLY        = $00000040;
  {$EXTERNALSYM STATE_SYSTEM_READONLY}
  STATE_SYSTEM_HOTTRACKED      = $00000080;
  {$EXTERNALSYM STATE_SYSTEM_HOTTRACKED}
  STATE_SYSTEM_DEFAULT         = $00000100;
  {$EXTERNALSYM STATE_SYSTEM_DEFAULT}
  STATE_SYSTEM_EXPANDED        = $00000200;
  {$EXTERNALSYM STATE_SYSTEM_EXPANDED}
  STATE_SYSTEM_COLLAPSED       = $00000400;
  {$EXTERNALSYM STATE_SYSTEM_COLLAPSED}
  STATE_SYSTEM_BUSY            = $00000800;
  {$EXTERNALSYM STATE_SYSTEM_BUSY}
  STATE_SYSTEM_FLOATING        = $00001000; // Children "owned" not "contained" by parent
  {$EXTERNALSYM STATE_SYSTEM_FLOATING}
  STATE_SYSTEM_MARQUEED        = $00002000;
  {$EXTERNALSYM STATE_SYSTEM_MARQUEED}
  STATE_SYSTEM_ANIMATED        = $00004000;
  {$EXTERNALSYM STATE_SYSTEM_ANIMATED}
  STATE_SYSTEM_INVISIBLE       = $00008000;
  {$EXTERNALSYM STATE_SYSTEM_INVISIBLE}
  STATE_SYSTEM_OFFSCREEN       = $00010000;
  {$EXTERNALSYM STATE_SYSTEM_OFFSCREEN}
  STATE_SYSTEM_SIZEABLE        = $00020000;
  {$EXTERNALSYM STATE_SYSTEM_SIZEABLE}
  STATE_SYSTEM_MOVEABLE        = $00040000;
  {$EXTERNALSYM STATE_SYSTEM_MOVEABLE}
  STATE_SYSTEM_SELFVOICING     = $00080000;
  {$EXTERNALSYM STATE_SYSTEM_SELFVOICING}
  STATE_SYSTEM_FOCUSABLE       = $00100000;
  {$EXTERNALSYM STATE_SYSTEM_FOCUSABLE}
  STATE_SYSTEM_SELECTABLE      = $00200000;
  {$EXTERNALSYM STATE_SYSTEM_SELECTABLE}
  STATE_SYSTEM_LINKED          = $00400000;
  {$EXTERNALSYM STATE_SYSTEM_LINKED}
  STATE_SYSTEM_TRAVERSED       = $00800000;
  {$EXTERNALSYM STATE_SYSTEM_TRAVERSED}
  STATE_SYSTEM_MULTISELECTABLE = $01000000; // Supports multiple selection
  {$EXTERNALSYM STATE_SYSTEM_MULTISELECTABLE}
  STATE_SYSTEM_EXTSELECTABLE   = $02000000; // Supports extended selection
  {$EXTERNALSYM STATE_SYSTEM_EXTSELECTABLE}
  STATE_SYSTEM_ALERT_LOW       = $04000000; // This information is of low priority
  {$EXTERNALSYM STATE_SYSTEM_ALERT_LOW}
  STATE_SYSTEM_ALERT_MEDIUM    = $08000000; // This information is of medium priority
  {$EXTERNALSYM STATE_SYSTEM_ALERT_MEDIUM}
  STATE_SYSTEM_ALERT_HIGH      = $10000000; // This information is of high priority
  {$EXTERNALSYM STATE_SYSTEM_ALERT_HIGH}
  STATE_SYSTEM_PROTECTED       = $20000000; // access to this is restricted
  {$EXTERNALSYM STATE_SYSTEM_PROTECTED}
  STATE_SYSTEM_VALID           = $3FFFFFFF;
  {$EXTERNALSYM STATE_SYSTEM_VALID}

  CCHILDREN_TITLEBAR  = 5;
  {$EXTERNALSYM CCHILDREN_TITLEBAR}
  CCHILDREN_SCROLLBAR = 5;
  {$EXTERNALSYM CCHILDREN_SCROLLBAR}

//
// Information about the global cursor.
//

type
  LPCURSORINFO = ^CURSORINFO;
  {$EXTERNALSYM LPCURSORINFO}
  tagCURSORINFO = record
    cbSize: DWORD;
    flags: DWORD;
    hCursor: HCURSOR;
    ptScreenPos: POINT;
  end;
  {$EXTERNALSYM tagCURSORINFO}
  CURSORINFO = tagCURSORINFO;
  {$EXTERNALSYM CURSORINFO}
  TCursorInfo = CURSORINFO;
  PCursorInfo = LPCURSORINFO;

const
  CURSOR_SHOWING = $00000001;
  {$EXTERNALSYM CURSOR_SHOWING}

function GetCursorInfo(var pci: CURSORINFO): BOOL; stdcall;
{$EXTERNALSYM GetCursorInfo}

//
// Window information snapshot
//

type
  LPWINDOWINFO = ^WINDOWINFO;
  {$EXTERNALSYM LPWINDOWINFO}
  tagWINDOWINFO = record
    cbSize: DWORD;
    rcWindow: RECT;
    rcClient: RECT;
    dwStyle: DWORD;
    dwExStyle: DWORD;
    dwWindowStatus: DWORD;
    cxWindowBorders: UINT;
    cyWindowBorders: UINT;
    atomWindowType: ATOM;
    wCreatorVersion: WORD;
  end;
  {$EXTERNALSYM tagWINDOWINFO}
  WINDOWINFO = tagWINDOWINFO;
  {$EXTERNALSYM WINDOWINFO}
  TWindowInfo = WINDOWINFO;
  PWindowInfo = LPWINDOWINFO;

const
  WS_ACTIVECAPTION = $0001;
  {$EXTERNALSYM WS_ACTIVECAPTION}

function GetWindowInfo(hwnd: HWND; var pwi: WINDOWINFO): BOOL; stdcall;
{$EXTERNALSYM GetWindowInfo}

//
// Titlebar information.
//

type
  LPTITLEBARINFO = ^TITLEBARINFO;
  {$EXTERNALSYM LPTITLEBARINFO}
  tagTITLEBARINFO = record
    cbSize: DWORD;
    rcTitleBar: RECT;
    rgstate: array [0..CCHILDREN_TITLEBAR] of DWORD;
  end;
  {$EXTERNALSYM tagTITLEBARINFO}
  TITLEBARINFO = tagTITLEBARINFO;
  {$EXTERNALSYM TITLEBARINFO}
  TTitleBarInfo = TITLEBARINFO;
  PTitleBarInfo = LPTITLEBARINFO;

function GetTitleBarInfo(hwnd: HWND; var pti: TITLEBARINFO): BOOL; stdcall;
{$EXTERNALSYM GetTitleBarInfo}

//
// Menubar information
//

type
  LPMENUBARINFO = ^MENUBARINFO;
  {$EXTERNALSYM LPMENUBARINFO}
  tagMENUBARINFO = record
    cbSize: DWORD;
    rcBar: RECT;          // rect of bar, popup, item
    hMenu: HMENU;         // real menu handle of bar, popup
    hwndMenu: HWND;       // hwnd of item submenu if one
    Flags: DWORD;
    // BOOL  fBarFocused:1;  // bar, popup has the focus
    // BOOL  fFocused:1;     // item has the focus
  end;
  {$EXTERNALSYM tagMENUBARINFO}
  MENUBARINFO = tagMENUBARINFO;
  {$EXTERNALSYM MENUBARINFO}
  TMenuBarInfo = MENUBARINFO;
  PMenuBarInfo = LPMENUBARINFO;

function GetMenuBarInfo(hwnd: HWND; idObject: LONG; idItem: LONG;
  var pmbi: MENUBARINFO): BOOL; stdcall;
{$EXTERNALSYM GetMenuBarInfo}

//
// Scrollbar information
//

type
  LPSCROLLBARINFO = ^SCROLLBARINFO;
  {$EXTERNALSYM LPSCROLLBARINFO}
  tagSCROLLBARINFO = record
    cbSize: DWORD;
    rcScrollBar: RECT;
    dxyLineButton: Integer;
    xyThumbTop: Integer;
    xyThumbBottom: Integer;
    reserved: Integer;
    rgstate: array [0..CCHILDREN_SCROLLBAR] of DWORD;
  end;
  {$EXTERNALSYM tagSCROLLBARINFO}
  SCROLLBARINFO = tagSCROLLBARINFO;
  {$EXTERNALSYM SCROLLBARINFO}
  TScrollBarInfo = SCROLLBARINFO;
  PScrollBarInfo = LPSCROLLBARINFO;

function GetScrollBarInfo(hwnd: HWND; idObject: LONG; var psbi: SCROLLBARINFO): BOOL; stdcall;
{$EXTERNALSYM GetScrollBarInfo}

//
// Combobox information
//

type
  LPCOMBOBOXINFO = ^COMBOBOXINFO;
  {$EXTERNALSYM LPCOMBOBOXINFO}
  tagCOMBOBOXINFO = record
    cbSize: DWORD;
    rcItem: RECT;
    rcButton: RECT;
    stateButton: DWORD;
    hwndCombo: HWND;
    hwndItem: HWND;
    hwndList: HWND;
  end;
  {$EXTERNALSYM tagCOMBOBOXINFO}
  COMBOBOXINFO = tagCOMBOBOXINFO;
  {$EXTERNALSYM COMBOBOXINFO}
  TComboBoxInfo = COMBOBOXINFO;
  PComboBoxInfo = LPCOMBOBOXINFO;

function GetComboBoxInfo(hwndCombo: HWND; var pcbi: COMBOBOXINFO): BOOL; stdcall;
{$EXTERNALSYM GetComboBoxInfo}

//
// The "real" ancestor window
//

const
  GA_PARENT    = 1;
  {$EXTERNALSYM GA_PARENT}
  GA_ROOT      = 2;
  {$EXTERNALSYM GA_ROOT}
  GA_ROOTOWNER = 3;
  {$EXTERNALSYM GA_ROOTOWNER}

function GetAncestor(hwnd: HWND; gaFlags: UINT): HWND; stdcall;
{$EXTERNALSYM GetAncestor}

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

function RealChildWindowFromPoint(hwndParent: HWND; ptParentClientCoords: POINT): HWND; stdcall;
{$EXTERNALSYM RealChildWindowFromPoint}

//
// This gets the name of the window TYPE, not class.  This allows us to
// recognize ThunderButton32 et al.
//

function RealGetWindowClassA(hwnd: HWND; pszType: LPSTR; cchType: UINT): UINT; stdcall;
{$EXTERNALSYM RealGetWindowClassA}

//
// This gets the name of the window TYPE, not class.  This allows us to
// recognize ThunderButton32 et al.
//

function RealGetWindowClassW(hwnd: HWND; pszType: LPWSTR; cchType: UINT): UINT; stdcall;
{$EXTERNALSYM RealGetWindowClassW}
function RealGetWindowClass(hwnd: HWND; pszType: LPTSTR; cchType: UINT): UINT; stdcall;
{$EXTERNALSYM RealGetWindowClass}

//
// Alt-Tab Switch window information.
//

type
  LPALTTABINFO = ^ALTTABINFO;
  {$EXTERNALSYM LPALTTABINFO}
  tagALTTABINFO = record
    cbSize: DWORD;
    cItems: Integer;
    cColumns: Integer;
    cRows: Integer;
    iColFocus: Integer;
    iRowFocus: Integer;
    cxItem: Integer;
    cyItem: Integer;
    ptStart: POINT;
  end;
  {$EXTERNALSYM tagALTTABINFO}
  ALTTABINFO = tagALTTABINFO;
  {$EXTERNALSYM ALTTABINFO}
  TAltTabInfo = ALTTABINFO;
  PAltTabInfo = LPALTTABINFO;

function GetAltTabInfoA(hwnd: HWND; iItem: Integer; var pati: ALTTABINFO;
  pszItemText: LPSTR; cchItemText: UINT): BOOL; stdcall;
{$EXTERNALSYM GetAltTabInfoA}
function GetAltTabInfoW(hwnd: HWND; iItem: Integer; var pati: ALTTABINFO;
  pszItemText: LPWSTR; cchItemText: UINT): BOOL; stdcall;
{$EXTERNALSYM GetAltTabInfoW}
function GetAltTabInfo(hwnd: HWND; iItem: Integer; var pati: ALTTABINFO;
  pszItemText: LPTSTR; cchItemText: UINT): BOOL; stdcall;
{$EXTERNALSYM GetAltTabInfo}

//
// Listbox information.
// Returns the number of items per row.
//

function GetListBoxInfo(hwnd: HWND): DWORD; stdcall;
{$EXTERNALSYM GetListBoxInfo}

function LockWorkStation: BOOL; stdcall;
{$EXTERNALSYM LockWorkStation}

function UserHandleGrantAccess(hUserHandle, hJob: HANDLE; bGrant: BOOL): BOOL; stdcall;
{$EXTERNALSYM UserHandleGrantAccess}

//
// Raw Input Messages.
//

type
  HRAWINPUT = HANDLE;
  {$EXTERNALSYM HRAWINPUT}

//
// WM_INPUT wParam
//

//
// Use this macro to get the input code from wParam.
//

function GET_RAWINPUT_CODE_WPARAM(wParam: WPARAM): DWORD;
{$EXTERNALSYM GET_RAWINPUT_CODE_WPARAM}

//
// The input is in the regular message flow,
// the app is required to call DefWindowProc
// so that the system can perform clean ups.
//

const
  RIM_INPUT       = 0;
  {$EXTERNALSYM RIM_INPUT}

//
// The input is sink only. The app is expected
// to behave nicely.
//

  RIM_INPUTSINK   = 1;
  {$EXTERNALSYM RIM_INPUTSINK}

//
// Raw Input data header
//

type
  tagRAWINPUTHEADER = record
    dwType: DWORD;
    dwSize: DWORD;
    hDevice: HANDLE;
    wParam: WPARAM;
  end;
  {$EXTERNALSYM tagRAWINPUTHEADER}
  RAWINPUTHEADER = tagRAWINPUTHEADER;
  {$EXTERNALSYM RAWINPUTHEADER}
  PRAWINPUTHEADER = ^RAWINPUTHEADER;
  {$EXTERNALSYM PRAWINPUTHEADER}
  LPRAWINPUTHEADER = ^RAWINPUTHEADER;
  {$EXTERNALSYM LPRAWINPUTHEADER}
  TRawInputHeader = RAWINPUTHEADER;

//
// Type of the raw input
//

const
  RIM_TYPEMOUSE      = 0;
  {$EXTERNALSYM RIM_TYPEMOUSE}
  RIM_TYPEKEYBOARD   = 1;
  {$EXTERNALSYM RIM_TYPEKEYBOARD}
  RIM_TYPEHID        = 2;
  {$EXTERNALSYM RIM_TYPEHID}

//
// Raw format of the mouse input
//

type
  tagRAWMOUSE = record
    //
    // Indicator flags.
    //
    usFlags: USHORT;

    //
    // The transition state of the mouse buttons.
    //

    union: record
    case Integer of
      0: (
        ulButtons: ULONG);
      1: (
        usButtonFlags: USHORT;
        usButtonData: USHORT);
    end;

    //
    // The raw state of the mouse buttons.
    //
    ulRawButtons: ULONG;

    //
    // The signed relative or absolute motion in the X direction.
    //
    lLastX: LONG;

    //
    // The signed relative or absolute motion in the Y direction.
    //
    lLastY: LONG;

    //
    // Device-specific additional information for the event.
    //
    ulExtraInformation: ULONG;
  end;
  {$EXTERNALSYM tagRAWMOUSE}
  RAWMOUSE = tagRAWMOUSE;
  {$EXTERNALSYM RAWMOUSE}
  PRAWMOUSE = ^RAWMOUSE;
  {$EXTERNALSYM PRAWMOUSE}
  LPRAWMOUSE = ^RAWMOUSE;
  {$EXTERNALSYM LPRAWMOUSE}
  TRawMouse = RAWMOUSE;

//
// Define the mouse button state indicators.
//

const
  RI_MOUSE_LEFT_BUTTON_DOWN   = $0001; // Left Button changed to down.
  {$EXTERNALSYM RI_MOUSE_LEFT_BUTTON_DOWN}
  RI_MOUSE_LEFT_BUTTON_UP     = $0002; // Left Button changed to up.
  {$EXTERNALSYM RI_MOUSE_LEFT_BUTTON_UP}
  RI_MOUSE_RIGHT_BUTTON_DOWN  = $0004; // Right Button changed to down.
  {$EXTERNALSYM RI_MOUSE_RIGHT_BUTTON_DOWN}
  RI_MOUSE_RIGHT_BUTTON_UP    = $0008; // Right Button changed to up.
  {$EXTERNALSYM RI_MOUSE_RIGHT_BUTTON_UP}
  RI_MOUSE_MIDDLE_BUTTON_DOWN = $0010; // Middle Button changed to down.
  {$EXTERNALSYM RI_MOUSE_MIDDLE_BUTTON_DOWN}
  RI_MOUSE_MIDDLE_BUTTON_UP   = $0020; // Middle Button changed to up.
  {$EXTERNALSYM RI_MOUSE_MIDDLE_BUTTON_UP}

  RI_MOUSE_BUTTON_1_DOWN = RI_MOUSE_LEFT_BUTTON_DOWN;
  {$EXTERNALSYM RI_MOUSE_BUTTON_1_DOWN}
  RI_MOUSE_BUTTON_1_UP   = RI_MOUSE_LEFT_BUTTON_UP;
  {$EXTERNALSYM RI_MOUSE_BUTTON_1_UP}
  RI_MOUSE_BUTTON_2_DOWN = RI_MOUSE_RIGHT_BUTTON_DOWN;
  {$EXTERNALSYM RI_MOUSE_BUTTON_2_DOWN}
  RI_MOUSE_BUTTON_2_UP   = RI_MOUSE_RIGHT_BUTTON_UP;
  {$EXTERNALSYM RI_MOUSE_BUTTON_2_UP}
  RI_MOUSE_BUTTON_3_DOWN = RI_MOUSE_MIDDLE_BUTTON_DOWN;
  {$EXTERNALSYM RI_MOUSE_BUTTON_3_DOWN}
  RI_MOUSE_BUTTON_3_UP   = RI_MOUSE_MIDDLE_BUTTON_UP;
  {$EXTERNALSYM RI_MOUSE_BUTTON_3_UP}

  RI_MOUSE_BUTTON_4_DOWN = $0040;
  {$EXTERNALSYM RI_MOUSE_BUTTON_4_DOWN}
  RI_MOUSE_BUTTON_4_UP   = $0080;
  {$EXTERNALSYM RI_MOUSE_BUTTON_4_UP}
  RI_MOUSE_BUTTON_5_DOWN = $0100;
  {$EXTERNALSYM RI_MOUSE_BUTTON_5_DOWN}
  RI_MOUSE_BUTTON_5_UP   = $0200;
  {$EXTERNALSYM RI_MOUSE_BUTTON_5_UP}

//
// If usButtonFlags has RI_MOUSE_WHEEL, the wheel delta is stored in usButtonData.
// Take it as a signed value.
//

  RI_MOUSE_WHEEL = $0400;
  {$EXTERNALSYM RI_MOUSE_WHEEL}

//
// Define the mouse indicator flags.
//

  MOUSE_MOVE_RELATIVE      = 0;
  {$EXTERNALSYM MOUSE_MOVE_RELATIVE}
  MOUSE_MOVE_ABSOLUTE      = 1;
  {$EXTERNALSYM MOUSE_MOVE_ABSOLUTE}
  MOUSE_VIRTUAL_DESKTOP    = $02; // the coordinates are mapped to the virtual desktop
  {$EXTERNALSYM MOUSE_VIRTUAL_DESKTOP}
  MOUSE_ATTRIBUTES_CHANGED = $04; // requery for mouse attributes
  {$EXTERNALSYM MOUSE_ATTRIBUTES_CHANGED}

//
// Raw format of the keyboard input
//

type
  tagRAWKEYBOARD = record
    //
    // The "make" scan code (key depression).
    //
    MakeCode: USHORT;

    //
    // The flags field indicates a "break" (key release) and other
    // miscellaneous scan code information defined in ntddkbd.h.
    //
    Flags: USHORT;

    Reserved: USHORT;

    //
    // Windows message compatible information
    //
    VKey: USHORT;
    Message: UINT;

    //
    // Device-specific additional information for the event.
    //
    ExtraInformation: ULONG;
  end;
  {$EXTERNALSYM tagRAWKEYBOARD}
  RAWKEYBOARD = tagRAWKEYBOARD;
  {$EXTERNALSYM RAWKEYBOARD}
  PRAWKEYBOARD = ^RAWKEYBOARD;
  {$EXTERNALSYM PRAWKEYBOARD}
  LPRAWKEYBOARD = ^RAWKEYBOARD;
  {$EXTERNALSYM LPRAWKEYBOARD}
  TRawKeyBoard = RAWKEYBOARD;

//
// Define the keyboard overrun MakeCode.
//

const
  KEYBOARD_OVERRUN_MAKE_CODE = $FF;
  {$EXTERNALSYM KEYBOARD_OVERRUN_MAKE_CODE}

//
// Define the keyboard input data Flags.
//

  RI_KEY_MAKE            = 0;
  {$EXTERNALSYM RI_KEY_MAKE}
  RI_KEY_BREAK           = 1;
  {$EXTERNALSYM RI_KEY_BREAK}
  RI_KEY_E0              = 2;
  {$EXTERNALSYM RI_KEY_E0}
  RI_KEY_E1              = 4;
  {$EXTERNALSYM RI_KEY_E1}
  RI_KEY_TERMSRV_SET_LED = 8;
  {$EXTERNALSYM RI_KEY_TERMSRV_SET_LED}
  RI_KEY_TERMSRV_SHADOW  = $10;
  {$EXTERNALSYM RI_KEY_TERMSRV_SHADOW}

//
// Raw format of the input from Human Input Devices
//

type
  tagRAWHID = record
    dwSizeHid: DWORD;    // byte size of each report
    dwCount: DWORD;      // number of input packed
    bRawData: array [0..0] of BYTE;
  end;
  {$EXTERNALSYM tagRAWHID}
  RAWHID = tagRAWHID;
  {$EXTERNALSYM RAWHID}
  PRAWHID = ^RAWHID;
  {$EXTERNALSYM PRAWHID}
  LPRAWHID = ^RAWHID;
  {$EXTERNALSYM LPRAWHID}
  TRawHid = RAWHID;

//
// RAWINPUT data structure.
//

  tagRAWINPUT = record
    header: RAWINPUTHEADER;
    case Integer of
      0: (mouse: RAWMOUSE);
      1: (keyboard: RAWKEYBOARD);
      2: (hid: RAWHID);
  end;
  {$EXTERNALSYM tagRAWINPUT}
  RAWINPUT = tagRAWINPUT;
  {$EXTERNALSYM RAWINPUT}
  PRAWINPUT = ^RAWINPUT;
  {$EXTERNALSYM PRAWINPUT}
  LPRAWINPUT = ^RAWINPUT;
  {$EXTERNALSYM LPRAWINPUT}
  TRawInput = RAWINPUT;

function RAWINPUT_ALIGN(x: Pointer): Pointer;
{$EXTERNALSYM RAWINPUT_ALIGN}

function NEXTRAWINPUTBLOCK(ptr: PRawInput): PRawInput;
{$EXTERNALSYM NEXTRAWINPUTBLOCK}

//
// Flags for GetRawInputData
//

const
  RID_INPUT  = $10000003;
  {$EXTERNALSYM RID_INPUT}
  RID_HEADER = $10000005;
  {$EXTERNALSYM RID_HEADER}

function GetRawInputData(hRawInput: HRAWINPUT; uiCommand: UINT; pData: LPVOID;
  var pcbSize: UINT; cbSizeHeader: UINT): UINT; stdcall;
{$EXTERNALSYM GetRawInputData}

//
// Raw Input Device Information
//

const
  RIDI_PREPARSEDDATA = $20000005;
  {$EXTERNALSYM RIDI_PREPARSEDDATA}
  RIDI_DEVICENAME    = $20000007; // the return valus is the character length, not the byte size
  {$EXTERNALSYM RIDI_DEVICENAME}
  RIDI_DEVICEINFO    = $2000000b;
  {$EXTERNALSYM RIDI_DEVICEINFO}

type
  PRID_DEVICE_INFO_MOUSE = ^RID_DEVICE_INFO_MOUSE;
  {$EXTERNALSYM PRID_DEVICE_INFO_MOUSE}
  tagRID_DEVICE_INFO_MOUSE = record
    dwId: DWORD;
    dwNumberOfButtons: DWORD;
    dwSampleRate: DWORD;
  end;
  {$EXTERNALSYM tagRID_DEVICE_INFO_MOUSE}
  RID_DEVICE_INFO_MOUSE = tagRID_DEVICE_INFO_MOUSE;
  {$EXTERNALSYM RID_DEVICE_INFO_MOUSE}
  TRidDeviceInfoMouse = RID_DEVICE_INFO_MOUSE;
  PRidDeviceInfoMouse = PRID_DEVICE_INFO_MOUSE;

  PRID_DEVICE_INFO_KEYBOARD = ^RID_DEVICE_INFO_KEYBOARD;
  {$EXTERNALSYM PRID_DEVICE_INFO_KEYBOARD}
  tagRID_DEVICE_INFO_KEYBOARD = record
    dwType: DWORD;
    dwSubType: DWORD;
    dwKeyboardMode: DWORD;
    dwNumberOfFunctionKeys: DWORD;
    dwNumberOfIndicators: DWORD;
    dwNumberOfKeysTotal: DWORD;
  end;
  {$EXTERNALSYM tagRID_DEVICE_INFO_KEYBOARD}
  RID_DEVICE_INFO_KEYBOARD = tagRID_DEVICE_INFO_KEYBOARD;
  {$EXTERNALSYM RID_DEVICE_INFO_KEYBOARD}
  TRidDeviceInfoKeyboard = RID_DEVICE_INFO_KEYBOARD;
  PRidDeviceInfoKeyboard = PRID_DEVICE_INFO_KEYBOARD;

  PRID_DEVICE_INFO_HID = ^RID_DEVICE_INFO_HID;
  {$EXTERNALSYM PRID_DEVICE_INFO_HID}
  tagRID_DEVICE_INFO_HID = record
    dwVendorId: DWORD;
    dwProductId: DWORD;
    dwVersionNumber: DWORD;
    //
    // Top level collection UsagePage and Usage
    //
    usUsagePage: USHORT;
    usUsage: USHORT;
  end;
  {$EXTERNALSYM tagRID_DEVICE_INFO_HID}
  RID_DEVICE_INFO_HID = tagRID_DEVICE_INFO_HID;
  {$EXTERNALSYM RID_DEVICE_INFO_HID}
  TRidDeviceInfoHid = RID_DEVICE_INFO_HID;
  PRidDeviceInfoHid = PRID_DEVICE_INFO_HID;

  tagRID_DEVICE_INFO = record
    cbSize: DWORD;
    dwType: DWORD;
    case Integer of
    0: (mouse: RID_DEVICE_INFO_MOUSE);
    1: (keyboard: RID_DEVICE_INFO_KEYBOARD);
    2: (hid: RID_DEVICE_INFO_HID);
  end;
  {$EXTERNALSYM tagRID_DEVICE_INFO}
  RID_DEVICE_INFO = tagRID_DEVICE_INFO;
  {$EXTERNALSYM RID_DEVICE_INFO}
  PRID_DEVICE_INFO = ^RID_DEVICE_INFO;
  {$EXTERNALSYM PRID_DEVICE_INFO}
  LPRID_DEVICE_INFO = ^RID_DEVICE_INFO;
  {$EXTERNALSYM LPRID_DEVICE_INFO}
  TRidDeviceInfo = RID_DEVICE_INFO;
  PRidDeviceInfo = PRID_DEVICE_INFO;

function GetRawInputDeviceInfoA(hDevice: HANDLE; uiCommand: UINT; pData: LPVOID;
  var pcbSize: UINT): UINT; stdcall;
{$EXTERNALSYM GetRawInputDeviceInfoA}
function GetRawInputDeviceInfoW(hDevice: HANDLE; uiCommand: UINT; pData: LPVOID;
  var pcbSize: UINT): UINT; stdcall;
{$EXTERNALSYM GetRawInputDeviceInfoW}
function GetRawInputDeviceInfo(hDevice: HANDLE; uiCommand: UINT; pData: LPVOID;
  var pcbSize: UINT): UINT; stdcall;
{$EXTERNALSYM GetRawInputDeviceInfo}

//
// Raw Input Bulk Read: GetRawInputBuffer
//

function GetRawInputBuffer(pData: PRAWINPUT; var pcbSize: UINT; cbSizeHeader: UINT): UINT; stdcall;
{$EXTERNALSYM GetRawInputBuffer}

//
// Raw Input request APIs
//

type
  LPRAWINPUTDEVICE = ^RAWINPUTDEVICE;
  {$EXTERNALSYM LPRAWINPUTDEVICE}
  PRAWINPUTDEVICE = ^RAWINPUTDEVICE;
  {$EXTERNALSYM PRAWINPUTDEVICE}
  tagRAWINPUTDEVICE = record
    usUsagePage: USHORT; // Toplevel collection UsagePage
    usUsage: USHORT;     // Toplevel collection Usage
    dwFlags: DWORD;
    hwndTarget: HWND;    // Target hwnd. NULL = follows keyboard focus
  end;
  {$EXTERNALSYM tagRAWINPUTDEVICE}
  RAWINPUTDEVICE = tagRAWINPUTDEVICE;
  {$EXTERNALSYM RAWINPUTDEVICE}
  TRawInputDevice = RAWINPUTDEVICE;

const
  RIDEV_REMOVE       = $00000001;
  {$EXTERNALSYM RIDEV_REMOVE}
  RIDEV_EXCLUDE      = $00000010;
  {$EXTERNALSYM RIDEV_EXCLUDE}
  RIDEV_PAGEONLY     = $00000020;
  {$EXTERNALSYM RIDEV_PAGEONLY}
  RIDEV_NOLEGACY     = $00000030;
  {$EXTERNALSYM RIDEV_NOLEGACY}
  RIDEV_INPUTSINK    = $00000100;
  {$EXTERNALSYM RIDEV_INPUTSINK}
  RIDEV_CAPTUREMOUSE = $00000200; // effective when mouse nolegacy is specified, otherwise it would be an error
  {$EXTERNALSYM RIDEV_CAPTUREMOUSE}
  RIDEV_NOHOTKEYS    = $00000200; // effective for keyboard.
  {$EXTERNALSYM RIDEV_NOHOTKEYS}
  RIDEV_APPKEYS      = $00000400;  // effective for keyboard.
  {$EXTERNALSYM RIDEV_APPKEYS}
  RIDEV_EXMODEMASK   = $000000F0;
  {$EXTERNALSYM RIDEV_EXMODEMASK}

function RIDEV_EXMODE(mode: DWORD): DWORD;
{$EXTERNALSYM RIDEV_EXMODE}

function RegisterRawInputDevices(pRawInputDevices: PRAWINPUTDEVICE;
  uiNumDevices: UINT; cbSize: UINT): BOOL; stdcall;
{$EXTERNALSYM RegisterRawInputDevices}

function GetRegisteredRawInputDevices(pRawInputDevices: PRAWINPUTDEVICE;
  var puiNumDevices: UINT; cbSize: UINT): UINT; stdcall;
{$EXTERNALSYM GetRegisteredRawInputDevices}

type
  PRAWINPUTDEVICELIST = ^RAWINPUTDEVICELIST;
  {$EXTERNALSYM PRAWINPUTDEVICELIST}
  tagRAWINPUTDEVICELIST = record
    hDevice: HANDLE;
    dwType: DWORD;
  end;
  {$EXTERNALSYM tagRAWINPUTDEVICELIST}
  RAWINPUTDEVICELIST = tagRAWINPUTDEVICELIST;
  {$EXTERNALSYM RAWINPUTDEVICELIST}
  TRawInputDeviceList = RAWINPUTDEVICELIST;

function GetRawInputDeviceList(pRawInputDeviceList: PRAWINPUTDEVICELIST; var puiNumDevices: UINT;
  cbSize: UINT): UINT; stdcall;
{$EXTERNALSYM GetRawInputDeviceList}

function DefRawInputProc(paRawInput: PRAWINPUT; nInput: Integer; cbSizeHeader: UINT): LRESULT; stdcall;
{$EXTERNALSYM DefRawInputProc}

{$ENDIF JWA_IMPLEMENTATIONSECTION}

{$IFNDEF JWA_OMIT_SECTIONS}
implementation
//uses ...
{$ENDIF JWA_OMIT_SECTIONS}

{$IFNDEF JWA_INTERFACESECTION}

{$IFNDEF JWA_INCLUDEMODE}
const
  user32 = 'user32.dll';
  {$IFDEF UNICODE}
  AWSuffix = 'W';
  {$ELSE}
  AWSuffix = 'A';
  {$ENDIF UNICODE}
{$ENDIF JWA_INCLUDEMODE}

function IS_INTRESOURCE(wInteger: WORD): BOOL;
begin
  Result := (ULONG_PTR(wInteger) shr 16) = 0;
end;

function GET_WHEEL_DELTA_WPARAM(wParam: WPARAM): SHORT;
begin
  Result := SHORT(HIWORD(wParam));
end;

function GET_KEYSTATE_WPARAM(wParam: WPARAM): Integer;
begin
  Result := LOWORD(wParam);
end;

function GET_NCHITTEST_WPARAM(wParam: WPARAM): Shortint;
begin
  Result := LOWORD(wParam);
end;

function GET_XBUTTON_WPARAM(wParam: WPARAM): Integer;
begin
  Result := HIWORD(wParam);
end;

{$IFDEF WIN2000_UP}

function GET_APPCOMMAND_LPARAM(lParam: LPARAM): WORD;
begin
  Result := WORD(HIWORD(lParam) and not FAPPCOMMAND_MASK);
end;

function GET_DEVICE_LPARAM(lParam: LPARAM): WORD;
begin
  Result := WORD(HIWORD(lParam) and FAPPCOMMAND_MASK);
end;

function GET_MOUSEORKEY_LPARAM(lParam: LPARAM): WORD;
begin
  Result := GET_DEVICE_LPARAM(lParam);
end;

function GET_FLAGS_LPARAM(lParam: LPARAM): Integer;
begin
  Result := LOWORD(lParam);
end;

function GET_KEYSTATE_LPARAM(lParam: LPARAM): Integer;
begin
  Result := GET_FLAGS_LPARAM(lParam);
end;

{$ENDIF WIN2000_UP}

function MAKEWPARAM(wLow, wHigh: WORD): WPARAM;
begin
  Result := WPARAM(DWORD(MAKELONG(wLow, wHigh)));
end;

function MAKELPARAM(wLow, wHigh: WORD): LPARAM;
begin
  Result := LPARAM(DWORD(MAKELONG(wLow, wHigh)));
end;

function MAKELRESULT(wLow, wHigh: WORD): LRESULT;
begin
  Result := LRESULT(DWORD(MAKELONG(wLow, wHigh)));
end;

function ExitWindows(dwReserved: DWORD; uREserved: UINT): BOOL;
begin
  Result := ExitWindowsEx(EWX_LOGOFF, $FFFFFFFF);
end;

function PostAppMessageA(idThread: DWORD; wMsg: UINT; wParam: WPARAM; lParam: LPARAM): BOOL;
begin
  Result := PostThreadMessageA(idThread, wMsg, wParam, lParam);
end;

function PostAppMessageW(idThread: DWORD; wMsg: UINT; wParam: WPARAM; lParam: LPARAM): BOOL;
begin
  Result := PostThreadMessageW(idThread, wMsg, wParam, lParam);
end;

function PostAppMessage(idThread: DWORD; wMsg: UINT; wParam: WPARAM; lParam: LPARAM): BOOL;
begin
  {$IFDEF UNICODE}
  Result := PostThreadMessageW(idThread, wMsg, wParam, lParam);
  {$ELSE}
  Result := PostThreadMessageA(idThread, wMsg, wParam, lParam);
  {$ENDIF UNICODE}
end;

function CreateWindowA(lpClassName: LPCSTR; lpWindowName: LPCSTR; dwStyle: DWORD;
  x, y, nWidth, nHeight: Integer; hWndParent: HWND; hMenu: HMENU;
  hInstance: HINST; lpParam: LPVOID): HWND;
begin
  Result := CreateWindowExA(0, lpClassName, lpWindowName, dwStyle, x, y,
    nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam);
end;

function CreateWindowW(lpClassName: LPCWSTR; lpWindowName: LPCWSTR; dwStyle: DWORD;
  x, y, nWidth, nHeight: Integer; hWndParent: HWND; hMenu: HMENU;
  hInstance: HINST; lpParam: LPVOID): HWND;
begin
  Result := CreateWindowExW(0, lpClassName, lpWindowName, dwStyle, x, y,
    nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam);
end;

function CreateWindow(lpClassName: LPCTSTR; lpWindowName: LPCTSTR; dwStyle: DWORD;
  x, y, nWidth, nHeight: Integer; hWndParent: HWND; hMenu: HMENU;
  hInstance: HINST; lpParam: LPVOID): HWND;
begin
  {$IFDEF UNICODE}
  Result := CreateWindowExW(0, lpClassName, lpWindowName, dwStyle, x, y,
    nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam);
  {$ELSE}
  Result := CreateWindowExA(0, lpClassName, lpWindowName, dwStyle, x, y,
    nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam);
  {$ENDIF UNICODE}
end;

function CreateDialogA(hInstance: HINST; lpName: LPCSTR; hWndParent: HWND; lpDialogFunc: DLGPROC): HWND;
begin
  Result := CreateDialogParamA(hInstance, lpName, hWndParent, lpDialogFunc, 0);
end;

function CreateDialogW(hInstance: HINST; lpName: LPCWSTR; hWndParent: HWND; lpDialogFunc: DLGPROC): HWND;
begin
  Result := CreateDialogParamW(hInstance, lpName, hWndParent, lpDialogFunc, 0);
end;

function CreateDialog(hInstance: HINST; lpName: LPCTSTR; hWndParent: HWND; lpDialogFunc: DLGPROC): HWND;
begin
  {$IFDEF UNICODE}
  Result := CreateDialogParamW(hInstance, lpName, hWndParent, lpDialogFunc, 0);
  {$ELSE}
  Result := CreateDialogParamA(hInstance, lpName, hWndParent, lpDialogFunc, 0);
  {$ENDIF UNICODE}
end;

function CreateDialogIndirectA(hInstance: HINST; const lpTemplate: DLGTEMPLATE;
  hWndParent: HWND; lpDialogFunc: DLGPROC): HWND;
begin
  Result := CreateDialogIndirectParamA(hInstance, lpTemplate, hWndParent, lpDialogFunc, 0);
end;

function CreateDialogIndirectW(hInstance: HINST; const lpTemplate: DLGTEMPLATE;
  hWndParent: HWND; lpDialogFunc: DLGPROC): HWND;
begin
  Result := CreateDialogIndirectParamW(hInstance, lpTemplate, hWndParent, lpDialogFunc, 0);
end;

function CreateDialogIndirect(hInstance: HINST; const lpTemplate: DLGTEMPLATE;
  hWndParent: HWND; lpDialogFunc: DLGPROC): HWND;
begin
  {$IFDEF UNICODE}
  Result := CreateDialogIndirectParamW(hInstance, lpTemplate, hWndParent, lpDialogFunc, 0);
  {$ELSE}
  Result := CreateDialogIndirectParamA(hInstance, lpTemplate, hWndParent, lpDialogFunc, 0);
  {$ENDIF UNICODE}
end;

function DialogBoxA(hInstance: HINST; lpTemplate: LPCSTR; hWndParent: HWND; lpDialogFunc: DLGPROC): INT_PTR;
begin
  Result := DialogBoxParamA(hInstance, lpTemplate, hWndParent, lpDialogFunc, 0);
end;

function DialogBoxW(hInstance: HINST; lpTemplate: LPCWSTR; hWndParent: HWND; lpDialogFunc: DLGPROC): INT_PTR;
begin
  Result := DialogBoxParamW(hInstance, lpTemplate, hWndParent, lpDialogFunc, 0);
end;

function DialogBox(hInstance: HINST; lpTemplate: LPCTSTR; hWndParent: HWND; lpDialogFunc: DLGPROC): INT_PTR;
begin
  {$IFDEF UNICODE}
  Result := DialogBoxParamW(hInstance, lpTemplate, hWndParent, lpDialogFunc, 0);
  {$ELSE}
  Result := DialogBoxParamA(hInstance, lpTemplate, hWndParent, lpDialogFunc, 0);
  {$ENDIF UNICODE}
end;

function DialogBoxIndirectA(hInstance: HINST; const lpTemplate: DLGTEMPLATE; hWndParent: HWND; lpDialogFunc: DLGPROC): INT_PTR;
begin
  Result := DialogBoxIndirectParamA(hInstance, lpTemplate, hWndParent, lpDialogFunc, 0);
end;

function DialogBoxIndirectW(hInstance: HINST; const lpTemplate: DLGTEMPLATE; hWndParent: HWND; lpDialogFunc: DLGPROC): INT_PTR;
begin
  Result := DialogBoxIndirectParamW(hInstance, lpTemplate, hWndParent, lpDialogFunc, 0);
end;

function DialogBoxIndirect(hInstance: HINST; const lpTemplate: DLGTEMPLATE; hWndParent: HWND; lpDialogFunc: DLGPROC): INT_PTR;
begin
  {$IFDEF UNICODE}
  Result := DialogBoxIndirectParamW(hInstance, lpTemplate, hWndParent, lpDialogFunc, 0);
  {$ELSE}
  Result := DialogBoxIndirectParamA(hInstance, lpTemplate, hWndParent, lpDialogFunc, 0);
  {$ENDIF UNICODE}
end;

function AnsiToOem(lpszSrc: LPCSTR; lpszDst: LPSTR): BOOL;
begin
  Result := CharToOemA(lpszSrc, lpszDst);
end;

function OemToAnsi(lpszSrc: LPCSTR; lpszDst: LPSTR): BOOL;
begin
  Result := OemToCharA(lpszSrc, lpszDst);
end;

function AnsiToOemBuff(lpszSrc: LPCSTR; lpszDst: LPSTR; cchDstLength: DWORD): BOOL;
begin
  Result := CharToOemBuffA(lpszSrc, lpszDst, cchDstLength);
end;

function OemToAnsiBuff(lpszSrc: LPCSTR; lpszDst: LPSTR; cchDstLength: DWORD): BOOL;
begin
  Result := OemToCharBuffA(lpszSrc, lpszDst, cchDstLength);
end;

function AnsiUpper(lpsz: LPSTR): LPSTR;
begin
  Result := CharUpperA(lpsz);
end;

function AnsiUpperBuff(lpsz: LPSTR; cchLength: DWORD): DWORD;
begin
  Result := CharUpperBuffA(lpsz, cchLength);
end;

function AnsiLower(lpsz: LPSTR): LPSTR;
begin
  Result := CharLowerA(lpsz);
end;

function AnsiLowerBuff(lpsz: LPSTR; cchLength: DWORD): DWORD;
begin
  Result := CharLowerBuffA(lpsz, cchLength);
end;

function AnsiNext(lpsz: LPCSTR): LPSTR;
begin
  Result := CharNextA(lpsz);
end;

function AnsiPrev(lpszStart: LPCSTR; lpszCurrent: LPCSTR): LPSTR;
begin
  Result := CharPrevA(lpszStart, lpszCurrent);
end;

function GetWindowLongPtrA(hWnd: HWND; nIndex: Integer): LONG_PTR;
begin
  Result := GetWindowLongA(hWnd, nIndex);
end;

function GetWindowLongPtrW(hWnd: HWND; nIndex: Integer): LONG_PTR;
begin
  Result := GetWindowLongW(hWnd, nIndex);
end;

function GetWindowLongPtr(hWnd: HWND; nIndex: Integer): LONG_PTR;
begin
  {$IFDEF UNICODE}
  Result := GetWindowLongW(hWnd, nIndex);
  {$ELSE}
  Result := GetWindowLongA(hWnd, nIndex);
  {$ENDIF UNICODE}
end;

function SetWindowLongPtrA(hWnd: HWND; nIndex: Integer; dwNewLong: LONG_PTR): LONG_PTR;
begin
  Result := SetWindowLongA(hWnd, nIndex, dwNewLong);
end;

function SetWindowLongPtrW(hWnd: HWND; nIndex: Integer; dwNewLong: LONG_PTR): LONG_PTR;
begin
  Result := SetWindowLongW(hWnd, nIndex, dwNewLong);
end;

function SetWindowLongPtr(hWnd: HWND; nIndex: Integer; dwNewLong: LONG_PTR): LONG_PTR;
begin
  {$IFDEF UNICODE}
  Result := SetWindowLongW(hWnd, nIndex, dwNewLong);
  {$ELSE}
  Result := SetWindowLongA(hWnd, nIndex, dwNewLong);
  {$ENDIF UNICODE}
end;

function GetClassLongPtrA(hWnd: HWND; nIndex: Integer): ULONG_PTR;
begin
  Result := GetClassLongA(hWnd, nIndex);
end;

function GetClassLongPtrW(hWnd: HWND; nIndex: Integer): ULONG_PTR;
begin
  Result := GetClassLongW(hWnd, nIndex);
end;

function GetClassLongPtr(hWnd: HWND; nIndex: Integer): ULONG_PTR;
begin
  {$IFDEF UNICODE}
  Result := GetClassLongW(hWnd, nIndex);
  {$ELSE}
  Result := GetClassLongA(hWnd, nIndex);
  {$ENDIF UNICODE}
end;

function SetClassLongPtrA(hWnd: HWND; nIndex: Integer; dwNewLong: ULONG_PTR): ULONG_PTR;
begin
  Result := SetClassLongA(hWnd, nIndex, dwNewLong);
end;

function SetClassLongPtrW(hWnd: HWND; nIndex: Integer; dwNewLong: ULONG_PTR): ULONG_PTR;
begin
  Result := SetClassLongW(hWnd, nIndex, dwNewLong);
end;

function SetClassLongPtr(hWnd: HWND; nIndex: Integer; dwNewLong: ULONG_PTR): ULONG_PTR;
begin
  {$IFDEF UNICODE}
  Result := SetClassLongW(hWnd, nIndex, dwNewLong);
  {$ELSE}
  Result := SetClassLongA(hWnd, nIndex, dwNewLong);
  {$ENDIF UNICODE}
end;

function EnumTaskWindows(hTask: HANDLE; lpfn: WNDENUMPROC; lParam: LPARAM): BOOL;
begin
  Result := EnumThreadWindows(ULONG(hTask), lpfn, lParam);
end;

function GetNextWindow(hWnd: HWND; wCmd: UINT): HWND;
begin
  Result := GetWindow(hWnd, wCmd);
end;

function GetWindowTask(hWnd: HWND): HANDLE;
begin
  Result := HANDLE(DWORD_PTR(GetWindowThreadProcessId(hWnd, nil)));
end;

function DefHookProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM; phhk: LPHHOOK): LRESULT;
begin
  Result := CallNextHookEx(HHOOK(phhk^), nCode, wParam, lParam);
end;

function CopyCursor(pcur: HCURSOR): HCURSOR;
begin
 Result := HCURSOR(CopyIcon(HICON(pcur)));
end;

function GET_RAWINPUT_CODE_WPARAM(wParam: WPARAM): DWORD;
begin
  Result := wParam and $ff;
end;

function RAWINPUT_ALIGN(x: Pointer): Pointer;
begin
  Result := Pointer((PtrUInt(x) + (SizeOf(DWORD) - 1)) and not (SizeOf(DWORD) - 1));
end;

function NEXTRAWINPUTBLOCK(ptr: PRawInput): PRawInput;
begin
  Result := PRAWINPUT(DWORD(RAWINPUT_ALIGN(ptr)) + ptr^.header.dwSize);
end;

function RIDEV_EXMODE(mode: DWORD): DWORD;
begin
  Result := mode and RIDEV_EXMODEMASK;
end;

{$IFDEF DYNAMIC_LINK}

var
  _IsHungAppWindow: Pointer;

function IsHungAppWindow;
begin
  GetProcedureAddress(_IsHungAppWindow, user32, 'IsHungAppWindow');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_IsHungAppWindow]
  end;
end;

var
  _DisableProcessWindowsGhosting: Pointer;

procedure DisableProcessWindowsGhosting;
begin
  GetProcedureAddress(_DisableProcessWindowsGhosting, user32, 'DisableProcessWindowsGhosting');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DisableProcessWindowsGhosting]
  end;
end;

var
  _wvsprintfA: Pointer;

function wvsprintfA;
begin
  GetProcedureAddress(_wvsprintfA, user32, 'wvsprintfA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_wvsprintfA]
  end;
end;

var
  _wvsprintfW: Pointer;

function wvsprintfW;
begin
  GetProcedureAddress(_wvsprintfW, user32, 'wvsprintfW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_wvsprintfW]
  end;
end;

var
  _wvsprintf: Pointer;

function wvsprintf;
begin
  GetProcedureAddress(_wvsprintf, user32, 'wvsprintf' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_wvsprintf]
  end;
end;

var
  _wsprintfA: Pointer;

function wsprintfA;
begin
  GetProcedureAddress(_wsprintfA, user32, 'wsprintfA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_wsprintfA]
  end;
end;

var
  _wsprintfW: Pointer;

function wsprintfW;
begin
  GetProcedureAddress(_wsprintfW, user32, 'wsprintfW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_wsprintfW]
  end;
end;

var
  _wsprintf: Pointer;

function wsprintf;
begin
  GetProcedureAddress(_wsprintf, user32, 'wsprintf' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_wsprintf]
  end;
end;

var
  _LoadKeyboardLayoutA: Pointer;

function LoadKeyboardLayoutA;
begin
  GetProcedureAddress(_LoadKeyboardLayoutA, user32, 'LoadKeyboardLayoutA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_LoadKeyboardLayoutA]
  end;
end;

var
  _LoadKeyboardLayoutW: Pointer;

function LoadKeyboardLayoutW;
begin
  GetProcedureAddress(_LoadKeyboardLayoutW, user32, 'LoadKeyboardLayoutW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_LoadKeyboardLayoutW]
  end;
end;

var
  _LoadKeyboardLayout: Pointer;

function LoadKeyboardLayout;
begin
  GetProcedureAddress(_LoadKeyboardLayout, user32, 'LoadKeyboardLayout' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_LoadKeyboardLayout]
  end;
end;

var
  _ActivateKeyboardLayout: Pointer;

function ActivateKeyboardLayout;
begin
  GetProcedureAddress(_ActivateKeyboardLayout, user32, 'ActivateKeyboardLayout');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_ActivateKeyboardLayout]
  end;
end;

var
  _ToUnicodeEx: Pointer;

function ToUnicodeEx;
begin
  GetProcedureAddress(_ToUnicodeEx, user32, 'ToUnicodeEx');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_ToUnicodeEx]
  end;
end;

var
  _UnloadKeyboardLayout: Pointer;

function UnloadKeyboardLayout;
begin
  GetProcedureAddress(_UnloadKeyboardLayout, user32, 'UnloadKeyboardLayout');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_UnloadKeyboardLayout]
  end;
end;

var
  _GetKeyboardLayoutNameA: Pointer;

function GetKeyboardLayoutNameA;
begin
  GetProcedureAddress(_GetKeyboardLayoutNameA, user32, 'GetKeyboardLayoutNameA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetKeyboardLayoutNameA]
  end;
end;

var
  _GetKeyboardLayoutNameW: Pointer;

function GetKeyboardLayoutNameW;
begin
  GetProcedureAddress(_GetKeyboardLayoutNameW, user32, 'GetKeyboardLayoutNameW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetKeyboardLayoutNameW]
  end;
end;

var
  _GetKeyboardLayoutName: Pointer;

function GetKeyboardLayoutName;
begin
  GetProcedureAddress(_GetKeyboardLayoutName, user32, 'GetKeyboardLayoutName' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetKeyboardLayoutName]
  end;
end;

var
  _GetKeyboardLayoutList: Pointer;

function GetKeyboardLayoutList;
begin
  GetProcedureAddress(_GetKeyboardLayoutList, user32, 'GetKeyboardLayoutList');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetKeyboardLayoutList]
  end;
end;

var
  _GetKeyboardLayout: Pointer;

function GetKeyboardLayout;
begin
  GetProcedureAddress(_GetKeyboardLayout, user32, 'GetKeyboardLayout');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetKeyboardLayout]
  end;
end;

var
  _GetMouseMovePointsEx: Pointer;

function GetMouseMovePointsEx;
begin
  GetProcedureAddress(_GetMouseMovePointsEx, user32, 'GetMouseMovePointsEx');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetMouseMovePointsEx]
  end;
end;

var
  _CreateDesktopA: Pointer;

function CreateDesktopA;
begin
  GetProcedureAddress(_CreateDesktopA, user32, 'CreateDesktopA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_CreateDesktopA]
  end;
end;

var
  _CreateDesktopW: Pointer;

function CreateDesktopW;
begin
  GetProcedureAddress(_CreateDesktopW, user32, 'CreateDesktopW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_CreateDesktopW]
  end;
end;

var
  _CreateDesktop: Pointer;

function CreateDesktop;
begin
  GetProcedureAddress(_CreateDesktop, user32, 'CreateDesktop' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_CreateDesktop]
  end;
end;

var
  _OpenDesktopA: Pointer;

function OpenDesktopA;
begin
  GetProcedureAddress(_OpenDesktopA, user32, 'OpenDesktopA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_OpenDesktopA]
  end;
end;

var
  _OpenDesktopW: Pointer;

function OpenDesktopW;
begin
  GetProcedureAddress(_OpenDesktopW, user32, 'OpenDesktopW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_OpenDesktopW]
  end;
end;

var
  _OpenDesktop: Pointer;

function OpenDesktop;
begin
  GetProcedureAddress(_OpenDesktop, user32, 'OpenDesktop' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_OpenDesktop]
  end;
end;

var
  _OpenInputDesktop: Pointer;

function OpenInputDesktop;
begin
  GetProcedureAddress(_OpenInputDesktop, user32, 'OpenInputDesktop');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_OpenInputDesktop]
  end;
end;

var
  _EnumDesktopsA: Pointer;

function EnumDesktopsA;
begin
  GetProcedureAddress(_EnumDesktopsA, user32, 'EnumDesktopsA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_EnumDesktopsA]
  end;
end;

var
  _EnumDesktopsW: Pointer;

function EnumDesktopsW;
begin
  GetProcedureAddress(_EnumDesktopsW, user32, 'EnumDesktopsW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_EnumDesktopsW]
  end;
end;

var
  _EnumDesktops: Pointer;

function EnumDesktops;
begin
  GetProcedureAddress(_EnumDesktops, user32, 'EnumDesktops' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_EnumDesktops]
  end;
end;

var
  _EnumDesktopWindows: Pointer;

function EnumDesktopWindows;
begin
  GetProcedureAddress(_EnumDesktopWindows, user32, 'EnumDesktopWindows');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_EnumDesktopWindows]
  end;
end;

var
  _SwitchDesktop: Pointer;

function SwitchDesktop;
begin
  GetProcedureAddress(_SwitchDesktop, user32, 'SwitchDesktop');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_SwitchDesktop]
  end;
end;

var
  _SetThreadDesktop: Pointer;

function SetThreadDesktop;
begin
  GetProcedureAddress(_SetThreadDesktop, user32, 'SetThreadDesktop');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_SetThreadDesktop]
  end;
end;

var
  _CloseDesktop: Pointer;

function CloseDesktop;
begin
  GetProcedureAddress(_CloseDesktop, user32, 'CloseDesktop');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_CloseDesktop]
  end;
end;

var
  _GetThreadDesktop: Pointer;

function GetThreadDesktop;
begin
  GetProcedureAddress(_GetThreadDesktop, user32, 'GetThreadDesktop');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetThreadDesktop]
  end;
end;

var
  _CreateWindowStationA: Pointer;

function CreateWindowStationA;
begin
  GetProcedureAddress(_CreateWindowStationA, user32, 'CreateWindowStationA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_CreateWindowStationA]
  end;
end;

var
  _CreateWindowStationW: Pointer;

function CreateWindowStationW;
begin
  GetProcedureAddress(_CreateWindowStationW, user32, 'CreateWindowStationW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_CreateWindowStationW]
  end;
end;

var
  _CreateWindowStation: Pointer;

function CreateWindowStation;
begin
  GetProcedureAddress(_CreateWindowStation, user32, 'CreateWindowStation' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_CreateWindowStation]
  end;
end;

var
  _OpenWindowStationA: Pointer;

function OpenWindowStationA;
begin
  GetProcedureAddress(_OpenWindowStationA, user32, 'OpenWindowStationA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_OpenWindowStationA]
  end;
end;

var
  _OpenWindowStationW: Pointer;

function OpenWindowStationW;
begin
  GetProcedureAddress(_OpenWindowStationW, user32, 'OpenWindowStationW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_OpenWindowStationW]
  end;
end;

var
  _OpenWindowStation: Pointer;

function OpenWindowStation;
begin
  GetProcedureAddress(_OpenWindowStation, user32, 'OpenWindowStation' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_OpenWindowStation]
  end;
end;

var
  _EnumWindowStationsA: Pointer;

function EnumWindowStationsA;
begin
  GetProcedureAddress(_EnumWindowStationsA, user32, 'EnumWindowStationsA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_EnumWindowStationsA]
  end;
end;

var
  _EnumWindowStationsW: Pointer;

function EnumWindowStationsW;
begin
  GetProcedureAddress(_EnumWindowStationsW, user32, 'EnumWindowStationsW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_EnumWindowStationsW]
  end;
end;

var
  _EnumWindowStations: Pointer;

function EnumWindowStations;
begin
  GetProcedureAddress(_EnumWindowStations, user32, 'EnumWindowStations' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_EnumWindowStations]
  end;
end;

var
  _CloseWindowStation: Pointer;

function CloseWindowStation;
begin
  GetProcedureAddress(_CloseWindowStation, user32, 'CloseWindowStation');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_CloseWindowStation]
  end;
end;

var
  _SetProcessWindowStation: Pointer;

function SetProcessWindowStation;
begin
  GetProcedureAddress(_SetProcessWindowStation, user32, 'SetProcessWindowStation');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_SetProcessWindowStation]
  end;
end;

var
  _GetProcessWindowStation: Pointer;

function GetProcessWindowStation;
begin
  GetProcedureAddress(_GetProcessWindowStation, user32, 'GetProcessWindowStation');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetProcessWindowStation]
  end;
end;

var
  _SetUserObjectSecurity: Pointer;

function SetUserObjectSecurity;
begin
  GetProcedureAddress(_SetUserObjectSecurity, user32, 'SetUserObjectSecurity');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_SetUserObjectSecurity]
  end;
end;

var
  _GetUserObjectSecurity: Pointer;

function GetUserObjectSecurity;
begin
  GetProcedureAddress(_GetUserObjectSecurity, user32, 'GetUserObjectSecurity');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetUserObjectSecurity]
  end;
end;

var
  _GetUserObjectInformationA: Pointer;

function GetUserObjectInformationA;
begin
  GetProcedureAddress(_GetUserObjectInformationA, user32, 'GetUserObjectInformationA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetUserObjectInformationA]
  end;
end;

var
  _GetUserObjectInformationW: Pointer;

function GetUserObjectInformationW;
begin
  GetProcedureAddress(_GetUserObjectInformationW, user32, 'GetUserObjectInformationW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetUserObjectInformationW]
  end;
end;

var
  _GetUserObjectInformation: Pointer;

function GetUserObjectInformation;
begin
  GetProcedureAddress(_GetUserObjectInformation, user32, 'GetUserObjectInformation' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetUserObjectInformation]
  end;
end;

var
  _SetUserObjectInformationA: Pointer;

function SetUserObjectInformationA;
begin
  GetProcedureAddress(_SetUserObjectInformationA, user32, 'SetUserObjectInformationA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_SetUserObjectInformationA]
  end;
end;

var
  _SetUserObjectInformationW: Pointer;

function SetUserObjectInformationW;
begin
  GetProcedureAddress(_SetUserObjectInformationW, user32, 'SetUserObjectInformationW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_SetUserObjectInformationW]
  end;
end;

var
  _SetUserObjectInformation: Pointer;

function SetUserObjectInformation;
begin
  GetProcedureAddress(_SetUserObjectInformation, user32, 'SetUserObjectInformation' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_SetUserObjectInformation]
  end;
end;

var
  _RegisterWindowMessageA: Pointer;

function RegisterWindowMessageA;
begin
  GetProcedureAddress(_RegisterWindowMessageA, user32, 'RegisterWindowMessageA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_RegisterWindowMessageA]
  end;
end;

var
  _RegisterWindowMessageW: Pointer;

function RegisterWindowMessageW;
begin
  GetProcedureAddress(_RegisterWindowMessageW, user32, 'RegisterWindowMessageW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_RegisterWindowMessageW]
  end;
end;

var
  _RegisterWindowMessage: Pointer;

function RegisterWindowMessage;
begin
  GetProcedureAddress(_RegisterWindowMessage, user32, 'RegisterWindowMessage' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_RegisterWindowMessage]
  end;
end;

var
  __TrackMouseEvent: Pointer;

function TrackMouseEvent;
begin
  GetProcedureAddress(__TrackMouseEvent, user32, 'TrackMouseEvent');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [__TrackMouseEvent]
  end;
end;

var
  _DrawEdge: Pointer;

function DrawEdge;
begin
  GetProcedureAddress(_DrawEdge, user32, 'DrawEdge');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DrawEdge]
  end;
end;

var
  _DrawFrameControl: Pointer;

function DrawFrameControl;
begin
  GetProcedureAddress(_DrawFrameControl, user32, 'DrawFrameControl');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DrawFrameControl]
  end;
end;

var
  _DrawCaption: Pointer;

function DrawCaption;
begin
  GetProcedureAddress(_DrawCaption, user32, 'DrawCaption');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DrawCaption]
  end;
end;

var
  _DrawAnimatedRects: Pointer;

function DrawAnimatedRects;
begin
  GetProcedureAddress(_DrawAnimatedRects, user32, 'DrawAnimatedRects');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DrawAnimatedRects]
  end;
end;

var
  _GetMessageA: Pointer;

function GetMessageA;
begin
  GetProcedureAddress(_GetMessageA, user32, 'GetMessageA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetMessageA]
  end;
end;

var
  _GetMessageW: Pointer;

function GetMessageW;
begin
  GetProcedureAddress(_GetMessageW, user32, 'GetMessageW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetMessageW]
  end;
end;

var
  _GetMessage: Pointer;

function GetMessage;
begin
  GetProcedureAddress(_GetMessage, user32, 'GetMessage' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetMessage]
  end;
end;

var
  _TranslateMessage: Pointer;

function TranslateMessage;
begin
  GetProcedureAddress(_TranslateMessage, user32, 'TranslateMessage');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_TranslateMessage]
  end;
end;

var
  _DispatchMessageA: Pointer;

function DispatchMessageA;
begin
  GetProcedureAddress(_DispatchMessageA, user32, 'DispatchMessageA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DispatchMessageA]
  end;
end;

var
  _DispatchMessageW: Pointer;

function DispatchMessageW;
begin
  GetProcedureAddress(_DispatchMessageW, user32, 'DispatchMessageW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DispatchMessageW]
  end;
end;

var
  _DispatchMessage: Pointer;

function DispatchMessage;
begin
  GetProcedureAddress(_DispatchMessage, user32, 'DispatchMessage' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DispatchMessage]
  end;
end;

var
  _SetMessageQueue: Pointer;

function SetMessageQueue;
begin
  GetProcedureAddress(_SetMessageQueue, user32, 'SetMessageQueue');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_SetMessageQueue]
  end;
end;

var
  _PeekMessageA: Pointer;

function PeekMessageA;
begin
  GetProcedureAddress(_PeekMessageA, user32, 'PeekMessageA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_PeekMessageA]
  end;
end;

var
  _PeekMessageW: Pointer;

function PeekMessageW;
begin
  GetProcedureAddress(_PeekMessageW, user32, 'PeekMessageW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_PeekMessageW]
  end;
end;

var
  _PeekMessage: Pointer;

function PeekMessage;
begin
  GetProcedureAddress(_PeekMessage, user32, 'PeekMessage' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_PeekMessage]
  end;
end;

var
  _RegisterHotKey: Pointer;

function RegisterHotKey;
begin
  GetProcedureAddress(_RegisterHotKey, user32, 'RegisterHotKey');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_RegisterHotKey]
  end;
end;

var
  _UnregisterHotKey: Pointer;

function UnregisterHotKey;
begin
  GetProcedureAddress(_UnregisterHotKey, user32, 'UnregisterHotKey');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_UnregisterHotKey]
  end;
end;

var
  _ExitWindowsEx: Pointer;

function ExitWindowsEx;
begin
  GetProcedureAddress(_ExitWindowsEx, user32, 'ExitWindowsEx');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_ExitWindowsEx]
  end;
end;

var
  _SwapMouseButton: Pointer;

function SwapMouseButton;
begin
  GetProcedureAddress(_SwapMouseButton, user32, 'SwapMouseButton');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_SwapMouseButton]
  end;
end;

var
  _GetMessagePos: Pointer;

function GetMessagePos;
begin
  GetProcedureAddress(_GetMessagePos, user32, 'GetMessagePos');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetMessagePos]
  end;
end;

var
  _GetMessageTime: Pointer;

function GetMessageTime;
begin
  GetProcedureAddress(_GetMessageTime, user32, 'GetMessageTime');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetMessageTime]
  end;
end;

var
  _GetMessageExtraInfo: Pointer;

function GetMessageExtraInfo;
begin
  GetProcedureAddress(_GetMessageExtraInfo, user32, 'GetMessageExtraInfo');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetMessageExtraInfo]
  end;
end;

var
  _SetMessageExtraInfo: Pointer;

function SetMessageExtraInfo;
begin
  GetProcedureAddress(_SetMessageExtraInfo, user32, 'SetMessageExtraInfo');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_SetMessageExtraInfo]
  end;
end;

var
  _SendMessageA: Pointer;

function SendMessageA;
begin
  GetProcedureAddress(_SendMessageA, user32, 'SendMessageA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_SendMessageA]
  end;
end;

var
  _SendMessageW: Pointer;

function SendMessageW;
begin
  GetProcedureAddress(_SendMessageW, user32, 'SendMessageW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_SendMessageW]
  end;
end;

var
  _SendMessage: Pointer;

function SendMessage;
begin
  GetProcedureAddress(_SendMessage, user32, 'SendMessage' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_SendMessage]
  end;
end;

var
  _SendMessageTimeoutA: Pointer;

function SendMessageTimeoutA;
begin
  GetProcedureAddress(_SendMessageTimeoutA, user32, 'SendMessageTimeoutA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_SendMessageTimeoutA]
  end;
end;

var
  _SendMessageTimeoutW: Pointer;

function SendMessageTimeoutW;
begin
  GetProcedureAddress(_SendMessageTimeoutW, user32, 'SendMessageTimeoutW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_SendMessageTimeoutW]
  end;
end;

var
  _SendMessageTimeout: Pointer;

function SendMessageTimeout;
begin
  GetProcedureAddress(_SendMessageTimeout, user32, 'SendMessageTimeout' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_SendMessageTimeout]
  end;
end;

var
  _SendNotifyMessageA: Pointer;

function SendNotifyMessageA;
begin
  GetProcedureAddress(_SendNotifyMessageA, user32, 'SendNotifyMessageA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_SendNotifyMessageA]
  end;
end;

var
  _SendNotifyMessageW: Pointer;

function SendNotifyMessageW;
begin
  GetProcedureAddress(_SendNotifyMessageW, user32, 'SendNotifyMessageW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_SendNotifyMessageW]
  end;
end;

var
  _SendNotifyMessage: Pointer;

function SendNotifyMessage;
begin
  GetProcedureAddress(_SendNotifyMessage, user32, 'SendNotifyMessage' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_SendNotifyMessage]
  end;
end;

var
  _SendMessageCallbackA: Pointer;

function SendMessageCallbackA;
begin
  GetProcedureAddress(_SendMessageCallbackA, user32, 'SendMessageCallbackA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_SendMessageCallbackA]
  end;
end;

var
  _SendMessageCallbackW: Pointer;

function SendMessageCallbackW;
begin
  GetProcedureAddress(_SendMessageCallbackW, user32, 'SendMessageCallbackW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_SendMessageCallbackW]
  end;
end;

var
  _SendMessageCallback: Pointer;

function SendMessageCallback;
begin
  GetProcedureAddress(_SendMessageCallback, user32, 'SendMessageCallback' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_SendMessageCallback]
  end;
end;

var
  _BroadcastSystemMessageExA: Pointer;

function BroadcastSystemMessageExA;
begin
  GetProcedureAddress(_BroadcastSystemMessageExA, user32, 'BroadcastSystemMessageExA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_BroadcastSystemMessageExA]
  end;
end;

var
  _BroadcastSystemMessageExW: Pointer;

function BroadcastSystemMessageExW;
begin
  GetProcedureAddress(_BroadcastSystemMessageExW, user32, 'BroadcastSystemMessageExW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_BroadcastSystemMessageExW]
  end;
end;

var
  _BroadcastSystemMessageEx: Pointer;

function BroadcastSystemMessageEx;
begin
  GetProcedureAddress(_BroadcastSystemMessageEx, user32, 'BroadcastSystemMessageEx' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_BroadcastSystemMessageEx]
  end;
end;

var
  _BroadcastSystemMessageA: Pointer;

function BroadcastSystemMessageA;
begin
  GetProcedureAddress(_BroadcastSystemMessageA, user32, 'BroadcastSystemMessageA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_BroadcastSystemMessageA]
  end;
end;

var
  _BroadcastSystemMessageW: Pointer;

function BroadcastSystemMessageW;
begin
  GetProcedureAddress(_BroadcastSystemMessageW, user32, 'BroadcastSystemMessageW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_BroadcastSystemMessageW]
  end;
end;

var
  _BroadcastSystemMessage: Pointer;

function BroadcastSystemMessage;
begin
  GetProcedureAddress(_BroadcastSystemMessage, user32, 'BroadcastSystemMessage' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_BroadcastSystemMessage]
  end;
end;

var
  _RegisterDeviceNotificationA: Pointer;

function RegisterDeviceNotificationA;
begin
  GetProcedureAddress(_RegisterDeviceNotificationA, user32, 'RegisterDeviceNotificationA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_RegisterDeviceNotificationA]
  end;
end;

var
  _RegisterDeviceNotificationW: Pointer;

function RegisterDeviceNotificationW;
begin
  GetProcedureAddress(_RegisterDeviceNotificationW, user32, 'RegisterDeviceNotificationW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_RegisterDeviceNotificationW]
  end;
end;

var
  _RegisterDeviceNotification: Pointer;

function RegisterDeviceNotification;
begin
  GetProcedureAddress(_RegisterDeviceNotification, user32, 'RegisterDeviceNotification' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_RegisterDeviceNotification]
  end;
end;

var
  _UnregisterDeviceNotification: Pointer;

function UnregisterDeviceNotification;
begin
  GetProcedureAddress(_UnregisterDeviceNotification, user32, 'UnregisterDeviceNotification');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_UnregisterDeviceNotification]
  end;
end;

var
  _PostMessageA: Pointer;

function PostMessageA;
begin
  GetProcedureAddress(_PostMessageA, user32, 'PostMessageA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_PostMessageA]
  end;
end;

var
  _PostMessageW: Pointer;

function PostMessageW;
begin
  GetProcedureAddress(_PostMessageW, user32, 'PostMessageW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_PostMessageW]
  end;
end;

var
  _PostMessage: Pointer;

function PostMessage;
begin
  GetProcedureAddress(_PostMessage, user32, 'PostMessage' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_PostMessage]
  end;
end;

var
  _PostThreadMessageA: Pointer;

function PostThreadMessageA;
begin
  GetProcedureAddress(_PostThreadMessageA, user32, 'PostThreadMessageA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_PostThreadMessageA]
  end;
end;

var
  _PostThreadMessageW: Pointer;

function PostThreadMessageW;
begin
  GetProcedureAddress(_PostThreadMessageW, user32, 'PostThreadMessageW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_PostThreadMessageW]
  end;
end;

var
  _PostThreadMessage: Pointer;

function PostThreadMessage;
begin
  GetProcedureAddress(_PostThreadMessage, user32, 'PostThreadMessage' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_PostThreadMessage]
  end;
end;

var
  _AttachThreadInput: Pointer;

function AttachThreadInput;
begin
  GetProcedureAddress(_AttachThreadInput, user32, 'AttachThreadInput');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_AttachThreadInput]
  end;
end;

var
  _ReplyMessage: Pointer;

function ReplyMessage;
begin
  GetProcedureAddress(_ReplyMessage, user32, 'ReplyMessage');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_ReplyMessage]
  end;
end;

var
  _WaitMessage: Pointer;

function WaitMessage;
begin
  GetProcedureAddress(_WaitMessage, user32, 'WaitMessage');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_WaitMessage]
  end;
end;

var
  _WaitForInputIdle: Pointer;

function WaitForInputIdle;
begin
  GetProcedureAddress(_WaitForInputIdle, user32, 'WaitForInputIdle');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_WaitForInputIdle]
  end;
end;

var
  _DefWindowProcA: Pointer;

function DefWindowProcA;
begin
  GetProcedureAddress(_DefWindowProcA, user32, 'DefWindowProcA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DefWindowProcA]
  end;
end;

var
  _DefWindowProcW: Pointer;

function DefWindowProcW;
begin
  GetProcedureAddress(_DefWindowProcW, user32, 'DefWindowProcW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DefWindowProcW]
  end;
end;

var
  _DefWindowProc: Pointer;

function DefWindowProc;
begin
  GetProcedureAddress(_DefWindowProc, user32, 'DefWindowProc' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DefWindowProc]
  end;
end;

var
  _PostQuitMessage: Pointer;

procedure PostQuitMessage;
begin
  GetProcedureAddress(_PostQuitMessage, user32, 'PostQuitMessage');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_PostQuitMessage]
  end;
end;

var
  _CallWindowProcA: Pointer;

function CallWindowProcA;
begin
  GetProcedureAddress(_CallWindowProcA, user32, 'CallWindowProcA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_CallWindowProcA]
  end;
end;

var
  _CallWindowProcW: Pointer;

function CallWindowProcW;
begin
  GetProcedureAddress(_CallWindowProcW, user32, 'CallWindowProcW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_CallWindowProcW]
  end;
end;

var
  _CallWindowProc: Pointer;

function CallWindowProc;
begin
  GetProcedureAddress(_CallWindowProc, user32, 'CallWindowProc' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_CallWindowProc]
  end;
end;

var
  _InSendMessage: Pointer;

function InSendMessage;
begin
  GetProcedureAddress(_InSendMessage, user32, 'InSendMessage');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_InSendMessage]
  end;
end;

var
  _InSendMessageEx: Pointer;

function InSendMessageEx;
begin
  GetProcedureAddress(_InSendMessageEx, user32, 'InSendMessageEx');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_InSendMessageEx]
  end;
end;

var
  _GetDoubleClickTime: Pointer;

function GetDoubleClickTime;
begin
  GetProcedureAddress(_GetDoubleClickTime, user32, 'GetDoubleClickTime');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetDoubleClickTime]
  end;
end;

var
  _SetDoubleClickTime: Pointer;

function SetDoubleClickTime;
begin
  GetProcedureAddress(_SetDoubleClickTime, user32, 'SetDoubleClickTime');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_SetDoubleClickTime]
  end;
end;

var
  _RegisterClassA: Pointer;

function RegisterClassA;
begin
  GetProcedureAddress(_RegisterClassA, user32, 'RegisterClassA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_RegisterClassA]
  end;
end;

var
  _RegisterClassW: Pointer;

function RegisterClassW;
begin
  GetProcedureAddress(_RegisterClassW, user32, 'RegisterClassW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_RegisterClassW]
  end;
end;

var
  _RegisterClass: Pointer;

function RegisterClass;
begin
  GetProcedureAddress(_RegisterClass, user32, 'RegisterClass' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_RegisterClass]
  end;
end;

var
  _UnregisterClassA: Pointer;

function UnregisterClassA;
begin
  GetProcedureAddress(_UnregisterClassA, user32, 'UnregisterClassA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_UnregisterClassA]
  end;
end;

var
  _UnregisterClassW: Pointer;

function UnregisterClassW;
begin
  GetProcedureAddress(_UnregisterClassW, user32, 'UnregisterClassW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_UnregisterClassW]
  end;
end;

var
  _UnregisterClass: Pointer;

function UnregisterClass;
begin
  GetProcedureAddress(_UnregisterClass, user32, 'UnregisterClass' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_UnregisterClass]
  end;
end;

var
  _GetClassInfoA: Pointer;

function GetClassInfoA;
begin
  GetProcedureAddress(_GetClassInfoA, user32, 'GetClassInfoA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetClassInfoA]
  end;
end;

var
  _GetClassInfoW: Pointer;

function GetClassInfoW;
begin
  GetProcedureAddress(_GetClassInfoW, user32, 'GetClassInfoW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetClassInfoW]
  end;
end;

var
  _GetClassInfo: Pointer;

function GetClassInfo;
begin
  GetProcedureAddress(_GetClassInfo, user32, 'GetClassInfo' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetClassInfo]
  end;
end;

var
  _RegisterClassExA: Pointer;

function RegisterClassExA;
begin
  GetProcedureAddress(_RegisterClassExA, user32, 'RegisterClassExA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_RegisterClassExA]
  end;
end;

var
  _RegisterClassExW: Pointer;

function RegisterClassExW;
begin
  GetProcedureAddress(_RegisterClassExW, user32, 'RegisterClassExW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_RegisterClassExW]
  end;
end;

var
  _RegisterClassEx: Pointer;

function RegisterClassEx;
begin
  GetProcedureAddress(_RegisterClassEx, user32, 'RegisterClassEx' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_RegisterClassEx]
  end;
end;

var
  _GetClassInfoExA: Pointer;

function GetClassInfoExA;
begin
  GetProcedureAddress(_GetClassInfoExA, user32, 'GetClassInfoExA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetClassInfoExA]
  end;
end;

var
  _GetClassInfoExW: Pointer;

function GetClassInfoExW;
begin
  GetProcedureAddress(_GetClassInfoExW, user32, 'GetClassInfoExW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetClassInfoExW]
  end;
end;

var
  _GetClassInfoEx: Pointer;

function GetClassInfoEx;
begin
  GetProcedureAddress(_GetClassInfoEx, user32, 'GetClassInfoEx' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetClassInfoEx]
  end;
end;

var
  _CreateWindowExA: Pointer;

function CreateWindowExA;
begin
  GetProcedureAddress(_CreateWindowExA, user32, 'CreateWindowExA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_CreateWindowExA]
  end;
end;

var
  _CreateWindowExW: Pointer;

function CreateWindowExW;
begin
  GetProcedureAddress(_CreateWindowExW, user32, 'CreateWindowExW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_CreateWindowExW]
  end;
end;

var
  _CreateWindowEx: Pointer;

function CreateWindowEx;
begin
  GetProcedureAddress(_CreateWindowEx, user32, 'CreateWindowEx' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_CreateWindowEx]
  end;
end;

var
  _IsWindow: Pointer;

function IsWindow;
begin
  GetProcedureAddress(_IsWindow, user32, 'IsWindow');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_IsWindow]
  end;
end;

var
  _IsMenu: Pointer;

function IsMenu;
begin
  GetProcedureAddress(_IsMenu, user32, 'IsMenu');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_IsMenu]
  end;
end;

var
  _IsChild: Pointer;

function IsChild;
begin
  GetProcedureAddress(_IsChild, user32, 'IsChild');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_IsChild]
  end;
end;

var
  _DestroyWindow: Pointer;

function DestroyWindow;
begin
  GetProcedureAddress(_DestroyWindow, user32, 'DestroyWindow');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DestroyWindow]
  end;
end;

var
  _ShowWindow: Pointer;

function ShowWindow;
begin
  GetProcedureAddress(_ShowWindow, user32, 'ShowWindow');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_ShowWindow]
  end;
end;

var
  _AnimateWindow: Pointer;

function AnimateWindow;
begin
  GetProcedureAddress(_AnimateWindow, user32, 'AnimateWindow');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_AnimateWindow]
  end;
end;

var
  _UpdateLayeredWindow: Pointer;

function UpdateLayeredWindow;
begin
  GetProcedureAddress(_UpdateLayeredWindow, user32, 'UpdateLayeredWindow');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_UpdateLayeredWindow]
  end;
end;

var
  _GetLayeredWindowAttributes: Pointer;

function GetLayeredWindowAttributes;
begin
  GetProcedureAddress(_GetLayeredWindowAttributes, user32, 'GetLayeredWindowAttributes');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetLayeredWindowAttributes]
  end;
end;

var
  _PrintWindow: Pointer;

function PrintWindow;
begin
  GetProcedureAddress(_PrintWindow, user32, 'PrintWindow');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_PrintWindow]
  end;
end;

var
  _SetLayeredWindowAttributes: Pointer;

function SetLayeredWindowAttributes;
begin
  GetProcedureAddress(_SetLayeredWindowAttributes, user32, 'SetLayeredWindowAttributes');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_SetLayeredWindowAttributes]
  end;
end;

var
  _ShowWindowAsync: Pointer;

function ShowWindowAsync;
begin
  GetProcedureAddress(_ShowWindowAsync, user32, 'ShowWindowAsync');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_ShowWindowAsync]
  end;
end;

var
  _FlashWindow: Pointer;

function FlashWindow;
begin
  GetProcedureAddress(_FlashWindow, user32, 'FlashWindow');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_FlashWindow]
  end;
end;

var
  _FlashWindowEx: Pointer;

function FlashWindowEx;
begin
  GetProcedureAddress(_FlashWindowEx, user32, 'FlashWindowEx');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_FlashWindowEx]
  end;
end;

var
  _ShowOwnedPopups: Pointer;

function ShowOwnedPopups;
begin
  GetProcedureAddress(_ShowOwnedPopups, user32, 'ShowOwnedPopups');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_ShowOwnedPopups]
  end;
end;

var
  _OpenIcon: Pointer;

function OpenIcon;
begin
  GetProcedureAddress(_OpenIcon, user32, 'OpenIcon');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_OpenIcon]
  end;
end;

var
  _CloseWindow: Pointer;

function CloseWindow;
begin
  GetProcedureAddress(_CloseWindow, user32, 'CloseWindow');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_CloseWindow]
  end;
end;

var
  _MoveWindow: Pointer;

function MoveWindow;
begin
  GetProcedureAddress(_MoveWindow, user32, 'MoveWindow');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_MoveWindow]
  end;
end;

var
  _SetWindowPos: Pointer;

function SetWindowPos;
begin
  GetProcedureAddress(_SetWindowPos, user32, 'SetWindowPos');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_SetWindowPos]
  end;
end;

var
  _GetWindowPlacement: Pointer;

function GetWindowPlacement;
begin
  GetProcedureAddress(_GetWindowPlacement, user32, 'GetWindowPlacement');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetWindowPlacement]
  end;
end;

var
  _SetWindowPlacement: Pointer;

function SetWindowPlacement;
begin
  GetProcedureAddress(_SetWindowPlacement, user32, 'SetWindowPlacement');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_SetWindowPlacement]
  end;
end;

var
  _BeginDeferWindowPos: Pointer;

function BeginDeferWindowPos;
begin
  GetProcedureAddress(_BeginDeferWindowPos, user32, 'BeginDeferWindowPos');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_BeginDeferWindowPos]
  end;
end;

var
  _DeferWindowPos: Pointer;

function DeferWindowPos;
begin
  GetProcedureAddress(_DeferWindowPos, user32, 'DeferWindowPos');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DeferWindowPos]
  end;
end;

var
  _EndDeferWindowPos: Pointer;

function EndDeferWindowPos;
begin
  GetProcedureAddress(_EndDeferWindowPos, user32, 'EndDeferWindowPos');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_EndDeferWindowPos]
  end;
end;

var
  _IsWindowVisible: Pointer;

function IsWindowVisible;
begin
  GetProcedureAddress(_IsWindowVisible, user32, 'IsWindowVisible');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_IsWindowVisible]
  end;
end;

var
  _IsIconic: Pointer;

function IsIconic;
begin
  GetProcedureAddress(_IsIconic, user32, 'IsIconic');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_IsIconic]
  end;
end;

var
  _AnyPopup: Pointer;

function AnyPopup;
begin
  GetProcedureAddress(_AnyPopup, user32, 'AnyPopup');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_AnyPopup]
  end;
end;

var
  _BringWindowToTop: Pointer;

function BringWindowToTop;
begin
  GetProcedureAddress(_BringWindowToTop, user32, 'BringWindowToTop');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_BringWindowToTop]
  end;
end;

var
  _IsZoomed: Pointer;

function IsZoomed;
begin
  GetProcedureAddress(_IsZoomed, user32, 'IsZoomed');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_IsZoomed]
  end;
end;

var
  _CreateDialogParamA: Pointer;

function CreateDialogParamA;
begin
  GetProcedureAddress(_CreateDialogParamA, user32, 'CreateDialogParamA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_CreateDialogParamA]
  end;
end;

var
  _CreateDialogParamW: Pointer;

function CreateDialogParamW;
begin
  GetProcedureAddress(_CreateDialogParamW, user32, 'CreateDialogParamW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_CreateDialogParamW]
  end;
end;

var
  _CreateDialogParam: Pointer;

function CreateDialogParam;
begin
  GetProcedureAddress(_CreateDialogParam, user32, 'CreateDialogParam' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_CreateDialogParam]
  end;
end;

var
  _CreateDialogIndirectParamA: Pointer;

function CreateDialogIndirectParamA;
begin
  GetProcedureAddress(_CreateDialogIndirectParamA, user32, 'CreateDialogIndirectParamA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_CreateDialogIndirectParamA]
  end;
end;

var
  _CreateDialogIndirectParamW: Pointer;

function CreateDialogIndirectParamW;
begin
  GetProcedureAddress(_CreateDialogIndirectParamW, user32, 'CreateDialogIndirectParamW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_CreateDialogIndirectParamW]
  end;
end;

var
  _CreateDialogIndirectParam: Pointer;

function CreateDialogIndirectParam;
begin
  GetProcedureAddress(_CreateDialogIndirectParam, user32, 'CreateDialogIndirectParam' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_CreateDialogIndirectParam]
  end;
end;

var
  _DialogBoxParamA: Pointer;

function DialogBoxParamA;
begin
  GetProcedureAddress(_DialogBoxParamA, user32, 'DialogBoxParamA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DialogBoxParamA]
  end;
end;

var
  _DialogBoxParamW: Pointer;

function DialogBoxParamW;
begin
  GetProcedureAddress(_DialogBoxParamW, user32, 'DialogBoxParamW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DialogBoxParamW]
  end;
end;

var
  _DialogBoxParam: Pointer;

function DialogBoxParam;
begin
  GetProcedureAddress(_DialogBoxParam, user32, 'DialogBoxParam' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DialogBoxParam]
  end;
end;

var
  _DialogBoxIndirectParamA: Pointer;

function DialogBoxIndirectParamA;
begin
  GetProcedureAddress(_DialogBoxIndirectParamA, user32, 'DialogBoxIndirectParamA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DialogBoxIndirectParamA]
  end;
end;

var
  _DialogBoxIndirectParamW: Pointer;

function DialogBoxIndirectParamW;
begin
  GetProcedureAddress(_DialogBoxIndirectParamW, user32, 'DialogBoxIndirectParamW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DialogBoxIndirectParamW]
  end;
end;

var
  _DialogBoxIndirectParam: Pointer;

function DialogBoxIndirectParam;
begin
  GetProcedureAddress(_DialogBoxIndirectParam, user32, 'DialogBoxIndirectParam' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DialogBoxIndirectParam]
  end;
end;

var
  _EndDialog: Pointer;

function EndDialog;
begin
  GetProcedureAddress(_EndDialog, user32, 'EndDialog');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_EndDialog]
  end;
end;

var
  _GetDlgItem: Pointer;

function GetDlgItem;
begin
  GetProcedureAddress(_GetDlgItem, user32, 'GetDlgItem');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetDlgItem]
  end;
end;

var
  _SetDlgItemInt: Pointer;

function SetDlgItemInt;
begin
  GetProcedureAddress(_SetDlgItemInt, user32, 'SetDlgItemInt');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_SetDlgItemInt]
  end;
end;

var
  _GetDlgItemInt: Pointer;

function GetDlgItemInt;
begin
  GetProcedureAddress(_GetDlgItemInt, user32, 'GetDlgItemInt');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetDlgItemInt]
  end;
end;

var
  _SetDlgItemTextA: Pointer;

function SetDlgItemTextA;
begin
  GetProcedureAddress(_SetDlgItemTextA, user32, 'SetDlgItemTextA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_SetDlgItemTextA]
  end;
end;

var
  _SetDlgItemTextW: Pointer;

function SetDlgItemTextW;
begin
  GetProcedureAddress(_SetDlgItemTextW, user32, 'SetDlgItemTextW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_SetDlgItemTextW]
  end;
end;

var
  _SetDlgItemText: Pointer;

function SetDlgItemText;
begin
  GetProcedureAddress(_SetDlgItemText, user32, 'SetDlgItemText' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_SetDlgItemText]
  end;
end;

var
  _GetDlgItemTextA: Pointer;

function GetDlgItemTextA;
begin
  GetProcedureAddress(_GetDlgItemTextA, user32, 'GetDlgItemTextA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetDlgItemTextA]
  end;
end;

var
  _GetDlgItemTextW: Pointer;

function GetDlgItemTextW;
begin
  GetProcedureAddress(_GetDlgItemTextW, user32, 'GetDlgItemTextW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetDlgItemTextW]
  end;
end;

var
  _GetDlgItemText: Pointer;

function GetDlgItemText;
begin
  GetProcedureAddress(_GetDlgItemText, user32, 'GetDlgItemText' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetDlgItemText]
  end;
end;

var
  _CheckDlgButton: Pointer;

function CheckDlgButton;
begin
  GetProcedureAddress(_CheckDlgButton, user32, 'CheckDlgButton');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_CheckDlgButton]
  end;
end;

var
  _CheckRadioButton: Pointer;

function CheckRadioButton;
begin
  GetProcedureAddress(_CheckRadioButton, user32, 'CheckRadioButton');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_CheckRadioButton]
  end;
end;

var
  _IsDlgButtonChecked: Pointer;

function IsDlgButtonChecked;
begin
  GetProcedureAddress(_IsDlgButtonChecked, user32, 'IsDlgButtonChecked');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_IsDlgButtonChecked]
  end;
end;

var
  _SendDlgItemMessageA: Pointer;

function SendDlgItemMessageA;
begin
  GetProcedureAddress(_SendDlgItemMessageA, user32, 'SendDlgItemMessageA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_SendDlgItemMessageA]
  end;
end;

var
  _SendDlgItemMessageW: Pointer;

function SendDlgItemMessageW;
begin
  GetProcedureAddress(_SendDlgItemMessageW, user32, 'SendDlgItemMessageW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_SendDlgItemMessageW]
  end;
end;

var
  _SendDlgItemMessage: Pointer;

function SendDlgItemMessage;
begin
  GetProcedureAddress(_SendDlgItemMessage, user32, 'SendDlgItemMessage' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_SendDlgItemMessage]
  end;
end;

var
  _GetNextDlgGroupItem: Pointer;

function GetNextDlgGroupItem;
begin
  GetProcedureAddress(_GetNextDlgGroupItem, user32, 'GetNextDlgGroupItem');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetNextDlgGroupItem]
  end;
end;

var
  _GetNextDlgTabItem: Pointer;

function GetNextDlgTabItem;
begin
  GetProcedureAddress(_GetNextDlgTabItem, user32, 'GetNextDlgTabItem');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetNextDlgTabItem]
  end;
end;

var
  _GetDlgCtrlID: Pointer;

function GetDlgCtrlID;
begin
  GetProcedureAddress(_GetDlgCtrlID, user32, 'GetDlgCtrlID');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetDlgCtrlID]
  end;
end;

var
  _GetDialogBaseUnits: Pointer;

function GetDialogBaseUnits;
begin
  GetProcedureAddress(_GetDialogBaseUnits, user32, 'GetDialogBaseUnits');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetDialogBaseUnits]
  end;
end;

var
  _DefDlgProcA: Pointer;

function DefDlgProcA;
begin
  GetProcedureAddress(_DefDlgProcA, user32, 'DefDlgProcA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DefDlgProcA]
  end;
end;

var
  _DefDlgProcW: Pointer;

function DefDlgProcW;
begin
  GetProcedureAddress(_DefDlgProcW, user32, 'DefDlgProcW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DefDlgProcW]
  end;
end;

var
  _DefDlgProc: Pointer;

function DefDlgProc;
begin
  GetProcedureAddress(_DefDlgProc, user32, 'DefDlgProc' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DefDlgProc]
  end;
end;

var
  _CallMsgFilterA: Pointer;

function CallMsgFilterA;
begin
  GetProcedureAddress(_CallMsgFilterA, user32, 'CallMsgFilterA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_CallMsgFilterA]
  end;
end;

var
  _CallMsgFilterW: Pointer;

function CallMsgFilterW;
begin
  GetProcedureAddress(_CallMsgFilterW, user32, 'CallMsgFilterW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_CallMsgFilterW]
  end;
end;

var
  _CallMsgFilter: Pointer;

function CallMsgFilter;
begin
  GetProcedureAddress(_CallMsgFilter, user32, 'CallMsgFilter' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_CallMsgFilter]
  end;
end;

var
  _OpenClipboard: Pointer;

function OpenClipboard;
begin
  GetProcedureAddress(_OpenClipboard, user32, 'OpenClipboard');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_OpenClipboard]
  end;
end;

var
  _CloseClipboard: Pointer;

function CloseClipboard;
begin
  GetProcedureAddress(_CloseClipboard, user32, 'CloseClipboard');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_CloseClipboard]
  end;
end;

var
  _GetClipboardSequenceNumber: Pointer;

function GetClipboardSequenceNumber;
begin
  GetProcedureAddress(_GetClipboardSequenceNumber, user32, 'GetClipboardSequenceNumber');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetClipboardSequenceNumber]
  end;
end;

var
  _GetClipboardOwner: Pointer;

function GetClipboardOwner;
begin
  GetProcedureAddress(_GetClipboardOwner, user32, 'GetClipboardOwner');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetClipboardOwner]
  end;
end;

var
  _SetClipboardViewer: Pointer;

function SetClipboardViewer;
begin
  GetProcedureAddress(_SetClipboardViewer, user32, 'SetClipboardViewer');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_SetClipboardViewer]
  end;
end;

var
  _GetClipboardViewer: Pointer;

function GetClipboardViewer;
begin
  GetProcedureAddress(_GetClipboardViewer, user32, 'GetClipboardViewer');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetClipboardViewer]
  end;
end;

var
  _ChangeClipboardChain: Pointer;

function ChangeClipboardChain;
begin
  GetProcedureAddress(_ChangeClipboardChain, user32, 'ChangeClipboardChain');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_ChangeClipboardChain]
  end;
end;

var
  _SetClipboardData: Pointer;

function SetClipboardData;
begin
  GetProcedureAddress(_SetClipboardData, user32, 'SetClipboardData');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_SetClipboardData]
  end;
end;

var
  _GetClipboardData: Pointer;

function GetClipboardData;
begin
  GetProcedureAddress(_GetClipboardData, user32, 'GetClipboardData');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetClipboardData]
  end;
end;

var
  _RegisterClipboardFormatA: Pointer;

function RegisterClipboardFormatA;
begin
  GetProcedureAddress(_RegisterClipboardFormatA, user32, 'RegisterClipboardFormatA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_RegisterClipboardFormatA]
  end;
end;

var
  _RegisterClipboardFormatW: Pointer;

function RegisterClipboardFormatW;
begin
  GetProcedureAddress(_RegisterClipboardFormatW, user32, 'RegisterClipboardFormatW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_RegisterClipboardFormatW]
  end;
end;

var
  _RegisterClipboardFormat: Pointer;

function RegisterClipboardFormat;
begin
  GetProcedureAddress(_RegisterClipboardFormat, user32, 'RegisterClipboardFormat' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_RegisterClipboardFormat]
  end;
end;

var
  _CountClipboardFormats: Pointer;

function CountClipboardFormats;
begin
  GetProcedureAddress(_CountClipboardFormats, user32, 'CountClipboardFormats');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_CountClipboardFormats]
  end;
end;

var
  _EnumClipboardFormats: Pointer;

function EnumClipboardFormats;
begin
  GetProcedureAddress(_EnumClipboardFormats, user32, 'EnumClipboardFormats');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_EnumClipboardFormats]
  end;
end;

var
  _GetClipboardFormatNameA: Pointer;

function GetClipboardFormatNameA;
begin
  GetProcedureAddress(_GetClipboardFormatNameA, user32, 'GetClipboardFormatNameA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetClipboardFormatNameA]
  end;
end;

var
  _GetClipboardFormatNameW: Pointer;

function GetClipboardFormatNameW;
begin
  GetProcedureAddress(_GetClipboardFormatNameW, user32, 'GetClipboardFormatNameW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetClipboardFormatNameW]
  end;
end;

var
  _GetClipboardFormatName: Pointer;

function GetClipboardFormatName;
begin
  GetProcedureAddress(_GetClipboardFormatName, user32, 'GetClipboardFormatName' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetClipboardFormatName]
  end;
end;

var
  _EmptyClipboard: Pointer;

function EmptyClipboard;
begin
  GetProcedureAddress(_EmptyClipboard, user32, 'EmptyClipboard');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_EmptyClipboard]
  end;
end;

var
  _IsClipboardFormatAvailable: Pointer;

function IsClipboardFormatAvailable;
begin
  GetProcedureAddress(_IsClipboardFormatAvailable, user32, 'IsClipboardFormatAvailable');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_IsClipboardFormatAvailable]
  end;
end;

var
  _GetPriorityClipboardFormat: Pointer;

function GetPriorityClipboardFormat;
begin
  GetProcedureAddress(_GetPriorityClipboardFormat, user32, 'GetPriorityClipboardFormat');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetPriorityClipboardFormat]
  end;
end;

var
  _GetOpenClipboardWindow: Pointer;

function GetOpenClipboardWindow;
begin
  GetProcedureAddress(_GetOpenClipboardWindow, user32, 'GetOpenClipboardWindow');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetOpenClipboardWindow]
  end;
end;

var
  _CharToOemA: Pointer;

function CharToOemA;
begin
  GetProcedureAddress(_CharToOemA, user32, 'CharToOemA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_CharToOemA]
  end;
end;

var
  _CharToOemW: Pointer;

function CharToOemW;
begin
  GetProcedureAddress(_CharToOemW, user32, 'CharToOemW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_CharToOemW]
  end;
end;

var
  _CharToOem: Pointer;

function CharToOem;
begin
  GetProcedureAddress(_CharToOem, user32, 'CharToOem' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_CharToOem]
  end;
end;

var
  _OemToCharA: Pointer;

function OemToCharA;
begin
  GetProcedureAddress(_OemToCharA, user32, 'OemToCharA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_OemToCharA]
  end;
end;

var
  _OemToCharW: Pointer;

function OemToCharW;
begin
  GetProcedureAddress(_OemToCharW, user32, 'OemToCharW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_OemToCharW]
  end;
end;

var
  _OemToChar: Pointer;

function OemToChar;
begin
  GetProcedureAddress(_OemToChar, user32, 'OemToChar' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_OemToChar]
  end;
end;

var
  _CharToOemBuffA: Pointer;

function CharToOemBuffA;
begin
  GetProcedureAddress(_CharToOemBuffA, user32, 'CharToOemBuffA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_CharToOemBuffA]
  end;
end;

var
  _CharToOemBuffW: Pointer;

function CharToOemBuffW;
begin
  GetProcedureAddress(_CharToOemBuffW, user32, 'CharToOemBuffW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_CharToOemBuffW]
  end;
end;

var
  _CharToOemBuff: Pointer;

function CharToOemBuff;
begin
  GetProcedureAddress(_CharToOemBuff, user32, 'CharToOemBuff' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_CharToOemBuff]
  end;
end;

var
  _OemToCharBuffA: Pointer;

function OemToCharBuffA;
begin
  GetProcedureAddress(_OemToCharBuffA, user32, 'OemToCharBuffA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_OemToCharBuffA]
  end;
end;

var
  _OemToCharBuffW: Pointer;

function OemToCharBuffW;
begin
  GetProcedureAddress(_OemToCharBuffW, user32, 'OemToCharBuffW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_OemToCharBuffW]
  end;
end;

var
  _OemToCharBuff: Pointer;

function OemToCharBuff;
begin
  GetProcedureAddress(_OemToCharBuff, user32, 'OemToCharBuff' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_OemToCharBuff]
  end;
end;

var
  _CharUpperA: Pointer;

function CharUpperA;
begin
  GetProcedureAddress(_CharUpperA, user32, 'CharUpperA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_CharUpperA]
  end;
end;

var
  _CharUpperW: Pointer;

function CharUpperW;
begin
  GetProcedureAddress(_CharUpperW, user32, 'CharUpperW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_CharUpperW]
  end;
end;

var
  _CharUpper: Pointer;

function CharUpper;
begin
  GetProcedureAddress(_CharUpper, user32, 'CharUpper' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_CharUpper]
  end;
end;

var
  _CharUpperBuffA: Pointer;

function CharUpperBuffA;
begin
  GetProcedureAddress(_CharUpperBuffA, user32, 'CharUpperBuffA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_CharUpperBuffA]
  end;
end;

var
  _CharUpperBuffW: Pointer;

function CharUpperBuffW;
begin
  GetProcedureAddress(_CharUpperBuffW, user32, 'CharUpperBuffW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_CharUpperBuffW]
  end;
end;

var
  _CharUpperBuff: Pointer;

function CharUpperBuff;
begin
  GetProcedureAddress(_CharUpperBuff, user32, 'CharUpperBuff' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_CharUpperBuff]
  end;
end;

var
  _CharLowerA: Pointer;

function CharLowerA;
begin
  GetProcedureAddress(_CharLowerA, user32, 'CharLowerA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_CharLowerA]
  end;
end;

var
  _CharLowerW: Pointer;

function CharLowerW;
begin
  GetProcedureAddress(_CharLowerW, user32, 'CharLowerW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_CharLowerW]
  end;
end;

var
  _CharLower: Pointer;

function CharLower;
begin
  GetProcedureAddress(_CharLower, user32, 'CharLower' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_CharLower]
  end;
end;

var
  _CharLowerBuffA: Pointer;

function CharLowerBuffA;
begin
  GetProcedureAddress(_CharLowerBuffA, user32, 'CharLowerBuffA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_CharLowerBuffA]
  end;
end;

var
  _CharLowerBuffW: Pointer;

function CharLowerBuffW;
begin
  GetProcedureAddress(_CharLowerBuffW, user32, 'CharLowerBuffW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_CharLowerBuffW]
  end;
end;

var
  _CharLowerBuff: Pointer;

function CharLowerBuff;
begin
  GetProcedureAddress(_CharLowerBuff, user32, 'CharLowerBuff' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_CharLowerBuff]
  end;
end;

var
  _CharNextA: Pointer;

function CharNextA;
begin
  GetProcedureAddress(_CharNextA, user32, 'CharNextA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_CharNextA]
  end;
end;

var
  _CharNextW: Pointer;

function CharNextW;
begin
  GetProcedureAddress(_CharNextW, user32, 'CharNextW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_CharNextW]
  end;
end;

var
  _CharNext: Pointer;

function CharNext;
begin
  GetProcedureAddress(_CharNext, user32, 'CharNext' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_CharNext]
  end;
end;

var
  _CharPrevA: Pointer;

function CharPrevA;
begin
  GetProcedureAddress(_CharPrevA, user32, 'CharPrevA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_CharPrevA]
  end;
end;

var
  _CharPrevW: Pointer;

function CharPrevW;
begin
  GetProcedureAddress(_CharPrevW, user32, 'CharPrevW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_CharPrevW]
  end;
end;

var
  _CharPrev: Pointer;

function CharPrev;
begin
  GetProcedureAddress(_CharPrev, user32, 'CharPrev' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_CharPrev]
  end;
end;

var
  _CharNextExA: Pointer;

function CharNextExA;
begin
  GetProcedureAddress(_CharNextExA, user32, 'CharNextExA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_CharNextExA]
  end;
end;

var
  _CharPrevExA: Pointer;

function CharPrevExA;
begin
  GetProcedureAddress(_CharPrevExA, user32, 'CharPrevExA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_CharPrevExA]
  end;
end;

var
  _IsCharAlphaA: Pointer;

function IsCharAlphaA;
begin
  GetProcedureAddress(_IsCharAlphaA, user32, 'IsCharAlphaA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_IsCharAlphaA]
  end;
end;

var
  _IsCharAlphaW: Pointer;

function IsCharAlphaW;
begin
  GetProcedureAddress(_IsCharAlphaW, user32, 'IsCharAlphaW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_IsCharAlphaW]
  end;
end;

var
  _IsCharAlpha: Pointer;

function IsCharAlpha;
begin
  GetProcedureAddress(_IsCharAlpha, user32, 'IsCharAlpha' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_IsCharAlpha]
  end;
end;

var
  _IsCharAlphaNumericA: Pointer;

function IsCharAlphaNumericA;
begin
  GetProcedureAddress(_IsCharAlphaNumericA, user32, 'IsCharAlphaNumericA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_IsCharAlphaNumericA]
  end;
end;

var
  _IsCharAlphaNumericW: Pointer;

function IsCharAlphaNumericW;
begin
  GetProcedureAddress(_IsCharAlphaNumericW, user32, 'IsCharAlphaNumericW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_IsCharAlphaNumericW]
  end;
end;

var
  _IsCharAlphaNumeric: Pointer;

function IsCharAlphaNumeric;
begin
  GetProcedureAddress(_IsCharAlphaNumeric, user32, 'IsCharAlphaNumeric' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_IsCharAlphaNumeric]
  end;
end;

var
  _IsCharUpperA: Pointer;

function IsCharUpperA;
begin
  GetProcedureAddress(_IsCharUpperA, user32, 'IsCharUpperA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_IsCharUpperA]
  end;
end;

var
  _IsCharUpperW: Pointer;

function IsCharUpperW;
begin
  GetProcedureAddress(_IsCharUpperW, user32, 'IsCharUpperW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_IsCharUpperW]
  end;
end;

var
  _IsCharUpper: Pointer;

function IsCharUpper;
begin
  GetProcedureAddress(_IsCharUpper, user32, 'IsCharUpper' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_IsCharUpper]
  end;
end;

var
  _IsCharLowerA: Pointer;

function IsCharLowerA;
begin
  GetProcedureAddress(_IsCharLowerA, user32, 'IsCharLowerA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_IsCharLowerA]
  end;
end;

var
  _IsCharLowerW: Pointer;

function IsCharLowerW;
begin
  GetProcedureAddress(_IsCharLowerW, user32, 'IsCharLowerW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_IsCharLowerW]
  end;
end;

var
  _IsCharLower: Pointer;

function IsCharLower;
begin
  GetProcedureAddress(_IsCharLower, user32, 'IsCharLower' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_IsCharLower]
  end;
end;

var
  _SetFocus: Pointer;

function SetFocus;
begin
  GetProcedureAddress(_SetFocus, user32, 'SetFocus');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_SetFocus]
  end;
end;

var
  _GetActiveWindow: Pointer;

function GetActiveWindow;
begin
  GetProcedureAddress(_GetActiveWindow, user32, 'GetActiveWindow');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetActiveWindow]
  end;
end;

var
  _GetFocus: Pointer;

function GetFocus;
begin
  GetProcedureAddress(_GetFocus, user32, 'GetFocus');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetFocus]
  end;
end;

var
  _GetKBCodePage: Pointer;

function GetKBCodePage;
begin
  GetProcedureAddress(_GetKBCodePage, user32, 'GetKBCodePage');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetKBCodePage]
  end;
end;

var
  _GetKeyState: Pointer;

function GetKeyState;
begin
  GetProcedureAddress(_GetKeyState, user32, 'GetKeyState');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetKeyState]
  end;
end;

var
  _GetAsyncKeyState: Pointer;

function GetAsyncKeyState;
begin
  GetProcedureAddress(_GetAsyncKeyState, user32, 'GetAsyncKeyState');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetAsyncKeyState]
  end;
end;

var
  _GetKeyboardState: Pointer;

function GetKeyboardState;
begin
  GetProcedureAddress(_GetKeyboardState, user32, 'GetKeyboardState');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetKeyboardState]
  end;
end;

var
  _SetKeyboardState: Pointer;

function SetKeyboardState;
begin
  GetProcedureAddress(_SetKeyboardState, user32, 'SetKeyboardState');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_SetKeyboardState]
  end;
end;

var
  _GetKeyNameTextA: Pointer;

function GetKeyNameTextA;
begin
  GetProcedureAddress(_GetKeyNameTextA, user32, 'GetKeyNameTextA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetKeyNameTextA]
  end;
end;

var
  _GetKeyNameTextW: Pointer;

function GetKeyNameTextW;
begin
  GetProcedureAddress(_GetKeyNameTextW, user32, 'GetKeyNameTextW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetKeyNameTextW]
  end;
end;

var
  _GetKeyNameText: Pointer;

function GetKeyNameText;
begin
  GetProcedureAddress(_GetKeyNameText, user32, 'GetKeyNameText' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetKeyNameText]
  end;
end;

var
  _GetKeyboardType: Pointer;

function GetKeyboardType;
begin
  GetProcedureAddress(_GetKeyboardType, user32, 'GetKeyboardType');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetKeyboardType]
  end;
end;

var
  _ToAscii: Pointer;

function ToAscii;
begin
  GetProcedureAddress(_ToAscii, user32, 'ToAscii');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_ToAscii]
  end;
end;

var
  _ToAsciiEx: Pointer;

function ToAsciiEx;
begin
  GetProcedureAddress(_ToAsciiEx, user32, 'ToAsciiEx');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_ToAsciiEx]
  end;
end;

var
  _ToUnicode: Pointer;

function ToUnicode;
begin
  GetProcedureAddress(_ToUnicode, user32, 'ToUnicode');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_ToUnicode]
  end;
end;

var
  _OemKeyScan: Pointer;

function OemKeyScan;
begin
  GetProcedureAddress(_OemKeyScan, user32, 'OemKeyScan');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_OemKeyScan]
  end;
end;

var
  _VkKeyScanA: Pointer;

function VkKeyScanA;
begin
  GetProcedureAddress(_VkKeyScanA, user32, 'VkKeyScanA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_VkKeyScanA]
  end;
end;

var
  _VkKeyScanW: Pointer;

function VkKeyScanW;
begin
  GetProcedureAddress(_VkKeyScanW, user32, 'VkKeyScanW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_VkKeyScanW]
  end;
end;

var
  _VkKeyScan: Pointer;

function VkKeyScan;
begin
  GetProcedureAddress(_VkKeyScan, user32, 'VkKeyScan' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_VkKeyScan]
  end;
end;

var
  _VkKeyScanExA: Pointer;

function VkKeyScanExA;
begin
  GetProcedureAddress(_VkKeyScanExA, user32, 'VkKeyScanExA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_VkKeyScanExA]
  end;
end;

var
  _VkKeyScanExW: Pointer;

function VkKeyScanExW;
begin
  GetProcedureAddress(_VkKeyScanExW, user32, 'VkKeyScanExW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_VkKeyScanExW]
  end;
end;

var
  _VkKeyScanEx: Pointer;

function VkKeyScanEx;
begin
  GetProcedureAddress(_VkKeyScanEx, user32, 'VkKeyScanEx' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_VkKeyScanEx]
  end;
end;

var
  _keybd_event: Pointer;

procedure keybd_event;
begin
  GetProcedureAddress(_keybd_event, user32, 'keybd_event');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_keybd_event]
  end;
end;

var
  _mouse_event: Pointer;

procedure mouse_event;
begin
  GetProcedureAddress(_mouse_event, user32, 'mouse_event');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_mouse_event]
  end;
end;

var
  _SendInput: Pointer;

function SendInput;
begin
  GetProcedureAddress(_SendInput, user32, 'SendInput');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_SendInput]
  end;
end;

var
  _GetLastInputInfo: Pointer;

function GetLastInputInfo;
begin
  GetProcedureAddress(_GetLastInputInfo, user32, 'GetLastInputInfo');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetLastInputInfo]
  end;
end;

var
  _MapVirtualKeyA: Pointer;

function MapVirtualKeyA;
begin
  GetProcedureAddress(_MapVirtualKeyA, user32, 'MapVirtualKeyA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_MapVirtualKeyA]
  end;
end;

var
  _MapVirtualKeyW: Pointer;

function MapVirtualKeyW;
begin
  GetProcedureAddress(_MapVirtualKeyW, user32, 'MapVirtualKeyW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_MapVirtualKeyW]
  end;
end;

var
  _MapVirtualKey: Pointer;

function MapVirtualKey;
begin
  GetProcedureAddress(_MapVirtualKey, user32, 'MapVirtualKey' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_MapVirtualKey]
  end;
end;

var
  _MapVirtualKeyExA: Pointer;

function MapVirtualKeyExA;
begin
  GetProcedureAddress(_MapVirtualKeyExA, user32, 'MapVirtualKeyExA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_MapVirtualKeyExA]
  end;
end;

var
  _MapVirtualKeyExW: Pointer;

function MapVirtualKeyExW;
begin
  GetProcedureAddress(_MapVirtualKeyExW, user32, 'MapVirtualKeyExW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_MapVirtualKeyExW]
  end;
end;

var
  _MapVirtualKeyEx: Pointer;

function MapVirtualKeyEx;
begin
  GetProcedureAddress(_MapVirtualKeyEx, user32, 'MapVirtualKeyEx' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_MapVirtualKeyEx]
  end;
end;

var
  _GetInputState: Pointer;

function GetInputState;
begin
  GetProcedureAddress(_GetInputState, user32, 'GetInputState');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetInputState]
  end;
end;

var
  _GetQueueStatus: Pointer;

function GetQueueStatus;
begin
  GetProcedureAddress(_GetQueueStatus, user32, 'GetQueueStatus');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetQueueStatus]
  end;
end;

var
  _GetCapture: Pointer;

function GetCapture;
begin
  GetProcedureAddress(_GetCapture, user32, 'GetCapture');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetCapture]
  end;
end;

var
  _SetCapture: Pointer;

function SetCapture;
begin
  GetProcedureAddress(_SetCapture, user32, 'SetCapture');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_SetCapture]
  end;
end;

var
  _ReleaseCapture: Pointer;

function ReleaseCapture;
begin
  GetProcedureAddress(_ReleaseCapture, user32, 'ReleaseCapture');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_ReleaseCapture]
  end;
end;

var
  _MsgWaitForMultipleObjects: Pointer;

function MsgWaitForMultipleObjects;
begin
  GetProcedureAddress(_MsgWaitForMultipleObjects, user32, 'MsgWaitForMultipleObjects');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_MsgWaitForMultipleObjects]
  end;
end;

var
  _MsgWaitForMultipleObjectsEx: Pointer;

function MsgWaitForMultipleObjectsEx;
begin
  GetProcedureAddress(_MsgWaitForMultipleObjectsEx, user32, 'MsgWaitForMultipleObjectsEx');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_MsgWaitForMultipleObjectsEx]
  end;
end;

var
  _SetTimer: Pointer;

function SetTimer;
begin
  GetProcedureAddress(_SetTimer, user32, 'SetTimer');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_SetTimer]
  end;
end;

var
  _KillTimer: Pointer;

function KillTimer;
begin
  GetProcedureAddress(_KillTimer, user32, 'KillTimer');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_KillTimer]
  end;
end;

var
  _IsWindowUnicode: Pointer;

function IsWindowUnicode;
begin
  GetProcedureAddress(_IsWindowUnicode, user32, 'IsWindowUnicode');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_IsWindowUnicode]
  end;
end;

var
  _EnableWindow: Pointer;

function EnableWindow;
begin
  GetProcedureAddress(_EnableWindow, user32, 'EnableWindow');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_EnableWindow]
  end;
end;

var
  _IsWindowEnabled: Pointer;

function IsWindowEnabled;
begin
  GetProcedureAddress(_IsWindowEnabled, user32, 'IsWindowEnabled');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_IsWindowEnabled]
  end;
end;

var
  _LoadAcceleratorsA: Pointer;

function LoadAcceleratorsA;
begin
  GetProcedureAddress(_LoadAcceleratorsA, user32, 'LoadAcceleratorsA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_LoadAcceleratorsA]
  end;
end;

var
  _LoadAcceleratorsW: Pointer;

function LoadAcceleratorsW;
begin
  GetProcedureAddress(_LoadAcceleratorsW, user32, 'LoadAcceleratorsW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_LoadAcceleratorsW]
  end;
end;

var
  _LoadAccelerators: Pointer;

function LoadAccelerators;
begin
  GetProcedureAddress(_LoadAccelerators, user32, 'LoadAccelerators' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_LoadAccelerators]
  end;
end;

var
  _CreateAcceleratorTableA: Pointer;

function CreateAcceleratorTableA;
begin
  GetProcedureAddress(_CreateAcceleratorTableA, user32, 'CreateAcceleratorTableA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_CreateAcceleratorTableA]
  end;
end;

var
  _CreateAcceleratorTableW: Pointer;

function CreateAcceleratorTableW;
begin
  GetProcedureAddress(_CreateAcceleratorTableW, user32, 'CreateAcceleratorTableW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_CreateAcceleratorTableW]
  end;
end;

var
  _CreateAcceleratorTable: Pointer;

function CreateAcceleratorTable;
begin
  GetProcedureAddress(_CreateAcceleratorTable, user32, 'CreateAcceleratorTable' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_CreateAcceleratorTable]
  end;
end;

var
  _DestroyAcceleratorTable: Pointer;

function DestroyAcceleratorTable;
begin
  GetProcedureAddress(_DestroyAcceleratorTable, user32, 'DestroyAcceleratorTable');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DestroyAcceleratorTable]
  end;
end;

var
  _CopyAcceleratorTableA: Pointer;

function CopyAcceleratorTableA;
begin
  GetProcedureAddress(_CopyAcceleratorTableA, user32, 'CopyAcceleratorTableA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_CopyAcceleratorTableA]
  end;
end;

var
  _CopyAcceleratorTableW: Pointer;

function CopyAcceleratorTableW;
begin
  GetProcedureAddress(_CopyAcceleratorTableW, user32, 'CopyAcceleratorTableW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_CopyAcceleratorTableW]
  end;
end;

var
  _CopyAcceleratorTable: Pointer;

function CopyAcceleratorTable;
begin
  GetProcedureAddress(_CopyAcceleratorTable, user32, 'CopyAcceleratorTable' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_CopyAcceleratorTable]
  end;
end;

var
  _TranslateAcceleratorA: Pointer;

function TranslateAcceleratorA;
begin
  GetProcedureAddress(_TranslateAcceleratorA, user32, 'TranslateAcceleratorA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_TranslateAcceleratorA]
  end;
end;

var
  _TranslateAcceleratorW: Pointer;

function TranslateAcceleratorW;
begin
  GetProcedureAddress(_TranslateAcceleratorW, user32, 'TranslateAcceleratorW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_TranslateAcceleratorW]
  end;
end;

var
  _TranslateAccelerator: Pointer;

function TranslateAccelerator;
begin
  GetProcedureAddress(_TranslateAccelerator, user32, 'TranslateAccelerator' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_TranslateAccelerator]
  end;
end;

var
  _GetSystemMetrics: Pointer;

function GetSystemMetrics;
begin
  GetProcedureAddress(_GetSystemMetrics, user32, 'GetSystemMetrics');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetSystemMetrics]
  end;
end;

var
  _LoadMenuA: Pointer;

function LoadMenuA;
begin
  GetProcedureAddress(_LoadMenuA, user32, 'LoadMenuAA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_LoadMenuA]
  end;
end;

var
  _LoadMenuW: Pointer;

function LoadMenuW;
begin
  GetProcedureAddress(_LoadMenuW, user32, 'LoadMenuWA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_LoadMenuW]
  end;
end;

var
  _LoadMenu: Pointer;

function LoadMenu;
begin
  GetProcedureAddress(_LoadMenu, user32, 'LoadMenu' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_LoadMenu]
  end;
end;

var
  _LoadMenuIndirectA: Pointer;

function LoadMenuIndirectA;
begin
  GetProcedureAddress(_LoadMenuIndirectA, user32, 'LoadMenuIndirectA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_LoadMenuIndirectA]
  end;
end;

var
  _LoadMenuIndirectW: Pointer;

function LoadMenuIndirectW;
begin
  GetProcedureAddress(_LoadMenuIndirectW, user32, 'LoadMenuIndirectW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_LoadMenuIndirectW]
  end;
end;

var
  _LoadMenuIndirect: Pointer;

function LoadMenuIndirect;
begin
  GetProcedureAddress(_LoadMenuIndirect, user32, 'LoadMenuIndirect' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_LoadMenuIndirect]
  end;
end;

var
  _GetMenu: Pointer;

function GetMenu;
begin
  GetProcedureAddress(_GetMenu, user32, 'GetMenu');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetMenu]
  end;
end;

var
  _SetMenu: Pointer;

function SetMenu;
begin
  GetProcedureAddress(_SetMenu, user32, 'SetMenu');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_SetMenu]
  end;
end;

var
  _ChangeMenuA: Pointer;

function ChangeMenuA;
begin
  GetProcedureAddress(_ChangeMenuA, user32, 'ChangeMenuA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_ChangeMenuA]
  end;
end;

var
  _ChangeMenuW: Pointer;

function ChangeMenuW;
begin
  GetProcedureAddress(_ChangeMenuW, user32, 'ChangeMenuW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_ChangeMenuW]
  end;
end;

var
  _ChangeMenu: Pointer;

function ChangeMenu;
begin
  GetProcedureAddress(_ChangeMenu, user32, 'ChangeMenu' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_ChangeMenu]
  end;
end;

var
  _HiliteMenuItem: Pointer;

function HiliteMenuItem;
begin
  GetProcedureAddress(_HiliteMenuItem, user32, 'HiliteMenuItem');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_HiliteMenuItem]
  end;
end;

var
  _GetMenuStringA: Pointer;

function GetMenuStringA;
begin
  GetProcedureAddress(_GetMenuStringA, user32, 'GetMenuStringA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetMenuStringA]
  end;
end;

var
  _GetMenuStringW: Pointer;

function GetMenuStringW;
begin
  GetProcedureAddress(_GetMenuStringW, user32, 'GetMenuStringW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetMenuStringW]
  end;
end;

var
  _GetMenuString: Pointer;

function GetMenuString;
begin
  GetProcedureAddress(_GetMenuString, user32, 'GetMenuString' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetMenuString]
  end;
end;

var
  _GetMenuState: Pointer;

function GetMenuState;
begin
  GetProcedureAddress(_GetMenuState, user32, 'GetMenuState');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetMenuState]
  end;
end;

var
  _DrawMenuBar: Pointer;

function DrawMenuBar;
begin
  GetProcedureAddress(_DrawMenuBar, user32, 'DrawMenuBar');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DrawMenuBar]
  end;
end;

var
  _GetSystemMenu: Pointer;

function GetSystemMenu;
begin
  GetProcedureAddress(_GetSystemMenu, user32, 'GetSystemMenu');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetSystemMenu]
  end;
end;

var
  _CreateMenu: Pointer;

function CreateMenu;
begin
  GetProcedureAddress(_CreateMenu, user32, 'CreateMenu');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_CreateMenu]
  end;
end;

var
  _CreatePopupMenu: Pointer;

function CreatePopupMenu;
begin
  GetProcedureAddress(_CreatePopupMenu, user32, 'CreatePopupMenu');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_CreatePopupMenu]
  end;
end;

var
  _DestroyMenu: Pointer;

function DestroyMenu;
begin
  GetProcedureAddress(_DestroyMenu, user32, 'DestroyMenu');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DestroyMenu]
  end;
end;

var
  _CheckMenuItem: Pointer;

function CheckMenuItem;
begin
  GetProcedureAddress(_CheckMenuItem, user32, 'CheckMenuItem');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_CheckMenuItem]
  end;
end;

var
  _EnableMenuItem: Pointer;

function EnableMenuItem;
begin
  GetProcedureAddress(_EnableMenuItem, user32, 'EnableMenuItem');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_EnableMenuItem]
  end;
end;

var
  _GetSubMenu: Pointer;

function GetSubMenu;
begin
  GetProcedureAddress(_GetSubMenu, user32, 'GetSubMenu');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetSubMenu]
  end;
end;

var
  _GetMenuItemID: Pointer;

function GetMenuItemID;
begin
  GetProcedureAddress(_GetMenuItemID, user32, 'GetMenuItemID');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetMenuItemID]
  end;
end;

var
  _GetMenuItemCount: Pointer;

function GetMenuItemCount;
begin
  GetProcedureAddress(_GetMenuItemCount, user32, 'GetMenuItemCount');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetMenuItemCount]
  end;
end;

var
  _InsertMenuA: Pointer;

function InsertMenuA;
begin
  GetProcedureAddress(_InsertMenuA, user32, 'InsertMenuA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_InsertMenuA]
  end;
end;

var
  _InsertMenuW: Pointer;

function InsertMenuW;
begin
  GetProcedureAddress(_InsertMenuW, user32, 'InsertMenuW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_InsertMenuW]
  end;
end;

var
  _InsertMenu: Pointer;

function InsertMenu;
begin
  GetProcedureAddress(_InsertMenu, user32, 'InsertMenu' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_InsertMenu]
  end;
end;

var
  _AppendMenuA: Pointer;

function AppendMenuA;
begin
  GetProcedureAddress(_AppendMenuA, user32, 'AppendMenuA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_AppendMenuA]
  end;
end;

var
  _AppendMenuW: Pointer;

function AppendMenuW;
begin
  GetProcedureAddress(_AppendMenuW, user32, 'AppendMenuW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_AppendMenuW]
  end;
end;

var
  _AppendMenu: Pointer;

function AppendMenu;
begin
  GetProcedureAddress(_AppendMenu, user32, 'AppendMenu' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_AppendMenu]
  end;
end;

var
  _ModifyMenuA: Pointer;

function ModifyMenuA;
begin
  GetProcedureAddress(_ModifyMenuA, user32, 'ModifyMenuA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_ModifyMenuA]
  end;
end;

var
  _ModifyMenuW: Pointer;

function ModifyMenuW;
begin
  GetProcedureAddress(_ModifyMenuW, user32, 'ModifyMenuW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_ModifyMenuW]
  end;
end;

var
  _ModifyMenu: Pointer;

function ModifyMenu;
begin
  GetProcedureAddress(_ModifyMenu, user32, 'ModifyMenu' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_ModifyMenu]
  end;
end;

var
  _RemoveMenu: Pointer;

function RemoveMenu;
begin
  GetProcedureAddress(_RemoveMenu, user32, 'RemoveMenu');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_RemoveMenu]
  end;
end;

var
  _DeleteMenu: Pointer;

function DeleteMenu;
begin
  GetProcedureAddress(_DeleteMenu, user32, 'DeleteMenu');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DeleteMenu]
  end;
end;

var
  _SetMenuItemBitmaps: Pointer;

function SetMenuItemBitmaps;
begin
  GetProcedureAddress(_SetMenuItemBitmaps, user32, 'SetMenuItemBitmaps');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_SetMenuItemBitmaps]
  end;
end;

var
  _GetMenuCheckMarkDimensions: Pointer;

function GetMenuCheckMarkDimensions;
begin
  GetProcedureAddress(_GetMenuCheckMarkDimensions, user32, 'GetMenuCheckMarkDimensions');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetMenuCheckMarkDimensions]
  end;
end;

var
  _TrackPopupMenu: Pointer;

function TrackPopupMenu;
begin
  GetProcedureAddress(_TrackPopupMenu, user32, 'TrackPopupMenu');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_TrackPopupMenu]
  end;
end;

var
  _TrackPopupMenuEx: Pointer;

function TrackPopupMenuEx;
begin
  GetProcedureAddress(_TrackPopupMenuEx, user32, 'TrackPopupMenuEx');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_TrackPopupMenuEx]
  end;
end;

var
  _GetMenuInfo: Pointer;

function GetMenuInfo;
begin
  GetProcedureAddress(_GetMenuInfo, user32, 'GetMenuInfo');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetMenuInfo]
  end;
end;

var
  _SetMenuInfo: Pointer;

function SetMenuInfo;
begin
  GetProcedureAddress(_SetMenuInfo, user32, 'SetMenuInfo');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_SetMenuInfo]
  end;
end;

var
  _EndMenu: Pointer;

function EndMenu;
begin
  GetProcedureAddress(_EndMenu, user32, 'EndMenu');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_EndMenu]
  end;
end;

var
  _InsertMenuItemA: Pointer;

function InsertMenuItemA;
begin
  GetProcedureAddress(_InsertMenuItemA, user32, 'InsertMenuItemA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_InsertMenuItemA]
  end;
end;

var
  _InsertMenuItemW: Pointer;

function InsertMenuItemW;
begin
  GetProcedureAddress(_InsertMenuItemW, user32, 'InsertMenuItemW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_InsertMenuItemW]
  end;
end;

var
  _InsertMenuItem: Pointer;

function InsertMenuItem;
begin
  GetProcedureAddress(_InsertMenuItem, user32, 'InsertMenuItem' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_InsertMenuItem]
  end;
end;

var
  _GetMenuItemInfoA: Pointer;

function GetMenuItemInfoA;
begin
  GetProcedureAddress(_GetMenuItemInfoA, user32, 'GetMenuItemInfoA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetMenuItemInfoA]
  end;
end;

var
  _GetMenuItemInfoW: Pointer;

function GetMenuItemInfoW;
begin
  GetProcedureAddress(_GetMenuItemInfoW, user32, 'GetMenuItemInfoW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetMenuItemInfoW]
  end;
end;

var
  _GetMenuItemInfo: Pointer;

function GetMenuItemInfo;
begin
  GetProcedureAddress(_GetMenuItemInfo, user32, 'GetMenuItemInfo' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetMenuItemInfo]
  end;
end;

var
  _SetMenuItemInfoA: Pointer;

function SetMenuItemInfoA;
begin
  GetProcedureAddress(_SetMenuItemInfoA, user32, 'SetMenuItemInfoA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_SetMenuItemInfoA]
  end;
end;

var
  _SetMenuItemInfoW: Pointer;

function SetMenuItemInfoW;
begin
  GetProcedureAddress(_SetMenuItemInfoW, user32, 'SetMenuItemInfoW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_SetMenuItemInfoW]
  end;
end;

var
  _SetMenuItemInfo: Pointer;

function SetMenuItemInfo;
begin
  GetProcedureAddress(_SetMenuItemInfo, user32, 'SetMenuItemInfo' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_SetMenuItemInfo]
  end;
end;

var
  _GetMenuDefaultItem: Pointer;

function GetMenuDefaultItem;
begin
  GetProcedureAddress(_GetMenuDefaultItem, user32, 'GetMenuDefaultItem');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetMenuDefaultItem]
  end;
end;

var
  _SetMenuDefaultItem: Pointer;

function SetMenuDefaultItem;
begin
  GetProcedureAddress(_SetMenuDefaultItem, user32, 'SetMenuDefaultItem');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_SetMenuDefaultItem]
  end;
end;

var
  _GetMenuItemRect: Pointer;

function GetMenuItemRect;
begin
  GetProcedureAddress(_GetMenuItemRect, user32, 'GetMenuItemRect');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetMenuItemRect]
  end;
end;

var
  _MenuItemFromPoint: Pointer;

function MenuItemFromPoint;
begin
  GetProcedureAddress(_MenuItemFromPoint, user32, 'MenuItemFromPoint');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_MenuItemFromPoint]
  end;
end;

var
  _DragObject: Pointer;

function DragObject;
begin
  GetProcedureAddress(_DragObject, user32, 'DragObject');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DragObject]
  end;
end;

var
  _DragDetect: Pointer;

function DragDetect;
begin
  GetProcedureAddress(_DragDetect, user32, 'DragDetect');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DragDetect]
  end;
end;

var
  _DrawIcon: Pointer;

function DrawIcon;
begin
  GetProcedureAddress(_DrawIcon, user32, 'DrawIcon');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DrawIcon]
  end;
end;

var
  _DrawTextA: Pointer;

function DrawTextA;
begin
  GetProcedureAddress(_DrawTextA, user32, 'DrawTextA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DrawTextA]
  end;
end;

var
  _DrawTextW: Pointer;

function DrawTextW;
begin
  GetProcedureAddress(_DrawTextW, user32, 'DrawTextW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DrawTextW]
  end;
end;

var
  _DrawText: Pointer;

function DrawText;
begin
  GetProcedureAddress(_DrawText, user32, 'DrawText' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DrawText]
  end;
end;

var
  _DrawTextExA: Pointer;

function DrawTextExA;
begin
  GetProcedureAddress(_DrawTextExA, user32, 'DrawTextExA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DrawTextExA]
  end;
end;

var
  _DrawTextExW: Pointer;

function DrawTextExW;
begin
  GetProcedureAddress(_DrawTextExW, user32, 'DrawTextExW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DrawTextExW]
  end;
end;

var
  _DrawTextEx: Pointer;

function DrawTextEx;
begin
  GetProcedureAddress(_DrawTextEx, user32, 'DrawTextEx' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DrawTextEx]
  end;
end;

var
  _GrayStringA: Pointer;

function GrayStringA;
begin
  GetProcedureAddress(_GrayStringA, user32, 'GrayStringA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GrayStringA]
  end;
end;

var
  _GrayStringW: Pointer;

function GrayStringW;
begin
  GetProcedureAddress(_GrayStringW, user32, 'GrayStringW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GrayStringW]
  end;
end;

var
  _GrayString: Pointer;

function GrayString;
begin
  GetProcedureAddress(_GrayString, user32, 'GrayString' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GrayString]
  end;
end;

var
  _DrawStateA: Pointer;

function DrawStateA;
begin
  GetProcedureAddress(_DrawStateA, user32, 'DrawStateA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DrawStateA]
  end;
end;

var
  _DrawStateW: Pointer;

function DrawStateW;
begin
  GetProcedureAddress(_DrawStateW, user32, 'DrawStateW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DrawStateW]
  end;
end;

var
  _DrawState: Pointer;

function DrawState;
begin
  GetProcedureAddress(_DrawState, user32, 'DrawState' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DrawState]
  end;
end;

var
  _TabbedTextOutA: Pointer;

function TabbedTextOutA;
begin
  GetProcedureAddress(_TabbedTextOutA, user32, 'TabbedTextOutA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_TabbedTextOutA]
  end;
end;

var
  _TabbedTextOutW: Pointer;

function TabbedTextOutW;
begin
  GetProcedureAddress(_TabbedTextOutW, user32, 'TabbedTextOutW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_TabbedTextOutW]
  end;
end;

var
  _TabbedTextOut: Pointer;

function TabbedTextOut;
begin
  GetProcedureAddress(_TabbedTextOut, user32, 'TabbedTextOut' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_TabbedTextOut]
  end;
end;

var
  _GetTabbedTextExtentA: Pointer;

function GetTabbedTextExtentA;
begin
  GetProcedureAddress(_GetTabbedTextExtentA, user32, 'GetTabbedTextExtentA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetTabbedTextExtentA]
  end;
end;

var
  _GetTabbedTextExtentW: Pointer;

function GetTabbedTextExtentW;
begin
  GetProcedureAddress(_GetTabbedTextExtentW, user32, 'GetTabbedTextExtentW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetTabbedTextExtentW]
  end;
end;

var
  _GetTabbedTextExtent: Pointer;

function GetTabbedTextExtent;
begin
  GetProcedureAddress(_GetTabbedTextExtent, user32, 'GetTabbedTextExtent' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetTabbedTextExtent]
  end;
end;

var
  _UpdateWindow: Pointer;

function UpdateWindow;
begin
  GetProcedureAddress(_UpdateWindow, user32, 'UpdateWindow');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_UpdateWindow]
  end;
end;

var
  _SetActiveWindow: Pointer;

function SetActiveWindow;
begin
  GetProcedureAddress(_SetActiveWindow, user32, 'SetActiveWindow');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_SetActiveWindow]
  end;
end;

var
  _GetForegroundWindow: Pointer;

function GetForegroundWindow;
begin
  GetProcedureAddress(_GetForegroundWindow, user32, 'GetForegroundWindow');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetForegroundWindow]
  end;
end;

var
  _PaintDesktop: Pointer;

function PaintDesktop;
begin
  GetProcedureAddress(_PaintDesktop, user32, 'PaintDesktop');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_PaintDesktop]
  end;
end;

var
  _SwitchToThisWindow: Pointer;

procedure SwitchToThisWindow;
begin
  GetProcedureAddress(_SwitchToThisWindow, user32, 'SwitchToThisWindow');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_SwitchToThisWindow]
  end;
end;

var
  _SetForegroundWindow: Pointer;

function SetForegroundWindow;
begin
  GetProcedureAddress(_SetForegroundWindow, user32, 'SetForegroundWindow');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_SetForegroundWindow]
  end;
end;

var
  _AllowSetForegroundWindow: Pointer;

function AllowSetForegroundWindow;
begin
  GetProcedureAddress(_AllowSetForegroundWindow, user32, 'AllowSetForegroundWindow');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_AllowSetForegroundWindow]
  end;
end;

var
  _LockSetForegroundWindow: Pointer;

function LockSetForegroundWindow;
begin
  GetProcedureAddress(_LockSetForegroundWindow, user32, 'LockSetForegroundWindow');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_LockSetForegroundWindow]
  end;
end;

var
  _WindowFromDC: Pointer;

function WindowFromDC;
begin
  GetProcedureAddress(_WindowFromDC, user32, 'WindowFromDC');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_WindowFromDC]
  end;
end;

var
  _GetDC: Pointer;

function GetDC;
begin
  GetProcedureAddress(_GetDC, user32, 'GetDC');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetDC]
  end;
end;

var
  _GetDCEx: Pointer;

function GetDCEx;
begin
  GetProcedureAddress(_GetDCEx, user32, 'GetDCEx');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetDCEx]
  end;
end;

var
  _GetWindowDC: Pointer;

function GetWindowDC;
begin
  GetProcedureAddress(_GetWindowDC, user32, 'GetWindowDC');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetWindowDC]
  end;
end;

var
  _ReleaseDC: Pointer;

function ReleaseDC;
begin
  GetProcedureAddress(_ReleaseDC, user32, 'ReleaseDC');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_ReleaseDC]
  end;
end;

var
  _BeginPaint: Pointer;

function BeginPaint;
begin
  GetProcedureAddress(_BeginPaint, user32, 'BeginPaint');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_BeginPaint]
  end;
end;

var
  _EndPaint: Pointer;

function EndPaint;
begin
  GetProcedureAddress(_EndPaint, user32, 'EndPaint');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_EndPaint]
  end;
end;

var
  _GetUpdateRect: Pointer;

function GetUpdateRect;
begin
  GetProcedureAddress(_GetUpdateRect, user32, 'GetUpdateRect');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetUpdateRect]
  end;
end;

var
  _GetUpdateRgn: Pointer;

function GetUpdateRgn;
begin
  GetProcedureAddress(_GetUpdateRgn, user32, 'GetUpdateRgn');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetUpdateRgn]
  end;
end;

var
  _SetWindowRgn: Pointer;

function SetWindowRgn;
begin
  GetProcedureAddress(_SetWindowRgn, user32, 'SetWindowRgn');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_SetWindowRgn]
  end;
end;

var
  _GetWindowRgn: Pointer;

function GetWindowRgn;
begin
  GetProcedureAddress(_GetWindowRgn, user32, 'GetWindowRgn');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetWindowRgn]
  end;
end;

var
  _GetWindowRgnBox: Pointer;

function GetWindowRgnBox;
begin
  GetProcedureAddress(_GetWindowRgnBox, user32, 'GetWindowRgnBox');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetWindowRgnBox]
  end;
end;

var
  _ExcludeUpdateRgn: Pointer;

function ExcludeUpdateRgn;
begin
  GetProcedureAddress(_ExcludeUpdateRgn, user32, 'ExcludeUpdateRgn');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_ExcludeUpdateRgn]
  end;
end;

var
  _InvalidateRect: Pointer;

function InvalidateRect;
begin
  GetProcedureAddress(_InvalidateRect, user32, 'InvalidateRect');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_InvalidateRect]
  end;
end;

var
  _ValidateRect: Pointer;

function ValidateRect;
begin
  GetProcedureAddress(_ValidateRect, user32, 'ValidateRect');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_ValidateRect]
  end;
end;

var
  _InvalidateRgn: Pointer;

function InvalidateRgn;
begin
  GetProcedureAddress(_InvalidateRgn, user32, 'InvalidateRgn');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_InvalidateRgn]
  end;
end;

var
  _ValidateRgn: Pointer;

function ValidateRgn;
begin
  GetProcedureAddress(_ValidateRgn, user32, 'ValidateRgn');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_ValidateRgn]
  end;
end;

var
  _RedrawWindow: Pointer;

function RedrawWindow;
begin
  GetProcedureAddress(_RedrawWindow, user32, 'RedrawWindow');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_RedrawWindow]
  end;
end;

var
  _LockWindowUpdate: Pointer;

function LockWindowUpdate;
begin
  GetProcedureAddress(_LockWindowUpdate, user32, 'LockWindowUpdate');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_LockWindowUpdate]
  end;
end;

var
  _ScrollWindow: Pointer;

function ScrollWindow;
begin
  GetProcedureAddress(_ScrollWindow, user32, 'ScrollWindow');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_ScrollWindow]
  end;
end;

var
  _ScrollDC: Pointer;

function ScrollDC;
begin
  GetProcedureAddress(_ScrollDC, user32, 'ScrollDC');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_ScrollDC]
  end;
end;

var
  _ScrollWindowEx: Pointer;

function ScrollWindowEx;
begin
  GetProcedureAddress(_ScrollWindowEx, user32, 'ScrollWindowEx');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_ScrollWindowEx]
  end;
end;

var
  _SetScrollPos: Pointer;

function SetScrollPos;
begin
  GetProcedureAddress(_SetScrollPos, user32, 'SetScrollPos');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_SetScrollPos]
  end;
end;

var
  _GetScrollPos: Pointer;

function GetScrollPos;
begin
  GetProcedureAddress(_GetScrollPos, user32, 'GetScrollPos');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetScrollPos]
  end;
end;

var
  _SetScrollRange: Pointer;

function SetScrollRange;
begin
  GetProcedureAddress(_SetScrollRange, user32, 'SetScrollRange');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_SetScrollRange]
  end;
end;

var
  _GetScrollRange: Pointer;

function GetScrollRange;
begin
  GetProcedureAddress(_GetScrollRange, user32, 'GetScrollRange');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetScrollRange]
  end;
end;

var
  _ShowScrollBar: Pointer;

function ShowScrollBar;
begin
  GetProcedureAddress(_ShowScrollBar, user32, 'ShowScrollBar');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_ShowScrollBar]
  end;
end;

var
  _EnableScrollBar: Pointer;

function EnableScrollBar;
begin
  GetProcedureAddress(_EnableScrollBar, user32, 'EnableScrollBar');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_EnableScrollBar]
  end;
end;

var
  _SetPropA: Pointer;

function SetPropA;
begin
  GetProcedureAddress(_SetPropA, user32, 'SetPropA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_SetPropA]
  end;
end;

var
  _SetPropW: Pointer;

function SetPropW;
begin
  GetProcedureAddress(_SetPropW, user32, 'SetPropW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_SetPropW]
  end;
end;

var
  _SetProp: Pointer;

function SetProp;
begin
  GetProcedureAddress(_SetProp, user32, 'SetProp' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_SetProp]
  end;
end;

var
  _GetPropA: Pointer;

function GetPropA;
begin
  GetProcedureAddress(_GetPropA, user32, 'GetPropA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetPropA]
  end;
end;

var
  _GetPropW: Pointer;

function GetPropW;
begin
  GetProcedureAddress(_GetPropW, user32, 'GetPropW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetPropW]
  end;
end;

var
  _GetProp: Pointer;

function GetProp;
begin
  GetProcedureAddress(_GetProp, user32, 'GetProp' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetProp]
  end;
end;

var
  _RemovePropA: Pointer;

function RemovePropA;
begin
  GetProcedureAddress(_RemovePropA, user32, 'RemovePropA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_RemovePropA]
  end;
end;

var
  _RemovePropW: Pointer;

function RemovePropW;
begin
  GetProcedureAddress(_RemovePropW, user32, 'RemovePropW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_RemovePropW]
  end;
end;

var
  _RemoveProp: Pointer;

function RemoveProp;
begin
  GetProcedureAddress(_RemoveProp, user32, 'RemoveProp' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_RemoveProp]
  end;
end;

var
  _EnumPropsExA: Pointer;

function EnumPropsExA;
begin
  GetProcedureAddress(_EnumPropsExA, user32, 'EnumPropsExA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_EnumPropsExA]
  end;
end;

var
  _EnumPropsExW: Pointer;

function EnumPropsExW;
begin
  GetProcedureAddress(_EnumPropsExW, user32, 'EnumPropsExW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_EnumPropsExW]
  end;
end;

var
  _EnumPropsEx: Pointer;

function EnumPropsEx;
begin
  GetProcedureAddress(_EnumPropsEx, user32, 'EnumPropsEx' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_EnumPropsEx]
  end;
end;

var
  _EnumPropsA: Pointer;

function EnumPropsA;
begin
  GetProcedureAddress(_EnumPropsA, user32, 'EnumPropsA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_EnumPropsA]
  end;
end;

var
  _EnumPropsW: Pointer;

function EnumPropsW;
begin
  GetProcedureAddress(_EnumPropsW, user32, 'EnumPropsW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_EnumPropsW]
  end;
end;

var
  _EnumProps: Pointer;

function EnumProps;
begin
  GetProcedureAddress(_EnumProps, user32, 'EnumProps' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_EnumProps]
  end;
end;

var
  _SetWindowTextA: Pointer;

function SetWindowTextA;
begin
  GetProcedureAddress(_SetWindowTextA, user32, 'SetWindowTextA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_SetWindowTextA]
  end;
end;

var
  _SetWindowTextW: Pointer;

function SetWindowTextW;
begin
  GetProcedureAddress(_SetWindowTextW, user32, 'SetWindowTextW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_SetWindowTextW]
  end;
end;

var
  _SetWindowText: Pointer;

function SetWindowText;
begin
  GetProcedureAddress(_SetWindowText, user32, 'SetWindowText' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_SetWindowText]
  end;
end;

var
  _GetWindowTextA: Pointer;

function GetWindowTextA;
begin
  GetProcedureAddress(_GetWindowTextA, user32, 'GetWindowTextA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetWindowTextA]
  end;
end;

var
  _GetWindowTextW: Pointer;

function GetWindowTextW;
begin
  GetProcedureAddress(_GetWindowTextW, user32, 'GetWindowTextW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetWindowTextW]
  end;
end;

var
  _GetWindowText: Pointer;

function GetWindowText;
begin
  GetProcedureAddress(_GetWindowText, user32, 'GetWindowText' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetWindowText]
  end;
end;

var
  _GetWindowTextLengthA: Pointer;

function GetWindowTextLengthA;
begin
  GetProcedureAddress(_GetWindowTextLengthA, user32, 'GetWindowTextLengthA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetWindowTextLengthA]
  end;
end;

var
  _GetWindowTextLengthW: Pointer;

function GetWindowTextLengthW;
begin
  GetProcedureAddress(_GetWindowTextLengthW, user32, 'GetWindowTextLengthW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetWindowTextLengthW]
  end;
end;

var
  _GetWindowTextLength: Pointer;

function GetWindowTextLength;
begin
  GetProcedureAddress(_GetWindowTextLength, user32, 'GetWindowTextLength' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetWindowTextLength]
  end;
end;

var
  _GetClientRect: Pointer;

function GetClientRect;
begin
  GetProcedureAddress(_GetClientRect, user32, 'GetClientRect');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetClientRect]
  end;
end;

var
  _GetWindowRect: Pointer;

function GetWindowRect;
begin
  GetProcedureAddress(_GetWindowRect, user32, 'GetWindowRect');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetWindowRect]
  end;
end;

var
  _AdjustWindowRect: Pointer;

function AdjustWindowRect;
begin
  GetProcedureAddress(_AdjustWindowRect, user32, 'AdjustWindowRect');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_AdjustWindowRect]
  end;
end;

var
  _AdjustWindowRectEx: Pointer;

function AdjustWindowRectEx;
begin
  GetProcedureAddress(_AdjustWindowRectEx, user32, 'AdjustWindowRectEx');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_AdjustWindowRectEx]
  end;
end;

var
  _SetWindowContextHelpId: Pointer;

function SetWindowContextHelpId;
begin
  GetProcedureAddress(_SetWindowContextHelpId, user32, 'SetWindowContextHelpId');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_SetWindowContextHelpId]
  end;
end;

var
  _GetWindowContextHelpId: Pointer;

function GetWindowContextHelpId;
begin
  GetProcedureAddress(_GetWindowContextHelpId, user32, 'GetWindowContextHelpId');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetWindowContextHelpId]
  end;
end;

var
  _SetMenuContextHelpId: Pointer;

function SetMenuContextHelpId;
begin
  GetProcedureAddress(_SetMenuContextHelpId, user32, 'SetMenuContextHelpId');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_SetMenuContextHelpId]
  end;
end;

var
  _GetMenuContextHelpId: Pointer;

function GetMenuContextHelpId;
begin
  GetProcedureAddress(_GetMenuContextHelpId, user32, 'GetMenuContextHelpId');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetMenuContextHelpId]
  end;
end;

var
  _MessageBoxA: Pointer;

function MessageBoxA;
begin
  GetProcedureAddress(_MessageBoxA, user32, 'MessageBoxA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_MessageBoxA]
  end;
end;

var
  _MessageBoxW: Pointer;

function MessageBoxW;
begin
  GetProcedureAddress(_MessageBoxW, user32, 'MessageBoxW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_MessageBoxW]
  end;
end;

var
  _MessageBox: Pointer;

function MessageBox;
begin
  GetProcedureAddress(_MessageBox, user32, 'MessageBox' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_MessageBox]
  end;
end;

var
  _MessageBoxExA: Pointer;

function MessageBoxExA;
begin
  GetProcedureAddress(_MessageBoxExA, user32, 'MessageBoxExA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_MessageBoxExA]
  end;
end;

var
  _MessageBoxExW: Pointer;

function MessageBoxExW;
begin
  GetProcedureAddress(_MessageBoxExW, user32, 'MessageBoxExW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_MessageBoxExW]
  end;
end;

var
  _MessageBoxEx: Pointer;

function MessageBoxEx;
begin
  GetProcedureAddress(_MessageBoxEx, user32, 'MessageBoxEx' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_MessageBoxEx]
  end;
end;

var
  _MessageBoxIndirectA: Pointer;

function MessageBoxIndirectA;
begin
  GetProcedureAddress(_MessageBoxIndirectA, user32, 'MessageBoxIndirectA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_MessageBoxIndirectA]
  end;
end;

var
  _MessageBoxIndirectW: Pointer;

function MessageBoxIndirectW;
begin
  GetProcedureAddress(_MessageBoxIndirectW, user32, 'MessageBoxIndirectW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_MessageBoxIndirectW]
  end;
end;

var
  _MessageBoxIndirect: Pointer;

function MessageBoxIndirect;
begin
  GetProcedureAddress(_MessageBoxIndirect, user32, 'MessageBoxIndirect' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_MessageBoxIndirect]
  end;
end;

var
  _MessageBeep: Pointer;

function MessageBeep;
begin
  GetProcedureAddress(_MessageBeep, user32, 'MessageBeep');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_MessageBeep]
  end;
end;

var
  _ShowCursor: Pointer;

function ShowCursor;
begin
  GetProcedureAddress(_ShowCursor, user32, 'ShowCursor');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_ShowCursor]
  end;
end;

var
  _SetCursorPos: Pointer;

function SetCursorPos;
begin
  GetProcedureAddress(_SetCursorPos, user32, 'SetCursorPos');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_SetCursorPos]
  end;
end;

var
  _SetCursor: Pointer;

function SetCursor;
begin
  GetProcedureAddress(_SetCursor, user32, 'SetCursor');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_SetCursor]
  end;
end;

var
  _GetCursorPos: Pointer;

function GetCursorPos;
begin
  GetProcedureAddress(_GetCursorPos, user32, 'GetCursorPos');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetCursorPos]
  end;
end;

var
  _ClipCursor: Pointer;

function ClipCursor;
begin
  GetProcedureAddress(_ClipCursor, user32, 'ClipCursor');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_ClipCursor]
  end;
end;

var
  _GetClipCursor: Pointer;

function GetClipCursor;
begin
  GetProcedureAddress(_GetClipCursor, user32, 'GetClipCursor');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetClipCursor]
  end;
end;

var
  _GetCursor: Pointer;

function GetCursor;
begin
  GetProcedureAddress(_GetCursor, user32, 'GetCursor');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetCursor]
  end;
end;

var
  _CreateCaret: Pointer;

function CreateCaret;
begin
  GetProcedureAddress(_CreateCaret, user32, 'CreateCaret');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_CreateCaret]
  end;
end;

var
  _GetCaretBlinkTime: Pointer;

function GetCaretBlinkTime;
begin
  GetProcedureAddress(_GetCaretBlinkTime, user32, 'GetCaretBlinkTime');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetCaretBlinkTime]
  end;
end;

var
  _SetCaretBlinkTime: Pointer;

function SetCaretBlinkTime;
begin
  GetProcedureAddress(_SetCaretBlinkTime, user32, 'SetCaretBlinkTime');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_SetCaretBlinkTime]
  end;
end;

var
  _DestroyCaret: Pointer;

function DestroyCaret;
begin
  GetProcedureAddress(_DestroyCaret, user32, 'DestroyCaret');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DestroyCaret]
  end;
end;

var
  _HideCaret: Pointer;

function HideCaret;
begin
  GetProcedureAddress(_HideCaret, user32, 'HideCaret');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_HideCaret]
  end;
end;

var
  _ShowCaret: Pointer;

function ShowCaret;
begin
  GetProcedureAddress(_ShowCaret, user32, 'ShowCaret');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_ShowCaret]
  end;
end;

var
  _SetCaretPos: Pointer;

function SetCaretPos;
begin
  GetProcedureAddress(_SetCaretPos, user32, 'SetCaretPos');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_SetCaretPos]
  end;
end;

var
  _GetCaretPos: Pointer;

function GetCaretPos;
begin
  GetProcedureAddress(_GetCaretPos, user32, 'GetCaretPos');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetCaretPos]
  end;
end;

var
  _ClientToScreen: Pointer;

function ClientToScreen;
begin
  GetProcedureAddress(_ClientToScreen, user32, 'ClientToScreen');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_ClientToScreen]
  end;
end;

var
  _ScreenToClient: Pointer;

function ScreenToClient;
begin
  GetProcedureAddress(_ScreenToClient, user32, 'ScreenToClient');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_ScreenToClient]
  end;
end;

var
  _MapWindowPoints: Pointer;

function MapWindowPoints;
begin
  GetProcedureAddress(_MapWindowPoints, user32, 'MapWindowPoints');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_MapWindowPoints]
  end;
end;

var
  _WindowFromPoint: Pointer;

function WindowFromPoint;
begin
  GetProcedureAddress(_WindowFromPoint, user32, 'WindowFromPoint');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_WindowFromPoint]
  end;
end;

var
  _ChildWindowFromPoint: Pointer;

function ChildWindowFromPoint;
begin
  GetProcedureAddress(_ChildWindowFromPoint, user32, 'ChildWindowFromPoint');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_ChildWindowFromPoint]
  end;
end;

var
  _ChildWindowFromPointEx: Pointer;

function ChildWindowFromPointEx;
begin
  GetProcedureAddress(_ChildWindowFromPointEx, user32, 'ChildWindowFromPointEx');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_ChildWindowFromPointEx]
  end;
end;

var
  _GetSysColor: Pointer;

function GetSysColor;
begin
  GetProcedureAddress(_GetSysColor, user32, 'GetSysColor');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetSysColor]
  end;
end;

var
  _GetSysColorBrush: Pointer;

function GetSysColorBrush;
begin
  GetProcedureAddress(_GetSysColorBrush, user32, 'GetSysColorBrush');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetSysColorBrush]
  end;
end;

var
  _SetSysColors: Pointer;

function SetSysColors;
begin
  GetProcedureAddress(_SetSysColors, user32, 'SetSysColors');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_SetSysColors]
  end;
end;

var
  _DrawFocusRect: Pointer;

function DrawFocusRect;
begin
  GetProcedureAddress(_DrawFocusRect, user32, 'DrawFocusRect');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DrawFocusRect]
  end;
end;

var
  _FillRect: Pointer;

function FillRect;
begin
  GetProcedureAddress(_FillRect, user32, 'FillRect');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_FillRect]
  end;
end;

var
  _FrameRect: Pointer;

function FrameRect;
begin
  GetProcedureAddress(_FrameRect, user32, 'FrameRect');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_FrameRect]
  end;
end;

var
  _InvertRect: Pointer;

function InvertRect;
begin
  GetProcedureAddress(_InvertRect, user32, 'InvertRect');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_InvertRect]
  end;
end;

var
  _SetRect: Pointer;

function SetRect;
begin
  GetProcedureAddress(_SetRect, user32, 'SetRect');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_SetRect]
  end;
end;

var
  _SetRectEmpty: Pointer;

function SetRectEmpty;
begin
  GetProcedureAddress(_SetRectEmpty, user32, 'SetRectEmpty');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_SetRectEmpty]
  end;
end;

var
  _CopyRect: Pointer;

function CopyRect;
begin
  GetProcedureAddress(_CopyRect, user32, 'CopyRect');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_CopyRect]
  end;
end;

var
  _InflateRect: Pointer;

function InflateRect;
begin
  GetProcedureAddress(_InflateRect, user32, 'InflateRect');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_InflateRect]
  end;
end;

var
  _IntersectRect: Pointer;

function IntersectRect;
begin
  GetProcedureAddress(_IntersectRect, user32, 'IntersectRect');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_IntersectRect]
  end;
end;

var
  _UnionRect: Pointer;

function UnionRect;
begin
  GetProcedureAddress(_UnionRect, user32, 'UnionRect');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_UnionRect]
  end;
end;

var
  _SubtractRect: Pointer;

function SubtractRect;
begin
  GetProcedureAddress(_SubtractRect, user32, 'SubtractRect');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_SubtractRect]
  end;
end;

var
  _OffsetRect: Pointer;

function OffsetRect;
begin
  GetProcedureAddress(_OffsetRect, user32, 'OffsetRect');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_OffsetRect]
  end;
end;

var
  _IsRectEmpty: Pointer;

function IsRectEmpty;
begin
  GetProcedureAddress(_IsRectEmpty, user32, 'IsRectEmpty');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_IsRectEmpty]
  end;
end;

var
  _EqualRect: Pointer;

function EqualRect;
begin
  GetProcedureAddress(_EqualRect, user32, 'EqualRect');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_EqualRect]
  end;
end;

var
  _PtInRect: Pointer;

function PtInRect;
begin
  GetProcedureAddress(_PtInRect, user32, 'PtInRect');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_PtInRect]
  end;
end;

var
  _GetWindowWord: Pointer;

function GetWindowWord;
begin
  GetProcedureAddress(_GetWindowWord, user32, 'GetWindowWord');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetWindowWord]
  end;
end;

var
  _SetWindowWord: Pointer;

function SetWindowWord;
begin
  GetProcedureAddress(_SetWindowWord, user32, 'SetWindowWord');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_SetWindowWord]
  end;
end;

var
  _GetWindowLongA: Pointer;

function GetWindowLongA;
begin
  GetProcedureAddress(_GetWindowLongA, user32, 'GetWindowLongA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetWindowLongA]
  end;
end;

var
  _GetWindowLongW: Pointer;

function GetWindowLongW;
begin
  GetProcedureAddress(_GetWindowLongW, user32, 'GetWindowLongW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetWindowLongW]
  end;
end;

var
  _GetWindowLong: Pointer;

function GetWindowLong;
begin
  GetProcedureAddress(_GetWindowLong, user32, 'GetWindowLong' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetWindowLong]
  end;
end;

var
  _SetWindowLongA: Pointer;

function SetWindowLongA;
begin
  GetProcedureAddress(_SetWindowLongA, user32, 'SetWindowLongA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_SetWindowLongA]
  end;
end;

var
  _SetWindowLongW: Pointer;

function SetWindowLongW;
begin
  GetProcedureAddress(_SetWindowLongW, user32, 'SetWindowLongW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_SetWindowLongW]
  end;
end;

var
  _SetWindowLong: Pointer;

function SetWindowLong;
begin
  GetProcedureAddress(_SetWindowLong, user32, 'SetWindowLong' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_SetWindowLong]
  end;
end;

var
  _GetClassWord: Pointer;

function GetClassWord;
begin
  GetProcedureAddress(_GetClassWord, user32, 'GetClassWord');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetClassWord]
  end;
end;

var
  _SetClassWord: Pointer;

function SetClassWord;
begin
  GetProcedureAddress(_SetClassWord, user32, 'SetClassWord');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_SetClassWord]
  end;
end;

var
  _GetClassLongA: Pointer;

function GetClassLongA;
begin
  GetProcedureAddress(_GetClassLongA, user32, 'GetClassLongA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetClassLongA]
  end;
end;

var
  _GetClassLongW: Pointer;

function GetClassLongW;
begin
  GetProcedureAddress(_GetClassLongW, user32, 'GetClassLongW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetClassLongW]
  end;
end;

var
  _GetClassLong: Pointer;

function GetClassLong;
begin
  GetProcedureAddress(_GetClassLong, user32, 'GetClassLong' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetClassLong]
  end;
end;

var
  _SetClassLongA: Pointer;

function SetClassLongA;
begin
  GetProcedureAddress(_SetClassLongA, user32, 'SetClassLongA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_SetClassLongA]
  end;
end;

var
  _SetClassLongW: Pointer;

function SetClassLongW;
begin
  GetProcedureAddress(_SetClassLongW, user32, 'SetClassLongW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_SetClassLongW]
  end;
end;

var
  _SetClassLong: Pointer;

function SetClassLong;
begin
  GetProcedureAddress(_SetClassLong, user32, 'SetClassLong' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_SetClassLong]
  end;
end;

var
  _GetProcessDefaultLayout: Pointer;

function GetProcessDefaultLayout;
begin
  GetProcedureAddress(_GetProcessDefaultLayout, user32, 'GetProcessDefaultLayout');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetProcessDefaultLayout]
  end;
end;

var
  _SetProcessDefaultLayout: Pointer;

function SetProcessDefaultLayout;
begin
  GetProcedureAddress(_SetProcessDefaultLayout, user32, 'SetProcessDefaultLayout');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_SetProcessDefaultLayout]
  end;
end;

var
  _GetDesktopWindow: Pointer;

function GetDesktopWindow;
begin
  GetProcedureAddress(_GetDesktopWindow, user32, 'GetDesktopWindow');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetDesktopWindow]
  end;
end;

var
  _GetParent: Pointer;

function GetParent;
begin
  GetProcedureAddress(_GetParent, user32, 'GetParent');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetParent]
  end;
end;

var
  _SetParent: Pointer;

function SetParent;
begin
  GetProcedureAddress(_SetParent, user32, 'SetParent');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_SetParent]
  end;
end;

var
  _EnumChildWindows: Pointer;

function EnumChildWindows;
begin
  GetProcedureAddress(_EnumChildWindows, user32, 'EnumChildWindows');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_EnumChildWindows]
  end;
end;

var
  _FindWindowA: Pointer;

function FindWindowA;
begin
  GetProcedureAddress(_FindWindowA, user32, 'FindWindowA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_FindWindowA]
  end;
end;

var
  _FindWindowW: Pointer;

function FindWindowW;
begin
  GetProcedureAddress(_FindWindowW, user32, 'FindWindowW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_FindWindowW]
  end;
end;

var
  _FindWindow: Pointer;

function FindWindow;
begin
  GetProcedureAddress(_FindWindow, user32, 'FindWindow' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_FindWindow]
  end;
end;

var
  _FindWindowExA: Pointer;

function FindWindowExA;
begin
  GetProcedureAddress(_FindWindowExA, user32, 'FindWindowExA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_FindWindowExA]
  end;
end;

var
  _FindWindowExW: Pointer;

function FindWindowExW;
begin
  GetProcedureAddress(_FindWindowExW, user32, 'FindWindowExW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_FindWindowExW]
  end;
end;

var
  _FindWindowEx: Pointer;

function FindWindowEx;
begin
  GetProcedureAddress(_FindWindowEx, user32, 'FindWindowEx' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_FindWindowEx]
  end;
end;

var
  _GetShellWindow: Pointer;

function GetShellWindow;
begin
  GetProcedureAddress(_GetShellWindow, user32, 'GetShellWindow');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetShellWindow]
  end;
end;

var
  _RegisterShellHookWindow: Pointer;

function RegisterShellHookWindow;
begin
  GetProcedureAddress(_RegisterShellHookWindow, user32, 'RegisterShellHookWindow');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_RegisterShellHookWindow]
  end;
end;

var
  _DeregisterShellHookWindow: Pointer;

function DeregisterShellHookWindow;
begin
  GetProcedureAddress(_DeregisterShellHookWindow, user32, 'DeregisterShellHookWindow');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DeregisterShellHookWindow]
  end;
end;

var
  _EnumWindows: Pointer;

function EnumWindows;
begin
  GetProcedureAddress(_EnumWindows, user32, 'EnumWindows');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_EnumWindows]
  end;
end;

var
  _EnumThreadWindows: Pointer;

function EnumThreadWindows;
begin
  GetProcedureAddress(_EnumThreadWindows, user32, 'EnumThreadWindows');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_EnumThreadWindows]
  end;
end;

var
  _GetClassNameA: Pointer;

function GetClassNameA;
begin
  GetProcedureAddress(_GetClassNameA, user32, 'GetClassNameA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetClassNameA]
  end;
end;

var
  _GetClassNameW: Pointer;

function GetClassNameW;
begin
  GetProcedureAddress(_GetClassNameW, user32, 'GetClassNameW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetClassNameW]
  end;
end;

var
  _GetClassName: Pointer;

function GetClassName;
begin
  GetProcedureAddress(_GetClassName, user32, 'GetClassName' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetClassName]
  end;
end;

var
  _GetTopWindow: Pointer;

function GetTopWindow;
begin
  GetProcedureAddress(_GetTopWindow, user32, 'GetTopWindow');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetTopWindow]
  end;
end;

var
  _GetWindowThreadProcessId: Pointer;

function GetWindowThreadProcessId;
begin
  GetProcedureAddress(_GetWindowThreadProcessId, user32, 'GetWindowThreadProcessId');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetWindowThreadProcessId]
  end;
end;

var
  _IsGUIThread: Pointer;

function IsGUIThread;
begin
  GetProcedureAddress(_IsGUIThread, user32, 'IsGUIThread');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_IsGUIThread]
  end;
end;

var
  _GetLastActivePopup: Pointer;

function GetLastActivePopup;
begin
  GetProcedureAddress(_GetLastActivePopup, user32, 'GetLastActivePopup');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetLastActivePopup]
  end;
end;

var
  _GetWindow: Pointer;

function GetWindow;
begin
  GetProcedureAddress(_GetWindow, user32, 'GetWindow');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetWindow]
  end;
end;

var
  _SetWindowsHookA: Pointer;

function SetWindowsHookA;
begin
  GetProcedureAddress(_SetWindowsHookA, user32, 'SetWindowsHookA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_SetWindowsHookA]
  end;
end;

var
  _SetWindowsHookW: Pointer;

function SetWindowsHookW;
begin
  GetProcedureAddress(_SetWindowsHookW, user32, 'SetWindowsHookW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_SetWindowsHookW]
  end;
end;

var
  _SetWindowsHook: Pointer;

function SetWindowsHook;
begin
  GetProcedureAddress(_SetWindowsHook, user32, 'SetWindowsHook' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_SetWindowsHook]
  end;
end;

var
  _UnhookWindowsHook: Pointer;

function UnhookWindowsHook;
begin
  GetProcedureAddress(_UnhookWindowsHook, user32, 'UnhookWindowsHook');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_UnhookWindowsHook]
  end;
end;

var
  _SetWindowsHookExA: Pointer;

function SetWindowsHookExA;
begin
  GetProcedureAddress(_SetWindowsHookExA, user32, 'SetWindowsHookExA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_SetWindowsHookExA]
  end;
end;

var
  _SetWindowsHookExW: Pointer;

function SetWindowsHookExW;
begin
  GetProcedureAddress(_SetWindowsHookExW, user32, 'SetWindowsHookExW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_SetWindowsHookExW]
  end;
end;

var
  _SetWindowsHookEx: Pointer;

function SetWindowsHookEx;
begin
  GetProcedureAddress(_SetWindowsHookEx, user32, 'SetWindowsHookEx' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_SetWindowsHookEx]
  end;
end;

var
  _UnhookWindowsHookEx: Pointer;

function UnhookWindowsHookEx;
begin
  GetProcedureAddress(_UnhookWindowsHookEx, user32, 'UnhookWindowsHookEx');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_UnhookWindowsHookEx]
  end;
end;

var
  _CallNextHookEx: Pointer;

function CallNextHookEx;
begin
  GetProcedureAddress(_CallNextHookEx, user32, 'CallNextHookEx');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_CallNextHookEx]
  end;
end;

var
  _CheckMenuRadioItem: Pointer;

function CheckMenuRadioItem;
begin
  GetProcedureAddress(_CheckMenuRadioItem, user32, 'CheckMenuRadioItem');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_CheckMenuRadioItem]
  end;
end;

var
  _LoadBitmapA: Pointer;

function LoadBitmapA;
begin
  GetProcedureAddress(_LoadBitmapA, user32, 'LoadBitmapA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_LoadBitmapA]
  end;
end;

var
  _LoadBitmapW: Pointer;

function LoadBitmapW;
begin
  GetProcedureAddress(_LoadBitmapW, user32, 'LoadBitmapW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_LoadBitmapW]
  end;
end;

var
  _LoadBitmap: Pointer;

function LoadBitmap;
begin
  GetProcedureAddress(_LoadBitmap, user32, 'LoadBitmap' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_LoadBitmap]
  end;
end;

var
  _LoadCursorA: Pointer;

function LoadCursorA;
begin
  GetProcedureAddress(_LoadCursorA, user32, 'LoadCursorA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_LoadCursorA]
  end;
end;

var
  _LoadCursorW: Pointer;

function LoadCursorW;
begin
  GetProcedureAddress(_LoadCursorW, user32, 'LoadCursorW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_LoadCursorW]
  end;
end;

var
  _LoadCursor: Pointer;

function LoadCursor;
begin
  GetProcedureAddress(_LoadCursor, user32, 'LoadCursor' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_LoadCursor]
  end;
end;

var
  _LoadCursorFromFileA: Pointer;

function LoadCursorFromFileA;
begin
  GetProcedureAddress(_LoadCursorFromFileA, user32, 'LoadCursorFromFileA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_LoadCursorFromFileA]
  end;
end;

var
  _LoadCursorFromFileW: Pointer;

function LoadCursorFromFileW;
begin
  GetProcedureAddress(_LoadCursorFromFileW, user32, 'LoadCursorFromFileW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_LoadCursorFromFileW]
  end;
end;

var
  _LoadCursorFromFile: Pointer;

function LoadCursorFromFile;
begin
  GetProcedureAddress(_LoadCursorFromFile, user32, 'LoadCursorFromFile' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_LoadCursorFromFile]
  end;
end;

var
  _CreateCursor: Pointer;

function CreateCursor;
begin
  GetProcedureAddress(_CreateCursor, user32, 'CreateCursor');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_CreateCursor]
  end;
end;

var
  _DestroyCursor: Pointer;

function DestroyCursor;
begin
  GetProcedureAddress(_DestroyCursor, user32, 'DestroyCursor');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DestroyCursor]
  end;
end;

var
  _SetSystemCursor: Pointer;

function SetSystemCursor;
begin
  GetProcedureAddress(_SetSystemCursor, user32, 'SetSystemCursor');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_SetSystemCursor]
  end;
end;

var
  _LoadIconA: Pointer;

function LoadIconA;
begin
  GetProcedureAddress(_LoadIconA, user32, 'LoadIconA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_LoadIconA]
  end;
end;

var
  _LoadIconW: Pointer;

function LoadIconW;
begin
  GetProcedureAddress(_LoadIconW, user32, 'LoadIconW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_LoadIconW]
  end;
end;

var
  _LoadIcon: Pointer;

function LoadIcon;
begin
  GetProcedureAddress(_LoadIcon, user32, 'LoadIcon' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_LoadIcon]
  end;
end;

var
  _PrivateExtractIconsA: Pointer;

function PrivateExtractIconsA;
begin
  GetProcedureAddress(_PrivateExtractIconsA, user32, 'PrivateExtractIconsA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_PrivateExtractIconsA]
  end;
end;

var
  _PrivateExtractIconsW: Pointer;

function PrivateExtractIconsW;
begin
  GetProcedureAddress(_PrivateExtractIconsW, user32, 'PrivateExtractIconsW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_PrivateExtractIconsW]
  end;
end;

var
  _PrivateExtractIcons: Pointer;

function PrivateExtractIcons;
begin
  GetProcedureAddress(_PrivateExtractIcons, user32, 'PrivateExtractIcons' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_PrivateExtractIcons]
  end;
end;

var
  _CreateIcon: Pointer;

function CreateIcon;
begin
  GetProcedureAddress(_CreateIcon, user32, 'CreateIcon');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_CreateIcon]
  end;
end;

var
  _DestroyIcon: Pointer;

function DestroyIcon;
begin
  GetProcedureAddress(_DestroyIcon, user32, 'DestroyIcon');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DestroyIcon]
  end;
end;

var
  _LookupIconIdFromDirectory: Pointer;

function LookupIconIdFromDirectory;
begin
  GetProcedureAddress(_LookupIconIdFromDirectory, user32, 'LookupIconIdFromDirectory');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_LookupIconIdFromDirectory]
  end;
end;

var
  _LookupIconIdFromDirectoryEx: Pointer;

function LookupIconIdFromDirectoryEx;
begin
  GetProcedureAddress(_LookupIconIdFromDirectoryEx, user32, 'LookupIconIdFromDirectoryEx');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_LookupIconIdFromDirectoryEx]
  end;
end;

var
  _CreateIconFromResource: Pointer;

function CreateIconFromResource;
begin
  GetProcedureAddress(_CreateIconFromResource, user32, 'CreateIconFromResource');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_CreateIconFromResource]
  end;
end;

var
  _CreateIconFromResourceEx: Pointer;

function CreateIconFromResourceEx;
begin
  GetProcedureAddress(_CreateIconFromResourceEx, user32, 'CreateIconFromResourceEx');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_CreateIconFromResourceEx]
  end;
end;

var
  _LoadImageA: Pointer;

function LoadImageA;
begin
  GetProcedureAddress(_LoadImageA, user32, 'LoadImageA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_LoadImageA]
  end;
end;

var
  _LoadImageW: Pointer;

function LoadImageW;
begin
  GetProcedureAddress(_LoadImageW, user32, 'LoadImageW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_LoadImageW]
  end;
end;

var
  _LoadImage: Pointer;

function LoadImage;
begin
  GetProcedureAddress(_LoadImage, user32, 'LoadImage' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_LoadImage]
  end;
end;

var
  _CopyImage: Pointer;

function CopyImage;
begin
  GetProcedureAddress(_CopyImage, user32, 'CopyImage');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_CopyImage]
  end;
end;

var
  _DrawIconEx: Pointer;

function DrawIconEx;
begin
  GetProcedureAddress(_DrawIconEx, user32, 'DrawIconEx');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DrawIconEx]
  end;
end;

var
  _CreateIconIndirect: Pointer;

function CreateIconIndirect;
begin
  GetProcedureAddress(_CreateIconIndirect, user32, 'CreateIconIndirect');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_CreateIconIndirect]
  end;
end;

var
  _CopyIcon: Pointer;

function CopyIcon;
begin
  GetProcedureAddress(_CopyIcon, user32, 'CopyIcon');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_CopyIcon]
  end;
end;

var
  _GetIconInfo: Pointer;

function GetIconInfo;
begin
  GetProcedureAddress(_GetIconInfo, user32, 'GetIconInfo');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetIconInfo]
  end;
end;

var
  _LoadStringA: Pointer;

function LoadStringA;
begin
  GetProcedureAddress(_LoadStringA, user32, 'LoadStringA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_LoadStringA]
  end;
end;

var
  _LoadStringW: Pointer;

function LoadStringW;
begin
  GetProcedureAddress(_LoadStringW, user32, 'LoadStringW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_LoadStringW]
  end;
end;

var
  _LoadString: Pointer;

function LoadString;
begin
  GetProcedureAddress(_LoadString, user32, 'LoadString' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_LoadString]
  end;
end;

var
  _IsDialogMessageA: Pointer;

function IsDialogMessageA;
begin
  GetProcedureAddress(_IsDialogMessageA, user32, 'IsDialogMessageA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_IsDialogMessageA]
  end;
end;

var
  _IsDialogMessageW: Pointer;

function IsDialogMessageW;
begin
  GetProcedureAddress(_IsDialogMessageW, user32, 'IsDialogMessageW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_IsDialogMessageW]
  end;
end;

var
  _IsDialogMessage: Pointer;

function IsDialogMessage;
begin
  GetProcedureAddress(_IsDialogMessage, user32, 'IsDialogMessage' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_IsDialogMessage]
  end;
end;

var
  _MapDialogRect: Pointer;

function MapDialogRect;
begin
  GetProcedureAddress(_MapDialogRect, user32, 'MapDialogRect');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_MapDialogRect]
  end;
end;

var
  _DlgDirListA: Pointer;

function DlgDirListA;
begin
  GetProcedureAddress(_DlgDirListA, user32, 'DlgDirListA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DlgDirListA]
  end;
end;

var
  _DlgDirListW: Pointer;

function DlgDirListW;
begin
  GetProcedureAddress(_DlgDirListW, user32, 'DlgDirListW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DlgDirListW]
  end;
end;

var
  _DlgDirList: Pointer;

function DlgDirList;
begin
  GetProcedureAddress(_DlgDirList, user32, 'DlgDirList' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DlgDirList]
  end;
end;

var
  _DlgDirSelectExA: Pointer;

function DlgDirSelectExA;
begin
  GetProcedureAddress(_DlgDirSelectExA, user32, 'DlgDirSelectExA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DlgDirSelectExA]
  end;
end;

var
  _DlgDirSelectExW: Pointer;

function DlgDirSelectExW;
begin
  GetProcedureAddress(_DlgDirSelectExW, user32, 'DlgDirSelectExW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DlgDirSelectExW]
  end;
end;

var
  _DlgDirSelectEx: Pointer;

function DlgDirSelectEx;
begin
  GetProcedureAddress(_DlgDirSelectEx, user32, 'DlgDirSelectEx' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DlgDirSelectEx]
  end;
end;

var
  _DlgDirListComboBoxA: Pointer;

function DlgDirListComboBoxA;
begin
  GetProcedureAddress(_DlgDirListComboBoxA, user32, 'DlgDirListComboBoxA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DlgDirListComboBoxA]
  end;
end;

var
  _DlgDirListComboBoxW: Pointer;

function DlgDirListComboBoxW;
begin
  GetProcedureAddress(_DlgDirListComboBoxW, user32, 'DlgDirListComboBoxW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DlgDirListComboBoxW]
  end;
end;

var
  _DlgDirListComboBox: Pointer;

function DlgDirListComboBox;
begin
  GetProcedureAddress(_DlgDirListComboBox, user32, 'DlgDirListComboBox' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DlgDirListComboBox]
  end;
end;

var
  _DlgDirSelectComboBoxExA: Pointer;

function DlgDirSelectComboBoxExA;
begin
  GetProcedureAddress(_DlgDirSelectComboBoxExA, user32, 'DlgDirSelectComboBoxExA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DlgDirSelectComboBoxExA]
  end;
end;

var
  _DlgDirSelectComboBoxExW: Pointer;

function DlgDirSelectComboBoxExW;
begin
  GetProcedureAddress(_DlgDirSelectComboBoxExW, user32, 'DlgDirSelectComboBoxExW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DlgDirSelectComboBoxExW]
  end;
end;

var
  _DlgDirSelectComboBoxEx: Pointer;

function DlgDirSelectComboBoxEx;
begin
  GetProcedureAddress(_DlgDirSelectComboBoxEx, user32, 'DlgDirSelectComboBoxEx' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DlgDirSelectComboBoxEx]
  end;
end;

var
  _SetScrollInfo: Pointer;

function SetScrollInfo;
begin
  GetProcedureAddress(_SetScrollInfo, user32, 'SetScrollInfo');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_SetScrollInfo]
  end;
end;

var
  _GetScrollInfo: Pointer;

function GetScrollInfo;
begin
  GetProcedureAddress(_GetScrollInfo, user32, 'GetScrollInfo');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetScrollInfo]
  end;
end;

var
  _DefFrameProcA: Pointer;

function DefFrameProcA;
begin
  GetProcedureAddress(_DefFrameProcA, user32, 'DefFrameProcA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DefFrameProcA]
  end;
end;

var
  _DefFrameProcW: Pointer;

function DefFrameProcW;
begin
  GetProcedureAddress(_DefFrameProcW, user32, 'DefFrameProcW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DefFrameProcW]
  end;
end;

var
  _DefFrameProc: Pointer;

function DefFrameProc;
begin
  GetProcedureAddress(_DefFrameProc, user32, 'DefFrameProc' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DefFrameProc]
  end;
end;

var
  _DefMDIChildProcA: Pointer;

function DefMDIChildProcA;
begin
  GetProcedureAddress(_DefMDIChildProcA, user32, 'DefMDIChildProcA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DefMDIChildProcA]
  end;
end;

var
  _DefMDIChildProcW: Pointer;

function DefMDIChildProcW;
begin
  GetProcedureAddress(_DefMDIChildProcW, user32, 'DefMDIChildProcW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DefMDIChildProcW]
  end;
end;

var
  _DefMDIChildProc: Pointer;

function DefMDIChildProc;
begin
  GetProcedureAddress(_DefMDIChildProc, user32, 'DefMDIChildProc' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DefMDIChildProc]
  end;
end;

var
  _TranslateMDISysAccel: Pointer;

function TranslateMDISysAccel;
begin
  GetProcedureAddress(_TranslateMDISysAccel, user32, 'TranslateMDISysAccel');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_TranslateMDISysAccel]
  end;
end;

var
  _ArrangeIconicWindows: Pointer;

function ArrangeIconicWindows;
begin
  GetProcedureAddress(_ArrangeIconicWindows, user32, 'ArrangeIconicWindows');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_ArrangeIconicWindows]
  end;
end;

var
  _CreateMDIWindowA: Pointer;

function CreateMDIWindowA;
begin
  GetProcedureAddress(_CreateMDIWindowA, user32, 'CreateMDIWindowA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_CreateMDIWindowA]
  end;
end;

var
  _CreateMDIWindowW: Pointer;

function CreateMDIWindowW;
begin
  GetProcedureAddress(_CreateMDIWindowW, user32, 'CreateMDIWindowW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_CreateMDIWindowW]
  end;
end;

var
  _CreateMDIWindow: Pointer;

function CreateMDIWindow;
begin
  GetProcedureAddress(_CreateMDIWindow, user32, 'CreateMDIWindow' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_CreateMDIWindow]
  end;
end;

var
  _TileWindows: Pointer;

function TileWindows;
begin
  GetProcedureAddress(_TileWindows, user32, 'TileWindows');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_TileWindows]
  end;
end;

var
  _CascadeWindows: Pointer;

function CascadeWindows;
begin
  GetProcedureAddress(_CascadeWindows, user32, 'CascadeWindows');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_CascadeWindows]
  end;
end;

var
  _WinHelpA: Pointer;

function WinHelpA;
begin
  GetProcedureAddress(_WinHelpA, user32, 'WinHelpA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_WinHelpA]
  end;
end;

var
  _WinHelpW: Pointer;

function WinHelpW;
begin
  GetProcedureAddress(_WinHelpW, user32, 'WinHelpW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_WinHelpW]
  end;
end;

var
  _WinHelp: Pointer;

function WinHelp;
begin
  GetProcedureAddress(_WinHelp, user32, 'WinHelp' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_WinHelp]
  end;
end;

var
  _GetGuiResources: Pointer;

function GetGuiResources;
begin
  GetProcedureAddress(_GetGuiResources, user32, 'GetGuiResources');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetGuiResources]
  end;
end;

var
  _ChangeDisplaySettingsA: Pointer;

function ChangeDisplaySettingsA;
begin
  GetProcedureAddress(_ChangeDisplaySettingsA, user32, 'ChangeDisplaySettingsA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_ChangeDisplaySettingsA]
  end;
end;

var
  _ChangeDisplaySettingsW: Pointer;

function ChangeDisplaySettingsW;
begin
  GetProcedureAddress(_ChangeDisplaySettingsW, user32, 'ChangeDisplaySettingsW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_ChangeDisplaySettingsW]
  end;
end;

var
  _ChangeDisplaySettings: Pointer;

function ChangeDisplaySettings;
begin
  GetProcedureAddress(_ChangeDisplaySettings, user32, 'ChangeDisplaySettings' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_ChangeDisplaySettings]
  end;
end;

var
  _ChangeDisplaySettingsExA: Pointer;

function ChangeDisplaySettingsExA;
begin
  GetProcedureAddress(_ChangeDisplaySettingsExA, user32, 'ChangeDisplaySettingsExA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_ChangeDisplaySettingsExA]
  end;
end;

var
  _ChangeDisplaySettingsExW: Pointer;

function ChangeDisplaySettingsExW;
begin
  GetProcedureAddress(_ChangeDisplaySettingsExW, user32, 'ChangeDisplaySettingsExW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_ChangeDisplaySettingsExW]
  end;
end;

var
  _ChangeDisplaySettingsEx: Pointer;

function ChangeDisplaySettingsEx;
begin
  GetProcedureAddress(_ChangeDisplaySettingsEx, user32, 'ChangeDisplaySettingsEx' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_ChangeDisplaySettingsEx]
  end;
end;

var
  _EnumDisplaySettingsA: Pointer;

function EnumDisplaySettingsA;
begin
  GetProcedureAddress(_EnumDisplaySettingsA, user32, 'EnumDisplaySettingsA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_EnumDisplaySettingsA]
  end;
end;

var
  _EnumDisplaySettingsW: Pointer;

function EnumDisplaySettingsW;
begin
  GetProcedureAddress(_EnumDisplaySettingsW, user32, 'EnumDisplaySettingsW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_EnumDisplaySettingsW]
  end;
end;

var
  _EnumDisplaySettings: Pointer;

function EnumDisplaySettings;
begin
  GetProcedureAddress(_EnumDisplaySettings, user32, 'EnumDisplaySettings' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_EnumDisplaySettings]
  end;
end;

var
  _EnumDisplaySettingsExA: Pointer;

function EnumDisplaySettingsExA;
begin
  GetProcedureAddress(_EnumDisplaySettingsExA, user32, 'EnumDisplaySettingsExA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_EnumDisplaySettingsExA]
  end;
end;

var
  _EnumDisplaySettingsExW: Pointer;

function EnumDisplaySettingsExW;
begin
  GetProcedureAddress(_EnumDisplaySettingsExW, user32, 'EnumDisplaySettingsExW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_EnumDisplaySettingsExW]
  end;
end;

var
  _EnumDisplaySettingsEx: Pointer;

function EnumDisplaySettingsEx;
begin
  GetProcedureAddress(_EnumDisplaySettingsEx, user32, 'EnumDisplaySettingsEx' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_EnumDisplaySettingsEx]
  end;
end;

var
  _EnumDisplayDevicesA: Pointer;

function EnumDisplayDevicesA;
begin
  GetProcedureAddress(_EnumDisplayDevicesA, user32, 'EnumDisplayDevicesA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_EnumDisplayDevicesA]
  end;
end;

var
  _EnumDisplayDevicesW: Pointer;

function EnumDisplayDevicesW;
begin
  GetProcedureAddress(_EnumDisplayDevicesW, user32, 'EnumDisplayDevicesW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_EnumDisplayDevicesW]
  end;
end;

var
  _EnumDisplayDevices: Pointer;

function EnumDisplayDevices;
begin
  GetProcedureAddress(_EnumDisplayDevices, user32, 'EnumDisplayDevices' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_EnumDisplayDevices]
  end;
end;

var
  _SystemParametersInfoA: Pointer;

function SystemParametersInfoA;
begin
  GetProcedureAddress(_SystemParametersInfoA, user32, 'SystemParametersInfoA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_SystemParametersInfoA]
  end;
end;

var
  _SystemParametersInfoW: Pointer;

function SystemParametersInfoW;
begin
  GetProcedureAddress(_SystemParametersInfoW, user32, 'SystemParametersInfoW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_SystemParametersInfoW]
  end;
end;

var
  _SystemParametersInfo: Pointer;

function SystemParametersInfo;
begin
  GetProcedureAddress(_SystemParametersInfo, user32, 'SystemParametersInfo' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_SystemParametersInfo]
  end;
end;

var
  _SetDebugErrorLevel: Pointer;

procedure SetDebugErrorLevel;
begin
  GetProcedureAddress(_SetDebugErrorLevel, user32, 'SetDebugErrorLevel');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_SetDebugErrorLevel]
  end;
end;

var
  _SetLastErrorEx: Pointer;

procedure SetLastErrorEx;
begin
  GetProcedureAddress(_SetLastErrorEx, user32, 'SetLastErrorEx');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_SetLastErrorEx]
  end;
end;

var
  _InternalGetWindowText: Pointer;

function InternalGetWindowText;
begin
  GetProcedureAddress(_InternalGetWindowText, user32, 'InternalGetWindowText');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_InternalGetWindowText]
  end;
end;

var
  _EndTask: Pointer;

function EndTask;
begin
  GetProcedureAddress(_EndTask, user32, 'EndTask');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_EndTask]
  end;
end;

var
  _MonitorFromPoint: Pointer;

function MonitorFromPoint;
begin
  GetProcedureAddress(_MonitorFromPoint, user32, 'MonitorFromPoint');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_MonitorFromPoint]
  end;
end;

var
  _MonitorFromRect: Pointer;

function MonitorFromRect;
begin
  GetProcedureAddress(_MonitorFromRect, user32, 'MonitorFromRect');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_MonitorFromRect]
  end;
end;

var
  _MonitorFromWindow: Pointer;

function MonitorFromWindow;
begin
  GetProcedureAddress(_MonitorFromWindow, user32, 'MonitorFromWindow');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_MonitorFromWindow]
  end;
end;

var
  _GetMonitorInfoA: Pointer;

function GetMonitorInfoA;
begin
  GetProcedureAddress(_GetMonitorInfoA, user32, 'GetMonitorInfoA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetMonitorInfoA]
  end;
end;

var
  _GetMonitorInfoW: Pointer;

function GetMonitorInfoW;
begin
  GetProcedureAddress(_GetMonitorInfoW, user32, 'GetMonitorInfoW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetMonitorInfoW]
  end;
end;

var
  _GetMonitorInfo: Pointer;

function GetMonitorInfo;
begin
  GetProcedureAddress(_GetMonitorInfo, user32, 'GetMonitorInfo' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetMonitorInfo]
  end;
end;

var
  _EnumDisplayMonitors: Pointer;

function EnumDisplayMonitors;
begin
  GetProcedureAddress(_EnumDisplayMonitors, user32, 'EnumDisplayMonitors');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_EnumDisplayMonitors]
  end;
end;

var
  _NotifyWinEvent: Pointer;

procedure NotifyWinEvent;
begin
  GetProcedureAddress(_NotifyWinEvent, user32, 'NotifyWinEvent');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_NotifyWinEvent]
  end;
end;

var
  _SetWinEventHook: Pointer;

function SetWinEventHook;
begin
  GetProcedureAddress(_SetWinEventHook, user32, 'SetWinEventHook');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_SetWinEventHook]
  end;
end;

var
  _IsWinEventHookInstalled: Pointer;

function IsWinEventHookInstalled;
begin
  GetProcedureAddress(_IsWinEventHookInstalled, user32, 'IsWinEventHookInstalled');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_IsWinEventHookInstalled]
  end;
end;

var
  _UnhookWinEvent: Pointer;

function UnhookWinEvent;
begin
  GetProcedureAddress(_UnhookWinEvent, user32, 'UnhookWinEvent');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_UnhookWinEvent]
  end;
end;

var
  _GetGUIThreadInfo: Pointer;

function GetGUIThreadInfo;
begin
  GetProcedureAddress(_GetGUIThreadInfo, user32, 'GetGUIThreadInfo');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetGUIThreadInfo]
  end;
end;

var
  _GetWindowModuleFileNameA: Pointer;

function GetWindowModuleFileNameA;
begin
  GetProcedureAddress(_GetWindowModuleFileNameA, user32, 'GetWindowModuleFileNameA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetWindowModuleFileNameA]
  end;
end;

var
  _GetWindowModuleFileNameW: Pointer;

function GetWindowModuleFileNameW;
begin
  GetProcedureAddress(_GetWindowModuleFileNameW, user32, 'GetWindowModuleFileNameW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetWindowModuleFileNameW]
  end;
end;

var
  _GetWindowModuleFileName: Pointer;

function GetWindowModuleFileName;
begin
  GetProcedureAddress(_GetWindowModuleFileName, user32, 'GetWindowModuleFileName' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetWindowModuleFileName]
  end;
end;

var
  _GetCursorInfo: Pointer;

function GetCursorInfo;
begin
  GetProcedureAddress(_GetCursorInfo, user32, 'GetCursorInfo');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetCursorInfo]
  end;
end;

var
  _GetWindowInfo: Pointer;

function GetWindowInfo;
begin
  GetProcedureAddress(_GetWindowInfo, user32, 'GetWindowInfo');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetWindowInfo]
  end;
end;

var
  _GetTitleBarInfo: Pointer;

function GetTitleBarInfo;
begin
  GetProcedureAddress(_GetTitleBarInfo, user32, 'GetTitleBarInfo');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetTitleBarInfo]
  end;
end;

var
  _GetMenuBarInfo: Pointer;

function GetMenuBarInfo;
begin
  GetProcedureAddress(_GetMenuBarInfo, user32, 'GetMenuBarInfo');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetMenuBarInfo]
  end;
end;

var
  _GetScrollBarInfo: Pointer;

function GetScrollBarInfo;
begin
  GetProcedureAddress(_GetScrollBarInfo, user32, 'GetScrollBarInfo');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetScrollBarInfo]
  end;
end;

var
  _GetComboBoxInfo: Pointer;

function GetComboBoxInfo;
begin
  GetProcedureAddress(_GetComboBoxInfo, user32, 'GetComboBoxInfo');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetComboBoxInfo]
  end;
end;

var
  _GetAncestor: Pointer;

function GetAncestor;
begin
  GetProcedureAddress(_GetAncestor, user32, 'GetAncestor');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetAncestor]
  end;
end;

var
  _RealChildWindowFromPoint: Pointer;

function RealChildWindowFromPoint;
begin
  GetProcedureAddress(_RealChildWindowFromPoint, user32, 'RealChildWindowFromPoint');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_RealChildWindowFromPoint]
  end;
end;

var
  _RealGetWindowClassA: Pointer;

function RealGetWindowClassA;
begin
  GetProcedureAddress(_RealGetWindowClassA, user32, 'RealGetWindowClassA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_RealGetWindowClassA]
  end;
end;

var
  _RealGetWindowClassW: Pointer;

function RealGetWindowClassW;
begin
  GetProcedureAddress(_RealGetWindowClassW, user32, 'RealGetWindowClassW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_RealGetWindowClassW]
  end;
end;

var
  _RealGetWindowClass: Pointer;

function RealGetWindowClass;
begin
  GetProcedureAddress(_RealGetWindowClass, user32, 'RealGetWindowClass' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_RealGetWindowClass]
  end;
end;

var
  _GetAltTabInfoA: Pointer;

function GetAltTabInfoA;
begin
  GetProcedureAddress(_GetAltTabInfoA, user32, 'GetAltTabInfoA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetAltTabInfoA]
  end;
end;

var
  _GetAltTabInfoW: Pointer;

function GetAltTabInfoW;
begin
  GetProcedureAddress(_GetAltTabInfoW, user32, 'GetAltTabInfoW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetAltTabInfoW]
  end;
end;

var
  _GetAltTabInfo: Pointer;

function GetAltTabInfo;
begin
  GetProcedureAddress(_GetAltTabInfo, user32, 'GetAltTabInfo' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetAltTabInfo]
  end;
end;

var
  _GetListBoxInfo: Pointer;

function GetListBoxInfo;
begin
  GetProcedureAddress(_GetListBoxInfo, user32, 'GetListBoxInfo');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetListBoxInfo]
  end;
end;

var
  _LockWorkStation: Pointer;

function LockWorkStation;
begin
  GetProcedureAddress(_LockWorkStation, user32, 'LockWorkStation');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_LockWorkStation]
  end;
end;

var
  _UserHandleGrantAccess: Pointer;

function UserHandleGrantAccess;
begin
  GetProcedureAddress(_UserHandleGrantAccess, user32, 'UserHandleGrantAccess');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_UserHandleGrantAccess]
  end;
end;

var
  _GetRawInputData: Pointer;

function GetRawInputData;
begin
  GetProcedureAddress(_GetRawInputData, user32, 'GetRawInputData');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetRawInputData]
  end;
end;

var
  _GetRawInputDeviceInfoA: Pointer;

function GetRawInputDeviceInfoA;
begin
  GetProcedureAddress(_GetRawInputDeviceInfoA, user32, 'GetRawInputDeviceInfoA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetRawInputDeviceInfoA]
  end;
end;

var
  _GetRawInputDeviceInfoW: Pointer;

function GetRawInputDeviceInfoW;
begin
  GetProcedureAddress(_GetRawInputDeviceInfoW, user32, 'GetRawInputDeviceInfoW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetRawInputDeviceInfoW]
  end;
end;

var
  _GetRawInputDeviceInfo: Pointer;

function GetRawInputDeviceInfo;
begin
  GetProcedureAddress(_GetRawInputDeviceInfo, user32, 'GetRawInputDeviceInfo' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetRawInputDeviceInfo]
  end;
end;

var
  _GetRawInputBuffer: Pointer;

function GetRawInputBuffer;
begin
  GetProcedureAddress(_GetRawInputBuffer, user32, 'GetRawInputBuffer');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetRawInputBuffer]
  end;
end;

var
  _RegisterRawInputDevices: Pointer;

function RegisterRawInputDevices;
begin
  GetProcedureAddress(_RegisterRawInputDevices, user32, 'RegisterRawInputDevices');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_RegisterRawInputDevices]
  end;
end;

var
  _GetRegisteredRawInputDevices: Pointer;

function GetRegisteredRawInputDevices;
begin
  GetProcedureAddress(_GetRegisteredRawInputDevices, user32, 'GetRegisteredRawInputDevices');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetRegisteredRawInputDevices]
  end;
end;

var
  _GetRawInputDeviceList: Pointer;

function GetRawInputDeviceList;
begin
  GetProcedureAddress(_GetRawInputDeviceList, user32, 'GetRawInputDeviceList');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_GetRawInputDeviceList]
  end;
end;

var
  _DefRawInputProc: Pointer;

function DefRawInputProc;
begin
  GetProcedureAddress(_DefRawInputProc, user32, 'DefRawInputProc');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DefRawInputProc]
  end;
end;

{$ELSE}

function IsHungAppWindow; external user32 name 'IsHungAppWindow';
procedure DisableProcessWindowsGhosting; external user32 name 'DisableProcessWindowsGhosting';
function wvsprintfA; external user32 name 'wvsprintfA';
function wvsprintfW; external user32 name 'wvsprintfW';
function wvsprintf; external user32 name 'wvsprintf' + AWSuffix;
function wsprintfA; external user32 name 'wsprintfA';
function wsprintfW; external user32 name 'wsprintfW';
function wsprintf; external user32 name 'wsprintf' + AWSuffix;
function LoadKeyboardLayoutA; external user32 name 'LoadKeyboardLayoutA';
function LoadKeyboardLayoutW; external user32 name 'LoadKeyboardLayoutW';
function LoadKeyboardLayout; external user32 name 'LoadKeyboardLayout' + AWSuffix;
function ActivateKeyboardLayout; external user32 name 'ActivateKeyboardLayout';
function ToUnicodeEx; external user32 name 'ToUnicodeEx';
function UnloadKeyboardLayout; external user32 name 'UnloadKeyboardLayout';
function GetKeyboardLayoutNameA; external user32 name 'GetKeyboardLayoutNameA';
function GetKeyboardLayoutNameW; external user32 name 'GetKeyboardLayoutNameW';
function GetKeyboardLayoutName; external user32 name 'GetKeyboardLayoutName' + AWSuffix;
function GetKeyboardLayoutList; external user32 name 'GetKeyboardLayoutList';
function GetKeyboardLayout; external user32 name 'GetKeyboardLayout';
function GetMouseMovePointsEx; external user32 name 'GetMouseMovePointsEx';
function CreateDesktopA; external user32 name 'CreateDesktopA';
function CreateDesktopW; external user32 name 'CreateDesktopW';
function CreateDesktop; external user32 name 'CreateDesktop' + AWSuffix;
function OpenDesktopA; external user32 name 'OpenDesktopA';
function OpenDesktopW; external user32 name 'OpenDesktopW';
function OpenDesktop; external user32 name 'OpenDesktop' + AWSuffix;
function OpenInputDesktop; external user32 name 'OpenInputDesktop';
function EnumDesktopsA; external user32 name 'EnumDesktopsA';
function EnumDesktopsW; external user32 name 'EnumDesktopsW';
function EnumDesktops; external user32 name 'EnumDesktops' + AWSuffix;
function EnumDesktopWindows; external user32 name 'EnumDesktopWindows';
function SwitchDesktop; external user32 name 'SwitchDesktop';
function SetThreadDesktop; external user32 name 'SetThreadDesktop';
function CloseDesktop; external user32 name 'CloseDesktop';
function GetThreadDesktop; external user32 name 'GetThreadDesktop';
function CreateWindowStationA; external user32 name 'CreateWindowStationA';
function CreateWindowStationW; external user32 name 'CreateWindowStationW';
function CreateWindowStation; external user32 name 'CreateWindowStation' + AWSuffix;
function OpenWindowStationA; external user32 name 'OpenWindowStationA';
function OpenWindowStationW; external user32 name 'OpenWindowStationW';
function OpenWindowStation; external user32 name 'OpenWindowStation' + AWSuffix;
function EnumWindowStationsA; external user32 name 'EnumWindowStationsA';
function EnumWindowStationsW; external user32 name 'EnumWindowStationsW';
function EnumWindowStations; external user32 name 'EnumWindowStations' + AWSuffix;
function CloseWindowStation; external user32 name 'CloseWindowStation';
function SetProcessWindowStation; external user32 name 'SetProcessWindowStation';
function GetProcessWindowStation; external user32 name 'GetProcessWindowStation';
function SetUserObjectSecurity; external user32 name 'SetUserObjectSecurity';
function GetUserObjectSecurity; external user32 name 'GetUserObjectSecurity';
function GetUserObjectInformationA; external user32 name 'GetUserObjectInformationA';
function GetUserObjectInformationW; external user32 name 'GetUserObjectInformationW';
function GetUserObjectInformation; external user32 name 'GetUserObjectInformation' + AWSuffix;
function SetUserObjectInformationA; external user32 name 'SetUserObjectInformationA';
function SetUserObjectInformationW; external user32 name 'SetUserObjectInformationW';
function SetUserObjectInformation; external user32 name 'SetUserObjectInformation' + AWSuffix;
function RegisterWindowMessageA; external user32 name 'RegisterWindowMessageA';
function RegisterWindowMessageW; external user32 name 'RegisterWindowMessageW';
function RegisterWindowMessage; external user32 name 'RegisterWindowMessage' + AWSuffix;
function TrackMouseEvent; external user32 name 'TrackMouseEvent';
function DrawEdge; external user32 name 'DrawEdge';
function DrawFrameControl; external user32 name 'DrawFrameControl';
function DrawCaption; external user32 name 'DrawCaption';
function DrawAnimatedRects; external user32 name 'DrawAnimatedRects';
function GetMessageA; external user32 name 'GetMessageA';
function GetMessageW; external user32 name 'GetMessageW';
function GetMessage; external user32 name 'GetMessage' + AWSuffix;
function TranslateMessage; external user32 name 'TranslateMessage';
function DispatchMessageA; external user32 name 'DispatchMessageA';
function DispatchMessageW; external user32 name 'DispatchMessageW';
function DispatchMessage; external user32 name 'DispatchMessage' + AWSuffix;
function SetMessageQueue; external user32 name 'SetMessageQueue';
function PeekMessageA; external user32 name 'PeekMessageA';
function PeekMessageW; external user32 name 'PeekMessageW';
function PeekMessage; external user32 name 'PeekMessage' + AWSuffix;
function RegisterHotKey; external user32 name 'RegisterHotKey';
function UnregisterHotKey; external user32 name 'UnregisterHotKey';
function ExitWindowsEx; external user32 name 'ExitWindowsEx';
function SwapMouseButton; external user32 name 'SwapMouseButton';
function GetMessagePos; external user32 name 'GetMessagePos';
function GetMessageTime; external user32 name 'GetMessageTime';
function GetMessageExtraInfo; external user32 name 'GetMessageExtraInfo';
function SetMessageExtraInfo; external user32 name 'SetMessageExtraInfo';
function SendMessageA; external user32 name 'SendMessageA';
function SendMessageW; external user32 name 'SendMessageW';
function SendMessage; external user32 name 'SendMessage' + AWSuffix;
function SendMessageTimeoutA; external user32 name 'SendMessageTimeoutA';
function SendMessageTimeoutW; external user32 name 'SendMessageTimeoutW';
function SendMessageTimeout; external user32 name 'SendMessageTimeout' + AWSuffix;
function SendNotifyMessageA; external user32 name 'SendNotifyMessageA';
function SendNotifyMessageW; external user32 name 'SendNotifyMessageW';
function SendNotifyMessage; external user32 name 'SendNotifyMessage' + AWSuffix;
function SendMessageCallbackA; external user32 name 'SendMessageCallbackA';
function SendMessageCallbackW; external user32 name 'SendMessageCallbackW';
function SendMessageCallback; external user32 name 'SendMessageCallback' + AWSuffix;
function BroadcastSystemMessageExA; external user32 name 'BroadcastSystemMessageExA';
function BroadcastSystemMessageExW; external user32 name 'BroadcastSystemMessageExW';
function BroadcastSystemMessageEx; external user32 name 'BroadcastSystemMessageEx' + AWSuffix;
function BroadcastSystemMessageA; external user32 name 'BroadcastSystemMessageA';
function BroadcastSystemMessageW; external user32 name 'BroadcastSystemMessageW';
function BroadcastSystemMessage; external user32 name 'BroadcastSystemMessage' + AWSuffix;
function RegisterDeviceNotificationA; external user32 name 'RegisterDeviceNotificationA';
function RegisterDeviceNotificationW; external user32 name 'RegisterDeviceNotificationW';
function RegisterDeviceNotification; external user32 name 'RegisterDeviceNotification' + AWSuffix;
function UnregisterDeviceNotification; external user32 name 'UnregisterDeviceNotification';
function PostMessageA; external user32 name 'PostMessageA';
function PostMessageW; external user32 name 'PostMessageW';
function PostMessage; external user32 name 'PostMessage' + AWSuffix;
function PostThreadMessageA; external user32 name 'PostThreadMessageA';
function PostThreadMessageW; external user32 name 'PostThreadMessageW';
function PostThreadMessage; external user32 name 'PostThreadMessage' + AWSuffix;
function AttachThreadInput; external user32 name 'AttachThreadInput';
function ReplyMessage; external user32 name 'ReplyMessage';
function WaitMessage; external user32 name 'WaitMessage';
function WaitForInputIdle; external user32 name 'WaitForInputIdle';
function DefWindowProcA; external user32 name 'DefWindowProcA';
function DefWindowProcW; external user32 name 'DefWindowProcW';
function DefWindowProc; external user32 name 'DefWindowProc' + AWSuffix;
procedure PostQuitMessage; external user32 name 'PostQuitMessage';
function CallWindowProcA; external user32 name 'CallWindowProcA';
function CallWindowProcW; external user32 name 'CallWindowProcW';
function CallWindowProc; external user32 name 'CallWindowProc' + AWSuffix;
function InSendMessage; external user32 name 'InSendMessage';
function InSendMessageEx; external user32 name 'InSendMessageEx';
function GetDoubleClickTime; external user32 name 'GetDoubleClickTime';
function SetDoubleClickTime; external user32 name 'SetDoubleClickTime';
function RegisterClassA; external user32 name 'RegisterClassA';
function RegisterClassW; external user32 name 'RegisterClassW';
function RegisterClass; external user32 name 'RegisterClass' + AWSuffix;
function UnregisterClassA; external user32 name 'UnregisterClassA';
function UnregisterClassW; external user32 name 'UnregisterClassW';
function UnregisterClass; external user32 name 'UnregisterClass' + AWSuffix;
function GetClassInfoA; external user32 name 'GetClassInfoA';
function GetClassInfoW; external user32 name 'GetClassInfoW';
function GetClassInfo; external user32 name 'GetClassInfo' + AWSuffix;
function RegisterClassExA; external user32 name 'RegisterClassExA';
function RegisterClassExW; external user32 name 'RegisterClassExW';
function RegisterClassEx; external user32 name 'RegisterClassEx' + AWSuffix;
function GetClassInfoExA; external user32 name 'GetClassInfoExA';
function GetClassInfoExW; external user32 name 'GetClassInfoExW';
function GetClassInfoEx; external user32 name 'GetClassInfoEx' + AWSuffix;
function CreateWindowExA; external user32 name 'CreateWindowExA';
function CreateWindowExW; external user32 name 'CreateWindowExW';
function CreateWindowEx; external user32 name 'CreateWindowEx' + AWSuffix;
function IsWindow; external user32 name 'IsWindow';
function IsMenu; external user32 name 'IsMenu';
function IsChild; external user32 name 'IsChild';
function DestroyWindow; external user32 name 'DestroyWindow';
function ShowWindow; external user32 name 'ShowWindow';
function AnimateWindow; external user32 name 'AnimateWindow';
function UpdateLayeredWindow; external user32 name 'UpdateLayeredWindow';
function GetLayeredWindowAttributes; external user32 name 'GetLayeredWindowAttributes';
function PrintWindow; external user32 name 'PrintWindow';
function SetLayeredWindowAttributes; external user32 name 'SetLayeredWindowAttributes';
function ShowWindowAsync; external user32 name 'ShowWindowAsync';
function FlashWindow; external user32 name 'FlashWindow';
function FlashWindowEx; external user32 name 'FlashWindowEx';
function ShowOwnedPopups; external user32 name 'ShowOwnedPopups';
function OpenIcon; external user32 name 'OpenIcon';
function CloseWindow; external user32 name 'CloseWindow';
function MoveWindow; external user32 name 'MoveWindow';
function SetWindowPos; external user32 name 'SetWindowPos';
function GetWindowPlacement; external user32 name 'GetWindowPlacement';
function SetWindowPlacement; external user32 name 'SetWindowPlacement';
function BeginDeferWindowPos; external user32 name 'BeginDeferWindowPos';
function DeferWindowPos; external user32 name 'DeferWindowPos';
function EndDeferWindowPos; external user32 name 'EndDeferWindowPos';
function IsWindowVisible; external user32 name 'IsWindowVisible';
function IsIconic; external user32 name 'IsIconic';
function AnyPopup; external user32 name 'AnyPopup';
function BringWindowToTop; external user32 name 'BringWindowToTop';
function IsZoomed; external user32 name 'IsZoomed';
function CreateDialogParamA; external user32 name 'CreateDialogParamA';
function CreateDialogParamW; external user32 name 'CreateDialogParamW';
function CreateDialogParam; external user32 name 'CreateDialogParam' + AWSuffix;
function CreateDialogIndirectParamA; external user32 name 'CreateDialogIndirectParamA';
function CreateDialogIndirectParamW; external user32 name 'CreateDialogIndirectParamW';
function CreateDialogIndirectParam; external user32 name 'CreateDialogIndirectParam' + AWSuffix;
function DialogBoxParamA; external user32 name 'DialogBoxParamA';
function DialogBoxParamW; external user32 name 'DialogBoxParamW';
function DialogBoxParam; external user32 name 'DialogBoxParam' + AWSuffix;
function DialogBoxIndirectParamA; external user32 name 'DialogBoxIndirectParamA';
function DialogBoxIndirectParamW; external user32 name 'DialogBoxIndirectParamW';
function DialogBoxIndirectParam; external user32 name 'DialogBoxIndirectParam' + AWSuffix;
function EndDialog; external user32 name 'EndDialog';
function GetDlgItem; external user32 name 'GetDlgItem';
function SetDlgItemInt; external user32 name 'SetDlgItemInt';
function GetDlgItemInt; external user32 name 'GetDlgItemInt';
function SetDlgItemTextA; external user32 name 'SetDlgItemTextA';
function SetDlgItemTextW; external user32 name 'SetDlgItemTextW';
function SetDlgItemText; external user32 name 'SetDlgItemText' + AWSuffix;
function GetDlgItemTextA; external user32 name 'GetDlgItemTextA';
function GetDlgItemTextW; external user32 name 'GetDlgItemTextW';
function GetDlgItemText; external user32 name 'GetDlgItemText' + AWSuffix;
function CheckDlgButton; external user32 name 'CheckDlgButton';
function CheckRadioButton; external user32 name 'CheckRadioButton';
function IsDlgButtonChecked; external user32 name 'IsDlgButtonChecked';
function SendDlgItemMessageA; external user32 name 'SendDlgItemMessageA';
function SendDlgItemMessageW; external user32 name 'SendDlgItemMessageW';
function SendDlgItemMessage; external user32 name 'SendDlgItemMessage' + AWSuffix;
function GetNextDlgGroupItem; external user32 name 'GetNextDlgGroupItem';
function GetNextDlgTabItem; external user32 name 'GetNextDlgTabItem';
function GetDlgCtrlID; external user32 name 'GetDlgCtrlID';
function GetDialogBaseUnits; external user32 name 'GetDialogBaseUnits';
function DefDlgProcA; external user32 name 'DefDlgProcA';
function DefDlgProcW; external user32 name 'DefDlgProcW';
function DefDlgProc; external user32 name 'DefDlgProc' + AWSuffix;
function CallMsgFilterA; external user32 name 'CallMsgFilterA';
function CallMsgFilterW; external user32 name 'CallMsgFilterW';
function CallMsgFilter; external user32 name 'CallMsgFilter' + AWSuffix;
function OpenClipboard; external user32 name 'OpenClipboard';
function CloseClipboard; external user32 name 'CloseClipboard';
function GetClipboardSequenceNumber; external user32 name 'GetClipboardSequenceNumber';
function GetClipboardOwner; external user32 name 'GetClipboardOwner';
function SetClipboardViewer; external user32 name 'SetClipboardViewer';
function GetClipboardViewer; external user32 name 'GetClipboardViewer';
function ChangeClipboardChain; external user32 name 'ChangeClipboardChain';
function SetClipboardData; external user32 name 'SetClipboardData';
function GetClipboardData; external user32 name 'GetClipboardData';
function RegisterClipboardFormatA; external user32 name 'RegisterClipboardFormatA';
function RegisterClipboardFormatW; external user32 name 'RegisterClipboardFormatW';
function RegisterClipboardFormat; external user32 name 'RegisterClipboardFormat' + AWSuffix;
function CountClipboardFormats; external user32 name 'CountClipboardFormats';
function EnumClipboardFormats; external user32 name 'EnumClipboardFormats';
function GetClipboardFormatNameA; external user32 name 'GetClipboardFormatNameA';
function GetClipboardFormatNameW; external user32 name 'GetClipboardFormatNameW';
function GetClipboardFormatName; external user32 name 'GetClipboardFormatName' + AWSuffix;
function EmptyClipboard; external user32 name 'EmptyClipboard';
function IsClipboardFormatAvailable; external user32 name 'IsClipboardFormatAvailable';
function GetPriorityClipboardFormat; external user32 name 'GetPriorityClipboardFormat';
function GetOpenClipboardWindow; external user32 name 'GetOpenClipboardWindow';
function CharToOemA; external user32 name 'CharToOemA';
function CharToOemW; external user32 name 'CharToOemW';
function CharToOem; external user32 name 'CharToOem' + AWSuffix;
function OemToCharA; external user32 name 'OemToCharA';
function OemToCharW; external user32 name 'OemToCharW';
function OemToChar; external user32 name 'OemToChar' + AWSuffix;
function CharToOemBuffA; external user32 name 'CharToOemBuffA';
function CharToOemBuffW; external user32 name 'CharToOemBuffW';
function CharToOemBuff; external user32 name 'CharToOemBuff' + AWSuffix;
function OemToCharBuffA; external user32 name 'OemToCharBuffA';
function OemToCharBuffW; external user32 name 'OemToCharBuffW';
function OemToCharBuff; external user32 name 'OemToCharBuff' + AWSuffix;
function CharUpperA; external user32 name 'CharUpperA';
function CharUpperW; external user32 name 'CharUpperW';
function CharUpper; external user32 name 'CharUpper' + AWSuffix;
function CharUpperBuffA; external user32 name 'CharUpperBuffA';
function CharUpperBuffW; external user32 name 'CharUpperBuffW';
function CharUpperBuff; external user32 name 'CharUpperBuff' + AWSuffix;
function CharLowerA; external user32 name 'CharLowerA';
function CharLowerW; external user32 name 'CharLowerW';
function CharLower; external user32 name 'CharLower' + AWSuffix;
function CharLowerBuffA; external user32 name 'CharLowerBuffA';
function CharLowerBuffW; external user32 name 'CharLowerBuffW';
function CharLowerBuff; external user32 name 'CharLowerBuff' + AWSuffix;
function CharNextA; external user32 name 'CharNextA';
function CharNextW; external user32 name 'CharNextW';
function CharNext; external user32 name 'CharNext' + AWSuffix;
function CharPrevA; external user32 name 'CharPrevA';
function CharPrevW; external user32 name 'CharPrevW';
function CharPrev; external user32 name 'CharPrev' + AWSuffix;
function CharNextExA; external user32 name 'CharNextExA';
function CharPrevExA; external user32 name 'CharPrevExA';
function IsCharAlphaA; external user32 name 'IsCharAlphaA';
function IsCharAlphaW; external user32 name 'IsCharAlphaW';
function IsCharAlpha; external user32 name 'IsCharAlpha' + AWSuffix;
function IsCharAlphaNumericA; external user32 name 'IsCharAlphaNumericA';
function IsCharAlphaNumericW; external user32 name 'IsCharAlphaNumericW';
function IsCharAlphaNumeric; external user32 name 'IsCharAlphaNumeric' + AWSuffix;
function IsCharUpperA; external user32 name 'IsCharUpperA';
function IsCharUpperW; external user32 name 'IsCharUpperW';
function IsCharUpper; external user32 name 'IsCharUpper' + AWSuffix;
function IsCharLowerA; external user32 name 'IsCharLowerA';
function IsCharLowerW; external user32 name 'IsCharLowerW';
function IsCharLower; external user32 name 'IsCharLower' + AWSuffix;
function SetFocus; external user32 name 'SetFocus';
function GetActiveWindow; external user32 name 'GetActiveWindow';
function GetFocus; external user32 name 'GetFocus';
function GetKBCodePage; external user32 name 'GetKBCodePage';
function GetKeyState; external user32 name 'GetKeyState';
function GetAsyncKeyState; external user32 name 'GetAsyncKeyState';
function GetKeyboardState; external user32 name 'GetKeyboardState';
function SetKeyboardState; external user32 name 'SetKeyboardState';
function GetKeyNameTextA; external user32 name 'GetKeyNameTextA';
function GetKeyNameTextW; external user32 name 'GetKeyNameTextW';
function GetKeyNameText; external user32 name 'GetKeyNameText' + AWSuffix;
function GetKeyboardType; external user32 name 'GetKeyboardType';
function ToAscii; external user32 name 'ToAscii';
function ToAsciiEx; external user32 name 'ToAsciiEx';
function ToUnicode; external user32 name 'ToUnicode';
function OemKeyScan; external user32 name 'OemKeyScan';
function VkKeyScanA; external user32 name 'VkKeyScanA';
function VkKeyScanW; external user32 name 'VkKeyScanW';
function VkKeyScan; external user32 name 'VkKeyScan' + AWSuffix;
function VkKeyScanExA; external user32 name 'VkKeyScanExA';
function VkKeyScanExW; external user32 name 'VkKeyScanExW';
function VkKeyScanEx; external user32 name 'VkKeyScanEx' + AWSuffix;
procedure keybd_event; external user32 name 'keybd_event';
procedure mouse_event; external user32 name 'mouse_event';
function SendInput; external user32 name 'SendInput';
function GetLastInputInfo; external user32 name 'GetLastInputInfo';
function MapVirtualKeyA; external user32 name 'MapVirtualKeyA';
function MapVirtualKeyW; external user32 name 'MapVirtualKeyW';
function MapVirtualKey; external user32 name 'MapVirtualKey' + AWSuffix;
function MapVirtualKeyExA; external user32 name 'MapVirtualKeyExA';
function MapVirtualKeyExW; external user32 name 'MapVirtualKeyExW';
function MapVirtualKeyEx; external user32 name 'MapVirtualKeyEx' + AWSuffix;
function GetInputState; external user32 name 'GetInputState';
function GetQueueStatus; external user32 name 'GetQueueStatus';
function GetCapture; external user32 name 'GetCapture';
function SetCapture; external user32 name 'SetCapture';
function ReleaseCapture; external user32 name 'ReleaseCapture';
function MsgWaitForMultipleObjects; external user32 name 'MsgWaitForMultipleObjects';
function MsgWaitForMultipleObjectsEx; external user32 name 'MsgWaitForMultipleObjectsEx';
function SetTimer; external user32 name 'SetTimer';
function KillTimer; external user32 name 'KillTimer';
function IsWindowUnicode; external user32 name 'IsWindowUnicode';
function EnableWindow; external user32 name 'EnableWindow';
function IsWindowEnabled; external user32 name 'IsWindowEnabled';
function LoadAcceleratorsA; external user32 name 'LoadAcceleratorsA';
function LoadAcceleratorsW; external user32 name 'LoadAcceleratorsW';
function LoadAccelerators; external user32 name 'LoadAccelerators' + AWSuffix;
function CreateAcceleratorTableA; external user32 name 'CreateAcceleratorTableA';
function CreateAcceleratorTableW; external user32 name 'CreateAcceleratorTableW';
function CreateAcceleratorTable; external user32 name 'CreateAcceleratorTable' + AWSuffix;
function DestroyAcceleratorTable; external user32 name 'DestroyAcceleratorTable';
function CopyAcceleratorTableA; external user32 name 'CopyAcceleratorTableA';
function CopyAcceleratorTableW; external user32 name 'CopyAcceleratorTableW';
function CopyAcceleratorTable; external user32 name 'CopyAcceleratorTable' + AWSuffix;
function TranslateAcceleratorA; external user32 name 'TranslateAcceleratorA';
function TranslateAcceleratorW; external user32 name 'TranslateAcceleratorW';
function TranslateAccelerator; external user32 name 'TranslateAccelerator' + AWSuffix;
function GetSystemMetrics; external user32 name 'GetSystemMetrics';
function LoadMenuA; external user32 name 'LoadMenuAA';
function LoadMenuW; external user32 name 'LoadMenuWA';
function LoadMenu; external user32 name 'LoadMenu' + AWSuffix;
function LoadMenuIndirectA; external user32 name 'LoadMenuIndirectA';
function LoadMenuIndirectW; external user32 name 'LoadMenuIndirectW';
function LoadMenuIndirect; external user32 name 'LoadMenuIndirect' + AWSuffix;
function GetMenu; external user32 name 'GetMenu';
function SetMenu; external user32 name 'SetMenu';
function ChangeMenuA; external user32 name 'ChangeMenuA';
function ChangeMenuW; external user32 name 'ChangeMenuW';
function ChangeMenu; external user32 name 'ChangeMenu' + AWSuffix;
function HiliteMenuItem; external user32 name 'HiliteMenuItem';
function GetMenuStringA; external user32 name 'GetMenuStringA';
function GetMenuStringW; external user32 name 'GetMenuStringW';
function GetMenuString; external user32 name 'GetMenuString' + AWSuffix;
function GetMenuState; external user32 name 'GetMenuState';
function DrawMenuBar; external user32 name 'DrawMenuBar';
function GetSystemMenu; external user32 name 'GetSystemMenu';
function CreateMenu; external user32 name 'CreateMenu';
function CreatePopupMenu; external user32 name 'CreatePopupMenu';
function DestroyMenu; external user32 name 'DestroyMenu';
function CheckMenuItem; external user32 name 'CheckMenuItem';
function EnableMenuItem; external user32 name 'EnableMenuItem';
function GetSubMenu; external user32 name 'GetSubMenu';
function GetMenuItemID; external user32 name 'GetMenuItemID';
function GetMenuItemCount; external user32 name 'GetMenuItemCount';
function InsertMenuA; external user32 name 'InsertMenuA';
function InsertMenuW; external user32 name 'InsertMenuW';
function InsertMenu; external user32 name 'InsertMenu' + AWSuffix;
function AppendMenuA; external user32 name 'AppendMenuA';
function AppendMenuW; external user32 name 'AppendMenuW';
function AppendMenu; external user32 name 'AppendMenu' + AWSuffix;
function ModifyMenuA; external user32 name 'ModifyMenuA';
function ModifyMenuW; external user32 name 'ModifyMenuW';
function ModifyMenu; external user32 name 'ModifyMenu' + AWSuffix;
function RemoveMenu; external user32 name 'RemoveMenu';
function DeleteMenu; external user32 name 'DeleteMenu';
function SetMenuItemBitmaps; external user32 name 'SetMenuItemBitmaps';
function GetMenuCheckMarkDimensions; external user32 name 'GetMenuCheckMarkDimensions';
function TrackPopupMenu; external user32 name 'TrackPopupMenu';
function TrackPopupMenuEx; external user32 name 'TrackPopupMenuEx';
function GetMenuInfo; external user32 name 'GetMenuInfo';
function SetMenuInfo; external user32 name 'SetMenuInfo';
function EndMenu; external user32 name 'EndMenu';
function InsertMenuItemA; external user32 name 'InsertMenuItemA';
function InsertMenuItemW; external user32 name 'InsertMenuItemW';
function InsertMenuItem; external user32 name 'InsertMenuItem' + AWSuffix;
function GetMenuItemInfoA; external user32 name 'GetMenuItemInfoA';
function GetMenuItemInfoW; external user32 name 'GetMenuItemInfoW';
function GetMenuItemInfo; external user32 name 'GetMenuItemInfo' + AWSuffix;
function SetMenuItemInfoA; external user32 name 'SetMenuItemInfoA';
function SetMenuItemInfoW; external user32 name 'SetMenuItemInfoW';
function SetMenuItemInfo; external user32 name 'SetMenuItemInfo' + AWSuffix;
function GetMenuDefaultItem; external user32 name 'GetMenuDefaultItem';
function SetMenuDefaultItem; external user32 name 'SetMenuDefaultItem';
function GetMenuItemRect; external user32 name 'GetMenuItemRect';
function MenuItemFromPoint; external user32 name 'MenuItemFromPoint';
function DragObject; external user32 name 'DragObject';
function DragDetect; external user32 name 'DragDetect';
function DrawIcon; external user32 name 'DrawIcon';
function DrawTextA; external user32 name 'DrawTextA';
function DrawTextW; external user32 name 'DrawTextW';
function DrawText; external user32 name 'DrawText' + AWSuffix;
function DrawTextExA; external user32 name 'DrawTextExA';
function DrawTextExW; external user32 name 'DrawTextExW';
function DrawTextEx; external user32 name 'DrawTextEx' + AWSuffix;
function GrayStringA; external user32 name 'GrayStringA';
function GrayStringW; external user32 name 'GrayStringW';
function GrayString; external user32 name 'GrayString' + AWSuffix;
function DrawStateA; external user32 name 'DrawStateA';
function DrawStateW; external user32 name 'DrawStateW';
function DrawState; external user32 name 'DrawState' + AWSuffix;
function TabbedTextOutA; external user32 name 'TabbedTextOutA';
function TabbedTextOutW; external user32 name 'TabbedTextOutW';
function TabbedTextOut; external user32 name 'TabbedTextOut' + AWSuffix;
function GetTabbedTextExtentA; external user32 name 'GetTabbedTextExtentA';
function GetTabbedTextExtentW; external user32 name 'GetTabbedTextExtentW';
function GetTabbedTextExtent; external user32 name 'GetTabbedTextExtent' + AWSuffix;
function UpdateWindow; external user32 name 'UpdateWindow';
function SetActiveWindow; external user32 name 'SetActiveWindow';
function GetForegroundWindow; external user32 name 'GetForegroundWindow';
function PaintDesktop; external user32 name 'PaintDesktop';
procedure SwitchToThisWindow; external user32 name 'SwitchToThisWindow';
function SetForegroundWindow; external user32 name 'SetForegroundWindow';
function AllowSetForegroundWindow; external user32 name 'AllowSetForegroundWindow';
function LockSetForegroundWindow; external user32 name 'LockSetForegroundWindow';
function WindowFromDC; external user32 name 'WindowFromDC';
function GetDC; external user32 name 'GetDC';
function GetDCEx; external user32 name 'GetDCEx';
function GetWindowDC; external user32 name 'GetWindowDC';
function ReleaseDC; external user32 name 'ReleaseDC';
function BeginPaint; external user32 name 'BeginPaint';
function EndPaint; external user32 name 'EndPaint';
function GetUpdateRect; external user32 name 'GetUpdateRect';
function GetUpdateRgn; external user32 name 'GetUpdateRgn';
function SetWindowRgn; external user32 name 'SetWindowRgn';
function GetWindowRgn; external user32 name 'GetWindowRgn';
function GetWindowRgnBox; external user32 name 'GetWindowRgnBox';
function ExcludeUpdateRgn; external user32 name 'ExcludeUpdateRgn';
function InvalidateRect; external user32 name 'InvalidateRect';
function ValidateRect; external user32 name 'ValidateRect';
function InvalidateRgn; external user32 name 'InvalidateRgn';
function ValidateRgn; external user32 name 'ValidateRgn';
function RedrawWindow; external user32 name 'RedrawWindow';
function LockWindowUpdate; external user32 name 'LockWindowUpdate';
function ScrollWindow; external user32 name 'ScrollWindow';
function ScrollDC; external user32 name 'ScrollDC';
function ScrollWindowEx; external user32 name 'ScrollWindowEx';
function SetScrollPos; external user32 name 'SetScrollPos';
function GetScrollPos; external user32 name 'GetScrollPos';
function SetScrollRange; external user32 name 'SetScrollRange';
function GetScrollRange; external user32 name 'GetScrollRange';
function ShowScrollBar; external user32 name 'ShowScrollBar';
function EnableScrollBar; external user32 name 'EnableScrollBar';
function SetPropA; external user32 name 'SetPropA';
function SetPropW; external user32 name 'SetPropW';
function SetProp; external user32 name 'SetProp' + AWSuffix;
function GetPropA; external user32 name 'GetPropA';
function GetPropW; external user32 name 'GetPropW';
function GetProp; external user32 name 'GetProp' + AWSuffix;
function RemovePropA; external user32 name 'RemovePropA';
function RemovePropW; external user32 name 'RemovePropW';
function RemoveProp; external user32 name 'RemoveProp' + AWSuffix;
function EnumPropsExA; external user32 name 'EnumPropsExA';
function EnumPropsExW; external user32 name 'EnumPropsExW';
function EnumPropsEx; external user32 name 'EnumPropsEx' + AWSuffix;
function EnumPropsA; external user32 name 'EnumPropsA';
function EnumPropsW; external user32 name 'EnumPropsW';
function EnumProps; external user32 name 'EnumProps' + AWSuffix;
function SetWindowTextA; external user32 name 'SetWindowTextA';
function SetWindowTextW; external user32 name 'SetWindowTextW';
function SetWindowText; external user32 name 'SetWindowText' + AWSuffix;
function GetWindowTextA; external user32 name 'GetWindowTextA';
function GetWindowTextW; external user32 name 'GetWindowTextW';
function GetWindowText; external user32 name 'GetWindowText' + AWSuffix;
function GetWindowTextLengthA; external user32 name 'GetWindowTextLengthA';
function GetWindowTextLengthW; external user32 name 'GetWindowTextLengthW';
function GetWindowTextLength; external user32 name 'GetWindowTextLength' + AWSuffix;
function GetClientRect; external user32 name 'GetClientRect';
function GetWindowRect; external user32 name 'GetWindowRect';
function AdjustWindowRect; external user32 name 'AdjustWindowRect';
function AdjustWindowRectEx; external user32 name 'AdjustWindowRectEx';
function SetWindowContextHelpId; external user32 name 'SetWindowContextHelpId';
function GetWindowContextHelpId; external user32 name 'GetWindowContextHelpId';
function SetMenuContextHelpId; external user32 name 'SetMenuContextHelpId';
function GetMenuContextHelpId; external user32 name 'GetMenuContextHelpId';
function MessageBoxA; external user32 name 'MessageBoxA';
function MessageBoxW; external user32 name 'MessageBoxW';
function MessageBox; external user32 name 'MessageBox' + AWSuffix;
function MessageBoxExA; external user32 name 'MessageBoxExA';
function MessageBoxExW; external user32 name 'MessageBoxExW';
function MessageBoxEx; external user32 name 'MessageBoxEx' + AWSuffix;
function MessageBoxIndirectA; external user32 name 'MessageBoxIndirectA';
function MessageBoxIndirectW; external user32 name 'MessageBoxIndirectW';
function MessageBoxIndirect; external user32 name 'MessageBoxIndirect' + AWSuffix;
function MessageBeep; external user32 name 'MessageBeep';
function ShowCursor; external user32 name 'ShowCursor';
function SetCursorPos; external user32 name 'SetCursorPos';
function SetCursor; external user32 name 'SetCursor';
function GetCursorPos; external user32 name 'GetCursorPos';
function ClipCursor; external user32 name 'ClipCursor';
function GetClipCursor; external user32 name 'GetClipCursor';
function GetCursor; external user32 name 'GetCursor';
function CreateCaret; external user32 name 'CreateCaret';
function GetCaretBlinkTime; external user32 name 'GetCaretBlinkTime';
function SetCaretBlinkTime; external user32 name 'SetCaretBlinkTime';
function DestroyCaret; external user32 name 'DestroyCaret';
function HideCaret; external user32 name 'HideCaret';
function ShowCaret; external user32 name 'ShowCaret';
function SetCaretPos; external user32 name 'SetCaretPos';
function GetCaretPos; external user32 name 'GetCaretPos';
function ClientToScreen; external user32 name 'ClientToScreen';
function ScreenToClient; external user32 name 'ScreenToClient';
function MapWindowPoints; external user32 name 'MapWindowPoints';
function WindowFromPoint; external user32 name 'WindowFromPoint';
function ChildWindowFromPoint; external user32 name 'ChildWindowFromPoint';
function ChildWindowFromPointEx; external user32 name 'ChildWindowFromPointEx';
function GetSysColor; external user32 name 'GetSysColor';
function GetSysColorBrush; external user32 name 'GetSysColorBrush';
function SetSysColors; external user32 name 'SetSysColors';
function DrawFocusRect; external user32 name 'DrawFocusRect';
function FillRect; external user32 name 'FillRect';
function FrameRect; external user32 name 'FrameRect';
function InvertRect; external user32 name 'InvertRect';
function SetRect; external user32 name 'SetRect';
function SetRectEmpty; external user32 name 'SetRectEmpty';
function CopyRect; external user32 name 'CopyRect';
function InflateRect; external user32 name 'InflateRect';
function IntersectRect; external user32 name 'IntersectRect';
function UnionRect; external user32 name 'UnionRect';
function SubtractRect; external user32 name 'SubtractRect';
function OffsetRect; external user32 name 'OffsetRect';
function IsRectEmpty; external user32 name 'IsRectEmpty';
function EqualRect; external user32 name 'EqualRect';
function PtInRect; external user32 name 'PtInRect';
function GetWindowWord; external user32 name 'GetWindowWord';
function SetWindowWord; external user32 name 'SetWindowWord';
function GetWindowLongA; external user32 name 'GetWindowLongA';
function GetWindowLongW; external user32 name 'GetWindowLongW';
function GetWindowLong; external user32 name 'GetWindowLong' + AWSuffix;
function SetWindowLongA; external user32 name 'SetWindowLongA';
function SetWindowLongW; external user32 name 'SetWindowLongW';
function SetWindowLong; external user32 name 'SetWindowLong' + AWSuffix;
function GetClassWord; external user32 name 'GetClassWord';
function SetClassWord; external user32 name 'SetClassWord';
function GetClassLongA; external user32 name 'GetClassLongA';
function GetClassLongW; external user32 name 'GetClassLongW';
function GetClassLong; external user32 name 'GetClassLong' + AWSuffix;
function SetClassLongA; external user32 name 'SetClassLongA';
function SetClassLongW; external user32 name 'SetClassLongW';
function SetClassLong; external user32 name 'SetClassLong' + AWSuffix;
function GetProcessDefaultLayout; external user32 name 'GetProcessDefaultLayout';
function SetProcessDefaultLayout; external user32 name 'SetProcessDefaultLayout';
function GetDesktopWindow; external user32 name 'GetDesktopWindow';
function GetParent; external user32 name 'GetParent';
function SetParent; external user32 name 'SetParent';
function EnumChildWindows; external user32 name 'EnumChildWindows';
function FindWindowA; external user32 name 'FindWindowA';
function FindWindowW; external user32 name 'FindWindowW';
function FindWindow; external user32 name 'FindWindow' + AWSuffix;
function FindWindowExA; external user32 name 'FindWindowExA';
function FindWindowExW; external user32 name 'FindWindowExW';
function FindWindowEx; external user32 name 'FindWindowEx' + AWSuffix;
function GetShellWindow; external user32 name 'GetShellWindow';
function RegisterShellHookWindow; external user32 name 'RegisterShellHookWindow';
function DeregisterShellHookWindow; external user32 name 'DeregisterShellHookWindow';
function EnumWindows; external user32 name 'EnumWindows';
function EnumThreadWindows; external user32 name 'EnumThreadWindows';
function GetClassNameA; external user32 name 'GetClassNameA';
function GetClassNameW; external user32 name 'GetClassNameW';
function GetClassName; external user32 name 'GetClassName' + AWSuffix;
function GetTopWindow; external user32 name 'GetTopWindow';
function GetWindowThreadProcessId; external user32 name 'GetWindowThreadProcessId';
function IsGUIThread; external user32 name 'IsGUIThread';
function GetLastActivePopup; external user32 name 'GetLastActivePopup';
function GetWindow; external user32 name 'GetWindow';
function SetWindowsHookA; external user32 name 'SetWindowsHookA';
function SetWindowsHookW; external user32 name 'SetWindowsHookW';
function SetWindowsHook; external user32 name 'SetWindowsHook' + AWSuffix;
function UnhookWindowsHook; external user32 name 'UnhookWindowsHook';
function SetWindowsHookExA; external user32 name 'SetWindowsHookExA';
function SetWindowsHookExW; external user32 name 'SetWindowsHookExW';
function SetWindowsHookEx; external user32 name 'SetWindowsHookEx' + AWSuffix;
function UnhookWindowsHookEx; external user32 name 'UnhookWindowsHookEx';
function CallNextHookEx; external user32 name 'CallNextHookEx';
function CheckMenuRadioItem; external user32 name 'CheckMenuRadioItem';
function LoadBitmapA; external user32 name 'LoadBitmapA';
function LoadBitmapW; external user32 name 'LoadBitmapW';
function LoadBitmap; external user32 name 'LoadBitmap' + AWSuffix;
function LoadCursorA; external user32 name 'LoadCursorA';
function LoadCursorW; external user32 name 'LoadCursorW';
function LoadCursor; external user32 name 'LoadCursor' + AWSuffix;
function LoadCursorFromFileA; external user32 name 'LoadCursorFromFileA';
function LoadCursorFromFileW; external user32 name 'LoadCursorFromFileW';
function LoadCursorFromFile; external user32 name 'LoadCursorFromFile' + AWSuffix;
function CreateCursor; external user32 name 'CreateCursor';
function DestroyCursor; external user32 name 'DestroyCursor';
function SetSystemCursor; external user32 name 'SetSystemCursor';
function LoadIconA; external user32 name 'LoadIconA';
function LoadIconW; external user32 name 'LoadIconW';
function LoadIcon; external user32 name 'LoadIcon' + AWSuffix;
function PrivateExtractIconsA; external user32 name 'PrivateExtractIconsA';
function PrivateExtractIconsW; external user32 name 'PrivateExtractIconsW';
function PrivateExtractIcons; external user32 name 'PrivateExtractIcons' + AWSuffix;
function CreateIcon; external user32 name 'CreateIcon';
function DestroyIcon; external user32 name 'DestroyIcon';
function LookupIconIdFromDirectory; external user32 name 'LookupIconIdFromDirectory';
function LookupIconIdFromDirectoryEx; external user32 name 'LookupIconIdFromDirectoryEx';
function CreateIconFromResource; external user32 name 'CreateIconFromResource';
function CreateIconFromResourceEx; external user32 name 'CreateIconFromResourceEx';
function LoadImageA; external user32 name 'LoadImageA';
function LoadImageW; external user32 name 'LoadImageW';
function LoadImage; external user32 name 'LoadImage' + AWSuffix;
function CopyImage; external user32 name 'CopyImage';
function DrawIconEx; external user32 name 'DrawIconEx';
function CreateIconIndirect; external user32 name 'CreateIconIndirect';
function CopyIcon; external user32 name 'CopyIcon';
function GetIconInfo; external user32 name 'GetIconInfo';
function LoadStringA; external user32 name 'LoadStringA';
function LoadStringW; external user32 name 'LoadStringW';
function LoadString; external user32 name 'LoadString' + AWSuffix;
function IsDialogMessageA; external user32 name 'IsDialogMessageA';
function IsDialogMessageW; external user32 name 'IsDialogMessageW';
function IsDialogMessage; external user32 name 'IsDialogMessage' + AWSuffix;
function MapDialogRect; external user32 name 'MapDialogRect';
function DlgDirListA; external user32 name 'DlgDirListA';
function DlgDirListW; external user32 name 'DlgDirListW';
function DlgDirList; external user32 name 'DlgDirList' + AWSuffix;
function DlgDirSelectExA; external user32 name 'DlgDirSelectExA';
function DlgDirSelectExW; external user32 name 'DlgDirSelectExW';
function DlgDirSelectEx; external user32 name 'DlgDirSelectEx' + AWSuffix;
function DlgDirListComboBoxA; external user32 name 'DlgDirListComboBoxA';
function DlgDirListComboBoxW; external user32 name 'DlgDirListComboBoxW';
function DlgDirListComboBox; external user32 name 'DlgDirListComboBox' + AWSuffix;
function DlgDirSelectComboBoxExA; external user32 name 'DlgDirSelectComboBoxExA';
function DlgDirSelectComboBoxExW; external user32 name 'DlgDirSelectComboBoxExW';
function DlgDirSelectComboBoxEx; external user32 name 'DlgDirSelectComboBoxEx' + AWSuffix;
function SetScrollInfo; external user32 name 'SetScrollInfo';
function GetScrollInfo; external user32 name 'GetScrollInfo';
function DefFrameProcA; external user32 name 'DefFrameProcA';
function DefFrameProcW; external user32 name 'DefFrameProcW';
function DefFrameProc; external user32 name 'DefFrameProc' + AWSuffix;
function DefMDIChildProcA; external user32 name 'DefMDIChildProcA';
function DefMDIChildProcW; external user32 name 'DefMDIChildProcW';
function DefMDIChildProc; external user32 name 'DefMDIChildProc' + AWSuffix;
function TranslateMDISysAccel; external user32 name 'TranslateMDISysAccel';
function ArrangeIconicWindows; external user32 name 'ArrangeIconicWindows';
function CreateMDIWindowA; external user32 name 'CreateMDIWindowA';
function CreateMDIWindowW; external user32 name 'CreateMDIWindowW';
function CreateMDIWindow; external user32 name 'CreateMDIWindow' + AWSuffix;
function TileWindows; external user32 name 'TileWindows';
function CascadeWindows; external user32 name 'CascadeWindows';
function WinHelpA; external user32 name 'WinHelpA';
function WinHelpW; external user32 name 'WinHelpW';
function WinHelp; external user32 name 'WinHelp' + AWSuffix;
function GetGuiResources; external user32 name 'GetGuiResources';
function ChangeDisplaySettingsA; external user32 name 'ChangeDisplaySettingsA';
function ChangeDisplaySettingsW; external user32 name 'ChangeDisplaySettingsW';
function ChangeDisplaySettings; external user32 name 'ChangeDisplaySettings' + AWSuffix;
function ChangeDisplaySettingsExA; external user32 name 'ChangeDisplaySettingsExA';
function ChangeDisplaySettingsExW; external user32 name 'ChangeDisplaySettingsExW';
function ChangeDisplaySettingsEx; external user32 name 'ChangeDisplaySettingsEx' + AWSuffix;
function EnumDisplaySettingsA; external user32 name 'EnumDisplaySettingsA';
function EnumDisplaySettingsW; external user32 name 'EnumDisplaySettingsW';
function EnumDisplaySettings; external user32 name 'EnumDisplaySettings' + AWSuffix;
function EnumDisplaySettingsExA; external user32 name 'EnumDisplaySettingsExA';
function EnumDisplaySettingsExW; external user32 name 'EnumDisplaySettingsExW';
function EnumDisplaySettingsEx; external user32 name 'EnumDisplaySettingsEx' + AWSuffix;
function EnumDisplayDevicesA; external user32 name 'EnumDisplayDevicesA';
function EnumDisplayDevicesW; external user32 name 'EnumDisplayDevicesW';
function EnumDisplayDevices; external user32 name 'EnumDisplayDevices' + AWSuffix;
function SystemParametersInfoA; external user32 name 'SystemParametersInfoA';
function SystemParametersInfoW; external user32 name 'SystemParametersInfoW';
function SystemParametersInfo; external user32 name 'SystemParametersInfo' + AWSuffix;
procedure SetDebugErrorLevel; external user32 name 'SetDebugErrorLevel';
procedure SetLastErrorEx; external user32 name 'SetLastErrorEx';
function InternalGetWindowText; external user32 name 'InternalGetWindowText';
function EndTask; external user32 name 'EndTask';
function MonitorFromPoint; external user32 name 'MonitorFromPoint';
function MonitorFromRect; external user32 name 'MonitorFromRect';
function MonitorFromWindow; external user32 name 'MonitorFromWindow';
function GetMonitorInfoA; external user32 name 'GetMonitorInfoA';
function GetMonitorInfoW; external user32 name 'GetMonitorInfoW';
function GetMonitorInfo; external user32 name 'GetMonitorInfo' + AWSuffix;
function EnumDisplayMonitors; external user32 name 'EnumDisplayMonitors';
procedure NotifyWinEvent; external user32 name 'NotifyWinEvent';
function SetWinEventHook; external user32 name 'SetWinEventHook';
function IsWinEventHookInstalled; external user32 name 'IsWinEventHookInstalled';
function UnhookWinEvent; external user32 name 'UnhookWinEvent';
function GetGUIThreadInfo; external user32 name 'GetGUIThreadInfo';
function GetWindowModuleFileNameA; external user32 name 'GetWindowModuleFileNameA';
function GetWindowModuleFileNameW; external user32 name 'GetWindowModuleFileNameW';
function GetWindowModuleFileName; external user32 name 'GetWindowModuleFileName' + AWSuffix;
function GetCursorInfo; external user32 name 'GetCursorInfo';
function GetWindowInfo; external user32 name 'GetWindowInfo';
function GetTitleBarInfo; external user32 name 'GetTitleBarInfo';
function GetMenuBarInfo; external user32 name 'GetMenuBarInfo';
function GetScrollBarInfo; external user32 name 'GetScrollBarInfo';
function GetComboBoxInfo; external user32 name 'GetComboBoxInfo';
function GetAncestor; external user32 name 'GetAncestor';
function RealChildWindowFromPoint; external user32 name 'RealChildWindowFromPoint';
function RealGetWindowClassA; external user32 name 'RealGetWindowClassA';
function RealGetWindowClassW; external user32 name 'RealGetWindowClassW';
function RealGetWindowClass; external user32 name 'RealGetWindowClass' + AWSuffix;
function GetAltTabInfoA; external user32 name 'GetAltTabInfoA';
function GetAltTabInfoW; external user32 name 'GetAltTabInfoW';
function GetAltTabInfo; external user32 name 'GetAltTabInfo' + AWSuffix;
function GetListBoxInfo; external user32 name 'GetListBoxInfo';
function LockWorkStation; external user32 name 'LockWorkStation';
function UserHandleGrantAccess; external user32 name 'UserHandleGrantAccess';
function GetRawInputData; external user32 name 'GetRawInputData';
function GetRawInputDeviceInfoA; external user32 name 'GetRawInputDeviceInfoA';
function GetRawInputDeviceInfoW; external user32 name 'GetRawInputDeviceInfoW';
function GetRawInputDeviceInfo; external user32 name 'GetRawInputDeviceInfo' + AWSuffix;
function GetRawInputBuffer; external user32 name 'GetRawInputBuffer';
function RegisterRawInputDevices; external user32 name 'RegisterRawInputDevices';
function GetRegisteredRawInputDevices; external user32 name 'GetRegisteredRawInputDevices';
function GetRawInputDeviceList; external user32 name 'GetRawInputDeviceList';
function DefRawInputProc; external user32 name 'DefRawInputProc';

{$ENDIF DYNAMIC_LINK}

{$ENDIF JWA_INTERFACESECTION}

{$IFNDEF JWA_OMIT_SECTIONS}
end.
{$ENDIF JWA_OMIT_SECTIONS}
