Source code for autoease.driver_control.mouse

#!/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)