jjzjj

【Python】监听键盘鼠标,基于pynput库

亦梦亦醒乐逍遥 2023-09-27 原文

目录

前言

首先放上官网链接

示例代码

模拟输入

监控输入

按键与鼠标宏

测试时的问题:按键按下不弹起的bug


前言

键盘输入我们第一时间会想到win32api,这货还行,就是稍微繁琐了点,底层了点

Windows平台Python编程必会模块之pywin32_顺其自然~的博客-CSDN博客_python pywin32

如果想监听键盘,网上大量的文章都是pyHook,但是这货是为python2服务的,然后python3要用就得经过复杂的途径,所以监听键盘用这个很难搞。

终于,我发现了pynput库,简直是救星!

对于键盘输入,pynput非常简洁,并且提供了组合键的简洁写法

对于键盘监听,pynput也非常简洁,关键是pynput一个库就实现了我们要的所有功能!

安装就pip即可,不会真有人搜到这里还不会用pip吧。

好,进入学习

首先放上官网链接

官网pynput Package Documentation — pynput 1.7.6 documentation

关于键盘Handling the keyboard — pynput 1.7.6 documentation

示例代码

模拟输入

from pynput import keyboard,mouse
from pynput.keyboard import Key
from pynput.mouse import Button

# 键盘
# 生成了一个控制器类
key_ctrl = keyboard.Controller()

# 简单按下放松
key_ctrl.press('a')
key_ctrl.release('a')

# 组合键写法1,顺序press,倒序release,比较麻烦
key_ctrl.press(Key.shift)
key_ctrl.press('a')
key_ctrl.release(Key.shift)
key_ctrl.release('a')

# 组合键写法2,使用with,自动释放,代码量缩小一半
with key_ctrl.pressed(Key.shift):
    key_ctrl.press('a')
    key_ctrl.release('a')

# 整段文字输入
key_ctrl.type('text')

# 鼠标
mouse_ctrl=mouse.Controller()
mouse_ctrl.scroll(0,-1) # 左右,上下,-1是往下滚,有小伙伴好奇,怎么能左右滚呢?
#当然是shift滚轮啦

print(mouse_ctrl.position)
mouse_ctrl.position=(0,0) # 绝对移动,直接设置坐标
mouse_ctrl.move(80,10) # 相对移动,通过函数实现
mouse_ctrl.click(Button.left,1) #选择键和次数
mouse_ctrl.press(Button.left) # 按下与释放,选择键
mouse_ctrl.release(Button.left)

监控输入

from pynput import keyboard
from pynput import mouse

def on_press(key):
    """定义按下时候的响应,参数传入key"""
    try:
        print(f'{key.char} down')
    except AttributeError:
        print(f'{key} down')


def on_release(key):
    """定义释放时候的响应"""
    print(f'{key} up')

def on_move(x,y):
    print('move to',x,y)

def on_click(x,y,button,pressed):
    print('click at',x,y,button,pressed)

def on_scroll(x,y,dx,dy):
    print('scroll at',x,y,'by',dx,dy)

# 监听写法1
def listen_key_block():
    with keyboard.Listener(
            on_press=on_press, on_release=on_release) as listener:
        listener.join()  # 加入线程池,阻塞写法


# 监听写法2
def listen_key_nblock():
    listener = keyboard.Listener(
        on_press=on_press, on_release=on_release
    )
    listener.start()  # 启动线程

def listen_mouse_nblock():
    listener = mouse.Listener(
        on_move=None, # 因为on_move太多输出了,就不放进来了,有兴趣可以加入
        on_click=on_click,
        on_scroll=on_scroll
    )
    listener.start()


if __name__ == '__main__':
    listen_mouse_nblock()
    listen_key_nblock()
    while True: # 这里应该用一个循环维持主线程,否则主线程结束了子线程就自动结束了
        pass

按键与鼠标宏

# 注意,按键类型有两种,一种是'pynput.keyboard._win32.KeyCode',另一种就是下面的枚举类

# 注意按键的模块是这个,'pynput.keyboard.Key',下面举出部分枚举,实际上还有更多

_MODIFIER_KEYS = (
    (Key.alt_gr, (Key.alt_gr.value,)),
    (Key.alt,    (Key.alt.value,   Key.alt_l.value,   Key.alt_r.value)),
    (Key.cmd,    (Key.cmd.value,   Key.cmd_l.value,   Key.cmd_r.value)),
    (Key.ctrl,   (Key.ctrl.value,  Key.ctrl_l.value,  Key.ctrl_r.value)),
    (Key.shift,  (Key.shift.value, Key.shift_l.value, Key.shift_r.value)))

测试时的问题:按键按下不弹起的bug

【Python】win32api调用后ctrl键弹不起,无法释放的原因_亦梦亦醒乐逍遥的博客-CSDN博客

有关【Python】监听键盘鼠标,基于pynput库的更多相关文章

  1. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  2. ruby - 在 Ruby 中用键盘诅咒数组浏览 - 2

    我正在尝试在Ruby中制作一个cli应用程序,它接受一个给定的数组,然后将其显示为一个列表,我可以使用箭头键浏览它。我觉得我已经在Ruby中看到一个库已经这样做了,但我记不起它的名字了。我正在尝试对soundcloud2000中的代码进行逆向工程做类似的事情,但他的代码与SoundcloudAPI的使用紧密耦合。我知道cursesgem,我正在考虑更抽象的东西。广告有没有人见过可以做到这一点的库或一些概念证明的Ruby代码可以做到这一点? 最佳答案 我不知道这是否是您正在寻找的,但也许您可以使用我的想法。由于我没有关于您要完成的工作

  3. Python 相当于 Perl/Ruby ||= - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。

  4. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  5. 叮咚买菜基于 Apache Doris 统一 OLAP 引擎的应用实践 - 2

    导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵

  6. 华为OD机试用Python实现 -【明明的随机数】 2023Q1A - 2

    华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o

  7. python - 如何读取 MIDI 文件、更改其乐器并将其写回? - 2

    我想解析一个已经存在的.mid文件,改变它的乐器,例如从“acousticgrandpiano”到“violin”,然后将它保存回去或作为另一个.mid文件。根据我在文档中看到的内容,该乐器通过program_change或patch_change指令进行了更改,但我找不到任何在已经存在的MIDI文件中执行此操作的库.他们似乎都只支持从头开始创建的MIDI文件。 最佳答案 MIDIpackage会为您完成此操作,但具体方法取决于midi文件的原始内容。一个MIDI文件由一个或多个音轨组成,每个音轨是十六个channel中任何一个上的

  8. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

  9. 「Python|Selenium|场景案例」如何定位iframe中的元素? - 2

    本文主要介绍在使用Selenium进行自动化测试或者任务时,对于使用了iframe的页面,如何定位iframe中的元素文章目录场景描述解决方案具体代码场景描述当我们在使用Selenium进行自动化测试的时候,可能会遇到一些界面或者窗体是使用HTML的iframe标签进行承载的。对于iframe中的标签,如果直接查找是无法找到的,会抛出没有找到元素的异常。比如近在咫尺的例子就是,CSDN的登录窗体就是使用的iframe,大家可以尝试通过F12开发者模式查看到的tag_name,class_name,id或者xpath来定位中的页面元素,会抛出NoSuchElementException异常。解决

  10. kvm虚拟机安装centos7基于ubuntu20.04系统 - 2

    需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/opt目录下创建一个10G大小的raw格式的虚拟磁盘CentOS-7-x86_64.raw命令格式:qemu-imgcreate-f磁盘格式磁盘名称磁盘大小qemu-imgcreate-f磁盘格式-o?1.创建磁盘qemu-imgcreate-fraw/opt/CentOS-7-x86_64.raw10G执行效果#ls/opt/CentOS-7-x86_64.raw2.安装虚拟机使用virt-install命令,基于我们提供的系统镜像和虚拟磁盘来创建一个虚拟机,另外在创建虚拟机之前,提前打开vnc客户端,在创建虚拟机的时候,通过vnc

随机推荐