110 lines
3.5 KiB
Python
110 lines
3.5 KiB
Python
#--------------------------------------------------------------------
|
|
#
|
|
# PyGUI - Event utilities - Win32
|
|
#
|
|
#--------------------------------------------------------------------
|
|
|
|
import win32con as wc, win32api as api, win32gui as gui, win32ui as ui
|
|
from GUI import Event
|
|
|
|
win_message_map = {
|
|
wc.WM_KEYDOWN: ('key_down', None),
|
|
wc.WM_KEYUP: ('key_up', None),
|
|
wc.WM_SYSKEYDOWN: ('key_down', None),
|
|
wc.WM_SYSKEYUP: ('key_up', None),
|
|
wc.WM_MOUSEMOVE: ('mouse_move', None),
|
|
wc.WM_LBUTTONDOWN: ('mouse_down', 'left'),
|
|
wc.WM_LBUTTONDBLCLK: ('mouse_down', 'left'),
|
|
wc.WM_LBUTTONUP: ('mouse_up', 'left'),
|
|
wc.WM_MBUTTONDOWN: ('mouse_down', 'middle'),
|
|
wc.WM_MBUTTONDBLCLK: ('mouse_down', 'middle'),
|
|
wc.WM_MBUTTONUP: ('mouse_up', 'middle'),
|
|
wc.WM_RBUTTONDOWN: ('mouse_down', 'right'),
|
|
wc.WM_RBUTTONDBLCLK: ('mouse_down', 'right'),
|
|
wc.WM_RBUTTONUP: ('mouse_up', 'right'),
|
|
}
|
|
|
|
win_special_keys = {
|
|
0x70: 'f1',
|
|
0x71: 'f2',
|
|
0x72: 'f3',
|
|
0x73: 'f4',
|
|
0x74: 'f5',
|
|
0x75: 'f6',
|
|
0x76: 'f7',
|
|
0x77: 'f8',
|
|
0x78: 'f9',
|
|
0x79: 'f10',
|
|
0x7a: 'f11',
|
|
0x7b: 'f12',
|
|
0x91: 'f14',
|
|
0x13: 'f15',
|
|
#0x2d: 'help',
|
|
0x2d: 'insert',
|
|
0x2e: 'delete',
|
|
0x24: 'home',
|
|
0x23: 'end',
|
|
0x21: 'page_up',
|
|
0x22: 'page_down',
|
|
0x25: 'left_arrow',
|
|
0x27: 'right_arrow',
|
|
0x26: 'up_arrow',
|
|
0x28: 'down_arrow',
|
|
}
|
|
|
|
win_button_flags = wc.MK_LBUTTON | wc.MK_MBUTTON | wc.MK_RBUTTON
|
|
win_prev_key_state = 1 << 30
|
|
|
|
win_last_mouse_down = None
|
|
win_dbl_time = gui.GetDoubleClickTime() / 1000.0 # 0.25
|
|
win_dbl_xdist = api.GetSystemMetrics(wc.SM_CXDOUBLECLK)
|
|
win_dbl_ydist = api.GetSystemMetrics(wc.SM_CYDOUBLECLK)
|
|
|
|
def win_message_to_event(message, target = None):
|
|
hwnd, msg, wParam, lParam, milliseconds, gpos = message
|
|
kind, button = win_message_map[msg]
|
|
time = milliseconds / 1000.0
|
|
if kind == 'mouse_move' and wParam & win_button_flags <> 0:
|
|
kind = 'mouse_drag'
|
|
if target:
|
|
lpos = target.global_to_local(gpos)
|
|
else:
|
|
lpos = gpos
|
|
event = Event()
|
|
event.kind = kind
|
|
event.global_position = gpos
|
|
event.position = lpos
|
|
event.time = time
|
|
event.button = button
|
|
shift = api.GetKeyState(wc.VK_SHIFT) & 0x80 <> 0
|
|
control = api.GetKeyState(wc.VK_CONTROL) & 0x80 <> 0
|
|
option = api.GetKeyState(wc.VK_MENU) & 0x80 <> 0
|
|
event.shift = event.extend_contig = shift
|
|
event.control = event.extend_noncontig = control
|
|
event.option = option
|
|
vkey = None
|
|
if kind == 'mouse_down':
|
|
global win_last_mouse_down
|
|
last = win_last_mouse_down
|
|
if last and last.button == button and time - last.time <= win_dbl_time:
|
|
x0, y0 = last.global_position
|
|
x1, y1 = gpos
|
|
if abs(x1 - x0) <= win_dbl_xdist and abs(y1 - y0) <= win_dbl_ydist:
|
|
event.num_clicks = last.num_clicks + 1
|
|
win_last_mouse_down = event
|
|
elif kind == 'key_down' or kind == 'key_up':
|
|
event.unichars = ui.TranslateVirtualKey(wParam)
|
|
event.char = event.unichars.decode('ascii')
|
|
event._keycode = wParam
|
|
if wParam == 0x0d:
|
|
if (lParam & 0x1000000):
|
|
event.key = 'enter'
|
|
else:
|
|
event.key = 'return'
|
|
else:
|
|
event.key = win_special_keys.get(wParam) or event.char
|
|
if kind == 'key_down':
|
|
event.auto = lParam & win_prev_key_state <> 0
|
|
return event
|
|
|