| # | 
 | # Copyright 1999, 2000, 2001 Patrik Stridvall | 
 | # | 
 | # This library is free software; you can redistribute it and/or | 
 | # modify it under the terms of the GNU Lesser General Public | 
 | # License as published by the Free Software Foundation; either | 
 | # version 2.1 of the License, or (at your option) any later version. | 
 | # | 
 | # This library is distributed in the hope that it will be useful, | 
 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | 
 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | 
 | # Lesser General Public License for more details. | 
 | # | 
 | # You should have received a copy of the GNU Lesser General Public | 
 | # License along with this library; if not, write to the Free Software | 
 | # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA | 
 | # | 
 |  | 
 | package winapi_module_user; | 
 |  | 
 | use strict; | 
 |  | 
 | use vars qw($VERSION @ISA @EXPORT @EXPORT_OK); | 
 | require Exporter; | 
 |  | 
 | @ISA = qw(Exporter); | 
 | @EXPORT = qw(); | 
 | @EXPORT_OK = qw( | 
 |     is_user_function | 
 |     get_message_result_type | 
 |     get_message_result_kind | 
 |     get_message_wparam_type | 
 |     get_message_wparam_kind | 
 |     get_message_lparam_type | 
 |     get_message_lparam_kind | 
 | ); | 
 |  | 
 | use config qw($wine_dir); | 
 | use options qw($options); | 
 | use output qw($output); | 
 |  | 
 | use c_parser; | 
 |  | 
 | ######################################################################## | 
 |  | 
 | my $message; | 
 |  | 
 | ######################################################################## | 
 | # is_user_function | 
 |  | 
 | sub is_user_function($) { | 
 |     my $name = shift; | 
 |     if($name =~ /^(?:DefWindowProc|SendMessage)[AW]?$/) { | 
 |     } | 
 | } | 
 |  | 
 | ######################################################################## | 
 | # $message | 
 |  | 
 | $message = { | 
 |     WM_ACTIVATE => { | 
 | 	id => 0x0006, result => "void", wparam => ["", ""], lparam => "HWND" }, | 
 |     WM_ACTIVATEAPP => { | 
 | 	id => 0x001c, result => "void", wparam => "BOOL", lparam => "DWORD" }, | 
 |     WM_ACTIVATESHELLWINDOW => { | 
 |         id => 0x003e, result => "", wparam => "", lparam => "" }, | 
 |     WM_ACTIVATETOPLEVEL => { | 
 |         id => 0x036e, result => "", wparam => "", lparam => "" }, | 
 |     WM_ALTTABACTIVE => { | 
 |         id => 0x0029, result => "", wparam => "", lparam => "" }, | 
 |     WM_APP => { | 
 |         id => 0x8000, result => "", wparam => "", lparam => "" }, | 
 |     WM_ASKCBFORMATNAME => { | 
 |         id => 0x030c, result => "void", wparam => "int", lparam => "LPTSTR" }, | 
 |  | 
 |     WM_BEGINDRAG => { | 
 | 	id => 0x022c, result => "", wparam => "", lparam => "" }, | 
 |  | 
 |     WM_CANCELMODE => { | 
 | 	id => 0x001f, result => "void", wparam => "void", lparam => "void" }, | 
 |     WM_CANCELJOURNAL => { | 
 |         id => 0x004b, result => "", wparam => "", lparam => "" }, | 
 |     WM_CAPTURECHANGED => { | 
 |         id => 0x0215, result => "void", wparam => "void", lparam => "HWND" }, | 
 |     WM_CHANGECBCHAIN => { | 
 |         id => 0x030d, result => "void", wparam => "HWND", lparam => "HWND" }, | 
 |     WM_CHILDACTIVATE => { | 
 |         id => 0x0022, result => "void", wparam => "void", lparam => "void" }, | 
 |     WM_CLEAR => { | 
 |         id => 0x0303, result => "void", wparam => "void", lparam => "void" }, | 
 |     WM_CHAR => { | 
 | 	id => 0x0102, result => "void", wparam => "TCHAR", lparam => ["", ""] }, | 
 |     WM_CHARTOITEM => { | 
 | 	id => 0x002f, result => "int", wparam => ["UINT", "UINT"], lparam => "HWND" }, | 
 |     WM_CLOSE => { | 
 | 	id => 0x0010, result => "void", wparam => "void", lparam => "void" }, | 
 |     WM_COALESCE_FIRST => { | 
 |         id => 0x0390, result => "", wparam => "", lparam => "" }, | 
 |     WM_COALESCE_LAST => { | 
 |         id => 0x039f, result => "", wparam => "", lparam => "" }, | 
 |     WM_COMMAND => { | 
 | 	id => 0x0111, result => "void", wparam => ["UINT", "UINT"], lparam => "HWND" }, | 
 |     WM_COMMANDHELP => { | 
 |         id => 0x0365, result => "", wparam => "", lparam => "" }, | 
 |     WM_COMMNOTIFY => { | 
 |         id => 0x0044, result => "void", wparam => "int", lparam => ["", ""] }, | 
 |     WM_CONTEXTMENU => { | 
 |         id => 0x007b, result => "void", wparam => "HWND", lparam => ["UINT", "UINT"] }, | 
 |     WM_COPY => { | 
 | 	id => 0x0301, result => "void", wparam => "void", lparam => "void" }, | 
 |     WM_COPYDATA => { | 
 |         id => 0x004a, result => "", wparam => "", lparam => "" }, | 
 |     WM_COMPACTING => { | 
 | 	id => 0x0041, result => "void", wparam => "UINT", lparam => "void" }, | 
 |     WM_COMPAREITEM => { | 
 | 	id => 0x0039, result => "int", wparam => "UINT", lparam => "const COMPAREITEMSTRUCT *" }, | 
 |     WM_CREATE => { | 
 | 	id => 0x0001, result => "BOOL", wparam => "void", lparam => "LPCREATESTRUCT" }, | 
 |     WM_CTLCOLOR => { | 
 |         id => 0x0019, result => "", wparam => "", lparam => "" }, | 
 |     WM_CTLCOLORBTN => { | 
 | 	id => 0x0135, result => "HBRUSH", wparam => "HDC", lparam => "HWND" }, | 
 |     WM_CTLCOLORDLG => { | 
 | 	id => 0x136, result => "HBRUSH", wparam => "HDC", lparam => "HWND" }, | 
 |     WM_CTLCOLOREDIT => { | 
 | 	id => 0x133, result => "HBRUSH", wparam => "HDC", lparam => "HWND" }, | 
 |     WM_CTLCOLORLISTBOX => { | 
 | 	id => 0x134, result => "HBRUSH", wparam => "HDC", lparam => "HWND" }, | 
 |     WM_CTLCOLORMSGBOX => { | 
 | 	id => 0x132, result => "HBRUSH", wparam => "HDC", lparam => "HWND" }, | 
 |     WM_CTLCOLORSCROLLBAR => { | 
 | 	id => 0x137, result => "HBRUSH", wparam => "HDC", lparam => "HWND" }, | 
 |     WM_CTLCOLORSTATIC => { | 
 | 	id => 0x138, result => "HBRUSH", wparam => "HDC", lparam => "HWND" }, | 
 |     WM_CUT => { | 
 | 	id => 0x0300, result => "void", wparam => "void", lparam => "void" }, | 
 |  | 
 |     WM_DDE_ACK => { # FIXME: Only correct if replying to WM_DDE_INITIATE | 
 | 	id => 0x03E4, result => "void", wparam => "HWND", lparam => ["ATOM", "ATOM"] }, | 
 |     WM_DDE_INITIATE => { | 
 | 	id => 0x03E0, result => "void", wparam => "HWND", lparam => ["ATOM", "ATOM"] }, | 
 |     WM_DEADCHAR => { | 
 | 	id => 0x0103, result => "void", wparam => "TCHAR", lparam => ["", ""] }, | 
 |     WM_DEVICECHANGE => { | 
 |         id => 0x0219, result => "BOOL", wparam => "UINT", lparam => "DWORD" }, | 
 |     WM_DELETEITEM => { | 
 | 	id => 0x002d, result => "void", wparam => "UINT", lparam => "const DELETEITEMSTRUCT *" }, | 
 |     WM_DEVMODECHANGE => { | 
 | 	id => 0x001b, result => "void", wparam => "void", lparam => "LPCTSTR" }, | 
 |     WM_DESTROY => { | 
 | 	id => 0x0002, result => "void", wparam => "void", lparam => "void" }, | 
 |     WM_DESTROYCLIPBOARD => { | 
 |         id => 0x0307, result => "void", wparam => "void", lparam => "void" }, | 
 |     WM_DISABLEMODAL => { | 
 |         id => 0x036c, result => "", wparam => "", lparam => "" }, | 
 |     WM_DISPLAYCHANGE => { | 
 |         id => 0x007e, result => "void", wparam => "UINT", lparam => ["UINT", "UINT"] }, | 
 |     WM_DRAGLOOP => { | 
 |         id => 0x022d, result => "", wparam => "", lparam => "" }, | 
 |     WM_DRAGMOVE => { | 
 |         id => 0x022f, result => "", wparam => "", lparam => "" }, | 
 |     WM_DRAGSELECT => { | 
 |         id => 0x022e, result => "", wparam => "", lparam => "" }, | 
 |     WM_DRAWCLIPBOARD => { | 
 |         id => 0x0308, result => "void", wparam => "void", lparam => "void" }, | 
 |     WM_DRAWITEM => { | 
 | 	id => 0x002b, result => "void", wparam => "UINT", lparam => "const DRAWITEMSTRUCT *" }, | 
 |     WM_DROPFILES => { | 
 | 	id => 0x0233, result => "void", wparam => "HDROP", lparam => "void" }, | 
 |     WM_DROPOBJECT => { | 
 |         id => 0x022a, result => "", wparam => "", lparam => "" }, | 
 |  | 
 |     WM_ENABLE => { | 
 | 	id => 0x000a, result => "void", wparam => "BOOL", lparam => "void" }, | 
 |     WM_ENDSESSION => { | 
 | 	id => 0x0016, result => "void", wparam => "BOOL", lparam => "void" }, | 
 |     WM_ENTERIDLE => { | 
 | 	id => 0x0121, result => "void", wparam => "UINT", lparam => "HWND" }, | 
 |     WM_ENTERSIZEMOVE => { | 
 |         id => 0x0231, result => "", wparam => "", lparam => "" }, | 
 |     WM_ENTERMENULOOP => { | 
 | 	id => 0x0211, result => "", wparam => "", lparam => "" }, | 
 |     WM_ERASEBKGND => { | 
 | 	id => 0x0014, result => "BOOL", wparam => "HDC", lparam => "void" }, | 
 |     WM_EXITHELPMODE => { | 
 |         id => 0x0367, result => "", wparam => "", lparam => "" }, | 
 |     WM_EXITMENULOOP => { | 
 | 	id => 0x0212, result => "", wparam => "", lparam => "" }, | 
 |     WM_EXITSIZEMOVE => { | 
 |         id => 0x0232, result => "", wparam => "", lparam => "" }, | 
 |  | 
 |     WM_FILESYSCHANGE => { | 
 |         id => 0x0034, result => "", wparam => "", lparam => "" }, | 
 |     WM_FLOATSTATUS => { | 
 |         id => 0x036d, result => "", wparam => "", lparam => "" }, | 
 |     WM_FONTCHANGE => { | 
 | 	id => 0x001d, result => "void", wparam => "void", lparam => "void" }, | 
 |  | 
 |     WM_GETDLGCODE => { | 
 |         id => 0x0087, result => "UINT", wparam => "WPARAM", lparam => "LPMSG" }, | 
 |     WM_GETFONT => { | 
 |         id => 0x0031, result => "HFONT", wparam => "void", lparam => "void" }, | 
 |     WM_GETHOTKEY => { | 
 |         id => 0x0033, result => "", wparam => "", lparam => "" }, | 
 |     WM_GETICON => { | 
 |         id => 0x007f, result => "", wparam => "", lparam => "" }, | 
 |     WM_GETMINMAXINFO => { | 
 |         id => 0x0024, result => "void", wparam => "void", lparam => "LPMINMAXINFO" }, | 
 |     WM_GETTEXT => { | 
 | 	id => 0x000d, result => "int", wparam => "int", lparam => "LPTSTR" }, | 
 |     WM_GETTEXTLENGTH => { | 
 | 	id => 0x000e, result => "int", wparam => "void", lparam => "void" }, | 
 |  | 
 |     WM_HELP => { | 
 | 	id => 0x0053, result => "void", wparam => "void", lparam => "LPHELPINFO" }, | 
 |     WM_HELPHITTEST => { | 
 |         id => 0x0366, result => "", wparam => "", lparam => "" }, | 
 |     WM_HOTKEY => { | 
 |         id => 0x0312, result => "", wparam => "", lparam => "" }, | 
 |     WM_HSCROLL => { | 
 | 	id => 0x0114, result => "void", wparam => ["int", "int"], lparam => "HWND" }, | 
 |     WM_HSCROLLCLIPBOARD => { | 
 |         id => 0x030e, result => "void", wparam => "HWND", lparam => "" }, | 
 |  | 
 |     WM_ICONERASEBKGND => { | 
 | 	id => 0x0027, result => "BOOL", wparam => "HDC", lparam => "void" }, | 
 |     WM_IME_CHAR => { | 
 |         id => 0x0286, result => "", wparam => "", lparam => "" }, | 
 |     WM_IME_COMPOSITION => { | 
 |         id => 0x010f, result => "", wparam => "", lparam => "" }, | 
 |     WM_IME_COMPOSITIONFULL => { | 
 |         id => 0x0284, result => "", wparam => "", lparam => "" }, | 
 |     WM_IME_CONTROL => { | 
 |         id => 0x0283, result => "", wparam => "", lparam => "" }, | 
 |     WM_IME_ENDCOMPOSITION => { | 
 |         id => 0x010e, result => "", wparam => "", lparam => "" }, | 
 |     WM_IME_KEYDOWN => { | 
 | 	id => 0x0290, result => "void", wparam => "UINT", lparam => ["int", "UINT"] }, | 
 |     WM_IME_KEYLAST => { | 
 |         id => 0x010f, result => "", wparam => "", lparam => "" }, | 
 |     WM_IME_KEYUP => { | 
 | 	id => 0x0291, result => "void", wparam => "UINT", lparam => ["int", "UINT"] }, | 
 |     WM_IME_NOTIFY => { | 
 |         id => 0x0282, result => "", wparam => "", lparam => "" }, | 
 |     WM_IME_REQUEST => { | 
 |         id => 0x0288, result => "", wparam => "", lparam => "" }, | 
 |     WM_IME_SELECT => { | 
 |         id => 0x0285, result => "", wparam => "", lparam => "" }, | 
 |     WM_IME_SETCONTEXT => { | 
 |         id => 0x0281, result => "", wparam => "", lparam => "" }, | 
 |     WM_IME_STARTCOMPOSITION => { | 
 |         id => 0x010d, result => "", wparam => "", lparam => "" }, | 
 |     WM_IDLEUPDATECMDUI => { | 
 |         id => 0x0363, result => "", wparam => "", lparam => "" }, | 
 |     WM_INITDIALOG => { | 
 |         id => 0x0110, result => "BOOL", wparam => "HWND", lparam => "LPARAM" }, | 
 |     WM_INITIALUPDATE => { | 
 |         id => 0x0364, result => "", wparam => "", lparam => "" }, | 
 |     WM_INITMENU => { | 
 | 	id => 0x0116, result => "void", wparam => "HMENU", lparam => "void" }, | 
 |     WM_INITMENUPOPUP => { | 
 | 	id => 0x0117, result => "void", wparam => "HMENU", lparam => ["UINT", "BOOL"] }, | 
 |     WM_INPUTLANGCHANGE => { | 
 |         id => 0x0051, result => "", wparam => "", lparam => "" }, | 
 |     WM_INPUTLANGCHANGEREQUEST => { | 
 |         id => 0x0050, result => "", wparam => "", lparam => "" }, | 
 |     WM_ISACTIVEICON => { | 
 | 	id => 0x0035, result => "", wparam => "", lparam => "" }, | 
 |  | 
 |     WM_KEYDOWN => { | 
 | 	id => 0x0100, result => "void", wparam => "UINT", lparam => ["int", "UINT"] }, | 
 |     WM_KEYLAST => { | 
 | 	id => 0x0108, result => "", wparam => "", lparam => "" }, | 
 |     WM_KICKIDLE => { | 
 | 	id => 0x036a, result => "", wparam => "", lparam => "" }, | 
 |     WM_KEYUP => { | 
 | 	id => 0x0101, result => "void", wparam => "UINT", lparam => ["", ""] }, | 
 |     WM_KILLFOCUS => { | 
 | 	id => 0x0008, result => "void", wparam => "HWND", lparam => "void" }, | 
 |  | 
 |     WM_LBTRACKPOINT => { | 
 | 	id => 0x0131, result => "", wparam => "", lparam => "" }, | 
 |     WM_LBUTTONDBLCLK => { | 
 | 	id => 0x0203, result => "void", wparam => "UINT", lparam => ["", ""] }, | 
 |     WM_LBUTTONDOWN => { | 
 | 	id => 0x0201, result => "void", wparam => "UINT", lparam => ["", ""] }, | 
 |     WM_LBUTTONUP => { | 
 | 	id => 0x0202, result => "void", wparam => "UINT", lparam => ["", ""] }, | 
 |  | 
 |     WM_MBUTTONDBLCLK => { | 
 | 	id => 0x0209, result => "void", wparam => "UINT", lparam => ["", ""] }, | 
 |     WM_MBUTTONDOWN => { | 
 | 	id => 0x0207, result => "void", wparam => "UINT", lparam => ["", ""] }, | 
 |     WM_MBUTTONUP => { | 
 | 	id => 0x0208, result => "void", wparam => "UINT", lparam => ["", ""] }, | 
 |     WM_MDIACTIVATE => { | 
 | 	id => 0x0222, result => "void", wparam => "HWND", lparam => "HWND" }, | 
 |     WM_MDICASCADE => { | 
 | 	id => 0x0227, result => "BOOL", wparam => "UINT", lparam => "void" }, | 
 |     WM_MDICREATE => { | 
 | 	id => 0x0220, result => "HWND", wparam => "void", lparam => "const LPMDICREATESTRUCT" }, | 
 |     WM_MDIDESTROY => { | 
 | 	id => 0x0221, result => "void", wparam => "HWND", lparam => "void" }, | 
 |     WM_MDIGETACTIVE => { | 
 | 	id => 0x0229, result => "HWND", wparam => "void", lparam => "void" }, | 
 |     WM_MDIICONARRANGE => { | 
 | 	id => 0x0228, result => "void", wparam => "void", lparam => "void" }, | 
 |     WM_MDIMAXIMIZE => { | 
 | 	id => 0x0225, result => "void", wparam => "HWND", lparam => "void" }, | 
 |     WM_MDINEXT => { | 
 | 	id => 0x0224, result => "HWND", wparam => "HWND", lparam => "BOOL" }, | 
 |     WM_MDIREFRESHMENU => { | 
 | 	id => 0x0234, result => "", wparam => "", lparam => "" }, | 
 |     WM_MDIRESTORE => { | 
 | 	id => 0x0223, result => "void", wparam => "HWND", lparam => "void" }, | 
 |     WM_MDISETMENU => { | 
 | 	id => 0x0230, result => "HMENU", wparam => "BOOL", lparam => "HMENU" }, | 
 |     WM_MDITILE => { | 
 | 	id => 0x0226, result => "BOOL", wparam => "UINT", lparam => "void" }, | 
 |     WM_MEASUREITEM => { | 
 | 	id => 0x002c, result => "void", wparam => "UINT", lparam => "MEASUREITEMSTRUCT *" }, | 
 |     WM_MENUSELECT => { | 
 | 	id => 0x011f, result => "void", wparam => ["", ""], lparam => "HMENU" }, | 
 |     WM_MENUCHAR => { | 
 | 	id => 0x0120, result => "DWORD", wparam => ["", "WORD"], lparam => "HMENU" }, | 
 |     WM_MOUSEACTIVATE => { | 
 | 	id => 0x0021, result => "int", wparam => "HWND", lparam => ["", ""] }, | 
 |     WM_MOUSEMOVE => { | 
 | 	id => 0x0200, result => "void", wparam => "UINT", lparam => ["", ""] }, | 
 |     WM_MOUSEWHEEL => { | 
 | 	id => 0x020a, result => "void", wparam => ["DWORD", "int"], lparam => ["UINT", "UINT"] }, | 
 |     WM_MOVE => { | 
 | 	id => 0x0003, result => "void", wparam => "void", lparam => ["", ""] }, | 
 |     WM_MOVING => { | 
 | 	id => 0x0216, result => "", wparam => "", lparam => "" }, | 
 |  | 
 |     WM_NCACTIVATE => { | 
 | 	id => 0x0086, result => "BOOL", wparam => "BOOL", lparam => "void" }, | 
 |     WM_NCLBUTTONDBLCLK => { | 
 | 	id => 0x00a3, result => "void", wparam => "UINT", lparam => ["", ""] }, | 
 |     WM_NCLBUTTONDOWN => { | 
 | 	id => 0x00a1, result => "void", wparam => "UINT", lparam => ["", ""] }, | 
 |     WM_NCLBUTTONUP => { | 
 | 	id => 0x00a2, result => "void", wparam => "UINT", lparam => ["", ""] }, | 
 |     WM_NCMOUSEMOVE => { | 
 | 	id => 0x00a0, result => "void", wparam => "UINT", lparam => ["", ""] }, | 
 |     WM_NCMBUTTONDBLCLK => { | 
 | 	id => 0x00a9, result => "void", wparam => "UINT", lparam => ["", ""] }, | 
 |     WM_NCMBUTTONDOWN => { | 
 | 	id => 0x00a7, result => "void", wparam => "UINT", lparam => ["", ""] }, | 
 |     WM_NCMBUTTONUP => { | 
 | 	id => 0x00a8, result => "void", wparam => "UINT", lparam => ["", ""] }, | 
 |     WM_NCRBUTTONDBLCLK => { | 
 | 	id => 0x00a6, result => "void", wparam => "UINT", lparam => ["", ""] }, | 
 |     WM_NCRBUTTONDOWN => { | 
 | 	id => 0x00a4, result => "void", wparam => "UINT", lparam => ["", ""] }, | 
 |     WM_NCRBUTTONUP => { | 
 | 	id => 0x00a5, result => "void", wparam => "UINT", lparam => ["", ""] }, | 
 |     WM_NCCALCSIZE => { | 
 | 	id => 0x0083, result => "UINT", wparam => "void", lparam => "NCCALCSIZE_PARAMS *" }, | 
 |     WM_NCCREATE => { | 
 | 	id => 0x0081, result => "BOOL", wparam => "void", lparam => "LPCREATESTRUCT" }, | 
 |     WM_NCDESTROY => { | 
 | 	id => 0x0082, result => "void", wparam => "void", lparam => "void" }, | 
 |     WM_NCHITTEST => { | 
 | 	id => 0x0084, result => "UINT", wparam => "void", lparam => ["int", "int"] }, | 
 |     WM_NCPAINT => { | 
 | 	id => 0x0085, result => "void", wparam => "HRGN", lparam => "void" }, | 
 |     WM_NEXTDLGCTL => { | 
 | 	id => 0x0028, result => "HWND", wparam => "HWND", lparam => "BOOL" }, | 
 |     WM_NEXTMENU => { | 
 | 	id => 0x0213, result => "void", wparam => "UINT", lparam => "LPMDINEXTMENU" }, | 
 |     WM_NOTIFY => { | 
 | 	id => 0x004e, result => "LRESULT", wparam => "int", lparam => "NMHDR *" }, | 
 |     WM_NOTIFYFORMAT => { | 
 | 	id => 0x0055, result => "", wparam => "", lparam => "" }, | 
 |     WM_NULL => { | 
 | 	id => 0x0000, result => "", wparam => "", lparam => "" }, | 
 |  | 
 |     WM_OCC_INITNEW => { | 
 | 	id => 0x0378, result => "", wparam => "", lparam => "" }, | 
 |     WM_OCC_LOADFROMSTORAGE => { | 
 | 	id => 0x0377, result => "", wparam => "", lparam => "" }, | 
 |     WM_OCC_LOADFROMSTORAGE_EX => { | 
 | 	id => 0x037b, result => "", wparam => "", lparam => "" }, | 
 |     WM_OCC_LOADFROMSTREAM => { | 
 | 	id => 0x0376, result => "", wparam => "", lparam => "" }, | 
 |     WM_OCC_LOADFROMSTREAM_EX => { | 
 | 	id => 0x037a, result => "", wparam => "", lparam => "" }, | 
 |     WM_OTHERWINDOWCREATED => { | 
 | 	id => 0x003c, result => "", wparam => "", lparam => "" }, | 
 |     WM_OTHERWINDOWDESTROYED => { | 
 | 	id => 0x003d, result => "", wparam => "", lparam => "" }, | 
 |  | 
 |     WM_PAINT => { | 
 | 	id => 0x000f, result => "void", wparam => "void", lparam => "void" }, | 
 |     WM_PAINTCLIPBOARD => { | 
 | 	id => 0x0309, result => "void", wparam => "HWND", lparam => "const LPPAINTSTRUCT" }, | 
 |     WM_PAINTICON => { | 
 | 	id => 0x0026, result => "", wparam => "", lparam => "" }, | 
 |     WM_PALETTEISCHANGING => { | 
 | 	id => 0x0310, result => "void", wparam => "HWND", lparam => "void" }, | 
 |     WM_PALETTECHANGED => { | 
 | 	id => 0x0311, result => "void", wparam => "HWND", lparam => "void" }, | 
 |     WM_PARENTNOTIFY => { | 
 | 	id => 0x0210, result => "void", wparam => ["UINT", "int"], lparam => "HWND" }, | 
 |     WM_PASTE => { | 
 | 	id => 0x0302, result => "void", wparam => "void", lparam => "void" }, | 
 |     WM_PENWINFIRST => { | 
 | 	id => 0x0380, result => "", wparam => "", lparam => "" }, | 
 |     WM_PENWINLAST => { | 
 | 	id => 0x038f, result => "", wparam => "", lparam => "" }, | 
 |     WM_POPMESSAGESTRING => { | 
 | 	id => 0x0375, result => "", wparam => "", lparam => "" }, | 
 |     WM_POWER => { | 
 | 	id => 0x0048, result => "void", wparam => "int", lparam => "void" }, | 
 |     WM_POWERBROADCAST => { | 
 | 	id => 0x0218, result => "", wparam => "", lparam => "" }, | 
 |     WM_PRINT => { | 
 | 	id => 0x0317, result => "", wparam => "", lparam => "" }, | 
 |     WM_PRINTCLIENT => { | 
 | 	id => 0x0318, result => "void", wparam => "HDC", lparam => "DWORD" }, | 
 |  | 
 |     WM_QUERY3DCONTROLS => { | 
 | 	id => 0x036f, result => "", wparam => "", lparam => "" }, | 
 |     WM_QUERYAFXWNDPROC => { | 
 | 	id => 0x0360, result => "", wparam => "", lparam => "" }, | 
 |     WM_QUERYCENTERWND => { | 
 | 	id => 0x036b, result => "", wparam => "", lparam => "" }, | 
 |     WM_QUERYDRAGICON => { | 
 | 	id => 0x0037, result => "HICON", wparam => "void", lparam => "void" }, | 
 |     WM_QUERYDROPOBJECT => { | 
 | 	id => 0x022b, result => "", wparam => "", lparam => "" }, | 
 |     WM_QUERYENDSESSION => { | 
 | 	id => 0x0011, result => "BOOL", wparam => "void", lparam => "void" }, | 
 |     WM_QUERYNEWPALETTE => { | 
 | 	id => 0x030f, result => "BOOL", wparam => "void", lparam => "void" }, | 
 |     WM_QUERYOPEN => { | 
 | 	id => 0x0013, result => "BOOL", wparam => "void", lparam => "void" }, | 
 |     WM_QUERYPARKICON => { | 
 | 	id => 0x0036, result => "", wparam => "", lparam => "" }, | 
 |     WM_QUERYSAVESTATE => { | 
 | 	id => 0x0038, result => "", wparam => "", lparam => "" }, | 
 |     WM_QUEUESYNC => { | 
 | 	id => 0x0023, result => "void", wparam => "void", lparam => "void" }, | 
 |     WM_QUEUE_SENTINEL => { | 
 | 	id => 0x0379, result => "", wparam => "", lparam => "" }, | 
 |     WM_QUIT => { | 
 | 	id => 0x0012, result => "void", wparam => "int", lparam => "void" }, | 
 |  | 
 |     WM_RBUTTONDBLCLK => { | 
 | 	id => 0x0206, result => "void", wparam => "UINT", lparam => ["", ""] }, | 
 |     WM_RBUTTONDOWN => { | 
 | 	id => 0x0204, result => "void", wparam => "UINT", lparam => ["", ""] }, | 
 |     WM_RBUTTONUP => { | 
 | 	id => 0x0205, result => "void", wparam => "UINT", lparam => ["", ""] }, | 
 |     WM_RECALCPARENT => { | 
 | 	id => 0x0368, result => "", wparam => "", lparam => "" }, | 
 |     WM_RENDERALLFORMATS => { | 
 | 	id => 0x0306, result => "void", wparam => "void", lparam => "void" }, | 
 |     WM_RENDERFORMAT => { | 
 | 	id => 0x0305, result => "HANDLE", wparam => "UINT", lparam => "void" }, | 
 |  | 
 |     WM_SETCURSOR => { | 
 | 	id => 0x0020, result => "BOOL", wparam => "HWND", lparam => ["UINT", "UINT"] }, | 
 |     WM_SETFOCUS => { | 
 | 	id => 0x0007, result => "void", wparam => "HWND", lparam => "void" }, | 
 |     WM_SETFONT => { | 
 | 	id => 0x0030, result => "void", wparam => "HFONT", lparam => "BOOL" }, | 
 |     WM_SETHOTKEY => { | 
 | 	id => 0x0032, result => "", wparam => "", lparam => "" }, | 
 |     WM_SETICON => { | 
 | 	id => 0x0080, result => "HICON", wparam => "DWORD", lparam => "HICON" }, | 
 |     WM_SETMESSAGESTRING => { | 
 | 	id => 0x0362, result => "", wparam => "", lparam => "" }, | 
 |     WM_SETREDRAW => { | 
 | 	id => 0x000b, result => "void", wparam => "BOOL", lparam => "void" }, | 
 |     WM_SETTEXT => { | 
 | 	id => 0x000c, result => "void", wparam => "void", lparam => "LPCTSTR" }, | 
 |     WM_SETVISIBLE => { | 
 | 	id => 0x0009, result => "", wparam => "", lparam => "" }, | 
 |     WM_SHOWWINDOW => { | 
 | 	id => 0x0018, result => "void", wparam => "BOOL", lparam => "UINT" }, | 
 |     WM_SIZE => { | 
 | 	id => 0x0005, result => "void", wparam => "UINT", lparam => ["", ""] }, | 
 |     WM_SIZECHILD => { | 
 | 	id => 0x0369, result => "", wparam => "", lparam => "" }, | 
 |     WM_SIZECLIPBOARD => { | 
 | 	id => 0x030b, result => "void", wparam => "HWND", lparam => "const LPRECT" }, | 
 |     WM_SIZEPARENT => { | 
 | 	id => 0x0361, result => "", wparam => "", lparam => "" }, | 
 |     WM_SIZEWAIT => { | 
 | 	id => 0x0004, result => "", wparam => "", lparam => "" }, | 
 |     WM_SIZING => { | 
 | 	id => 0x0214, result => "", wparam => "", lparam => "" }, | 
 |     WM_SOCKET_DEAD => { | 
 | 	id => 0x0374, result => "", wparam => "", lparam => "" }, | 
 |     WM_SOCKET_NOTIFY => { | 
 | 	id => 0x0373, result => "", wparam => "", lparam => "" }, | 
 |     WM_SPOOLERSTATUS => { | 
 | 	id => 0x002a, result => "void", wparam => "UINT", lparam => ["", ""] }, | 
 |     WM_STYLECHANGED => { | 
 | 	id => 0x007d, result => "void", wparam => "DWORD", lparam => "LPSTYLESTRUCT" }, | 
 |     WM_STYLECHANGING => { | 
 | 	id => 0x007c, result => "void", wparam => "DWORD", lparam => "LPSTYLESTRUCT" }, | 
 |     WM_SYNCPAINT => { | 
 | 	id => 0x0088, result => "", wparam => "", lparam => "" }, | 
 |     WM_SYNCTASK => { | 
 | 	id => 0x0089, result => "", wparam => "", lparam => "" }, | 
 |     WM_SYSCHAR => { | 
 | 	id => 0x0106, result => "void", wparam => "TCHAR", lparam => ["", ""] }, | 
 |     WM_SYSCOLORCHANGE => { | 
 | 	id => 0x0015, result => "void", wparam => "void", lparam => "void" }, | 
 |     WM_SYSCOMMAND => { | 
 | 	id => 0x0112, result => "void", wparam => "UINT", lparam => "int" }, | 
 |     WM_SYSDEADCHAR => { | 
 | 	id => 0x0107, result => "void", wparam => "TCHAR", lparam => ["", ""] }, | 
 |     WM_SYSKEYDOWN => { | 
 | 	id => 0x0104, result => "void", wparam => "UINT", lparam => ["", ""] }, | 
 |     WM_SYSKEYUP => { | 
 | 	id => 0x0105, result => "void", wparam => "UINT", lparam => ["", ""] }, | 
 |     WM_SYSTEMERROR => { | 
 | 	id => 0x0017, result => "", wparam => "", lparam => "" }, | 
 |     WM_SYSTIMER => { | 
 | 	id => 0x0118, result => "", wparam => "", lparam => "" }, | 
 |  | 
 |     WM_TCARD => { | 
 | 	id => 0x0052, result => "", wparam => "", lparam => "" }, | 
 |     WM_TESTING => { | 
 | 	id => 0x003a, result => "", wparam => "", lparam => "" }, | 
 |     WM_TIMECHANGE => { | 
 | 	id => 0x001e, result => "void", wparam => "void", lparam => "void" }, | 
 |     WM_TIMER => { | 
 | 	id => 0x0113, result => "void", wparam => "UINT", lparam => "void" }, | 
 |  | 
 |     WM_UNDO => { | 
 | 	id => 0x0304, result => "void", wparam => "void", lparam => "void" }, | 
 |     WM_USER => { | 
 | 	id => 0x0400, result => "", wparam => "", lparam => "" }, | 
 |     WM_USERCHANGED => { | 
 | 	id => 0x0054, result => "", wparam => "", lparam => "" }, | 
 |  | 
 |     WM_VKEYTOITEM => { | 
 | 	id => 0x002e, result => "int", wparam => ["UINT", "int"], lparam => "HWND" }, | 
 |     WM_VSCROLL => { | 
 | 	id => 0x0115, result => "void", wparam => ["int", "int"], lparam => "HWND" }, | 
 |     WM_VSCROLLCLIPBOARD => { | 
 | 	id => 0x030a, result => "void", wparam => "HWND", lparam => ["", ""] }, | 
 |  | 
 |     WM_WINDOWPOSCHANGING => { | 
 | 	id => 0x0046, result => "BOOL", wparam => "void", lparam => "LPWINDOWPOS" }, | 
 |     WM_WINDOWPOSCHANGED => { | 
 | 	id => 0x0047, result => "void", wparam => "void", lparam => "const LPWINDOWPOS" }, | 
 |     WM_WININICHANGE => { | 
 | 	id => 0x001a, result => "void", wparam => "void", lparam => "LPCTSTR" } | 
 | }; | 
 |  | 
 | ######################################################################## | 
 | # _get_kind | 
 |  | 
 | sub _get_kind($) { | 
 |     local $_ = shift; | 
 |  | 
 |     if(!$_) { | 
 | 	return undef; | 
 |     } elsif(/^(?:HBRUSH|HDC|HFONT|HMENU|HRGN|HWND)$/ || /\*$/ || | 
 | 	    /^LP(?!ARAM)/) | 
 |     { | 
 | 	return "ptr"; | 
 |     } else { | 
 | 	return "long"; | 
 |     } | 
 | } | 
 |  | 
 | ######################################################################## | 
 | # get_message_result_type | 
 |  | 
 | sub get_message_result_type($) { | 
 |     my $name = shift; | 
 |     return $$message{$name}{result}; | 
 | } | 
 |  | 
 | ######################################################################## | 
 | # get_message_result_kind | 
 |  | 
 | sub get_message_result_kind(@) { | 
 |     return _get_kind(get_message_result_type(@_)); | 
 | } | 
 |  | 
 | ######################################################################## | 
 | # get_message_wparam_type | 
 |  | 
 | sub get_message_wparam_type($) { | 
 |     my $name = shift; | 
 |     return $$message{$name}{wparam}; | 
 | } | 
 |  | 
 | ######################################################################## | 
 | # get_message_wparam_kind | 
 |  | 
 | sub get_message_wparam_kind(@) { | 
 |     return _get_kind(get_message_wparam_type(@_)); | 
 | } | 
 |  | 
 | ######################################################################## | 
 | # get_message_lparam_type | 
 |  | 
 | sub get_message_lparam_type($) { | 
 |     my $name = shift; | 
 |     return $$message{$name}{lparam}; | 
 | } | 
 |  | 
 | ######################################################################## | 
 | # get_message_lparam_kind | 
 |  | 
 | sub get_message_lparam_kind(@) { | 
 |     return _get_kind(get_message_lparam_type(@_)); | 
 | } | 
 |  | 
 | ######################################################################## | 
 | # _parse_file | 
 |  | 
 | sub _parse_file($$$) { | 
 |     my $file = shift; | 
 |     my $found_preprocessor = shift; | 
 |     my $found_comment = shift; | 
 |  | 
 |     { | 
 | 	open(IN, "< $file") || die "Error: Can't open $file: $!\n"; | 
 | 	local $/ = undef; | 
 | 	$_ = <IN>; | 
 | 	close(IN); | 
 |     } | 
 |  | 
 |     my @lines = split(/\n/, $_); | 
 |     my $max_line = scalar(@lines); | 
 |  | 
 |     my $parser = new c_parser($file); | 
 |  | 
 |     $parser->set_found_preprocessor_callback($found_preprocessor); | 
 |     $parser->set_found_comment_callback($found_comment); | 
 |  | 
 |     my $found_line = sub { | 
 | 	my $line = shift; | 
 | 	local $_ = shift; | 
 |  | 
 | 	$output->progress("$file: line $line of $max_line"); | 
 |     }; | 
 |  | 
 |     $parser->set_found_line_callback($found_line); | 
 |  | 
 |     my $line = 1; | 
 |     my $column = 0; | 
 |  | 
 |     my $old_prefix = $output->prefix; | 
 |     $output->progress("$file"); | 
 |     $output->prefix("$file: "); | 
 |  | 
 |     if(!$parser->parse_c_file(\$_, \$line, \$column)) { | 
 | 	$output->write("can't parse file\n"); | 
 |     } | 
 |  | 
 |     $output->prefix($old_prefix); | 
 | } | 
 |  | 
 | ######################################################################## | 
 | # _get_tuple_arguments | 
 |  | 
 | sub _get_tuple_arguments($) { | 
 |     local $_ = shift; | 
 |  | 
 |     my $parser = new c_parser; | 
 |  | 
 |     my $line = 1; | 
 |     my $column = 0; | 
 |  | 
 |     my @arguments; | 
 |     my @argument_lines; | 
 |     my @argument_columns; | 
 |     if(!$parser->parse_c_tuple(\$_, \$line, \$column, \@arguments, \@argument_lines, \@argument_columns)) { | 
 | 	return undef; | 
 |     } | 
 |  | 
 |     return @arguments; | 
 | } | 
 |  | 
 | ######################################################################## | 
 | # _parse_windowsx_h | 
 |  | 
 |  | 
 | sub _parse_windowsx_h($$$) { | 
 |     my $last_comment; | 
 |  | 
 |     my $found_preprocessor = sub { | 
 | 	my $begin_line = shift; | 
 | 	my $begin_column = shift; | 
 | 	local $_ = shift; | 
 |  | 
 | 	if(!s/^\#\s*define\s*// || !/^FORWARD_WM_/) { | 
 | 	    return 1; | 
 | 	} | 
 |  | 
 | 	my $name; | 
 | 	if(s/^FORWARD_(\w+)\([^\)]*\)\s*(.*?)\s*$/$2/s) { | 
 | 	    $name = $1; | 
 | 	} | 
 |  | 
 | 	if($name eq "WM_SYSTEMERROR") { | 
 | 	    return 1; | 
 | 	} | 
 |  | 
 | 	my $result; | 
 | 	if(s/^\(\s*(\w+)\s*\)(?:\(\s*\w+\s*\))*\(\s*\w+\s*\)//) { | 
 | 	    $result = $1; | 
 | 	} else { | 
 | 	    die "$name: '$_'"; | 
 | 	} | 
 |  | 
 | 	(undef, $_, my $wparam, my $lparam) = _get_tuple_arguments($_); | 
 |  | 
 | 	my @names = (); | 
 | 	if(/^$name$/) { | 
 | 	    @names = $name; | 
 | 	} elsif(/^\(\w+\)\s*\?\s*(\w+)\s*:\s*(\w+)$/) { | 
 | 	    @names = ($1, $2); | 
 | 	} else { | 
 | 	    die "$name: '$_'"; | 
 | 	} | 
 |  | 
 | 	local $_ = $last_comment; | 
 | 	s%^/\*\s*(.*?)\s*\*/$%$1%; | 
 |  | 
 | 	my %arguments; | 
 | 	if(s/^(\w+)\s+\w+\s*\(\s*(.*?)\s*\)$/$2/) { | 
 | 	    my $result2 = $1; | 
 | 	    if($result2 eq "INT") { $result2 = "int"; } | 
 | 	    if($result ne $result2) { | 
 | 		$output->write("message $name: result type mismatch '$result' != '$result2'\n"); | 
 | 	    } | 
 | 	    foreach (split(/\s*,\s*/)) { | 
 | 		if(/^((?:const\s+|volatile\s+)?\w+(?:\s*\*\s*|\s+)?)(\w+)$/) { | 
 | 		    my $type = $1; | 
 | 		    my $name = $2; | 
 |  | 
 | 		    $type =~ s/^\s*(.*?)\s*$/$1/; | 
 |  | 
 | 		    $arguments{$name} = $type; | 
 | 		} else { | 
 | 		    die "$name: '$_'"; | 
 | 		} | 
 | 	    } | 
 | 	    # $output->write("$1: $_\n"); | 
 | 	} else { | 
 | 	    die "$name: '$_'"; | 
 | 	} | 
 |  | 
 | 	my $find_inner_cast = sub { | 
 | 	    local $_ = shift; | 
 | 	    if(/^(?:\(\s*((?:const\s+|volatile\s+)?\w+(?:\s*\*)?)\s*\))*\(.*?\)$/) { | 
 | 		if(defined($1)) { | 
 | 		    return $1; | 
 | 		} else { | 
 | 		    return ""; | 
 | 		} | 
 | 	    } | 
 |  | 
 | 	}; | 
 |  | 
 | 	my @entries = ( | 
 | 	    [ \$wparam, "W", "w" ], | 
 | 	    [ \$lparam, "L", "l" ] | 
 | 	); | 
 | 	foreach my $entry (@entries) { | 
 | 	    (my $refparam, my $upper, my $lower) = @$entry; | 
 |  | 
 | 	    local $_ = $$refparam; | 
 | 	    if(s/^\(\s*$upper(?:)PARAM\s*\)\s*(?:\(\s*((?:const\s+|volatile\s+)?\w+(?:\s*\*)?)\s*\))*\(\s*(.*?)\s*\)$/$2/) { | 
 | 		if(defined($1)) { | 
 | 		    $$refparam = $1; | 
 | 		} else { | 
 | 		    $$refparam = ""; | 
 | 		} | 
 |  | 
 | 		if(/^\w+$/) { | 
 | 		    if(exists($arguments{$_})) { | 
 | 			$$refparam = $arguments{$_}; | 
 | 		    } | 
 | 		} elsif(/^\(\s*(\w+)\s*\)\s*\?\s*\(\s*(\w+)\s*\)\s*:\s*(?:\(\s*(\w+)\s*\)|0)$/) { | 
 | 		    foreach ($1, $2, $3) { | 
 | 			if(exists($arguments{$_})) { | 
 | 			    $$refparam = $arguments{$_}; | 
 | 			    last; | 
 | 			} | 
 | 		    } | 
 | 		} elsif(/^\(\((?:const\s+|volatile\s+)?\w+\s*(?:\*\s*)?\)\s*(?:\(\s*\w+\s*\)|\w+)\s*\)\s*\->\s*\w+$/) { | 
 | 		    $$refparam = "UINT"; | 
 | 		} else { | 
 | 		    die "$name: '$_'"; | 
 | 		} | 
 | 	    } elsif(s/^(?:\(\s*$upper(?:)PARAM\s*\)\s*)?MAKE$upper(?:)PARAM\s*//) { | 
 |                 (my $low, my $high) = _get_tuple_arguments($_); | 
 |  | 
 | 		$low = &$find_inner_cast($low); | 
 | 		$high = &$find_inner_cast($high); | 
 |  | 
 | 		$$refparam = "($low,$high)"; | 
 | 	    } elsif(s/^\(.*?$lower(?:)Param.*?\)$//) { | 
 | 		$$refparam = $upper . "PARAM"; | 
 | 	    } elsif(s/^\(\s*(.*?)\s*\)$//) { | 
 | 		$$refparam = "$1"; | 
 | 	    } elsif(s/^0L$//) { | 
 | 		$$refparam = "void"; | 
 | 	    } else { | 
 | 		die "$name: '$_'"; | 
 |             } | 
 |         } | 
 |  | 
 | 	# $output->write("$result: '@names', '$wparam', '$lparam'\n"); | 
 |  | 
 |         foreach my $name (@names) { | 
 | 	    my $result2 = $$message{$name}{result}; | 
 |             my $wparam2 = $$message{$name}{wparam}; | 
 | 	    my $lparam2 = $$message{$name}{lparam}; | 
 |  | 
 | 	    if(ref($wparam2)) { | 
 | 		$wparam2 = "(" . join(",", @$wparam2) . ")"; | 
 | 	    } | 
 |  | 
 | 	    if(ref($lparam2)) { | 
 | 		$lparam2 = "(" . join(",", @$lparam2) . ")"; | 
 | 	    } | 
 |  | 
 | 	    if($result ne $result2) { | 
 | 		$output->write("message $name: wrong result type '$result2' should be '$result'\n"); | 
 | 	    } | 
 |  | 
 | 	    if($wparam ne $wparam2) { | 
 | 		# if($wparam ne "WPARAM" && $wparam ne "(,)") { | 
 | 		    $output->write("message $name: wrong wparam type '$wparam2' should be '$wparam'\n"); | 
 | 		# } | 
 | 	    } | 
 |  | 
 | 	    if($lparam ne $lparam2) { | 
 | 		# if($lparam ne "LPARAM" && $lparam ne "(,)") { | 
 | 		    $output->write("message $name: wrong lparam type '$lparam2' should be '$lparam'\n"); | 
 | 		# } | 
 | 	    } | 
 | 	} | 
 |  | 
 | 	return 1; | 
 |     }; | 
 |  | 
 |     my $found_comment = sub { | 
 | 	my $begin_line = shift; | 
 | 	my $begin_column = shift; | 
 | 	my $comment = shift; | 
 |  | 
 | 	$last_comment = $comment; | 
 |  | 
 | 	return 1; | 
 |     }; | 
 |  | 
 |     _parse_file("$wine_dir/include/windowsx.h", $found_preprocessor, $found_comment); | 
 | } | 
 |  | 
 |  | 
 | ######################################################################## | 
 | # _parse_winuser_h | 
 |  | 
 | sub _parse_winuser_h($$$) { | 
 |     my %not_found = (); | 
 |  | 
 |     my $found_preprocessor = sub { | 
 | 	my $begin_line = shift; | 
 | 	my $begin_column = shift; | 
 | 	local $_ = shift; | 
 |  | 
 | 	if(/^\#\s*define\s+(WM_\w+)\s+(0x[0-9a-fA-F]+)\s*$/) { | 
 | 	    my $name = $1; | 
 | 	    my $id = lc($2); | 
 |  | 
 | 	    if(exists($$message{$name})) { | 
 | 		my $id2 = sprintf("0x%04x", $$message{$name}{id}); | 
 | 		if($id ne $id2) { | 
 | 		    $output->write("message $name: wrong value ($id2) should be $id\n"); | 
 | 		} | 
 | 	    } else { | 
 | 		$output->write("message $name: exists but is not supported\n"); | 
 | 		$not_found{$name} = $id; | 
 | 	    } | 
 | 	} | 
 |  | 
 | 	return 1; | 
 |     }; | 
 |  | 
 |     _parse_file("$wine_dir/include/winuser.h", $found_preprocessor); | 
 |  | 
 |     foreach my $name (sort(keys(%not_found))) { | 
 | 	my $id = $not_found{$name}; | 
 |  | 
 | 	print "    $name => {\n"; | 
 | 	print "\tid => $id, result => \"\", wparam => \"\", lparam => \"\" },\n"; | 
 |     } | 
 | } | 
 |  | 
 | # _parse_windowsx_h; | 
 | # _parse_winuser_h; | 
 |  | 
 | 1; |