python如何实现按键精灵:python按键精灵-录制鼠标和键盘操作
python如何实现按键精灵:python按键精灵-录制鼠标和键盘操作play.py代码如下python play.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.Ge
如果每天需要重复操作,怎样做到一键重复?
使用python2.7开发按键精灵
pyHook(安装地址:https://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