1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155
|
from ctypes import Union, Structure, c_char, c_short, c_long, c_ulong
from ctypes.wintypes import DWORD, BOOL, LPVOID, WORD, WCHAR
# 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
"""
_fields_ = [
('X', c_short), # Short
('Y', c_short), # Short
]
def __repr__(self):
return '%s(X=%r, Y=%r, type_x=%r, type_y=%r)' % (
self.__class__.__name__, self.X, self.Y, type(self.X), type(self.Y))
class UNICODE_OR_ASCII(Union):
_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
"""
_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
"""
_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
"""
_fields_ = [
('Size', COORD)
]
class MENU_EVENT_RECORD(Structure):
"""
http://msdn.microsoft.com/en-us/library/windows/desktop/ms684213(v=vs.85).aspx
"""
_fields_ = [
('CommandId', c_long) # uint
]
class FOCUS_EVENT_RECORD(Structure):
"""
http://msdn.microsoft.com/en-us/library/windows/desktop/ms683149(v=vs.85).aspx
"""
_fields_ = [
('SetFocus', c_long) # bool
]
class EVENT_RECORD(Union):
_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
"""
_fields_ = [
('EventType', c_short), # word
('Event', EVENT_RECORD) # Union.
]
EventTypes = {
1: 'KeyEvent',
2: 'MouseEvent',
4: 'WindowBufferSizeEvent',
8: 'MenuEvent',
16: 'FocusEvent'
}
class SMALL_RECT(Structure):
"""struct in wincon.h."""
_fields_ = [
("Left", c_short),
("Top", c_short),
("Right", c_short),
("Bottom", c_short),
]
class CONSOLE_SCREEN_BUFFER_INFO(Structure):
"""struct in wincon.h."""
_fields_ = [
("dwSize", COORD),
("dwCursorPosition", COORD),
("wAttributes", WORD),
("srWindow", SMALL_RECT),
("dwMaximumWindowSize", COORD),
]
def __str__(self):
return '(%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d)' % (
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
"""
_fields_ = [
('nLength', DWORD),
('lpSecurityDescriptor', LPVOID),
('bInheritHandle', BOOL),
]
|