Pywin3 使用Demo鍵盤輸入與鼠標點擊

import win32api,win32gui,win32con
import os
import time


class WindowUtils():
    VK_CODE = {'backspace': 0x08,
               'tab': 0x09,
               'clear': 0x0C,
               'enter': 0x0D,
               'shift': 0x10,
               'ctrl': 0x11,
               'alt': 0x12,
               'pause': 0x13,
               'caps_lock': 0x14,
               'esc': 0x1B,
               'spacebar': 0x20,
               'page_up': 0x21,
               'page_down': 0x22,
               'end': 0x23,
               'home': 0x24,
               'left_arrow': 0x25,
               'up_arrow': 0x26,
               'right_arrow': 0x27,
               'down_arrow': 0x28,
               'select': 0x29,
               'print': 0x2A,
               'execute': 0x2B,
               'print_screen': 0x2C,
               'ins': 0x2D,
               'del': 0x2E,
               'help': 0x2F,
               '0': 0x30,
               '1': 0x31,
               '2': 0x32,
               '3': 0x33,
               '4': 0x34,
               '5': 0x35,
               '6': 0x36,
               '7': 0x37,
               '8': 0x38,
               '9': 0x39,
               'a': 0x41,
               'b': 0x42,
               'c': 0x43,
               'd': 0x44,
               'e': 0x45,
               'f': 0x46,
               'g': 0x47,
               'h': 0x48,
               'i': 0x49,
               'j': 0x4A,
               'k': 0x4B,
               'l': 0x4C,
               'm': 0x4D,
               'n': 0x4E,
               'o': 0x4F,
               'p': 0x50,
               'q': 0x51,
               'r': 0x52,
               's': 0x53,
               't': 0x54,
               'u': 0x55,
               'v': 0x56,
               'w': 0x57,
               'x': 0x58,
               'y': 0x59,
               'z': 0x5A,
               'numpad_0': 0x60,
               'numpad_1': 0x61,
               'numpad_2': 0x62,
               'numpad_3': 0x63,
               'numpad_4': 0x64,
               'numpad_5': 0x65,
               'numpad_6': 0x66,
               'numpad_7': 0x67,
               'numpad_8': 0x68,
               'numpad_9': 0x69,
               'multiply_key': 0x6A,
               'add_key': 0x6B,
               'separator_key': 0x6C,
               'subtract_key': 0x6D,
               'decimal_key': 0x6E,
               'divide_key': 0x6F,
               'F1': 0x70,
               'F2': 0x71,
               'F3': 0x72,
               'F4': 0x73,
               'F5': 0x74,
               'F6': 0x75,
               'F7': 0x76,
               'F8': 0x77,
               'F9': 0x78,
               'F10': 0x79,
               'F11': 0x7A,
               'F12': 0x7B,
               'F13': 0x7C,
               'F14': 0x7D,
               'F15': 0x7E,
               'F16': 0x7F,
               'F17': 0x80,
               'F18': 0x81,
               'F19': 0x82,
               'F20': 0x83,
               'F21': 0x84,
               'F22': 0x85,
               'F23': 0x86,
               'F24': 0x87,
               'num_lock': 0x90,
               'scroll_lock': 0x91,
               'left_shift': 0xA0,
               'right_shift ': 0xA1,
               'left_control': 0xA2,
               'right_control': 0xA3,
               'left_menu': 0xA4,
               'right_menu': 0xA5,
               'browser_back': 0xA6,
               'browser_forward': 0xA7,
               'browser_refresh': 0xA8,
               'browser_stop': 0xA9,
               'browser_search': 0xAA,
               'browser_favorites': 0xAB,
               'browser_start_and_home': 0xAC,
               'volume_mute': 0xAD,
               'volume_Down': 0xAE,
               'volume_up': 0xAF,
               'next_track': 0xB0,
               'previous_track': 0xB1,
               'stop_media': 0xB2,
               'play/pause_media': 0xB3,
               'start_mail': 0xB4,
               'select_media': 0xB5,
               'start_application_1': 0xB6,
               'start_application_2': 0xB7,
               'attn_key': 0xF6,
               'crsel_key': 0xF7,
               'exsel_key': 0xF8,
               'play_key': 0xFA,
               'zoom_key': 0xFB,
               'clear_key': 0xFE,
               '+': 0xBB,
               ',': 0xBC,
               '-': 0xBD,
               '.': 0xBE,
               '/': 0xBF,
               '`': 0xC0,
               ';': 0xBA,
               '[': 0xDB,
               '\\': 0xDC,
               ']': 0xDD,
               "'": 0xDE,
               '`': 0xC0}
    VK_SHIFT_CODE = {
        "~":"`",
        "!":"1",
        "@":"2",
        "#":"3",
        "$":"4",
        "%":"5",
        "^":"6",
        "&":"7",
        "*":"8",
        "(":"9",
        ")":"0",
        "_":"-",
        "+":"=",
        "Q":"q",
        "W":"w",
        "E":"e",
        "R":"r",
        "T":"t",
        "Y":"y",
        "U":"u",
        "I":"i",
        "O":"o",
        "P":"p",
        "A":"a",
        "S":"s",
        "D":"d",
        "F":"f",
        "G":"g",
        "H":"h",
        "J":"j",
        "K":"k",
        "L":"l",
        ":":";",
        "\"":"'",
        "Z":"z",
        "X":"x",
        "C":"c",
        "V":"v",
        "B":"b",
        "N":"n",
        "M":"m",
        "<":",",
        ">":".",
        "?":"/",
        "{":"[",
        "}":"]",
        "|":"\\",
    }

    @staticmethod
    def find_handle(title):
        """
        根據名稱找窗口句柄ID號,如果根據名稱沒有找到,則返回第一個包含標題的句柄
        :param title: 窗口標題精確匹配或者包含
        :return: 窗口句柄ID
        """
        handle = win32gui.FindWindow(None, title)
        if handle > 0:
            return handle
        # 遍歷已經所有標題
        hWndList = []
        win32gui.EnumWindows(lambda hWnd, param: param.append(hWnd), hWndList)
        for hwnd in hWndList:
            w_title = win32gui.GetWindowText(hwnd)
            if title in w_title:
                print("找到----------%s, 進程Id:%d" % (w_title, hwnd))
                handle = hwnd
        return  handle

    @staticmethod
    def get_handle(title, exe_path=""):
        """
        打開軟件,並返回軟件的句柄,如果不存在則啓動
        :return: hwnd 窗口句柄
        """
        # 如果軟件已經啓動
        handle = WindowUtils.find_handle(title)

        # 同花順沒有啓動
        if handle == 0 and exe_path != "":
            os.system("start %s" % exe_path)
            for i in range(20):
                time.sleep(1) # 暫停1秒
                handle = WindowUtils.find_handle(title)
                if handle > 0:
                    break
                print("等待軟件啓動----------%d" % i)
        return handle

    @staticmethod
    def click(type, x_position, y_position, sleep=0):
        """
        鼠標點擊事件
        :param type: 類型,left, right
        :param x_position:
        :param y_position:
        :param hwnd: 窗口句柄可選
        :param sleep: 點擊之後暫停時間
        :return:
        """
        if type not in ["left","right"]:
            type = "left"

        if type == "left":
            down, up = win32con.MOUSEEVENTF_LEFTDOWN, win32con.MOUSEEVENTF_LEFTUP
        else:
            down, up = win32con.MOUSEEVENTF_RIGHTDOWN, win32con.MOUSEEVENTF_RIGHTUP
        win32api.SetCursorPos((x_position, y_position))
        win32api.mouse_event(down, 0, 0, 0, 0)
        win32api.mouse_event(up, 0, 0, 0, 0)

        if sleep > 0:
            time.sleep(sleep)

    @staticmethod
    def move(x_position, y_position, sleep=0):
        """
        鼠標移動到指定位置
        :param x_position:
        :param y_position:
        :param sleep:
        :return:
        """
        win32api.SetCursorPos((x_position, y_position))
        if sleep > 0:
            time.sleep(sleep)

    @staticmethod
    def click_left(x_position, y_position, sleep=0):
        """
        鼠標左鍵點擊指定座標
        :param hwnd: 窗口句柄
        :param x_position: x 點
        :param y_position: y 點
        :param sleep: 點擊之後暫停時間
        :return: None
        """
        WindowUtils.click("left", x_position,y_position, sleep=sleep)


    @staticmethod
    def click_right(x_position, y_position, sleep=0):
        """
        鼠標右鍵點擊指定座標
        :param hwnd: 窗口句柄
        :param x_position: x 點
        :param y_position: y 點
        :param sleep: 點擊之後暫停時間
        :return: None
        """
        WindowUtils.click("right", x_position, y_position, sleep=sleep)

    @staticmethod
    def press(*args, sleep=0):
        """
        順序按下釋放按鍵
        :param hwd:
        :param args:
        :return:
        """
        for arg in args:
            if arg in WindowUtils.VK_SHIFT_CODE:
                WindowUtils.press_hold_release("left_shift", WindowUtils.VK_SHIFT_CODE[arg])
            else:
                win32api.keybd_event(WindowUtils.VK_CODE[arg],0, 0, 0)
                time.sleep(.05)
                win32api.keybd_event(WindowUtils.VK_CODE[arg],0, win32con.KEYEVENTF_KEYUP,  0)
        if sleep > 0:
            time.sleep(sleep)
    
    @staticmethod
    def press_hold_release(*args):
        """
        組合建按下與釋放
        :param args:
        :return:
        """
        for arg in args:
            win32api.keybd_event(WindowUtils.VK_CODE[arg], 0, 0, 0)
            time.sleep(.05)

        for arg in args:
            win32api.keybd_event(WindowUtils.VK_CODE[arg], 0, win32con.KEYEVENTF_KEYUP, 0)
            time.sleep(.05)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章