python键盘、鼠标控制

本文介绍如何使用PyHook模块实现Python中的键盘和鼠标事件监听。通过示例代码展示了如何捕获并记录键盘按键和鼠标移动事件,适用于行为监控或自动化测试场景。
python键盘、鼠标控制
使用pyhook模块可以很快地完成键盘及鼠标事件捕获。 网站上提供了个使用的例子,改写了下,将信息记录到文件中,本来想使用python的logging模块,但测试时发现,因为鼠标事件频率太高,导致写时报I/O错误的异常,所以使用了自己写文件记录日志的方式。
代码:
Python代码
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-


  3. import pythoncom
  4. import pyHook
  5. import time


  6. def onMouseEvent(event):
  7.     "处理鼠标事件"
  8.     fobj.writelines('-' * 20 + 'MouseEvent Begin' + '-' * 20 + '\n')
  9.     fobj.writelines("Current Time:%s\n" % time.strftime("%a, %d %b %Y %H:%M:%S", time.gmtime()))
  10.     fobj.writelines("MessageName:%s\n" % str(event.MessageName))
  11.     fobj.writelines("Message:%d\n" % event.Message)
  12.     fobj.writelines("Time_sec:%d\n" % event.Time)
  13.     fobj.writelines("Window:%s\n" % str(event.Window))
  14.     fobj.writelines("WindowName:%s\n" % str(event.WindowName))
  15.     fobj.writelines("Position:%s\n" % str(event.Position))
  16.     fobj.writelines('-' * 20 + 'MouseEvent End' + '-' * 20 + '\n')
  17.     return True


  18. def onKeyboardEvent(event):
  19.     "处理键盘事件"
  20.     fobj.writelines('-' * 20 + 'Keyboard Begin' + '-' * 20 + '\n')
  21.     fobj.writelines("Current Time:%s\n" % time.strftime("%a, %d %b %Y %H:%M:%S", time.gmtime()))
  22.     fobj.writelines("MessageName:%s\n" % str(event.MessageName))
  23.     fobj.writelines("Message:%d\n" % event.Message)
  24.     fobj.writelines("Time:%d\n" % event.Time)
  25.     fobj.writelines("Window:%s\n" % str(event.Window))
  26.     fobj.writelines("WindowName:%s\n" % str(event.WindowName))
  27.     fobj.writelines("Ascii_code: %d\n" % event.Ascii)
  28.     fobj.writelines("Ascii_char:%s\n" % chr(event.Ascii))
  29.     fobj.writelines("Key:%s\n" % str(event.Key))
  30.     fobj.writelines('-' * 20 + 'Keyboard End' + '-' * 20 + '\n')
  31.     return True




  32. if __name__ == "__main__":
  33.     '''
  34.     Function:操作SQLITE3数据库函数
  35.     Input:NONE
  36.     Output: NONE
  37.     author: socrates
  38.     blog:http://blog.youkuaiyun.com/dyx1024
  39.     date:2012-03-1
  40.     '''

  41.     #打开日志文件
  42.     file_name = "D:\\hook_log.txt"
  43.     fobj = open(file_name,  'w')


  44.     #创建hook句柄
  45.     hm = pyHook.HookManager()


  46.     #监控键盘
  47.     hm.KeyDown = onKeyboardEvent
  48.     hm.HookKeyboard()


  49.     #监控鼠标
  50.     hm.MouseAll = onMouseEvent
  51.     hm.HookMouse()

  52.     #循环获取消息

  53.     #关闭日志文件
  54.     fobj.close()

复制代码
测试:
Plain 代码
  1. --------------------Keyboard Begin--------------------
  2. Current Time:Thu, 01 Mar 2012 15:07:01
  3. MessageName:key down
  4. Message:256
  5. Time:6376015
  6. Window:66926
  7. WindowName:淘宝网 - 淘我喜欢! - Windows Internet Explorer
  8. Ascii_code: 103
  9. Ascii_char:g
  10. Key:G
  11. --------------------Keyboard End--------------------
  12. --------------------MouseEvent Begin--------------------
  13. Current Time:Thu, 01 Mar 2012 15:07:01
  14. MessageName:mouse move
  15. Message:512
  16. Time_sec:6376078
  17. Window:132584
  18. WindowName:None
  19. Position:(724, 344)
  20. --------------------MouseEvent End--------------------
  21. --------------------MouseEvent Begin--------------------
  22. Current Time:Thu, 01 Mar 2012 15:07:01
  23. MessageName:mouse move
  24. Message:512
  25. Time_sec:6376109
  26. Window:132584
  27. WindowName:None
  28. Position:(724, 344)
  29. --------------------MouseEvent End--------------------
  30. --------------------Keyboard Begin--------------------
  31. Current Time:Thu, 01 Mar 2012 15:07:01
  32. MessageName:key down
  33. Message:256
  34. Time:6376625
  35. Window:66926
  36. WindowName:淘宝网 - 淘我喜欢! - Windows Internet Explorer
  37. Ascii_code: 111
  38. Ascii_char:o
  39. Key:O
  40. --------------------Keyboard End--------------------
  41. --------------------Keyboard Begin--------------------
  42. Current Time:Thu, 01 Mar 2012 15:07:02
  43. MessageName:key down
  44. Message:256
  45. Time:6376781
  46. Window:66926
  47. WindowName:淘宝网 - 淘我喜欢! - Windows Internet Explorer
  48. Ascii_code: 111
  49. Ascii_char:o
  50. Key:O
  51. --------------------Keyboard End--------------------
  52. --------------------Keyboard Begin--------------------
  53. Current Time:Thu, 01 Mar 2012 15:07:02
  54. MessageName:key down
  55. Message:256
  56. Time:6377000
  57. Window:66926
  58. WindowName:淘宝网 - 淘我喜欢! - Windows Internet Explorer
  59. Ascii_code: 103
  60. Ascii_char:g
  61. Key:G
  62. --------------------Keyboard End--------------------
  63. --------------------Keyboard Begin--------------------
  64. Current Time:Thu, 01 Mar 2012 15:07:02
  65. MessageName:key down
  66. Message:256
  67. Time:6377140
  68. Window:66926
  69. WindowName:淘宝网 - 淘我喜欢! - Windows Internet Explorer
  70. Ascii_code: 108
  71. Ascii_char:l
  72. Key:L
  73. --------------------Keyboard End--------------------
  74. --------------------Keyboard Begin--------------------
  75. Current Time:Thu, 01 Mar 2012 15:07:02
  76. MessageName:key down
  77. Message:256
  78. Time:6377187
  79. Window:66926
  80. WindowName:淘宝网 - 淘我喜欢! - Windows Internet Explorer
  81. Ascii_code: 101
  82. Ascii_char:e
  83. Key:E
  84. --------------------Keyboard End--------------------
  85. --------------------MouseEvent Begin--------------------
  86. Current Time:Thu, 01 Mar 2012 15:07:07
  87. MessageName:mouse move
  88. Message:512
  89. Time_sec:6382093
  90. Window:132584
  91. WindowName:None
  92. Position:(725, 344)
  93. --------------------MouseEvent End--------------------


复制代码
由上面的记录可以看出,当时我通过IE上淘宝,并且输入了google这个单词,有可能这是商品名,用户名,或者密码,呵呵。
查看Ascii_char字段即可看出输入的字母。如果没有解析出来,可通过Ascii_code字段的值到ASCII表中查找即可
<think>我们有两个主要的库来完成任务:pyautogui和pynput。根据引用[1]和引用[4],pyautogui可以控制鼠标键盘和屏幕。例如,移动鼠标、点击、输入文字以及屏幕截图和图像识别。根据引用[2]和引用[3],pynput库也可以控制鼠标键盘,并且还可以监控鼠标键盘事件。以下分别介绍这两个库的基本用法:###一、使用pyautogui控制鼠标键盘1.**安装pyautogui**```bashpipinstallpyautogui```对于图像识别功能,还需要安装OpenCV:```bashpipinstallopencv-python```2.**控制鼠标**-移动鼠标:`pyautogui.moveTo(x,y,duration=秒数)`-获取当前鼠标位置:`pyautogui.position()`-点击:`pyautogui.click(x,y,clicks=点击次数,interval=间隔时间,button='left')`-拖动鼠标:`pyautogui.dragTo(x,y,duration=秒数)`3.**控制键盘**-输入字符串:`pyautogui.typewrite('字符串',interval=秒)`-按下和释放键:`pyautogui.keyDown('键名')`,`pyautogui.keyUp('键名')`-组合键:`pyautogui.hotkey('ctrl','c')`4.**屏幕操作**-截图:`pyautogui.screenshot()`-图像识别:`pyautogui.locateOnScreen('图片.png',confidence=0.8)`(需要安装OpenCV)示例:使用pyautogui双击一个在屏幕上找到的按钮```pythonimportpyautoguiimporttimetime.sleep(5)#暂停5秒,让你有时间切换到目标窗口#在屏幕上查找按钮图片button_location=pyautogui.locateOnScreen('button.png',confidence=0.8)ifbutton_location:button_x,button_y=pyautogui.center(button_location)pyautogui.doubleClick(button_x,button_y)else:print("按钮未找到")```###二、使用pynput控制鼠标键盘1.**安装pynput**```bashpipinstallpynput```2.**控制鼠标**-导入鼠标控制器:`frompynput.mouseimportController`-移动鼠标:`controller.position=(x,y)`-点击:`controller.click(Button.left,1)`3.**控制键盘**-导入键盘控制器:`frompynput.keyboardimportController`-输入字符串:`controller.type('字符串')`-按下和释放键:`controller.press('a')`,`controller.release('a')`4.**监控鼠标键盘事件**pynput还可以监控事件,如记录鼠标移动和点击(见引用[3]的示例)。示例:使用pynput控制鼠标移动和点击```pythonfrompynput.mouseimportControllerasMouseControllerfrompynput.keyboardimportControllerasKeyboardController#控制鼠标mouse=MouseController()mouse.position=(100,200)#移动到(100,200)mouse.click(Button.left,1)#单击左键#控制键盘keyboard=KeyboardController()keyboard.type('HelloWorld')#输入字符串```###三、两个库的对比-**pyautogui**:更简单,适合屏幕操作(如图像识别)和自动化脚本。-**pynput**:除了控制外,还支持监控事件,适合需要记录或响应事件的场景。根据需求选择库:1.如果需要进行图像识别,选择pyautogui。2.如果需要监控鼠标键盘事件,选择pynput。3.如果只需要基本控制,两者都可以。§§相关问题§§1.pyautogui的图像识别功能如何使用?2.pynput如何实现键盘事件的监听?3.使用Python控制鼠标键盘,如何避免误操作?4.除了pyautogui和pynput,还有哪些库可以实现鼠标键盘控制?</think> 根据您的问题,我将系统介绍 Python 控制鼠标键盘的主要库及实现方法,结合站内引用中的技术方案: ### 一、主流库推荐 1. **PyAutoGUI** (引用[1][4]) - 功能最全面的自动化库,支持: - 鼠标移动、点击、拖拽 - 键盘输入、组合键操作 - 屏幕截图与图像识别 - 安装:`pip install pyautogui` 2. **pynput** (引用[2][3]) - 特点: - 支持鼠标/键盘监听和控制 - 事件驱动的编程模型 - 轻量级但功能强大 - 安装:`pip install pynput` ### 二、核心实现方法 #### (1) 鼠标控制 **PyAutoGUI 示例**: ```python import pyautogui # 移动鼠标到坐标(100,200) pyautogui.moveTo(100, 200, duration=0.5) # 左键双击 pyautogui.doubleClick() # 拖拽操作 pyautogui.dragTo(300, 400, duration=1) ``` **pynput 示例** (引用[3]): ```python from pynput.mouse import Controller mouse = Controller() mouse.position = (500, 500) # 设置鼠标位置 mouse.click(Button.left, 2) # 左键双击 ``` #### (2) 键盘控制 **PyAutoGUI 键盘操作**: ```python import pyautogui pyautogui.write('Hello World!') # 输入文本 pyautogui.hotkey('ctrl', 's') # 组合键保存 ``` **pynput 键盘控制**: ```python from pynput.keyboard import Controller keyboard = Controller() keyboard.press('a') # 按下a键 keyboard.release('a') # 释放a键 ``` #### (3) 高级功能实现 1. **图像识别操作** (引用[4]) ```python import pyautogui # 识别屏幕上的按钮位置 button_location = pyautogui.locateOnScreen('button.png', confidence=0.8) if button_location: x, y = pyautogui.center(button_location) pyautogui.click(x, y) # 点击识别到的位置 ``` 2. **输入事件监听** (引用[3]) ```python from pynput.mouse import Listener def on_move(x, y): print(f"鼠标位置: ({x}, {y})") # 创建监听器 with Listener(on_move=on_move) as listener: listener.join() ``` ### 三、库特性对比 | 特性 | PyAutoGUI | pynput | |------|-----------|--------| | 鼠标控制 | ✓ | ✓ | | 键盘控制 | ✓ | ✓ | | 图像识别 | ✓ | ✗ | | 事件监听 | ✗ | ✓ | | 组合键支持 | ✓ | ✓ | | 跨平台性 | 全平台 | 全平台 | | 学习曲线 | 平缓 | 中等 |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值