├── .gitignore ├── README.MD ├── Ver 0.1.py └── Ver 0.2.py /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | 测试录制记录.rec 3 | -------------------------------------------------------------------------------- /README.MD: -------------------------------------------------------------------------------- 1 | > 由于疫情在家太久玩起了游戏 但是还是习惯了挂机.. 2 | > 3 | > 有点嫌弃老旧VB的按键精灵和它的Q语言 (Ver 0.2更新 按键精灵上钩子的反侦察非常完善 没有精神癖的话就不要造轮子了) 4 | > 5 | > 精神癖程序员想自己写一个 6 | > 7 | > 开始是用C++ win32库写的 8 | > 9 | > 但是微软的库太多太复杂以及非反外挂的没必要与内存和句柄作斗争就放弃了 (太菜) 10 | > 11 | > 这次使用的是python的第三方库*pynput* 12 | > 13 | > 目标是: 14 | > 15 | > + 键鼠的录制与回放 16 | > + 抓图抓色功能 17 | > + 拥有GUI 18 | > + 能够自由编写新的脚本 19 | 20 | 21 | 22 | **Ver 0.2** 23 | 24 | 1. 封装键盘相关函数 25 | 2. 键盘动作录制 26 | 3. 键鼠的完整录制与回放 27 | 4. 修复了桌面设置的缩放倍率问题 加入了设置倍率的全局变量 28 | 5. bug 鼠标滚动录制功能 不同鼠标录制为滚动一页 但实际效果是鼠标驱动修改后的滚动一次的像素点大小 29 | 30 | 31 | 32 | **Ver 0.1** 33 | 34 | 1. 封装鼠标相关函数 35 | 2. 鼠标动作录制 36 | 3. 每个动作的延迟 37 | 4. 发现bug 桌面分辨率尺寸如果不在100% 录制时候的坐标是映射到100%的 待解决 38 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /Ver 0.1.py: -------------------------------------------------------------------------------- 1 | #Ver 0.1 2 | from pynput import mouse 3 | from pynput import keyboard 4 | import time 5 | import json 6 | 7 | #全局鼠标控制器 8 | my_mouse=mouse.Controller() 9 | 10 | #鼠标连点 可设置点击次数和延迟 11 | def mouseClick(type:str='left',times:int=1,delay:float=0.1): 12 | for _ in range(times): 13 | if _!=0 : 14 | time.sleep(delay) 15 | if type == 'left': 16 | my_mouse.click(mouse.Button.left) 17 | elif type == 'right': 18 | my_mouse.click(mouse.Button.right) 19 | elif type == 'middle': 20 | my_mouse.click(mouse.Button.middle) 21 | else : 22 | return False 23 | return True 24 | 25 | #持续按住鼠标 可设置持续的时间 26 | def keepMousePress(type:str='left',seconds:float=0.1): 27 | if type == 'left': 28 | my_mouse.press(mouse.Button.left) 29 | time.sleep(seconds) 30 | my_mouse.release(mouse.Button.left) 31 | elif type == 'right': 32 | my_mouse.press(mouse.Button.right) 33 | time.sleep(seconds) 34 | my_mouse.release(mouse.Button.right) 35 | elif type == 'middle': 36 | my_mouse.press(mouse.Button.middle) 37 | time.sleep(seconds) 38 | my_mouse.release(mouse.Button.middle) 39 | else : 40 | return False 41 | return True 42 | 43 | #按住鼠标 44 | def mousePress(type:str='left'): 45 | if type=='left': 46 | my_mouse.press(mouse.Button.left) 47 | elif type=='right': 48 | my_mouse.press(mouse.Button.right) 49 | elif type=='middle': 50 | my_mouse.press(mouse.Button.middle) 51 | else : 52 | return False 53 | return True 54 | 55 | #松开鼠标 56 | def mouseRelease(type:str='left'): 57 | if type=='left': 58 | my_mouse.release(mouse.Button.left) 59 | elif type=='right': 60 | my_mouse.release(mouse.Button.right) 61 | elif type=='middle': 62 | my_mouse.release(mouse.Button.middle) 63 | else : 64 | return False 65 | return True 66 | 67 | #鼠标向下滚动 68 | def mouseScrollDown(dy:int): 69 | my_mouse.scroll(0,-dy) 70 | return True 71 | 72 | #鼠标向上滚动 73 | def mouseScrollUp(dy:int): 74 | my_mouse.scroll(0,dy) 75 | return True 76 | 77 | #设置鼠标的位置 (瞬时移动) 78 | def setMousePosition(x:int,y:int): 79 | my_mouse.position=(x,y) 80 | return True 81 | 82 | #移动位置 相对于当前位置的 (瞬时移动) 83 | def moveMouse(dx:int,dy:int): 84 | my_mouse.move(dx,dy) 85 | return True 86 | 87 | #获取鼠标监视器 88 | def newMouseListener(file): 89 | #鼠标移动事件 90 | global start_time 91 | start_time=time.time() 92 | def on_move(x,y): 93 | global start_time 94 | record={} 95 | record['type']='mouse' 96 | record['event']='move' 97 | record['posX']=x 98 | record['posY']=y 99 | end_time=time.time() 100 | delay=end_time-start_time 101 | record['delay']=delay 102 | start_time=end_time 103 | file.writelines(json.dumps(record)+'\n') 104 | file.flush() 105 | #鼠标点击事件 106 | def on_click(x,y,button,pressed): 107 | global start_time 108 | if button.name=='middle': 109 | return False 110 | record={} 111 | record['type']='mouse' 112 | record['event']='click' 113 | record['posX']=x 114 | record['posY']=y 115 | record['button']=button.name 116 | record['pressed']=pressed 117 | end_time=time.time() 118 | delay=end_time-start_time 119 | record['delay']=delay 120 | start_time=end_time 121 | file.writelines(json.dumps(record)+'\n') 122 | file.flush() 123 | #鼠标滚动事件 124 | def on_scroll(x,y,dx,dy): 125 | global start_time 126 | record={} 127 | record['type']='mouse' 128 | record['event']='scroll' 129 | record['posX']=x 130 | record['posY']=y 131 | record['dx']=dx 132 | record['dy']=dy 133 | end_time=time.time() 134 | delay=end_time-start_time 135 | record['delay']=delay 136 | start_time=end_time 137 | file.writelines(json.dumps(record)+'\n') 138 | file.flush() 139 | return mouse.Listener(on_move=on_move,on_click=on_click,on_scroll=on_scroll) 140 | 141 | #执行录制操作 142 | def executeRecord(file): 143 | line=file.readline() 144 | while line: 145 | cmd=json.loads(line) 146 | if cmd['type']=='mouse': 147 | if cmd['event']=='move': 148 | setMousePosition(cmd['posX'],cmd['posY']) 149 | elif cmd['event']=='click': 150 | if cmd['pressed']: 151 | mousePress(cmd['button']) 152 | else : 153 | mouseRelease(cmd['button']) 154 | time.sleep(cmd['delay']) 155 | line=file.readline() 156 | return True 157 | 158 | 159 | if __name__ == '__main__': 160 | print('3s后进行录制,鼠标中键结束') 161 | time.sleep(3) 162 | f=open('测试录制记录.rec','w',encoding='utf-8') 163 | listener = newMouseListener(f) 164 | listener.start() 165 | while listener.is_alive(): 166 | print('正在录制中...') 167 | time.sleep(3) 168 | listener.stop() 169 | f.close() 170 | print('录制完成!') 171 | time.sleep(5) 172 | print('开始回放') 173 | f=open('测试录制记录.rec','r',encoding='utf-8') 174 | executeRecord(f) 175 | f.close() 176 | 177 | -------------------------------------------------------------------------------- /Ver 0.2.py: -------------------------------------------------------------------------------- 1 | #Ver 0.2 2 | from pynput import mouse 3 | from pynput import keyboard 4 | import time 5 | import json 6 | 7 | #全局鼠标控制器 8 | my_mouse=mouse.Controller() 9 | #全局键盘控制器 10 | my_keyboard=keyboard.Controller() 11 | #系统显示设置中的缩放倍率 会影响到鼠标获取的xy坐标映射 (如笔记本默认是1.25倍) 12 | display_X=1.0 13 | 14 | #鼠标连点 可设置点击次数和延迟 15 | def mouseClick(type:str='left',times:int=1,delay:float=0.1): 16 | for _ in range(times): 17 | if _!=0 : 18 | time.sleep(delay) 19 | if type == 'left': 20 | my_mouse.click(mouse.Button.left) 21 | elif type == 'right': 22 | my_mouse.click(mouse.Button.right) 23 | elif type == 'middle': 24 | my_mouse.click(mouse.Button.middle) 25 | else : 26 | return False 27 | return True 28 | 29 | #持续按住鼠标 可设置持续的时间 30 | def keepMousePress(type:str='left',seconds:float=0.1): 31 | if type == 'left': 32 | my_mouse.press(mouse.Button.left) 33 | time.sleep(seconds) 34 | my_mouse.release(mouse.Button.left) 35 | elif type == 'right': 36 | my_mouse.press(mouse.Button.right) 37 | time.sleep(seconds) 38 | my_mouse.release(mouse.Button.right) 39 | elif type == 'middle': 40 | my_mouse.press(mouse.Button.middle) 41 | time.sleep(seconds) 42 | my_mouse.release(mouse.Button.middle) 43 | else : 44 | return False 45 | return True 46 | 47 | #按住鼠标 48 | def mousePress(type:str='left'): 49 | if type=='left': 50 | my_mouse.press(mouse.Button.left) 51 | elif type=='right': 52 | my_mouse.press(mouse.Button.right) 53 | elif type=='middle': 54 | my_mouse.press(mouse.Button.middle) 55 | else : 56 | return False 57 | return True 58 | 59 | #松开鼠标 60 | def mouseRelease(type:str='left'): 61 | if type=='left': 62 | my_mouse.release(mouse.Button.left) 63 | elif type=='right': 64 | my_mouse.release(mouse.Button.right) 65 | elif type=='middle': 66 | my_mouse.release(mouse.Button.middle) 67 | else : 68 | return False 69 | return True 70 | 71 | #鼠标滚动 72 | def mouseScroll(dx,dy): 73 | my_mouse.scroll(dx,dy) 74 | return True 75 | 76 | #鼠标向下滚动 77 | def mouseScrollDown(dy:int): 78 | my_mouse.scroll(0,-dy) 79 | return True 80 | 81 | #鼠标向上滚动 82 | def mouseScrollUp(dy:int): 83 | my_mouse.scroll(0,dy) 84 | return True 85 | 86 | #设置鼠标的位置 (瞬时移动) 87 | def setMousePosition(x:int,y:int): 88 | my_mouse.position=(x,y) 89 | return True 90 | 91 | #移动位置 相对于当前位置的 (瞬时移动) 92 | def moveMouse(dx:int,dy:int): 93 | my_mouse.move(dx,dy) 94 | return True 95 | 96 | #获取鼠标监视器 (参数为录制保存的文件实例) 97 | def newMouseListener(file): 98 | global start_time 99 | start_time=time.time() 100 | #鼠标移动事件 101 | def on_move(x,y): 102 | global start_time 103 | record={} 104 | record['type']='mouse' 105 | record['event']='move' 106 | record['posX']=x 107 | record['posY']=y 108 | end_time=time.time() 109 | delay=end_time-start_time 110 | record['delay']=delay 111 | start_time=end_time 112 | file.writelines(json.dumps(record)+'\n') 113 | file.flush() 114 | #鼠标点击事件 115 | def on_click(x,y,button,pressed): 116 | global start_time 117 | record={} 118 | record['type']='mouse' 119 | record['event']='click' 120 | record['posX']=x 121 | record['posY']=y 122 | record['button']=button.name 123 | record['pressed']=pressed 124 | end_time=time.time() 125 | delay=end_time-start_time 126 | record['delay']=delay 127 | start_time=end_time 128 | file.writelines(json.dumps(record)+'\n') 129 | file.flush() 130 | #鼠标滚动事件 131 | def on_scroll(x,y,dx,dy): 132 | global start_time 133 | record={} 134 | record['type']='mouse' 135 | record['event']='scroll' 136 | record['posX']=x 137 | record['posY']=y 138 | record['dx']=dx 139 | record['dy']=dy 140 | end_time=time.time() 141 | delay=end_time-start_time 142 | record['delay']=delay 143 | start_time=end_time 144 | file.writelines(json.dumps(record)+'\n') 145 | file.flush() 146 | return mouse.Listener(on_move=on_move,on_click=on_click,on_scroll=on_scroll) 147 | 148 | #键盘按下按键 (参数需要为VK值) 149 | def keyPress(key_code): 150 | my_keyboard.press(keyboard.KeyCode.from_vk(key_code)) 151 | return True 152 | 153 | #键盘松开按键 (参数需要为VK值) 154 | def keyRelease(key_code): 155 | my_keyboard.release(keyboard.KeyCode.from_vk(key_code)) 156 | return True 157 | 158 | #持续按键 可设置持续时间 (模拟连续时间间隔) 159 | def keepKeyPress(key_code,seconds:float,delay=0.02): 160 | t=time.time() 161 | while time.time()-t