+ added the winapi functions, structures and constants for raw keyboard and mouse input

git-svn-id: trunk@33746 -
This commit is contained in:
nickysn 2016-05-22 01:59:27 +00:00
parent e2b3c6389f
commit bffe9480f4
11 changed files with 567 additions and 0 deletions

2
.gitattributes vendored
View File

@ -13288,6 +13288,8 @@ tests/test/units/variants/tcustomvariant.pp svneol=native#text/plain
tests/test/units/variants/tvararrayofintf.pp svneol=native#text/plain
tests/test/units/variants/tw26370.pp svneol=native#text/plain
tests/test/units/variants/tw27044.pp svneol=native#text/plain
tests/test/units/windows/twinrawinput32.pp svneol=native#text/plain
tests/test/units/windows/twinrawinput64.pp svneol=native#text/plain
tests/test/uobjc24.pp svneol=native#text/plain
tests/test/uobjc26.pp svneol=native#text/plain
tests/test/uobjc27a.pp svneol=native#text/plain

View File

@ -293,6 +293,7 @@ function WinHelp(hWndMain:HWND; lpszHelp:LPCSTR; uCommand:UINT; dwData:DWORD):WI
function ChangeDisplaySettings(lpDevMode:LPDEVMODE; dwFlags:DWORD):LONG; external 'user32' name 'ChangeDisplaySettingsA';
function EnumDisplaySettings(lpszDeviceName:LPCSTR; iModeNum:DWORD; lpDevMode:LPDEVMODE):WINBOOL; external 'user32' name 'EnumDisplaySettingsA';
function SystemParametersInfo(uiAction:UINT; uiParam:UINT; pvParam:PVOID; fWinIni:UINT):WINBOOL; external 'user32' name 'SystemParametersInfoA';
function GetRawInputDeviceInfo(hDevice: HANDLE; uiCommand: UINT; pData: LPVOID; pcbSize: PUINT): UINT external 'user32' name 'GetRawInputDeviceInfoA';
function AddFontResource(_para1:LPCSTR):longint; external 'gdi32' name 'AddFontResourceA';
function CopyMetaFile(_para1:HMETAFILE; _para2:LPCSTR):HMETAFILE; external 'gdi32' name 'CopyMetaFileA';
function CreateFont(_para1:longint; _para2:longint; _para3:longint; _para4:longint; _para5:longint;_para6:DWORD; _para7:DWORD; _para8:DWORD; _para9:DWORD; _para10:DWORD;_para11:DWORD; _para12:DWORD; _para13:DWORD; _para14:LPCSTR):HFONT;

View File

@ -296,6 +296,7 @@ function WinHelpA(hWndMain:HWND; lpszHelp:LPCSTR; uCommand:UINT; dwData:DWORD):W
function ChangeDisplaySettingsA(lpDevMode:LPDEVMODE; dwFlags:DWORD):LONG; external 'user32' name 'ChangeDisplaySettingsA';
function EnumDisplaySettingsA(lpszDeviceName:LPCSTR; iModeNum:DWORD; lpDevMode:LPDEVMODE):WINBOOL; external 'user32' name 'EnumDisplaySettingsA';
function SystemParametersInfoA(uiAction:UINT; uiParam:UINT; pvParam:PVOID; fWinIni:UINT):WINBOOL; external 'user32' name 'SystemParametersInfoA';
function GetRawInputDeviceInfoA(hDevice: HANDLE; uiCommand: UINT; pData: LPVOID; pcbSize: PUINT): UINT external 'user32' name 'GetRawInputDeviceInfoA';
function AddFontResourceA(_para1:LPCSTR):longint; external 'gdi32' name 'AddFontResourceA';
function CopyMetaFileA(_para1:HMETAFILE; _para2:LPCSTR):HMETAFILE; external 'gdi32' name 'CopyMetaFileA';
function CreateFontA(_para1:longint; _para2:longint; _para3:longint; _para4:longint; _para5:longint;_para6:DWORD; _para7:DWORD; _para8:DWORD; _para9:DWORD; _para10:DWORD;_para11:DWORD; _para12:DWORD; _para13:DWORD; _para14:LPCSTR):HFONT;

View File

@ -143,6 +143,7 @@
HWINSTA = HANDLE;
HWND = HANDLE;
HTASK = HANDLE;
HRAWINPUT = HANDLE;
LANGID = word;
LCID = DWORD;

View File

@ -6097,6 +6097,118 @@ const
REPLACEFILE_IGNORE_MERGE_ERRORS = $00000002;
REPLACEFILE_IGNORE_ACL_ERRORS = $00000004;
// WM_INPUT wParam
(*
* The input is in the regular message flow,
* the app is required to call DefWindowProc
* so that the system can perform clean ups.
*)
RIM_INPUT = 0;
(*
* The input is sink only. The app is expected
* to behave nicely.
*)
RIM_INPUTSINK = 1;
(*
* Type of the raw input
*)
RIM_TYPEMOUSE = 0;
RIM_TYPEKEYBOARD = 1;
RIM_TYPEHID = 2;
(*
* Define the mouse button state indicators.
*)
RI_MOUSE_LEFT_BUTTON_DOWN = $0001; // Left Button changed to down.
RI_MOUSE_LEFT_BUTTON_UP = $0002; // Left Button changed to up.
RI_MOUSE_RIGHT_BUTTON_DOWN = $0004; // Right Button changed to down.
RI_MOUSE_RIGHT_BUTTON_UP = $0008; // Right Button changed to up.
RI_MOUSE_MIDDLE_BUTTON_DOWN = $0010; // Middle Button changed to down.
RI_MOUSE_MIDDLE_BUTTON_UP = $0020; // Middle Button changed to up.
RI_MOUSE_BUTTON_1_DOWN = RI_MOUSE_LEFT_BUTTON_DOWN;
RI_MOUSE_BUTTON_1_UP = RI_MOUSE_LEFT_BUTTON_UP;
RI_MOUSE_BUTTON_2_DOWN = RI_MOUSE_RIGHT_BUTTON_DOWN;
RI_MOUSE_BUTTON_2_UP = RI_MOUSE_RIGHT_BUTTON_UP;
RI_MOUSE_BUTTON_3_DOWN = RI_MOUSE_MIDDLE_BUTTON_DOWN;
RI_MOUSE_BUTTON_3_UP = RI_MOUSE_MIDDLE_BUTTON_UP;
RI_MOUSE_BUTTON_4_DOWN = $0040;
RI_MOUSE_BUTTON_4_UP = $0080;
RI_MOUSE_BUTTON_5_DOWN = $0100;
RI_MOUSE_BUTTON_5_UP = $0200;
(*
* If usButtonFlags has RI_MOUSE_WHEEL, the wheel delta is stored in usButtonData.
* Take it as a signed value.
*)
RI_MOUSE_WHEEL = $0400;
(*
* Define the mouse indicator flags.
*)
MOUSE_MOVE_RELATIVE = 0;
MOUSE_MOVE_ABSOLUTE = 1;
MOUSE_VIRTUAL_DESKTOP = $02; // the coordinates are mapped to the virtual desktop
MOUSE_ATTRIBUTES_CHANGED = $04; // requery for mouse attributes
//#if(WINVER >= 0x0600)
MOUSE_MOVE_NOCOALESCE = $08; // do not coalesce mouse moves
//#endif /* WINVER >= 0x0600 */
(*
* Define the keyboard overrun MakeCode.
*)
KEYBOARD_OVERRUN_MAKE_CODE = $FF;
(*
* Define the keyboard input data Flags.
*)
RI_KEY_MAKE = 0;
RI_KEY_BREAK = 1;
RI_KEY_E0 = 2;
RI_KEY_E1 = 4;
RI_KEY_TERMSRV_SET_LED = 8;
RI_KEY_TERMSRV_SHADOW = $10;
(*
* Flags for GetRawInputData
*)
RID_INPUT = $10000003;
RID_HEADER = $10000005;
(*
* Raw Input Device Information
*)
RIDI_PREPARSEDDATA = $20000005;
RIDI_DEVICENAME = $20000007; // the return valus is the character length, not the byte size
RIDI_DEVICEINFO = $2000000b;
RIDEV_REMOVE = $00000001;
RIDEV_EXCLUDE = $00000010;
RIDEV_PAGEONLY = $00000020;
RIDEV_NOLEGACY = $00000030;
RIDEV_INPUTSINK = $00000100;
RIDEV_CAPTUREMOUSE = $00000200; // effective when mouse nolegacy is specified, otherwise it would be an error
RIDEV_NOHOTKEYS = $00000200; // effective for keyboard.
RIDEV_APPKEYS = $00000400; // effective for keyboard.
//#if(_WIN32_WINNT >= 0x0501)
RIDEV_EXINPUTSINK = $00001000;
RIDEV_DEVNOTIFY = $00002000;
//#endif /* _WIN32_WINNT >= 0x0501 */
RIDEV_EXMODEMASK = $000000F0;
//#if(_WIN32_WINNT >= 0x0501)
(*
* Flags for the WM_INPUT_DEVICE_CHANGE message.
*)
GIDC_ARRIVAL = 1;
GIDC_REMOVAL = 2;
//#endif /* _WIN32_WINNT >= 0x0501 */
{$endif read_interface}
{$ifdef read_implementation}

View File

@ -668,6 +668,12 @@ function TrackPopupMenuEx(_para1:HMENU; _para2:UINT; _para3:longint; _para4:long
function ChildWindowFromPointEx(_para1:HWND; _para2:POINT; _para3:UINT):HWND; external 'user32' name 'ChildWindowFromPointEx';
function DrawIconEx(hdc:HDC; xLeft:longint; yTop:longint; hIcon:HICON; cxWidth:longint;cyWidth:longint; istepIfAniCur:UINT; hbrFlickerFreeDraw:HBRUSH; diFlags:UINT):WINBOOL; external 'user32' name 'DrawIconEx';
function GetWindowInfo(hWnd:HWND; pwi:PWindowInfo):WINBOOL; external 'user32' name 'GetWindowInfo';
function GetRawInputData(hRawInput: HRAWINPUT; uiCommand: UINT; pData: LPVOID; pcbSize: PUINT; cbSizeHeader: UINT): UINT; external 'user32' name 'GetRawInputData';
function GetRawInputBuffer(pData: PRAWINPUT; pcbSize: PUINT; cbSizeHeader: UINT): UINT; external 'user32' name 'GetRawInputBuffer';
function RegisterRawInputDevices(pRawInputDevices: PCRAWINPUTDEVICE; uiNumDevices: UINT; cbSize: UINT):WINBOOL; external 'user32' name 'RegisterRawInputDevices';
function GetRegisteredRawInputDevices(pRawInputDevices: PRAWINPUTDEVICE; puiNumDevices: PUINT; cbSize: UINT): UINT; external 'user32' name 'GetRegisteredRawInputDevices';
function GetRawInputDeviceList(pRawInputDeviceList: PRAWINPUTDEVICELIST; puiNumDevices: PUINT; cbSize: UINT): UINT; external 'user32' name 'GetRawInputDeviceList';
function DefRawInputProc(paRawInput: PPRAWINPUT; nInput: longint; cbSizeHeader: UINT): LRESULT; external 'user32' name 'DefRawInputProc';
function AnimatePalette(_para1:HPALETTE; _para2:UINT; _para3:UINT; var _para4:PALETTEENTRY):WINBOOL; external 'gdi32' name 'AnimatePalette';
function Arc(_para1:HDC; _para2:longint; _para3:longint; _para4:longint; _para5:longint;_para6:longint; _para7:longint; _para8:longint; _para9:longint):WINBOOL; external 'gdi32' name 'Arc';
@ -1276,6 +1282,16 @@ function EndMenu:BOOL; external 'user32' name 'EndMenu';
function GetMenuBarInfo(_hwnd:HWND; idObject:longint; idItem:longint; pmbi:LPMENUBARINFO):BOOL; external 'user32' name 'GetMenuBarInfo';
function IMAGE_FIRST_SECTION(ntheader : PIMAGE_NT_HEADERS):PIMAGE_SECTION_HEADER;
function GET_RAWINPUT_CODE_WPARAM(wp: WPARAM): longint; inline;
function RAWINPUT_ALIGN(x: PtrUInt): PtrUInt; inline;
function NEXTRAWINPUTBLOCK(ptr: PRAWINPUT): PRAWINPUT; inline;
function RIDEV_EXMODE(mode: DWORD): DWORD; inline;
//#if (_WIN32_WINNT >= 0x0601)
function GET_DEVICE_CHANGE_WPARAM(wParam: WPARAM): WORD; inline;
//#elif (_WIN32_WINNT >= 0x0501)
function GET_DEVICE_CHANGE_LPARAM(lParam: LPARAM): WORD; inline;
//#endif /* (_WIN32_WINNT >= 0x0601) */
{$endif read_interface}
@ -2389,5 +2405,35 @@ begin
IMAGE_FIRST_SECTION:=PIMAGE_SECTION_HEADER(OFS(ntheader^.OptionalHeader) + ntheader^.FileHeader.SizeOfOptionalHeader);
end;
function GET_RAWINPUT_CODE_WPARAM(wp: WPARAM): longint;
begin
GET_RAWINPUT_CODE_WPARAM:=wp and $FF;
end;
function RAWINPUT_ALIGN(x: PtrUInt): PtrUInt;
begin
RAWINPUT_ALIGN:=PtrUInt(x+(SizeOf(PtrUInt)-1)) and not PtrUInt(SizeOf(PtrUInt)-1);
end;
function NEXTRAWINPUTBLOCK(ptr: PRAWINPUT): PRAWINPUT;
begin
NEXTRAWINPUTBLOCK:=PRAWINPUT(RAWINPUT_ALIGN(ULONG_PTR(PBYTE(ptr)+ptr^.header.dwSize)));
end;
function RIDEV_EXMODE(mode: DWORD): DWORD;
begin
RIDEV_EXMODE:=mode and RIDEV_EXMODEMASK;
end;
function GET_DEVICE_CHANGE_WPARAM(wParam: WPARAM): WORD;
begin
GET_DEVICE_CHANGE_WPARAM:=LOWORD(wParam);
end;
function GET_DEVICE_CHANGE_LPARAM(lParam: LPARAM): WORD;
begin
GET_DEVICE_CHANGE_LPARAM:=LOWORD(lParam);
end;
{$endif read_implementation}

View File

@ -9108,7 +9108,207 @@ type
LPPROGRESS_ROUTINE = function(TotalFileSize,TotalBytesTransferred,StreamSize,StreamBytesTransferred:LARGE_INTEGER;dwStreamNumber,dwCallbackReason:DWord;hSourceFile,hDestinationFile :THandle;lpdata:pointer):Dword; Stdcall;
TPROGRESS_ROUTINE = LPPROGRESS_ROUTINE;
// Raw Input Messages
//#if(_WIN32_WINNT >= 0x0501)
{$push}{$packrecords 4}
tagRAWINPUTHEADER = record
dwType: DWORD;
dwSize: DWORD;
hDevice: HANDLE;
wParam: WPARAM;
end;
RAWINPUTHEADER = tagRAWINPUTHEADER;
TRAWINPUTHEADER = tagRAWINPUTHEADER;
PRAWINPUTHEADER = ^tagRAWINPUTHEADER;
LPRAWINPUTHEADER = ^tagRAWINPUTHEADER;
(*
* Raw format of the mouse input
*)
tagRAWMOUSE = record
(*
* Indicator flags.
*)
usFlags: USHORT;
case longint of
0: (
(*
* The transition state of the mouse buttons.
*)
ulButtons: ULONG;
(*
* 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
);
1: (
(*
* The transition state of the mouse buttons.
*)
usButtonFlags: USHORT;
usButtonData: USHORT
);
end;
RAWMOUSE = tagRAWMOUSE;
TRAWMOUSE = tagRAWMOUSE;
PRAWMOUSE = ^tagRAWMOUSE;
LPRAWMOUSE = ^tagRAWMOUSE;
(*
* Raw format of the keyboard input
*)
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;
RAWKEYBOARD = tagRAWKEYBOARD;
TRAWKEYBOARD = tagRAWKEYBOARD;
PRAWKEYBOARD = ^tagRAWKEYBOARD;
LPRAWKEYBOARD = ^tagRAWKEYBOARD;
(*
* Raw format of the input from Human Input Devices
*)
tagRAWHID = record
dwSizeHid: DWORD; // byte size of each report
dwCount: DWORD; // number of input packed
bRawData: array [0..0] of BYTE;
end;
RAWHID = tagRAWHID;
TRAWHID = tagRAWHID;
PRAWHID = ^tagRAWHID;
LPRAWHID = ^tagRAWHID;
(*
* RAWINPUT data structure.
*)
tagRAWINPUT = record
header: RAWINPUTHEADER;
data: record
case longint of
0: (mouse: RAWMOUSE);
1: (keyboard: RAWKEYBOARD);
2: (hid: RAWHID);
end;
end;
RAWINPUT = tagRAWINPUT;
TRAWINPUT = tagRAWINPUT;
PRAWINPUT = ^tagRAWINPUT;
LPRAWINPUT = ^tagRAWINPUT;
PPRAWINPUT = ^PRAWINPUT;
LPLPRAWINPUT = ^LPRAWINPUT;
tagRID_DEVICE_INFO_MOUSE = record
dwId: DWORD;
dwNumberOfButtons: DWORD;
dwSampleRate: DWORD;
fHasHorizontalWheel: BOOL;
end;
RID_DEVICE_INFO_MOUSE = tagRID_DEVICE_INFO_MOUSE;
TRID_DEVICE_INFO_MOUSE = tagRID_DEVICE_INFO_MOUSE;
PRID_DEVICE_INFO_MOUSE = ^tagRID_DEVICE_INFO_MOUSE;
tagRID_DEVICE_INFO_KEYBOARD = record
dwType: DWORD;
dwSubType: DWORD;
dwKeyboardMode: DWORD;
dwNumberOfFunctionKeys: DWORD;
dwNumberOfIndicators: DWORD;
dwNumberOfKeysTotal: DWORD;
end;
RID_DEVICE_INFO_KEYBOARD = tagRID_DEVICE_INFO_KEYBOARD;
TRID_DEVICE_INFO_KEYBOARD = tagRID_DEVICE_INFO_KEYBOARD;
PRID_DEVICE_INFO_KEYBOARD = ^tagRID_DEVICE_INFO_KEYBOARD;
tagRID_DEVICE_INFO_HID = record
dwVendorId: DWORD;
dwProductId: DWORD;
dwVersionNumber: DWORD;
(*
* Top level collection UsagePage and Usage
*)
usUsagePage: USHORT;
usUsage: USHORT;
end;
RID_DEVICE_INFO_HID = tagRID_DEVICE_INFO_HID;
TRID_DEVICE_INFO_HID = tagRID_DEVICE_INFO_HID;
PRID_DEVICE_INFO_HID = ^tagRID_DEVICE_INFO_HID;
tagRID_DEVICE_INFO = record
cbSize: DWORD;
dwType: DWORD;
case longint of
0: (mouse: RID_DEVICE_INFO_MOUSE);
1: (keyboard: RID_DEVICE_INFO_KEYBOARD);
2: (hid: RID_DEVICE_INFO_HID);
end;
RID_DEVICE_INFO = tagRID_DEVICE_INFO;
PRID_DEVICE_INFO = ^tagRID_DEVICE_INFO;
LPRID_DEVICE_INFO = ^tagRID_DEVICE_INFO;
(*
* Raw Input request APIs
*)
tagRAWINPUTDEVICE = record
usUsagePage: USHORT; // Toplevel collection UsagePage
usUsage: USHORT; // Toplevel collection Usage
dwFlags: DWORD;
hwndTarget: HWND; // Target hwnd. NULL = follows keyboard focus
end;
RAWINPUTDEVICE = tagRAWINPUTDEVICE;
TRAWINPUTDEVICE = tagRAWINPUTDEVICE;
PRAWINPUTDEVICE = ^tagRAWINPUTDEVICE;
LPRAWINPUTDEVICE = ^tagRAWINPUTDEVICE;
PCRAWINPUTDEVICE = ^tagRAWINPUTDEVICE;
{$packrecords C}
tagRAWINPUTDEVICELIST = record
hDevice: HANDLE;
dwType: DWORD;
end;
RAWINPUTDEVICELIST = tagRAWINPUTDEVICELIST;
PRAWINPUTDEVICELIST = ^tagRAWINPUTDEVICELIST;
//#endif /* _WIN32_WINNT >= 0x0501 */
{$pop}
{$endif read_interface}

View File

@ -294,6 +294,7 @@ function WinHelp(hWndMain:HWND; lpszHelp:LPCWSTR; uCommand:UINT; dwData:DWORD):W
function ChangeDisplaySettings(lpDevMode:LPDEVMODE; dwFlags:DWORD):LONG; external 'user32' name 'ChangeDisplaySettingsW';
function EnumDisplaySettings(lpszDeviceName:LPCWSTR; iModeNum:DWORD; lpDevMode:LPDEVMODEW):WINBOOL; external 'user32' name 'EnumDisplaySettingsW';
function SystemParametersInfo(uiAction:UINT; uiParam:UINT; pvParam:PVOID; fWinIni:UINT):WINBOOL; external 'user32' name 'SystemParametersInfoW';
function GetRawInputDeviceInfo(hDevice: HANDLE; uiCommand: UINT; pData: LPVOID; pcbSize: PUINT): UINT; external 'user32' name 'GetRawInputDeviceInfoW';
function AddFontResource(_para1:LPCWSTR):longint; external 'gdi32' name 'AddFontResourceW';
function CopyMetaFile(_para1:HMETAFILE; _para2:LPCWSTR):HMETAFILE; external 'gdi32' name 'CopyMetaFileW';
function CreateFontIndirect(_para1:PLOGFONT):HFONT; external 'gdi32' name 'CreateFontIndirectW';

View File

@ -293,6 +293,7 @@ function WinHelpW(hWndMain:HWND; lpszHelp:LPCWSTR; uCommand:UINT; dwData:DWORD):
function ChangeDisplaySettingsW(lpDevMode:LPDEVMODEW; dwFlags:DWORD):LONG; external 'user32' name 'ChangeDisplaySettingsW';
function EnumDisplaySettingsW(lpszDeviceName:LPCWSTR; iModeNum:DWORD;lpDevMode:LPDEVMODEW):WINBOOL; external 'user32' name 'EnumDisplaySettingsW';
function SystemParametersInfoW(uiAction:UINT; uiParam:UINT; pvParam:PVOID; fWinIni:UINT):WINBOOL; external 'user32' name 'SystemParametersInfoW';
function GetRawInputDeviceInfoW(hDevice: HANDLE; uiCommand: UINT; pData: LPVOID; pcbSize: PUINT): UINT; external 'user32' name 'GetRawInputDeviceInfoW';
function AddFontResourceW(_para1:LPCWSTR):longint; external 'gdi32' name 'AddFontResourceW';
function CopyMetaFileW(_para1:HMETAFILE; _para2:LPCWSTR):HMETAFILE; external 'gdi32' name 'CopyMetaFileW';
function CreateFontIndirectW(_para1:PLOGFONTW):HFONT; external 'gdi32' name 'CreateFontIndirectW';

View File

@ -0,0 +1,101 @@
{ %TARGET=win32 }
uses windows;
var
errors_found: Boolean = false;
procedure DoCheckSize(const StructName: string; ActualSize, ExpectedSize: SizeUInt);
begin
if ActualSize <> ExpectedSize then
begin
Writeln('SizeOf(', StructName, ') is wrong - got ', ActualSize, ', expected ', ExpectedSize);
errors_found := true;
end;
end;
procedure DoCheckOffset(const StructAndFieldName: string; ActualOffset, ExpectedOffset: SizeUInt);
begin
if ActualOffset <> ExpectedOffset then
begin
Writeln('Offset of ', StructAndFieldName, ' is wrong - got ', ActualOffset, ', expected ', ExpectedOffset);
errors_found := true;
end;
end;
begin
DoCheckSize('RAWINPUTHEADER', SizeOf( RAWINPUTHEADER ), 16 ) ;
DoCheckOffset('RAWINPUTHEADER'+'.'+'dwType', SizeUInt(@(PRAWINPUTHEADER (nil)^. dwType )), 0 ) ;
DoCheckOffset('RAWINPUTHEADER'+'.'+'dwSize', SizeUInt(@(PRAWINPUTHEADER (nil)^. dwSize )), 4 ) ;
DoCheckOffset('RAWINPUTHEADER'+'.'+'hDevice', SizeUInt(@(PRAWINPUTHEADER (nil)^. hDevice )), 8 ) ;
DoCheckOffset('RAWINPUTHEADER'+'.'+'wParam', SizeUInt(@(PRAWINPUTHEADER (nil)^. wParam )), 12 ) ;
DoCheckSize('RAWMOUSE', SizeOf( RAWMOUSE ), 24 ) ;
DoCheckOffset('RAWMOUSE'+'.'+'usFlags', SizeUInt(@(PRAWMOUSE (nil)^. usFlags )), 0 ) ;
DoCheckOffset('RAWMOUSE'+'.'+'ulButtons', SizeUInt(@(PRAWMOUSE (nil)^. ulButtons )), 4 ) ;
DoCheckOffset('RAWMOUSE'+'.'+'ulRawButtons', SizeUInt(@(PRAWMOUSE (nil)^. ulRawButtons )), 8 ) ;
DoCheckOffset('RAWMOUSE'+'.'+'lLastX', SizeUInt(@(PRAWMOUSE (nil)^. lLastX )), 12 ) ;
DoCheckOffset('RAWMOUSE'+'.'+'lLastY', SizeUInt(@(PRAWMOUSE (nil)^. lLastY )), 16 ) ;
DoCheckOffset('RAWMOUSE'+'.'+'ulExtraInformation', SizeUInt(@(PRAWMOUSE (nil)^. ulExtraInformation )), 20 ) ;
DoCheckOffset('RAWMOUSE'+'.'+'usButtonFlags', SizeUInt(@(PRAWMOUSE (nil)^. usButtonFlags )), 4 ) ;
DoCheckOffset('RAWMOUSE'+'.'+'usButtonData', SizeUInt(@(PRAWMOUSE (nil)^. usButtonData )), 6 ) ;
DoCheckSize('RAWKEYBOARD', SizeOf( RAWKEYBOARD ), 16 ) ;
DoCheckOffset('RAWKEYBOARD'+'.'+'MakeCode', SizeUInt(@(PRAWKEYBOARD (nil)^. MakeCode )), 0 ) ;
DoCheckOffset('RAWKEYBOARD'+'.'+'Flags', SizeUInt(@(PRAWKEYBOARD (nil)^. Flags )), 2 ) ;
DoCheckOffset('RAWKEYBOARD'+'.'+'Reserved', SizeUInt(@(PRAWKEYBOARD (nil)^. Reserved )), 4 ) ;
DoCheckOffset('RAWKEYBOARD'+'.'+'VKey', SizeUInt(@(PRAWKEYBOARD (nil)^. VKey )), 6 ) ;
DoCheckOffset('RAWKEYBOARD'+'.'+'Message', SizeUInt(@(PRAWKEYBOARD (nil)^. Message )), 8 ) ;
DoCheckOffset('RAWKEYBOARD'+'.'+'ExtraInformation', SizeUInt(@(PRAWKEYBOARD (nil)^. ExtraInformation )), 12 ) ;
DoCheckSize('RAWHID', SizeOf( RAWHID ), 12 ) ;
DoCheckOffset('RAWHID'+'.'+'dwSizeHid', SizeUInt(@(PRAWHID (nil)^. dwSizeHid )), 0 ) ;
DoCheckOffset('RAWHID'+'.'+'dwCount', SizeUInt(@(PRAWHID (nil)^. dwCount )), 4 ) ;
DoCheckOffset('RAWHID'+'.'+'bRawData', SizeUInt(@(PRAWHID (nil)^. bRawData )), 8 ) ;
DoCheckSize('RAWINPUT', SizeOf( RAWINPUT ), 40 ) ;
DoCheckOffset('RAWINPUT'+'.'+'header', SizeUInt(@(PRAWINPUT (nil)^. header )), 0 ) ;
DoCheckOffset('RAWINPUT'+'.'+'data', SizeUInt(@(PRAWINPUT (nil)^. data )), 16 ) ;
DoCheckOffset('RAWINPUT'+'.'+'data.mouse', SizeUInt(@(PRAWINPUT (nil)^. data.mouse )), 16 ) ;
DoCheckOffset('RAWINPUT'+'.'+'data.keyboard', SizeUInt(@(PRAWINPUT (nil)^. data.keyboard )), 16 ) ;
DoCheckOffset('RAWINPUT'+'.'+'data.hid', SizeUInt(@(PRAWINPUT (nil)^. data.hid )), 16 ) ;
DoCheckSize('RID_DEVICE_INFO_MOUSE', SizeOf( RID_DEVICE_INFO_MOUSE ), 16 ) ;
DoCheckOffset('RID_DEVICE_INFO_MOUSE'+'.'+'dwId', SizeUInt(@(PRID_DEVICE_INFO_MOUSE (nil)^. dwId )), 0 ) ;
DoCheckOffset('RID_DEVICE_INFO_MOUSE'+'.'+'dwNumberOfButtons', SizeUInt(@(PRID_DEVICE_INFO_MOUSE (nil)^. dwNumberOfButtons )), 4 ) ;
DoCheckOffset('RID_DEVICE_INFO_MOUSE'+'.'+'dwSampleRate', SizeUInt(@(PRID_DEVICE_INFO_MOUSE (nil)^. dwSampleRate )), 8 ) ;
DoCheckOffset('RID_DEVICE_INFO_MOUSE'+'.'+'fHasHorizontalWheel', SizeUInt(@(PRID_DEVICE_INFO_MOUSE (nil)^. fHasHorizontalWheel )), 12 ) ;
DoCheckSize('RID_DEVICE_INFO_KEYBOARD', SizeOf( RID_DEVICE_INFO_KEYBOARD ), 24 ) ;
DoCheckOffset('RID_DEVICE_INFO_KEYBOARD'+'.'+'dwType', SizeUInt(@(PRID_DEVICE_INFO_KEYBOARD (nil)^. dwType )), 0 ) ;
DoCheckOffset('RID_DEVICE_INFO_KEYBOARD'+'.'+'dwSubType', SizeUInt(@(PRID_DEVICE_INFO_KEYBOARD (nil)^. dwSubType )), 4 ) ;
DoCheckOffset('RID_DEVICE_INFO_KEYBOARD'+'.'+'dwKeyboardMode', SizeUInt(@(PRID_DEVICE_INFO_KEYBOARD (nil)^. dwKeyboardMode )), 8 ) ;
DoCheckOffset('RID_DEVICE_INFO_KEYBOARD'+'.'+'dwNumberOfFunctionKeys', SizeUInt(@(PRID_DEVICE_INFO_KEYBOARD (nil)^. dwNumberOfFunctionKeys )), 12 ) ;
DoCheckOffset('RID_DEVICE_INFO_KEYBOARD'+'.'+'dwNumberOfIndicators', SizeUInt(@(PRID_DEVICE_INFO_KEYBOARD (nil)^. dwNumberOfIndicators )), 16 ) ;
DoCheckOffset('RID_DEVICE_INFO_KEYBOARD'+'.'+'dwNumberOfKeysTotal', SizeUInt(@(PRID_DEVICE_INFO_KEYBOARD (nil)^. dwNumberOfKeysTotal )), 20 ) ;
DoCheckSize('RID_DEVICE_INFO_HID', SizeOf( RID_DEVICE_INFO_HID ), 16 ) ;
DoCheckOffset('RID_DEVICE_INFO_HID'+'.'+'dwVendorId', SizeUInt(@(PRID_DEVICE_INFO_HID (nil)^. dwVendorId )), 0 ) ;
DoCheckOffset('RID_DEVICE_INFO_HID'+'.'+'dwProductId', SizeUInt(@(PRID_DEVICE_INFO_HID (nil)^. dwProductId )), 4 ) ;
DoCheckOffset('RID_DEVICE_INFO_HID'+'.'+'dwVersionNumber', SizeUInt(@(PRID_DEVICE_INFO_HID (nil)^. dwVersionNumber )), 8 ) ;
DoCheckOffset('RID_DEVICE_INFO_HID'+'.'+'usUsagePage', SizeUInt(@(PRID_DEVICE_INFO_HID (nil)^. usUsagePage )), 12 ) ;
DoCheckOffset('RID_DEVICE_INFO_HID'+'.'+'usUsage', SizeUInt(@(PRID_DEVICE_INFO_HID (nil)^. usUsage )), 14 ) ;
DoCheckSize('RID_DEVICE_INFO', SizeOf( RID_DEVICE_INFO ), 32 ) ;
DoCheckOffset('RID_DEVICE_INFO'+'.'+'cbSize', SizeUInt(@(PRID_DEVICE_INFO (nil)^. cbSize )), 0 ) ;
DoCheckOffset('RID_DEVICE_INFO'+'.'+'dwType', SizeUInt(@(PRID_DEVICE_INFO (nil)^. dwType )), 4 ) ;
DoCheckOffset('RID_DEVICE_INFO'+'.'+'mouse', SizeUInt(@(PRID_DEVICE_INFO (nil)^. mouse )), 8 ) ;
DoCheckOffset('RID_DEVICE_INFO'+'.'+'keyboard', SizeUInt(@(PRID_DEVICE_INFO (nil)^. keyboard )), 8 ) ;
DoCheckOffset('RID_DEVICE_INFO'+'.'+'hid', SizeUInt(@(PRID_DEVICE_INFO (nil)^. hid )), 8 ) ;
DoCheckSize('RAWINPUTDEVICE', SizeOf( RAWINPUTDEVICE ), 12 ) ;
DoCheckOffset('RAWINPUTDEVICE'+'.'+'usUsagePage', SizeUInt(@(PRAWINPUTDEVICE (nil)^. usUsagePage )), 0 ) ;
DoCheckOffset('RAWINPUTDEVICE'+'.'+'usUsage', SizeUInt(@(PRAWINPUTDEVICE (nil)^. usUsage )), 2 ) ;
DoCheckOffset('RAWINPUTDEVICE'+'.'+'dwFlags', SizeUInt(@(PRAWINPUTDEVICE (nil)^. dwFlags )), 4 ) ;
DoCheckOffset('RAWINPUTDEVICE'+'.'+'hwndTarget', SizeUInt(@(PRAWINPUTDEVICE (nil)^. hwndTarget )), 8 ) ;
DoCheckSize('RAWINPUTDEVICELIST', SizeOf( RAWINPUTDEVICELIST ), 8 ) ;
DoCheckOffset('RAWINPUTDEVICELIST'+'.'+'hDevice', SizeUInt(@(PRAWINPUTDEVICELIST (nil)^. hDevice )), 0 ) ;
DoCheckOffset('RAWINPUTDEVICELIST'+'.'+'dwType', SizeUInt(@(PRAWINPUTDEVICELIST (nil)^. dwType )), 4 ) ;
if errors_found then
begin
Writeln('Errors found!');
Halt(1);
end
else
Writeln('Ok!');
end.

View File

@ -0,0 +1,101 @@
{ %TARGET=win64 }
uses windows;
var
errors_found: Boolean = false;
procedure DoCheckSize(const StructName: string; ActualSize, ExpectedSize: SizeUInt);
begin
if ActualSize <> ExpectedSize then
begin
Writeln('SizeOf(', StructName, ') is wrong - got ', ActualSize, ', expected ', ExpectedSize);
errors_found := true;
end;
end;
procedure DoCheckOffset(const StructAndFieldName: string; ActualOffset, ExpectedOffset: SizeUInt);
begin
if ActualOffset <> ExpectedOffset then
begin
Writeln('Offset of ', StructAndFieldName, ' is wrong - got ', ActualOffset, ', expected ', ExpectedOffset);
errors_found := true;
end;
end;
begin
DoCheckSize('RAWINPUTHEADER', SizeOf( RAWINPUTHEADER ), 24 ) ;
DoCheckOffset('RAWINPUTHEADER'+'.'+'dwType', SizeUInt(@(PRAWINPUTHEADER (nil)^. dwType )), 0 ) ;
DoCheckOffset('RAWINPUTHEADER'+'.'+'dwSize', SizeUInt(@(PRAWINPUTHEADER (nil)^. dwSize )), 4 ) ;
DoCheckOffset('RAWINPUTHEADER'+'.'+'hDevice', SizeUInt(@(PRAWINPUTHEADER (nil)^. hDevice )), 8 ) ;
DoCheckOffset('RAWINPUTHEADER'+'.'+'wParam', SizeUInt(@(PRAWINPUTHEADER (nil)^. wParam )), 16 ) ;
DoCheckSize('RAWMOUSE', SizeOf( RAWMOUSE ), 24 ) ;
DoCheckOffset('RAWMOUSE'+'.'+'usFlags', SizeUInt(@(PRAWMOUSE (nil)^. usFlags )), 0 ) ;
DoCheckOffset('RAWMOUSE'+'.'+'ulButtons', SizeUInt(@(PRAWMOUSE (nil)^. ulButtons )), 4 ) ;
DoCheckOffset('RAWMOUSE'+'.'+'ulRawButtons', SizeUInt(@(PRAWMOUSE (nil)^. ulRawButtons )), 8 ) ;
DoCheckOffset('RAWMOUSE'+'.'+'lLastX', SizeUInt(@(PRAWMOUSE (nil)^. lLastX )), 12 ) ;
DoCheckOffset('RAWMOUSE'+'.'+'lLastY', SizeUInt(@(PRAWMOUSE (nil)^. lLastY )), 16 ) ;
DoCheckOffset('RAWMOUSE'+'.'+'ulExtraInformation', SizeUInt(@(PRAWMOUSE (nil)^. ulExtraInformation )), 20 ) ;
DoCheckOffset('RAWMOUSE'+'.'+'usButtonFlags', SizeUInt(@(PRAWMOUSE (nil)^. usButtonFlags )), 4 ) ;
DoCheckOffset('RAWMOUSE'+'.'+'usButtonData', SizeUInt(@(PRAWMOUSE (nil)^. usButtonData )), 6 ) ;
DoCheckSize('RAWKEYBOARD', SizeOf( RAWKEYBOARD ), 16 ) ;
DoCheckOffset('RAWKEYBOARD'+'.'+'MakeCode', SizeUInt(@(PRAWKEYBOARD (nil)^. MakeCode )), 0 ) ;
DoCheckOffset('RAWKEYBOARD'+'.'+'Flags', SizeUInt(@(PRAWKEYBOARD (nil)^. Flags )), 2 ) ;
DoCheckOffset('RAWKEYBOARD'+'.'+'Reserved', SizeUInt(@(PRAWKEYBOARD (nil)^. Reserved )), 4 ) ;
DoCheckOffset('RAWKEYBOARD'+'.'+'VKey', SizeUInt(@(PRAWKEYBOARD (nil)^. VKey )), 6 ) ;
DoCheckOffset('RAWKEYBOARD'+'.'+'Message', SizeUInt(@(PRAWKEYBOARD (nil)^. Message )), 8 ) ;
DoCheckOffset('RAWKEYBOARD'+'.'+'ExtraInformation', SizeUInt(@(PRAWKEYBOARD (nil)^. ExtraInformation )), 12 ) ;
DoCheckSize('RAWHID', SizeOf( RAWHID ), 12 ) ;
DoCheckOffset('RAWHID'+'.'+'dwSizeHid', SizeUInt(@(PRAWHID (nil)^. dwSizeHid )), 0 ) ;
DoCheckOffset('RAWHID'+'.'+'dwCount', SizeUInt(@(PRAWHID (nil)^. dwCount )), 4 ) ;
DoCheckOffset('RAWHID'+'.'+'bRawData', SizeUInt(@(PRAWHID (nil)^. bRawData )), 8 ) ;
DoCheckSize('RAWINPUT', SizeOf( RAWINPUT ), 48 ) ;
DoCheckOffset('RAWINPUT'+'.'+'header', SizeUInt(@(PRAWINPUT (nil)^. header )), 0 ) ;
DoCheckOffset('RAWINPUT'+'.'+'data', SizeUInt(@(PRAWINPUT (nil)^. data )), 24 ) ;
DoCheckOffset('RAWINPUT'+'.'+'data.mouse', SizeUInt(@(PRAWINPUT (nil)^. data.mouse )), 24 ) ;
DoCheckOffset('RAWINPUT'+'.'+'data.keyboard', SizeUInt(@(PRAWINPUT (nil)^. data.keyboard )), 24 ) ;
DoCheckOffset('RAWINPUT'+'.'+'data.hid', SizeUInt(@(PRAWINPUT (nil)^. data.hid )), 24 ) ;
DoCheckSize('RID_DEVICE_INFO_MOUSE', SizeOf( RID_DEVICE_INFO_MOUSE ), 16 ) ;
DoCheckOffset('RID_DEVICE_INFO_MOUSE'+'.'+'dwId', SizeUInt(@(PRID_DEVICE_INFO_MOUSE (nil)^. dwId )), 0 ) ;
DoCheckOffset('RID_DEVICE_INFO_MOUSE'+'.'+'dwNumberOfButtons', SizeUInt(@(PRID_DEVICE_INFO_MOUSE (nil)^. dwNumberOfButtons )), 4 ) ;
DoCheckOffset('RID_DEVICE_INFO_MOUSE'+'.'+'dwSampleRate', SizeUInt(@(PRID_DEVICE_INFO_MOUSE (nil)^. dwSampleRate )), 8 ) ;
DoCheckOffset('RID_DEVICE_INFO_MOUSE'+'.'+'fHasHorizontalWheel', SizeUInt(@(PRID_DEVICE_INFO_MOUSE (nil)^. fHasHorizontalWheel )), 12 ) ;
DoCheckSize('RID_DEVICE_INFO_KEYBOARD', SizeOf( RID_DEVICE_INFO_KEYBOARD ), 24 ) ;
DoCheckOffset('RID_DEVICE_INFO_KEYBOARD'+'.'+'dwType', SizeUInt(@(PRID_DEVICE_INFO_KEYBOARD (nil)^. dwType )), 0 ) ;
DoCheckOffset('RID_DEVICE_INFO_KEYBOARD'+'.'+'dwSubType', SizeUInt(@(PRID_DEVICE_INFO_KEYBOARD (nil)^. dwSubType )), 4 ) ;
DoCheckOffset('RID_DEVICE_INFO_KEYBOARD'+'.'+'dwKeyboardMode', SizeUInt(@(PRID_DEVICE_INFO_KEYBOARD (nil)^. dwKeyboardMode )), 8 ) ;
DoCheckOffset('RID_DEVICE_INFO_KEYBOARD'+'.'+'dwNumberOfFunctionKeys', SizeUInt(@(PRID_DEVICE_INFO_KEYBOARD (nil)^. dwNumberOfFunctionKeys )), 12 ) ;
DoCheckOffset('RID_DEVICE_INFO_KEYBOARD'+'.'+'dwNumberOfIndicators', SizeUInt(@(PRID_DEVICE_INFO_KEYBOARD (nil)^. dwNumberOfIndicators )), 16 ) ;
DoCheckOffset('RID_DEVICE_INFO_KEYBOARD'+'.'+'dwNumberOfKeysTotal', SizeUInt(@(PRID_DEVICE_INFO_KEYBOARD (nil)^. dwNumberOfKeysTotal )), 20 ) ;
DoCheckSize('RID_DEVICE_INFO_HID', SizeOf( RID_DEVICE_INFO_HID ), 16 ) ;
DoCheckOffset('RID_DEVICE_INFO_HID'+'.'+'dwVendorId', SizeUInt(@(PRID_DEVICE_INFO_HID (nil)^. dwVendorId )), 0 ) ;
DoCheckOffset('RID_DEVICE_INFO_HID'+'.'+'dwProductId', SizeUInt(@(PRID_DEVICE_INFO_HID (nil)^. dwProductId )), 4 ) ;
DoCheckOffset('RID_DEVICE_INFO_HID'+'.'+'dwVersionNumber', SizeUInt(@(PRID_DEVICE_INFO_HID (nil)^. dwVersionNumber )), 8 ) ;
DoCheckOffset('RID_DEVICE_INFO_HID'+'.'+'usUsagePage', SizeUInt(@(PRID_DEVICE_INFO_HID (nil)^. usUsagePage )), 12 ) ;
DoCheckOffset('RID_DEVICE_INFO_HID'+'.'+'usUsage', SizeUInt(@(PRID_DEVICE_INFO_HID (nil)^. usUsage )), 14 ) ;
DoCheckSize('RID_DEVICE_INFO', SizeOf( RID_DEVICE_INFO ), 32 ) ;
DoCheckOffset('RID_DEVICE_INFO'+'.'+'cbSize', SizeUInt(@(PRID_DEVICE_INFO (nil)^. cbSize )), 0 ) ;
DoCheckOffset('RID_DEVICE_INFO'+'.'+'dwType', SizeUInt(@(PRID_DEVICE_INFO (nil)^. dwType )), 4 ) ;
DoCheckOffset('RID_DEVICE_INFO'+'.'+'mouse', SizeUInt(@(PRID_DEVICE_INFO (nil)^. mouse )), 8 ) ;
DoCheckOffset('RID_DEVICE_INFO'+'.'+'keyboard', SizeUInt(@(PRID_DEVICE_INFO (nil)^. keyboard )), 8 ) ;
DoCheckOffset('RID_DEVICE_INFO'+'.'+'hid', SizeUInt(@(PRID_DEVICE_INFO (nil)^. hid )), 8 ) ;
DoCheckSize('RAWINPUTDEVICE', SizeOf( RAWINPUTDEVICE ), 16 ) ;
DoCheckOffset('RAWINPUTDEVICE'+'.'+'usUsagePage', SizeUInt(@(PRAWINPUTDEVICE (nil)^. usUsagePage )), 0 ) ;
DoCheckOffset('RAWINPUTDEVICE'+'.'+'usUsage', SizeUInt(@(PRAWINPUTDEVICE (nil)^. usUsage )), 2 ) ;
DoCheckOffset('RAWINPUTDEVICE'+'.'+'dwFlags', SizeUInt(@(PRAWINPUTDEVICE (nil)^. dwFlags )), 4 ) ;
DoCheckOffset('RAWINPUTDEVICE'+'.'+'hwndTarget', SizeUInt(@(PRAWINPUTDEVICE (nil)^. hwndTarget )), 8 ) ;
DoCheckSize('RAWINPUTDEVICELIST', SizeOf( RAWINPUTDEVICELIST ), 16 ) ;
DoCheckOffset('RAWINPUTDEVICELIST'+'.'+'hDevice', SizeUInt(@(PRAWINPUTDEVICELIST (nil)^. hDevice )), 0 ) ;
DoCheckOffset('RAWINPUTDEVICELIST'+'.'+'dwType', SizeUInt(@(PRAWINPUTDEVICELIST (nil)^. dwType )), 8 ) ;
if errors_found then
begin
Writeln('Errors found!');
Halt(1);
end
else
Writeln('Ok!');
end.