如果每天需要重复操作,怎样做到一键重复?,我来为大家讲解一下关于python可以做按键精灵吗?跟着小编一起来看一看吧!

python可以做按键精灵吗(python按键精灵-录制鼠标和键盘操作)

python可以做按键精灵吗

如果每天需要重复操作,怎样做到一键重复?

使用python2.7开发按键精灵

pyHook(安装地址:http://www.lfd.uci.edu/~gohlke/pythonlibs/#pyhook)

recode.py代码如下,记录鼠标键盘的操作

运行python recode.py

#!/usr/bin/env python # -*- coding: utf-8 -*- import pythoncom import pyHook import time import threading import datetime import sys import win32api import win32con import win32gui from ctypes import * actions=[] _stoped = False class POINT(Structure): _fields_ = [("x", c_ulong),("y", c_ulong)] def get_mouse_point(): po = POINT() windll.user32.GetCursorPos(byref(po)) return int(po.x), int(po.y) def logAction(e): po = get_mouse_point() seconds = getCurSec() if len(actions)>0 and e.MessageName=='mouse move' and actions[-1][0] == 'mouse move' and seconds-actions[-1][1]<0.05: actions[-1] = [e.MessageName,seconds,po[0],po[1]] else: actions.append([e.MessageName,seconds,po[0],po[1]]) startLogTime = datetime.datetime.now() def getCurSec(): return (datetime.datetime.now() - startLogTime).total_seconds() def log(s): fobj.writelines(s) def onMouseEvent(event): "处理鼠标事件" #log("Current Time:%s\n" % time.strftime("%a, %d %b %Y %H:%M:%S", time.gmtime())) #log("MessageName:%s\n" % str(event.MessageName)) #log("Position:%s\n" % str(event.Position)) global _stoped if _stoped: return True logAction(event) return True def onKeyboardEvent(event): "处理键盘事件" #log("Current Time:%s\n" % time.strftime("%a, %d %b %Y %H:%M:%S", time.gmtime())) #log("MessageName:%s\n" % str(event.MessageName)) #log("Ascii_code: %d\n" % event.Ascii) #log("Ascii_char:%s\n" % chr(event.Ascii)) #log("Key:%s\n" % str(event.Key)) #logAction(event) global _stoped if event.KeyID == 0x2C: _stoped = True if _stoped: return True actions.append([event.MessageName,getCurSec(),event.KeyID,event.Key]) return True def start_log(): #创建hook句柄 hm = pyHook.HookManager() #监控键盘 hm.KeyDown = onKeyboardEvent hm.KeyUp = onKeyboardEvent hm.HookKeyboard() #监控鼠标 hm.MouseAll = onMouseEvent hm.HookMouse() #循环获取消息 pythoncom.PumpMessages() if __name__ == "__main__": user32 = windll.user32 hwnd = user32.GetForegroundWindow() win32gui.CloseWindow(hwnd) # 窗口最小化 t4=threading.Thread(target=start_log,args=()) t4.setDaemon(True) t4.start() print 'begin to record' while not _stoped: time.sleep(1) print 'end to record' #打开日志文件 file_name = "hook_log.txt" if len(sys.argv) > 1: file_name = sys.argv[1] fobj = open(file_name, 'w') content = '\n'.join(str(','.join(str(s1) for s1 in s)) for s in actions) fobj.write(content) #关闭日志文件 fobj.close()

运行之后记录操作,当按下 PrtSc 键后停止记录,得到log文件内容如下

mouse move,2.198,479,305 mouse left down,2.434,480,305 mouse left up,2.546,480,305 key down,3.238,84,T key up,3.374,84,T key down,3.382,72,H key down,3.47,73,I key up,3.542,72,H key up,3.622,73,I key down,3.686,83,S key up,3.798,83,S key down,4.19,32,Space key up,4.318,32,Space key down,4.366,73,I key down,4.454,83,S key up,4.462,73,I key up,4.582,83,S key down,4.67,32,Space key up,4.774,32,Space key down,4.982,84,T key down,5.062,69,E key up,5.15,84,T key down,5.166,83,S key down,5.27,84,T key up,5.31,69,E key up,5.318,83,S key up,5.398,84,T mouse move,6.086,481,306

记录播放

python play.py

play.py代码如下

# # _*_ coding:UTF-8 _*_ import win32api import win32con import win32gui from ctypes import * import time import sys,ctypes if sys.getdefaultencoding() != 'utf-8': reload(sys) sys.setdefaultencoding('utf-8') 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, ' ':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} class POINT(Structure): _fields_ = [("x", c_ulong),("y", c_ulong)] def get_mouse_point(): po = POINT() windll.user32.GetCursorPos(byref(po)) return int(po.x), int(po.y) def mouse_click(x=None,y=None): if not x is None and not y is None: mouse_move(x,y) time.sleep(0.05) win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0) def mouse_dclick(x=None,y=None): if not x is None and not y is None: mouse_move(x,y) time.sleep(0.05) win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0) win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0) def mouse_move(x,y): windll.user32.SetCursorPos(x, y) def mouse_leftdown(x=None,y=None): if not x is None and not y is None: mouse_move(x,y) win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0) def mouse_leftup(x=None,y=None): if not x is None and not y is None: mouse_move(x,y) win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0, 0, 0, 0) def mouse_rightdown(x=None,y=None): if not x is None and not y is None: mouse_move(x,y) win32api.mouse_event(win32con.MOUSEEVENTF_RIGHTDOWN, 0, 0, 0, 0) def mouse_rightup(x=None,y=None): if not x is None and not y is None: mouse_move(x,y) win32api.mouse_event(win32con.MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0) def key_down(vc): win32api.keybd_event(vc,0,0,0) def key_up(vc): win32api.keybd_event(vc,0,win32con.KEYEVENTF_KEYUP,0) def key_input(str=''): for c in str: win32api.keybd_event(VK_CODE[c],0,0,0) win32api.keybd_event(VK_CODE[c],0,win32con.KEYEVENTF_KEYUP,0) time.sleep(0.01) def setClipboard(mystr): '''把字符串放到剪切板中,成功返回1,失败返回0''' u=ctypes.WinDLL('user32.dll') k=ctypes.WinDLL('kernel32.dll') s=mystr.encode('utf-16') s=s[2:] b'\0\0' ss=ctypes.c_char_p(s) u.OpenClipboard(0) u.EmptyClipboard() k.GlobalAlloc.argtypes=[ctypes.c_uint32,ctypes.c_uint32] try: cb=k.GlobalAlloc(0,len(s)) cb=ctypes.c_void_p(cb) ctypes.memmove(cb,ss,len(s)) rr=u.SetClipboardData(13,cb) # 13->unicode finally: u.CloseClipboard() if rr==0: return 0 else: return 1 def key_input2(s): setClipboard(s) #ctrl v key_down(0x11) key_down(0x56) key_up(0x56) key_up(0x11) def runActrion(actions): alen = len(actions) for i in range(alen): action = actions[i] t = action[0] if t =='mouse left down': mouse_leftdown(int(action[2]),int(action[3])) elif t =='mouse left up': mouse_leftup(int(action[2]),int(action[3])) elif t =='mouse right down': mouse_rightdown(int(action[2]),int(action[3])) elif t =='mouse right up': mouse_rightup(int(action[2]),int(action[3])) elif t =='key up': key_up(int(action[2])) elif t =='key down' or t =='key sys down': key_down(int(action[2])) elif t=='key input': key_input2(action[2]) elif t =='mouse move': mouse_move(int(action[2]),int(action[3])) if i < alen-1: time.sleep(float(actions[i 1][1])-float(action[1])) if __name__ == "__main__": user32 = windll.user32 hwnd = user32.GetForegroundWindow() win32gui.CloseWindow(hwnd) # 窗口最小化 fname = 'hook_log.txt' if len(sys.argv) > 1: fname = sys.argv[1] actions = [] for line in open(fname): if len(line.strip())>0: actions.append(line.split(',')) times = 1 if len(sys.argv) > 2: times = int(sys.argv[2]) for i in range(times): runActrion(actions)

更多功能可以自己去修改代码

可以录制和播放不同脚本,如登录游戏,登录邮箱等等.本人用c#做了个界面,可以显示记录的不同脚本,并可以设置播放次数等功能

python recode.py game.txt

python play.py game.txt