#!/usr/bin/python
# -*- coding: UTF-8 -*-
"""
@IDE: PyCharm
@Project: automation
@Author: Alice Wu
@Email: wutong01@corp.netease.com
@File: mouse.py
@Time: 2021/3/1 12:02
@Description:
"""
import time
import win32api
from autoease.driver_control import dd_dll, STEPS_INTERVAL
def _get_display_info():
display_info = []
for monitor in win32api.EnumDisplayMonitors():
info = win32api.GetMonitorInfo(monitor[0])
display_info.append(info)
print(info)
return display_info
def _init_left_top_point():
monitors = _get_display_info()
left = min([monitor['Monitor'][0] for monitor in monitors])
top = min([monitor['Monitor'][1] for monitor in monitors])
return (left, top)
LEFT_TOP_POINT = _init_left_top_point()
print(f"Left top point: {LEFT_TOP_POINT}")
MOUSES = {
'LEFT_DOWN': 1,
'LEFT_UP': 2,
'RIGHT_DOWN': 4,
'RIGHT_UP': 8,
'MIDDLE_DOWN': 16,
'MIDDLE_UP': 32,
'FORWARD_DOWN': 64,
'FORWARD_UP': 128,
'BACK_DOWN': 256,
'BACK_UP': 512,
'WHEEL_FORWARD': 1,
'WHEEL_BACK': 2,
}
def _mouse_click(button, direction):
try:
button_name = button.upper()
except AttributeError:
raise ValueError('invalid literal for _mouseClick(): {}'.format(button))
try:
direction_name = direction.upper()
except AttributeError:
raise ValueError('invalid literal for _mouseClick(): {}'.format(direction))
try:
btn_name = '%s_%s' % (button_name, direction_name)
btn_code = MOUSES[btn_name]
except KeyError:
pass
else:
dd_dll.DD_btn(btn_code)
[docs]def mouse_down(button='LEFT'):
_mouse_click(button, 'DOWN')
print('Mouse Down: %s' % button)
[docs]def mouse_up(button='LEFT'):
_mouse_click(button, 'UP')
print('Mouse Up: %s' % button)
[docs]def mouse_click(button='LEFT', duration=None, repeat=1):
for _ in range(repeat):
mouse_down(button)
if duration:
time.sleep(duration)
mouse_up(button)
[docs]def mouse_right_click(button='RIGHT', duration=None, repeat=1):
for _ in range(repeat):
mouse_down(button)
if duration:
time.sleep(duration)
mouse_up(button)
[docs]def mouse_move_and_click(pos, duration=None, repeat=1):
print(f"mouse move and click, pos is {pos}")
mouse_move(pos=pos, duration=duration)
time.sleep(0.1)
mouse_click(duration=0.05, repeat=repeat)
[docs]def mouse_double_click(button='LEFT', duration=0.05, repeat=1):
for _ in range(repeat):
mouse_click(button, repeat=2)
if duration:
time.sleep(duration)
[docs]def mouse_drag(pos1: tuple, pos2: tuple, button='LEFT', duration=None):
mouse_move(pos1)
mouse_down(button)
mouse_move(pos2, duration)
mouse_up(button)
[docs]def mouse_drag_relative(dx: int, dy: int, button='LEFT', duration=None):
mouse_down(button)
mouse_move_relative(dx, dy, duration)
mouse_up(button)
[docs]def mouse_move(pos: tuple, duration=1):
_nx, _ny = pos
# convert
x_min, y_min = LEFT_TOP_POINT
nx = _nx + x_min
ny = _ny + y_min
print(f"Map point {_nx},{_ny} to {nx}, {ny}")
if duration is None:
dd_dll.DD_mov(nx, ny)
else:
dd_dll.DD_mov(nx, ny)
# TODO move step by step
[docs]def mouse_move_relative(dx: int, dy: int, duration=None):
cx, cy = win32api.GetCursorPos()
nx, ny = cx + dx, cy + dy
mouse_move((nx, ny), duration)
[docs]def mouse_wheel(steps: int, direction='FORWARD', duration=None):
try:
direction_name = direction.upper()
except AttributeError:
raise ValueError('invalid literal for _MouseWheel(): {}'.format(direction))
try:
btn_name = 'WHEEL_%s' % direction_name
btn_code = MOUSES[btn_name]
except KeyError:
pass
else:
for _ in range(steps):
time.sleep(duration)
dd_dll.DD_whl(btn_code)