python pynput鼠标键盘监控(详细)第1部鼠标监控

python pynput鼠标键盘监控(详细)第1部鼠标监控

本人看完原文,认为很简单,结果花费3天时间才基本了解。由于我现在仅仅用到监听,

所以先写监听。模拟功能本模块也有,稍后补充。

网上搜索了很多,没有见创新的,基本上是原文档的复制,本人经过摸索,基本校全面。

现总结如下。补充说明不要用os._exit or sys.exit退出,那样的话能是不能鼠标监听的。

如有错误或补充欢迎交流。

另外除非你一定要用控制台程序,没有界面,否则不建议使用,比较难。你可以用pyqt5或matplotlib中鼠标键盘监控事件。

参考本人另一篇博文matplotlib键盘鼠标事件 https://mp.csdn.net/postedit/84777736

pynput模块: 控制监控鼠标和键盘 2018/8/28

-------------------------------------------------------------------------------

1.模块函数

1.mouse: 包含鼠标类的模块

1.1.class Button: 鼠标的键值类

left(左键), right(右键),middle(中间建),unknown(未知键)

1.2.class Controller: 向系统发送鼠标事件的控制器

position: 指针当前的位置

move(x, y): 将鼠标移动到指定位置

press(button): 按下鼠标键

release(button): 释放鼠标键

scroll(x, y): 发送滚动事件

click(button, count=1): 在当前位置发送点击事件

button: 按下的鼠标键

count: 点击的次数

1.3.class Listener: 鼠标的监听器

Listener(no_move,on_click,on_scroll): 创建一个监听器

no_move: 鼠标移动调用的方法(参数: x, y)

on_click: 鼠标点击调用的方法(参数: x, y, button, pressed)

on_scroll: 鼠标滚轮滑动调用的方法(参数: x, y , dx, dy)

run(): 启动监听器

stop(): 停止监听器

wait(): 等待监听器就绪

join(): 启动并等待线程停止

---------------------------------------------------------------------------

2.keyboard: 包含键盘类的模块

2.1.class Key: 键盘的键值类

alt(Alt),alt_l(左Alt),alt_r(右),ctrl(Ctrl),ctrl_l(左Ctrl),ctrl_r(右Ctrl),shift(Shift), enter(回车),

shift_r(右Shift),space(空格),tab(Tab),caps_lock(大小写),cmd(cmd),backspace(退格),

esc(esc),down(下),up(上),left(左),right(右)end(End),delete(Del),home(Home),insert(Ins),

page_down(PageDown),page_up(PageUp),scroll_lock(ScrlLock), pause(PauseBreak)

,print_screen(PrintScr.)f1-12(F1-12),menu(menu),num_lock(NumLock)

2.2.class Controller: 向系统发送键盘事件的控制器

press(key): 按下某个键

key: 按下的键

release(key): 释放某个键

pressed(*args): 使下边的按键均同时按下此键(可以用with打开)

type(str): 将字符串发送

2.3.class Listener: 键盘的监听器

Listener(on_press, on_release): 创建一个监听器

on_press: 按下某个键时调用的方法(参数为key)

on_release: 释放某个键时调用的方法(参数为key)

run(): 启动监听器

stop(): 停止监听器

wait(): 等待监听器就绪

join(): 启动并等待线程停止

-------------------------------------------------------------------------------

3.例

1.标准鼠标监控

from pynput import mouse

def on_move(x, y):

print('Pointer moved to {0}'.format((x, y)))

def on_click(x, y, button, pressed):

print('{0} at {1}'.format(

'Pressed' if pressed else 'Released',(x, y)))

if not pressed:

# Stop listener

return False

def on_scroll(x, y, dx, dy):

print('Scrolled {0} at {1}'.format(

'down' if dy < 0 else 'up',(x, y)))

# Collect events until released

with mouse.Listener(on_move=on_move,on_click=on_click,

on_scroll=on_scroll) as listener:

listener.join()

------------------------------------------------------------------------------

from pynput import mouse,keyboard

from collections import deque

import threading,time,os,sys

'''

1.说明:

1.0.tcy shanghai 2018/8/28 测试平台windows7 python3.7 pycharm20182.1

1.1. 一个鼠标监听器是一个线程。所有的回调将从线程调用。

1.2. 任何地方调用pynput.mouse.Listener.stop,mouse.Listener.StopException

或从回调中返回False来停止监听器。

2.用途: 1.1.本函数主要用作鼠标监听 1.2.实现鼠标监听暂停,启动,停止;停止和销毁后不能再进行鼠标监听,暂停后可以恢复。 3.技术要点 1.1.构造2个event,停止和暂停;退出采用回调函数内部return False

以恢复

'''

class MouseClass(threading.Thread):

def __init__(self, *args, **kwargs):

super(MouseClass, self).__init__(*args, **kwargs)

self.mouse_listion=mouse.Listener()

self.__mouse_pause_flag_=threading.Event() # 用于暂停鼠标线程的标识

self.__mouse_pause_flag_.set() # 鼠标线程不阻塞

self.__mouse_run_flag_ = threading.Event() # 用于停止鼠标线程的标识

self.__mouse_run_flag_.set() # 鼠标线程开始启用

self.__mouse_destroy_flag_=True #True鼠标监听不退出

def on_move(self,x, y ):

print("Pointer moved to {0} {1}".format((x,y),time.ctime()))

if not self.__mouse_destroy_flag_: #false鼠标监听停止

return False

#注意:不要返回True,否则不能够暂停等功能

def on_click(self,x, y , button, pressed):

print('{0}at{1} '.format('Pressed' if pressed else 'Released',(x, y)))

#凸轮键松开鼠标监控停止

if (not self.__mouse_destroy_flag_) or (not pressed):#false鼠标监听停

return False

def on_scroll(self,x, y ,dx, dy):

print('Scrolled{0} at {1}'.format( 'down' if dy < 0 else 'up',(x, y)))

if not self.__mouse_destroy_flag_: #false鼠标监听停止

return False

def run(self):

while self.__mouse_run_flag_.is_set() :

if not self.__mouse_destroy_flag_:

break

self.__mouse_pause_flag_.wait()

with mouse.Listener( no_move = self.on_move,on_click =

self.on_click,on_scroll = self.on_scroll) as listener:

self.mouse_listion = listener

self.mouse_listion.join()

def mouse_pause(self):

self.__mouse_pause_flag_.clear() # 为False鼠标线程阻塞,暂停鼠标功能

print('鼠标暂停...;当前线程==>%s ;线程数量==%d\n' % (

threading.current_thread().name, threading.activeCount()))

def mouse_resume(self):

self.__mouse_pause_flag_.set() # True鼠标线程停止阻塞,开启鼠标功能

print('鼠标恢复...;当前线程==>%s ;线程数量==%d\n' % (

threading.current_thread().name, threading.activeCount()))

def mouse_stop(self):

self.__mouse_run_flag_.clear() # 设置为False鼠标线程停止

self.__mouse_pause_flag_.set()

print('鼠标停用...;当前线程==>%s ;线程数量==%d\n' %(

threading.current_thread().name, threading.activeCount()))

def mouse_destroy(self):

self.__mouse_destroy_flag_=False # 鼠标监听停止

print('鼠标监听停止;当前线程==>%s ;线程数量==%d\n' %(

threading.current_thread().name, threading.activeCount()))

#测试函数

def mouse_test():

km=MouseClass()

print('1.Start runing...')

km.start()

time.sleep(5)

print('2.Mouse pause...')

km.mouse_pause()

time.sleep(5)

print('3.Mouse start....')

km.mouse_resume()

time.sleep(5)

print('4.Mouse stop....')

# km.mouse_stop()#任选一个停止

km.mouse_destroy()#任选一个停止

time.sleep(5)

print('5.End all program!')

print('当前线程==>%s ;线程数量==%d\n' %(

threading.current_thread().name, threading.activeCount()))

mouse_test()

# C:\python37\python.exe C:/Users/Administrator/.PyCharmCE2018.2/config/scratches/test3.py

# 1.Start runing...

# Pressed at (338, 619)

# Released at (338, 619)

# Scrolled down at (338, 619)

# Scrolled down at (338, 620)

# 2.Mouse pause...

# 鼠标暂停...;当前线程==>MainThread ;线程数量==3

#

# Scrolled down at (338, 622)

# Scrolled down at (338, 622)

# Pressed at (338, 622)

# Released at (338, 622)

# 3.Mouse start....

# 鼠标恢复...;当前线程==>MainThread ;线程数量==2

#

# Pressed at (338, 622)

# Released at (338, 622)

# Scrolled down at (338, 622)

# Pressed at (338, 622)

# Released at (338, 622)

# Scrolled down at (338, 622)

# Pressed at (338, 622)

# Released at (338, 622)

# Scrolled down at (338, 622)

# Pressed at (338, 622)

# Released at (338, 622)

# 4.Mouse stop....

# 鼠标监听停止;当前线程==>MainThread ;线程数量==3

#

# Scrolled down at (338, 622)

# 5.End all program!

# 当前线程==>MainThread ;线程数量==1

---------------------------------------------------------------------

from pynput import mouse,keyboard

from collections import deque

import threading,time,os,sys

'''

1.说明:

1.0.tcy shanghai 2018/8/28 测试平台windows7 python3.7 pycharm20182.1

1.1. 一个鼠标监听器是一个线程。所有的回调将从线程调用。

1.2. 任何地方调用pynput.mouse.Listener.stop,mouse.Listener.StopException

或从回调中返回False来停止监听器。

2.用途:

1.1.本函数主要用作鼠标监听

1.2.实现鼠标监听暂停启动停止;停止和销毁后不能再进行鼠标监听,暂停后可

3.技术要点

1.1.采用鼠标监听内部的线程挂起,当暂停时鼠标不起左右,恢复后又正常工作。

'''

class MouseClass(threading.Thread):

def __init__(self, *args, **kwargs):

super(MouseClass, self).__init__(*args, **kwargs)

self.mouse_listion=mouse.Listener()

self.__mouse_run_flag_=True # 用于暂停鼠标线程不挂起

self.__mouse_destroy_flag_=True #True鼠标监听不退出

def on_move(self,x, y ):

print("Pointer moved to {0} {1}".format((x,y),time.ctime()))

if not self.__mouse_destroy_flag_: #false鼠标监听停止

return False # 注意:不要返回True,否则不能够暂停等功能

def on_click(self,x, y , button, pressed):

print('{0} at{1}'.format('Pressed' if pressed else 'Released',(x, y)))

#凸轮键松开鼠标监控停止

if (not self.__mouse_destroy_flag_) or (not pressed): #false鼠标监听停

return False

def on_scroll(self,x, y ,dx, dy):

print('Scrolled {0} at {1}'.format( 'down' if dy <0 else 'up',(x, y)))

if not self.__mouse_destroy_flag_: #false鼠标监听停止

return False

def run(self):

while 1:

with mouse.Listener( no_move = self.on_move,on_click = self.on_click,on_scroll = self.on_scroll,

suppress=not self.__mouse_run_flag_) as self.mouse_listion:

self.mouse_listion.join()

if not self.__mouse_destroy_flag_:

break

def mouse_pause(self):

self.__mouse_run_flag_ = False

print('鼠标暂停...;当前线程==>%s ;线程数量==%d\n' % (

threading.current_thread().name, threading.activeCount()))

def mouse_resume(self):

self.__mouse_run_flag_=True

print('鼠标恢复...;当前线程==>%s ;线程数量==%d\n' % (

threading.current_thread().name, threading.activeCount()))

def mouse_destroy(self):

self.__mouse_destroy_flag_=False # 鼠标监听停止

self.__mouse_run_flag_ = True

print('鼠标监听停止;当前线程==>%s ;线程数量==%d\n' %(

threading.current_thread().name, threading.activeCount()))

#测试函数

def mouse_test():

km=MouseClass()

print('1.Start runing...')

km.start()

time.sleep(5)

print('2.Mouse pause...')

km.mouse_pause()

time.sleep(5)

print('3.Mouse start....')

km.mouse_resume()

time.sleep(5)

print('4.Mouse stop....')

km.mouse_destroy()#任选一个停止

time.sleep(5)

print('5.End all program!')

print('当前线程==>%s ;线程数量==%d\n' %(

threading.current_thread().name, threading.activeCount()))

mouse_test()

#输出结果:

# 1.Start runing...

# Pressed at (321, 553)

# Released at (321, 553)

# Scrolled down at (321, 553)

# Scrolled down at (320, 556)

# Scrolled down at (320, 556)

# 2.Mouse pause...

# 鼠标暂停...;当前线程==>MainThread ;线程数量==3

'''此时鼠标不起作用'''

# Scrolled down at (320, 556)

# Scrolled down at (320, 556)

# Pressed at (320, 556)

# Released at (320, 556)

# Scrolled down at (320, 556)

# Scrolled down at (320, 556)

'''估计是将队列中的剩余任务输出;参考原函数定义'''

# 3.Mouse start....

# 鼠标恢复...;当前线程==>MainThread ;线程数量==3

'''此时鼠标起作用'''

# Pressed at (320, 556)

# Released at (320, 556)

# Scrolled down at (320, 556)

# 4.Mouse stop....

# 鼠标监听停止;当前线程==>MainThread ;线程数量==3

# Scrolled down at (320, 556)

'''将队列中的剩余任务输出;鼠标监听退出,等待主线程完成'''

# 5.End all program!

# 当前线程==>MainThread ;线程数量==1

-------------------------------------------------------------------------------

from pynput import mouse,keyboardfrom collections import dequeimport threading,time,os,sys''' 1.说明: 1.0.tcy shanghai 2018/8/28 测试平台windows7 python3.7 pycharm20182.1 1.1. 一个鼠标监听器是一个线程。所有的回调将从线程调用。 1.2. 任何地方调用pynput.mouse.Listener.stop,或pynput.mouse.Listener.StopException 或从回调中返回False来停止监听器。 2.用途: 1.1.本函数主要用作鼠标监听 1.2.实现鼠标监听暂停,启动,停止;停止和销毁后不能再进行鼠标监听,暂停后可以恢复。 3.技术要点 1.1.采用 self.mouse_listion.stop()暂停监听 等价于self.mouse_listion.StopException 1.2.最好不要用self.mouse_listion.run(),测试出现一些异常;可能我理解不透,欢迎大神补充。 和上面程序差别在MouseClass.run()函数中。 '''class MouseClass(threading.Thread): def __init__(self, *args, **kwargs): super(MouseClass, self).__init__(*args, **kwargs) self.mouse_listion=mouse.Listener() self.__mouse_run_flag_=True # 用于暂停鼠标线程不挂起 self.__mouse_destroy_flag_=True #True鼠标监听不退出 def on_move(self,x, y ): print("Pointer moved to {0} {1}".format((x,y),time.ctime())) if not self.__mouse_destroy_flag_: #false鼠标监听停止 return False #注意:不要返回True,否则不能够暂停等功能 def on_click(self,x, y , button, pressed): print('{0} at{1}'.format('Pressed' if pressed else 'Released',(x, y))) #凸轮键松开鼠标监控停止 if (not self.__mouse_destroy_flag_) or (not pressed): #false鼠标监听停 return False def on_scroll(self,x, y ,dx, dy): print('Scrolled {0} at {1}'.format( 'down' if dy <0 else 'up',(x, y))) if not self.__mouse_destroy_flag_: #false鼠标监听停止 return False def run(self): while 1: with mouse.Listener( no_move = self.on_move,on_click = self.on_click,on_scroll = self.on_scroll, ) as self.mouse_listion: if self.__mouse_run_flag_: self.mouse_listion.join() else: self.mouse_listion.stop() # 暂停监听等价于下条语句 # self.mouse_listion.StopException #暂停监听等价于上条语句 if not self.__mouse_destroy_flag_: break def mouse_pause(self): self.__mouse_run_flag_ = False print('鼠标暂停...;当前线程==>%s ;线程数量==%d\n' % ( threading.current_thread().name, threading.activeCount())) def mouse_resume(self): self.__mouse_run_flag_=True print('鼠标恢复...;当前线程==>%s ;线程数量==%d\n' % ( threading.current_thread().name, threading.activeCount())) def mouse_destroy(self): self.__mouse_destroy_flag_=False # 鼠标监听停止 self.__mouse_run_flag_ = True print('鼠标监听停止;当前线程==>%s ;线程数量==%d\n' %( threading.current_thread().name, threading.activeCount()))#测试函数def mouse_test(): km=MouseClass() print('1.Start runing...') km.start() time.sleep(5) print('2.Mouse pause...') km.mouse_pause() time.sleep(5) print('3.Mouse start....') km.mouse_resume() time.sleep(5) print('4.Mouse stop....') km.mouse_destroy()#任选一个停止 time.sleep(5) print('5.End all program!') print('当前线程==>%s ;线程数量==%d\n' %( threading.current_thread().name, threading.activeCount())) mouse_test()#输出结果:同上例程。


又有好消息!梦幻西游同时最高在线人数突破275万
机械键盘怎么设置宏