Structure Union, . , , :
class KEYBDINPUT(ctypes.Structure):
"A particular keyboard event"
_pack_ = 2
_fields_ = [
('wVk', WORD),
('wScan', WORD),
('dwFlags', DWORD),
('time', DWORD),
('dwExtraInfo', DWORD),
]
( FIXME , .)
-, _pack_ = 2, . - _pack_. 32-, 64- Windows.
, _pack_ = 2 32- Windows: 2 , , , , , 4- .
64- Windows 8 , , _pack_ = 2 _pack_ = 4 .
, ULONG_PTR ctypes.wintypes, dwExtraInfo. 32- Windows ULONG_PTR 32- , 64- Windows 64- .
MSDN Windows , :
#if defined(_WIN64)
typedef unsigned __int64 ULONG_PTR;
#else
typedef unsigned long ULONG_PTR;
#endif
DWORD ULONG dwExtraInfo, 32- Windows .
POINTER , , , ULONG_PTR - " , () ", .
wintypes, , WPARAM , ULONG_PTR. , ( ) ULONG_PTR :
from ctypes.wintypes import WPARAM as ULONG_PTR
, :
import ctypes
for ULONG_PTR in [ctypes.c_ulong, ctypes.c_ulonglong]:
if ctypes.sizeof(ULONG_PTR) == ctypes.sizeof(ctypes.c_void_p):
break
else:
raise TypeError("cannot find a suitable type for ULONG_PTR")
, :
class MOUSEINPUT(ctypes.Structure):
_fields_ = [
('dw', LONG),
('dy', LONG),
('mouseData', DWORD),
('dwFlags', DWORD),
('time', DWORD),
('dwExtraInfo', ULONG_PTR),
]
class KEYBDINPUT(ctypes.Structure):
_fields_ = [
('wVk', WORD),
('wScan', WORD),
('dwFlags', DWORD),
('time', DWORD),
('dwExtraInfo', ULONG_PTR),
]
class HARDWAREINPUT(ctypes.Structure):
_fields_ = [
('uMsg', DWORD),
('wParamL', WORD),
('wParamH', WORD),
]
class _INPUT(ctypes.Union):
_fields_ = [
('mi', MOUSEINPUT),
('ki', KEYBDINPUT),
('hi', HARDWAREINPUT),
]
class INPUT(ctypes.Structure):
_anonymous_ = ['']
_fields_ = [
('type', DWORD),
('', _INPUT),
]