You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
228 lines
5.4 KiB
228 lines
5.4 KiB
from ctypes import Structure, Union, c_char, c_long, c_short, c_ulong
|
|
from ctypes.wintypes import BOOL, DWORD, LPVOID, WCHAR, WORD
|
|
from typing import TYPE_CHECKING
|
|
|
|
# Input/Output standard device numbers. Note that these are not handle objects.
|
|
# It's the `windll.kernel32.GetStdHandle` system call that turns them into a
|
|
# real handle object.
|
|
STD_INPUT_HANDLE = c_ulong(-10)
|
|
STD_OUTPUT_HANDLE = c_ulong(-11)
|
|
STD_ERROR_HANDLE = c_ulong(-12)
|
|
|
|
|
|
class COORD(Structure):
|
|
"""
|
|
Struct in wincon.h
|
|
http://msdn.microsoft.com/en-us/library/windows/desktop/ms682119(v=vs.85).aspx
|
|
"""
|
|
|
|
if TYPE_CHECKING:
|
|
X: int
|
|
Y: int
|
|
|
|
_fields_ = [
|
|
("X", c_short), # Short
|
|
("Y", c_short), # Short
|
|
]
|
|
|
|
def __repr__(self) -> str:
|
|
return "{}(X={!r}, Y={!r}, type_x={!r}, type_y={!r})".format(
|
|
self.__class__.__name__,
|
|
self.X,
|
|
self.Y,
|
|
type(self.X),
|
|
type(self.Y),
|
|
)
|
|
|
|
|
|
class UNICODE_OR_ASCII(Union):
|
|
if TYPE_CHECKING:
|
|
AsciiChar: bytes
|
|
UnicodeChar: str
|
|
|
|
_fields_ = [
|
|
("AsciiChar", c_char),
|
|
("UnicodeChar", WCHAR),
|
|
]
|
|
|
|
|
|
class KEY_EVENT_RECORD(Structure):
|
|
"""
|
|
http://msdn.microsoft.com/en-us/library/windows/desktop/ms684166(v=vs.85).aspx
|
|
"""
|
|
|
|
if TYPE_CHECKING:
|
|
KeyDown: int
|
|
RepeatCount: int
|
|
VirtualKeyCode: int
|
|
VirtualScanCode: int
|
|
uChar: UNICODE_OR_ASCII
|
|
ControlKeyState: int
|
|
|
|
_fields_ = [
|
|
("KeyDown", c_long), # bool
|
|
("RepeatCount", c_short), # word
|
|
("VirtualKeyCode", c_short), # word
|
|
("VirtualScanCode", c_short), # word
|
|
("uChar", UNICODE_OR_ASCII), # Unicode or ASCII.
|
|
("ControlKeyState", c_long), # double word
|
|
]
|
|
|
|
|
|
class MOUSE_EVENT_RECORD(Structure):
|
|
"""
|
|
http://msdn.microsoft.com/en-us/library/windows/desktop/ms684239(v=vs.85).aspx
|
|
"""
|
|
|
|
if TYPE_CHECKING:
|
|
MousePosition: COORD
|
|
ButtonState: int
|
|
ControlKeyState: int
|
|
EventFlags: int
|
|
|
|
_fields_ = [
|
|
("MousePosition", COORD),
|
|
("ButtonState", c_long), # dword
|
|
("ControlKeyState", c_long), # dword
|
|
("EventFlags", c_long), # dword
|
|
]
|
|
|
|
|
|
class WINDOW_BUFFER_SIZE_RECORD(Structure):
|
|
"""
|
|
http://msdn.microsoft.com/en-us/library/windows/desktop/ms687093(v=vs.85).aspx
|
|
"""
|
|
|
|
if TYPE_CHECKING:
|
|
Size: COORD
|
|
|
|
_fields_ = [("Size", COORD)]
|
|
|
|
|
|
class MENU_EVENT_RECORD(Structure):
|
|
"""
|
|
http://msdn.microsoft.com/en-us/library/windows/desktop/ms684213(v=vs.85).aspx
|
|
"""
|
|
|
|
if TYPE_CHECKING:
|
|
CommandId: int
|
|
|
|
_fields_ = [("CommandId", c_long)] # uint
|
|
|
|
|
|
class FOCUS_EVENT_RECORD(Structure):
|
|
"""
|
|
http://msdn.microsoft.com/en-us/library/windows/desktop/ms683149(v=vs.85).aspx
|
|
"""
|
|
|
|
if TYPE_CHECKING:
|
|
SetFocus: int
|
|
|
|
_fields_ = [("SetFocus", c_long)] # bool
|
|
|
|
|
|
class EVENT_RECORD(Union):
|
|
if TYPE_CHECKING:
|
|
KeyEvent: KEY_EVENT_RECORD
|
|
MouseEvent: MOUSE_EVENT_RECORD
|
|
WindowBufferSizeEvent: WINDOW_BUFFER_SIZE_RECORD
|
|
MenuEvent: MENU_EVENT_RECORD
|
|
FocusEvent: FOCUS_EVENT_RECORD
|
|
|
|
_fields_ = [
|
|
("KeyEvent", KEY_EVENT_RECORD),
|
|
("MouseEvent", MOUSE_EVENT_RECORD),
|
|
("WindowBufferSizeEvent", WINDOW_BUFFER_SIZE_RECORD),
|
|
("MenuEvent", MENU_EVENT_RECORD),
|
|
("FocusEvent", FOCUS_EVENT_RECORD),
|
|
]
|
|
|
|
|
|
class INPUT_RECORD(Structure):
|
|
"""
|
|
http://msdn.microsoft.com/en-us/library/windows/desktop/ms683499(v=vs.85).aspx
|
|
"""
|
|
|
|
if TYPE_CHECKING:
|
|
EventType: int
|
|
Event: EVENT_RECORD
|
|
|
|
_fields_ = [("EventType", c_short), ("Event", EVENT_RECORD)] # word # Union.
|
|
|
|
|
|
EventTypes = {
|
|
1: "KeyEvent",
|
|
2: "MouseEvent",
|
|
4: "WindowBufferSizeEvent",
|
|
8: "MenuEvent",
|
|
16: "FocusEvent",
|
|
}
|
|
|
|
|
|
class SMALL_RECT(Structure):
|
|
"""struct in wincon.h."""
|
|
|
|
if TYPE_CHECKING:
|
|
Left: int
|
|
Top: int
|
|
Right: int
|
|
Bottom: int
|
|
|
|
_fields_ = [
|
|
("Left", c_short),
|
|
("Top", c_short),
|
|
("Right", c_short),
|
|
("Bottom", c_short),
|
|
]
|
|
|
|
|
|
class CONSOLE_SCREEN_BUFFER_INFO(Structure):
|
|
"""struct in wincon.h."""
|
|
|
|
if TYPE_CHECKING:
|
|
dwSize: COORD
|
|
dwCursorPosition: COORD
|
|
wAttributes: int
|
|
srWindow: SMALL_RECT
|
|
dwMaximumWindowSize: COORD
|
|
|
|
_fields_ = [
|
|
("dwSize", COORD),
|
|
("dwCursorPosition", COORD),
|
|
("wAttributes", WORD),
|
|
("srWindow", SMALL_RECT),
|
|
("dwMaximumWindowSize", COORD),
|
|
]
|
|
|
|
def __repr__(self) -> str:
|
|
return "CONSOLE_SCREEN_BUFFER_INFO({!r},{!r},{!r},{!r},{!r},{!r},{!r},{!r},{!r},{!r},{!r})".format(
|
|
self.dwSize.Y,
|
|
self.dwSize.X,
|
|
self.dwCursorPosition.Y,
|
|
self.dwCursorPosition.X,
|
|
self.wAttributes,
|
|
self.srWindow.Top,
|
|
self.srWindow.Left,
|
|
self.srWindow.Bottom,
|
|
self.srWindow.Right,
|
|
self.dwMaximumWindowSize.Y,
|
|
self.dwMaximumWindowSize.X,
|
|
)
|
|
|
|
|
|
class SECURITY_ATTRIBUTES(Structure):
|
|
"""
|
|
http://msdn.microsoft.com/en-us/library/windows/desktop/aa379560(v=vs.85).aspx
|
|
"""
|
|
|
|
if TYPE_CHECKING:
|
|
nLength: int
|
|
lpSecurityDescriptor: int
|
|
bInheritHandle: int # BOOL comes back as 'int'.
|
|
|
|
_fields_ = [
|
|
("nLength", DWORD),
|
|
("lpSecurityDescriptor", LPVOID),
|
|
("bInheritHandle", BOOL),
|
|
]
|