驱动级别模拟鼠标键盘

驱动级别模拟鼠标键盘

import time
from ctypes import windll
import sys
import ctypes


# 管理员登录
def is_admin():
    try:
        return windll.shell32.IsUserAnAdmin()
    except:
        return False


def admin_run():
    if is_admin():

        InputPasswordUtil().dd_mo_cli(494, 502)
        time.sleep(1)
        InputPasswordUtil().type('kong199701')
        time.sleep(1)
        InputPasswordUtil().dd_mo_cli(515,586)
        time.sleep(2)
    else:
        if sys.version_info[0] == 3:
            windll.shell32.ShellExecuteW(None, "runas", sys.executable, __file__, None, 1)


# 隐藏黑窗口
def hide_cmd():
    whnd = ctypes.windll.kernel32.GetConsoleWindow()
    if whnd != 0:
        ctypes.windll.user32.ShowWindow(whnd, 0)
        ctypes.windll.kernel32.CloseHandle(whnd)


# 驱动级键盘鼠标操作
class InputPasswordUtil():
    """
        模拟键盘输入密码内容
    """

    def __init__(self):
        self.vk = {
            '5': 205, 'c': 503, 'n': 506, 'z': 501, '3': 203, '1': 201, 'd': 403, '0': 210, 'l': 409, '8': 208,
            'w': 302, 'u': 307, '4': 204, 'e': 303, '[': 311, 'f': 404, 'y': 306, 'x': 502, 'g': 405, 'v': 504,
            'r': 304, 'i': 308, 'a': 401, 'm': 507, 'h': 406, '.': 509, ',': 508, ']': 312, '/': 510, '6': 206,
            '2': 202, 'b': 505, 'k': 408, '7': 207, 'q': 301, "'": 411, '\': 313, 'j': 407, '`': 200, '9': 209,
            'p': 310, 'o': 309, 't': 305, '-': 211, '=': 212, 's': 402, ';': 410
        }

        # 需要组合shift的按键。
        self.vk2 = {
            '"': "'", '#': '3', ')': '0', '^': '6', '?': '/', '>': '.', '<': ',', '+': '=', '*': '8', '&': '7',
            '{': '[', '_': '-', '|': '\', '~': '`', ':': ';', '$': '4', '}': ']', '%': '5', '@': '2', '!': '1',
            '(': '9'
        }

        self.dd_dll = windll.LoadLibrary("DD94687.64.dll")

    def down_up(self, code):
        print("简码:", code, self.vk[code])
        self.dd_dll.DD_key(self.vk[code], 1)
        # time.sleep(0.5)
        self.dd_dll.DD_key(self.vk[code], 2)

    def dd(self, key):
        if key.isupper():
            # 按下 500是shift键码
            self.dd_dll.DD_key(500, 1)
            self.down_up(key.lower())
            self.dd_dll.DD_key(500, 2)

        elif key in r'~!@#$%^&*()_+{}|:"<>?':
            self.dd_dll.DD_key(500, 1)
            self.down_up(self.vk2[key])
            self.dd_dll.DD_key(500, 2)
        else:
            self.down_up(key)

    def type(self, password):
        # 依次输入密码字符
        for key in password:
            # print(key)
            self.dd(str(key))
            time.sleep(0.5)

    def dd_mo_cli(self, x, y):
        self.dd_dll.DD_mov(x, y)
        self.dd_dll.DD_btn(1)
        self.dd_dll.DD_btn(2)

    def t_str(self):
        # self.dd_dll.DD_str("ddd")
        self.dd_dll.DD_key(0x30, 1)
        self.dd_dll.DD_key(0x30, 2)


if __name__ == '__main__':

    if is_admin():
        hide_cmd()
        InputPasswordUtil().dd_mo_cli(583, 460)
        time.sleep(1)
        InputPasswordUtil().type('kong199701')
        time.sleep(1)
        # InputPasswordUtil().dd_mo_cli(518, 562)
        # time.sleep(2)
    else:
        if sys.version_info[0] == 3:
            windll.shell32.ShellExecuteW(None, "runas", sys.executable, __file__, None, 1)


# 1. DD_btn(参数)
# 功能: 模拟鼠标点击
# 参数: 1 =左键按下 ,2 =左键放开
# 4 =右键按下 ,8 =右键放开
# 16 =中键按下 ,32 =中键放开
# 64 =4键按下 ,128 =4键放开
# 256 =5键按下 ,512 =5键放开
# 例子:模拟鼠标右键 只需要连写(中间可添加延迟) dd_btn(4); dd_btn(8);
#
#
# 2. DD_mov(参数x,参数y)
# 功能: 模拟鼠标结对移动
# 参数: 参数x , 参数y 以屏幕左上角为原点。
# 例子: 把鼠标移动到分辨率1920*1080 的屏幕正中间,
# int x = 1920/2 ; int y = 1080/2;
# DD_mov(x,y) ;1234567890
#
#
#
# 3. DD_movR(参数dx,参数dy)
# 功能: 模拟鼠标相对移动
# 参数: 参数dx , 参数dy 以当前坐标为原点。
# 例子: 把鼠标向左移动10像素
# DD_movR(-10,0) ;
#
#
#
# 4. DD_whl(参数)
# 功能: 模拟鼠标滚轮
# 参数: 1=前 , 2 = 后
# 例子: 向前滚一格, DD_whl(1)
#
#
#
# 5. DD_key(参数1,参数2)
# 功能: 模拟键盘按键
# 参数: 参数1 ,请查看[DD虚拟键盘码表]。
# 参数2,1=按下,2=放开
# 例子: 模拟单键WIN,
# DD_key(601, 1);DD_key(601, 2);
#     组合键:ctrl+alt+del
#     DD_key(600,1);
#     DD_key(602,1);
#     DD_key(706,1);
#     DD_key(706,2);
#     DD_key(602,2);
#     DD_key(600,2);
#
#
#
# 6. DD_str(参数)
# 功能: 直接输入键盘上可见字符和空格
# 参数: 字符串, (注意,这个参数不是int32 类型)
# 例子: DD_str("MyEmail@aa.bb.cc !@#$")
原文地址:https://www.cnblogs.com/konghui/p/12980329.html