电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

python使用pynput庫操作、監(jiān)控你的鼠標(biāo)和鍵盤

瀏覽:4日期:2022-06-25 15:13:30
楔子

python是一門很神奇的語言,原因在于它有很多的庫可以實(shí)現(xiàn)各種意想不到的功能。當(dāng)然我們這次介紹的庫所實(shí)現(xiàn)的功能卻是已經(jīng)很常見了,就是操作、監(jiān)控你的鼠標(biāo)和鍵盤。如果你寫過游戲,那么即使不用下面即將介紹的庫也可以實(shí)現(xiàn)對鼠標(biāo)、鍵盤的操作以及監(jiān)控。

當(dāng)然我們下面介紹庫:pynput,是專門針對鼠標(biāo)和鍵盤的,至于pygame、pyglet等游戲框架雖然也提供了鼠標(biāo)、鍵盤的監(jiān)控事件,但它們畢竟是用來開發(fā)游戲的,還提供了創(chuàng)建窗口、圖形繪制、物體的碰撞檢測等等很多復(fù)雜的功能。如果只是單純的操作鼠標(biāo)和鍵盤,使用這種游戲框架有點(diǎn)小題大做了,下面我們就來看看這個(gè)名叫pynput的模塊吧,看看它的使用方法。

鼠標(biāo)操作鼠標(biāo)

鼠標(biāo)無非就是'點(diǎn)擊按住不放'、'松開'、'雙擊'(針對左右鍵),滑動滾輪,移動鼠標(biāo)等等,這些功能已經(jīng)基本上覆蓋百分之八九十的日常使用了。至于剩下的一小部分,可能就是打游戲用到的'側(cè)鍵',但是我們不介紹那么多,先來看看常用的吧。

from pynput.mouse import Button, Controller# 實(shí)例化Controller得到一個(gè)可以操作鼠標(biāo)的對象mouse = Controller()# mouse.position: 獲取當(dāng)前鼠標(biāo)位置。# 屏幕左上角坐標(biāo)為(0, 0) 右下角為(屏幕寬度, 屏幕高度)print(f'當(dāng)前鼠標(biāo)位置: {mouse.position}') # 當(dāng)前鼠標(biāo)位置: (881, 467)# 給mouse.position賦值等于移動鼠標(biāo),這里相當(dāng)于移動到(100, 100)的位置# 如果坐標(biāo)小于0,那么等于0。如果超出屏幕范圍,那么等于最大范圍mouse.position = (100, 100) # 此方法等價(jià)于mouse.move(100, 100)print(f'當(dāng)前鼠標(biāo)位置: {mouse.position}') # 當(dāng)前鼠標(biāo)位置: (100, 100)# 按下左鍵,同理Button.right是右鍵mouse.press(Button.left)# 松開左鍵mouse.release(Button.left)# 上面兩行連在一起等于一次單擊。如果上面兩行緊接著再重復(fù)一次,那么整體會實(shí)現(xiàn)雙擊的效果# 因?yàn)閮纱螁螕羰沁B續(xù)執(zhí)行的,沒有等待時(shí)間。如果中間來一個(gè)time.sleep幾秒,那么就變成兩次單擊了# 當(dāng)然鼠標(biāo)點(diǎn)擊我們有更合適的辦法,使用click函數(shù)# 該函數(shù)接收兩個(gè)參數(shù):點(diǎn)擊鼠標(biāo)的哪個(gè)鍵、以及點(diǎn)擊次數(shù)# 這里連續(xù)點(diǎn)擊兩次,等于雙擊mouse.click(Button.right, 2)

還有一個(gè)功能比較常見,我們需要拿出來單獨(dú)說,是因?yàn)檫@個(gè)需要找張圖片來演示。

python使用pynput庫操作、監(jiān)控你的鼠標(biāo)和鍵盤

這種情況我們?nèi)绻胫栏鄡?nèi)容,需要向下滑動,也就是沿著y軸滑動

from pynput.mouse import Controllermouse = Controller()# 垂直方向、沿著y軸滑動# 第一個(gè)參數(shù)是針對水平方向的,暫時(shí)不用管,為0則表示不變。# 第二個(gè)參數(shù)是針對垂直方向的,大于0表示向下,小于0表示向上mouse.scroll(0, 2)

我們上面是向下移動兩個(gè)step,什么是step呢?

python使用pynput庫操作、監(jiān)控你的鼠標(biāo)和鍵盤

點(diǎn)擊一次就會移動一個(gè)step

python使用pynput庫操作、監(jiān)控你的鼠標(biāo)和鍵盤

同理這個(gè)就是在水平方向上移動

from pynput.mouse import Controllermouse = Controller()# 大于0向右,小于0向左mouse.scroll(3, 0)

可能有人好奇,可不可以水平、垂直兩個(gè)方向同時(shí)移動呢?答案是不可以,因?yàn)檫@是模擬人來點(diǎn)擊,無非就是效率的問題,所以也要符合常理,因?yàn)槲覀兤綍r(shí)用鼠標(biāo)顯然不可能兩個(gè)方向同時(shí)移動。

監(jiān)控鼠標(biāo)

我們可以使用pynput操作鼠標(biāo),同時(shí)pynput也支持我們在手動操作鼠標(biāo)的時(shí)候記錄我們做了哪些操作,同理后面介紹的鍵盤也是一樣的,都分為操作、監(jiān)控兩部分。

from pynput.mouse import Listenerdef on_move(x, y): print(f'鼠標(biāo)移動到: ({x}, {y})')def on_click(x, y, button, is_press): print(f'鼠標(biāo){button}鍵在({x}, {y})處{’按下’ if is_press else ’松開’}')def on_scroll(x, y, dx, dy): if dx: print(f'滑輪在({x}, {y})處向{’右’ if dx > 0 else ’左’}滑') else: print(f'滑輪在({x}, {y})處向{’下’ if dy > 0 else ’上’}滑')with Listener( # 上面函數(shù)名不能變,記得對應(yīng) on_move=on_move, on_click=on_click, on_scroll=on_scroll) as listener: listener.join()'''鼠標(biāo)移動到: (1090, 369)鼠標(biāo)移動到: (1090, 368)鼠標(biāo)移動到: (1090, 368)鼠標(biāo)移動到: (1090, 367)鼠標(biāo)Button.left鍵在(1090, 367)處按下鼠標(biāo)Button.left鍵在(1090, 367)處松開滑輪在(1090, 367)處向上滑'''

上面實(shí)例化一個(gè)Listener時(shí),相當(dāng)于開啟了一個(gè)線程,因?yàn)長istener這個(gè)類繼承自threading.Thread。所以我們調(diào)用listener.join()相當(dāng)于就阻塞在這里了,會一直監(jiān)控鼠標(biāo)事件。所以我們需要一個(gè)機(jī)制來讓它停下來:

from pynput.mouse import Listener, Buttondef on_move(x, y): print(f'鼠標(biāo)移動到: ({x}, {y})')def on_click(x, y, button, is_press): if button == Button.right: # 一旦當(dāng)某個(gè)事件返回了False,那么就會停止了 # 這里我們選擇右鍵吧 print('點(diǎn)擊右鍵,停止監(jiān)控') return False print(f'鼠標(biāo){button}鍵在({x}, {y})處{’按下’ if is_press else ’松開’}')def on_scroll(x, y, dx, dy): if dx: print(f'滑輪在({x}, {y})處向{’右’ if dx > 0 else ’左’}滑') else: print(f'滑輪在({x}, {y})處向{’下’ if dy > 0 else ’上’}滑')with Listener( on_move=on_move, on_click=on_click, on_scroll=on_scroll) as listener: listener.join()'''鼠標(biāo)Button.left鍵在(881, 606)處按下鼠標(biāo)Button.left鍵在(881, 606)處松開點(diǎn)擊右鍵,停止監(jiān)控'''

另外執(zhí)行的時(shí)候,你會發(fā)現(xiàn),程序會一直阻塞在listener.join()處,如果下面還有代碼要怎么執(zhí)行呢?

from pynput.mouse import Listenerdef on_move(x, y): print(f'鼠標(biāo)移動到: ({x}, {y})')def on_click(x, y, button, is_press): print(f'鼠標(biāo){button}鍵在({x}, {y})處{’按下’ if is_press else ’松開’}')def on_scroll(x, y, dx, dy): if dx: print(f'滑輪在({x}, {y})處向{’右’ if dx > 0 else ’左’}滑') else: print(f'滑輪在({x}, {y})處向{’下’ if dy > 0 else ’上’}滑')listener = Listener( on_move=on_move, on_click=on_click, on_scroll=on_scroll)# 啟動線程,主線程會繼續(xù)向下執(zhí)行l(wèi)istener.start()print('執(zhí)行下面代碼')print(123)# 此外我們也可以不通過讓事件返回False,結(jié)束監(jiān)聽# 而是就讓它一直監(jiān)聽,等我們的邏輯執(zhí)行完畢之后,手動結(jié)束監(jiān)聽# 結(jié)束監(jiān)聽是通listener.stop()import timetime.sleep(3) # 這里睡3s,相當(dāng)于執(zhí)行一段長邏輯了,否則子線程還未啟動,就直接被主線程強(qiáng)制stop掉了# 結(jié)束監(jiān)聽listener.stop()print('程序結(jié)束')'''執(zhí)行下面代碼123鼠標(biāo)移動到: (850, 525)鼠標(biāo)Button.left鍵在(850, 525)處按下鼠標(biāo)Button.left鍵在(850, 525)處松開鼠標(biāo)Button.right鍵在(850, 525)處按下鼠標(biāo)Button.right鍵在(850, 525)處松開程序結(jié)束'''鍵盤

操作鍵盤也比較簡單,無非也是按下某個(gè)鍵、松開某個(gè)鍵,或者在按下某個(gè)鍵(或者多個(gè))不松開的前提下、按下另一個(gè)鍵,下面來操作一下。方法和操作鼠標(biāo)比較類似:

from pynput.keyboard import Key, Controller# 實(shí)例化一個(gè)可以操作鍵盤的對象keyboard = Controller()# 按下a鍵,小寫keyboard.press('a')# 松開a鍵keyboard.release('a')# 按下A鍵,大寫keyboard.press('A')# 松開A鍵keyboard.release('A')'''像英文字符、數(shù)字等等直接輸入相應(yīng)的字符即可但如果是shift、ctrl等鍵,那么需要調(diào)用Key里面屬性'''# 按下大寫鍵keyboard.press(Key.caps_lock)# 松開大寫鍵keyboard.release(Key.caps_lock)

下面來看看如何在按住某個(gè)鍵不放的前提下,按下另外的鍵

from pynput.keyboard import Key, Controller# 實(shí)例化一個(gè)可以操作鍵盤的對象keyboard = Controller()# 注意調(diào)用的方法,是pressed,不是press# shift有兩個(gè)鍵,一個(gè)是左邊的、一個(gè)是右邊的with keyboard.pressed(Key.shift_l): keyboard.press('1') keyboard.release('1')'''上面的結(jié)果會輸出一個(gè)感嘆號,另外我們鍵盤的上方有數(shù)字鍵、右側(cè)也有數(shù)字鍵。我們平時(shí)輸出感嘆號用的都是shift加上鍵盤上方的數(shù)字鍵,用右側(cè)的數(shù)字鍵會沒有效果但是對于pynput則沒有區(qū)別,都會輸出感嘆號,因?yàn)槟阌面I盤上方和有方的數(shù)字鍵打出來的都是數(shù)字'''# 如果要同時(shí)按下多個(gè)鍵呢?那就輸入多個(gè)鍵即可,細(xì)心的老鐵可能發(fā)現(xiàn)了,這正是pycharm啟動程序的快捷鍵with keyboard.pressed(Key.shift_l, Key.ctrl_l): keyboard.press(Key.f10)監(jiān)控

監(jiān)控鍵盤使用的方法和監(jiān)控鼠標(biāo)非常類似,依舊是實(shí)例化一個(gè)類Listener

from pynput.keyboard import Key, Listener# 此時(shí)的Listener是從keyboard里面導(dǎo)入的def on_press(key): # 當(dāng)按下esc,結(jié)束監(jiān)聽 if key == Key.esc: print(f'你按下了esc,監(jiān)聽結(jié)束') return False print(f'你按下了{(lán)key}鍵')def on_release(key): print(f'你松開了{(lán)key}鍵')with Listener(on_press=on_press, on_release=on_release) as listener: listener.join()'''你按下了’a’鍵你松開了’a’鍵你按下了Key.shift鍵你松開了Key.shift鍵你按下了Key.right鍵你松開了Key.right鍵你按下了Key.down鍵你松開了Key.down鍵你按下了esc,監(jiān)聽結(jié)束'''

所以定義函數(shù)的方式和操作鼠標(biāo)也是類似的,該Listener同樣會開啟一個(gè)線程。另外這里的key打印的是’Key.xxx’,我們轉(zhuǎn)成字符串其實(shí)已經(jīng)可以判斷按下了哪個(gè)鍵了。不過key里面還是提供了方法,讓我們獲取操作的鍵

from pynput.keyboard import Key, Listenerdef on_press(key): ''' 我們之前說按下某個(gè)鍵的時(shí)候,如果是英文字符、數(shù)字這些,直接輸入相應(yīng)的字符即可 但如果是ctrl、shift這些鍵,需要從keyboard.Key里面獲取 那么同理,在這里我們?nèi)绻胍@取具體按下、松開哪個(gè)鍵的話,那么可以調(diào)用key.char或者key.name 如果是英文字符、數(shù)字這些,調(diào)用key.char;如果是ctrl、shift、f1、f12這些鍵,則需要調(diào)用key.name ''' if key == Key.esc: print(f'你按下了esc,監(jiān)聽結(jié)束') return False print(f'你按下了{(lán)key.char if hasattr(key, ’char’) else key.name}鍵')def on_release(key): print(f'你松開了{(lán)key.char if hasattr(key, ’char’) else key.name}鍵')with Listener(on_press=on_press, on_release=on_release) as listener: listener.join()'''你按下了shift鍵你松開了shift鍵你按下了a鍵你松開了a鍵你按下了esc,監(jiān)聽結(jié)束'''

此時(shí)返回的就是普通的鍵的名稱,沒有Key.這個(gè)前綴了。以上就是這個(gè)模塊的內(nèi)容了,具體怎么使用可以由你自己決定。另外這個(gè)模塊在Linux上也是可以運(yùn)行的,但前提是必須有顯示器,而公司用的服務(wù)器肯定是不帶顯示器的,所以不推薦Linux上使用

以上就是python使用pynput庫操作、監(jiān)控你的鼠標(biāo)和鍵盤的詳細(xì)內(nèi)容,更多關(guān)于python pynput庫操作監(jiān)控鼠標(biāo)鍵盤的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: cnc精密加工_数控机械加工_非标平键定制生产厂家_扬州沃佳机械有限公司 | 保镖公司-私人保镖-深圳保镖公司【环宇兄弟保镖】 | 一体式钢筋扫描仪-楼板测厚仪-裂缝检测仪-泰仕特(北京) | 电池挤压试验机-自行车喷淋-车辆碾压试验装置-深圳德迈盛测控设备有限公司 | atcc网站,sigma试剂价格,肿瘤细胞现货,人结肠癌细胞株购买-南京科佰生物 | 温州食堂承包 - 温州市尚膳餐饮管理有限公司| 江苏密集柜_电动_手动_移动_盛隆柜业江苏档案密集柜厂家 | 铝镁锰板_铝镁锰合金板_铝镁锰板厂家_铝镁锰金属屋面板_安徽建科 | 数控走心机-走心机价格-双主轴走心机-宝宇百科 | 彩超机-黑白B超机-便携兽用B超机-多普勒彩超机价格「大为彩超」厂家 | 济南货架定做_仓储货架生产厂_重型货架厂_仓库货架批发_济南启力仓储设备有限公司 | 济南品牌包装设计公司_济南VI标志设计公司_山东锐尚文化传播 | 今日娱乐圈——影视剧集_八卦娱乐_明星八卦_最新娱乐八卦新闻 | 防水套管_柔性防水套管_刚性防水套管-巩义市润达管道设备制造有限公司 | 石英砂矿石色选机_履带辣椒色选机_X光异物检测机-合肥幼狮光电科技 | 新密高铝耐火砖,轻质保温砖价格,浇注料厂家直销-郑州荣盛窑炉耐火材料有限公司 | 双效节能浓缩器-热回流提取浓缩机组-温州市利宏机械 | 高低温试验箱-模拟高低温试验箱订制-北京普桑达仪器科技有限公司【官网】 | 冻干机(冷冻干燥机)_小型|实验型|食品真空冷冻干燥机-松源 | 数显恒温油浴-电砂浴-高温油浴振荡器-常州迈科诺仪器有限公司 | 食品无尘净化车间,食品罐装净化车间,净化车间配套风淋室-青岛旭恒洁净技术有限公司 | 时代北利离心机,实验室离心机,医用离心机,低速离心机DT5-2,美国SKC采样泵-上海京工实业有限公司 工业电炉,台车式电炉_厂家-淄博申华工业电炉有限公司 | 广域铭岛Geega(际嘉)工业互联网平台-以数字科技引领行业跃迁 | 餐饮小吃技术培训-火锅串串香培训「何小胖培训」_成都点石成金[官网] | 光栅尺_Magnescale探规_磁栅尺_笔式位移传感器_苏州德美达 | 云南成人高考_云南成考网| 不锈钢复合板|钛复合板|金属复合板|南钢集团安徽金元素复合材料有限公司-官网 | 上海公司注册-代理记账-招投标审计-上海昆仑扇财税咨询有限公司 上海冠顶工业设备有限公司-隧道炉,烘箱,UV固化机,涂装设备,高温炉,工业机器人生产厂家 | 智成电子深圳tdk一级代理-提供TDK电容电感贴片蜂鸣器磁芯lambda电源代理经销,TDK代理商有哪些TDK一级代理商排名查询。-深圳tdk一级代理 | 稳尚教育加盟-打造高考志愿填报平台_新高考志愿填报加盟_学业生涯规划加盟 | 薪动-人力资源公司-灵活用工薪资代发-费用结算-残保金优化-北京秒付科技有限公司 | 生鲜配送系统-蔬菜食材配送管理系统-连锁餐饮订货配送软件-挪挪生鲜供应链管理软件 | 冷水机-冰水机-冷冻机-冷风机-本森智能装备(深圳)有限公司 | 铸钢件厂家-铸钢齿轮-减速机厂家-淄博凯振机械有限公司 | 山东信蓝建设有限公司官网| 铝镁锰板_铝镁锰合金板_铝镁锰板厂家_铝镁锰金属屋面板_安徽建科 | 阜阳在线-阜阳综合门户 | 澳门精准正版免费大全,2025新澳门全年免费,新澳天天开奖免费资料大全最新,新澳2025今晚开奖资料,新澳马今天最快最新图库 | 热闷罐-高温罐-钢渣热闷罐-山东鑫泰鑫智能热闷罐厂家 | 耐酸碱胶管_耐腐蚀软管总成_化学品输送软管_漯河利通液压科技耐油耐磨喷砂软管|耐腐蚀化学软管 | 食品机械专用传感器-落料放大器-低价接近开关-菲德自控技术(天津)有限公司 |