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,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,或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()


#输出结果:同上例程。

 

  • 8
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
好的,我来回答您的问题。 pynput是Python的一个第三方库,可以用来控制键盘鼠标。它提供了两个主要的模块:keyboard和mouse。以下是pynput的详细用法: 1. 安装pynput 在终端输入以下命令即可安装pynput: ``` pip install pynput ``` 2. 控制键盘 使用pynput控制键盘需要导入keyboard模块,然后创建一个Listener对象并定义回调函数来监听键盘事件。以下是一个示例代码: ```python from pynput import keyboard def on_press(key): try: print('Key {} pressed.'.format(key.char)) except AttributeError: print('Special key {} pressed.'.format(key)) def on_release(key): print('Key {} released.'.format(key)) with keyboard.Listener(on_press=on_press, on_release=on_release) as listener: listener.join() ``` 这个代码可以监听键盘按下和松开的事件,并打印出对应的键位信息。 3. 控制鼠标 使用pynput控制鼠标需要导入mouse模块,然后创建一个Controller对象来模拟鼠标操作。以下是一个示例代码: ```python from pynput.mouse import Button, Controller mouse = Controller() # 鼠标移动到(x, y)位置 mouse.position = (100, 200) # 鼠标左键单击 mouse.click(Button.left, 1) # 鼠标右键单击 mouse.click(Button.right, 1) # 鼠标滚轮向上滚动10个单位 mouse.scroll(0, 10) ``` 这个代码可以模拟鼠标移动、左键单击、右键单击和滚轮滚动操作。 以上就是pynput的详细用法,希望能对您有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值