自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

用 Python 操作你的鼠標(biāo)和鍵盤

開(kāi)發(fā) 前端
Python 有很多的庫(kù)可以實(shí)現(xiàn)各種各樣的功能,比如使用 pynput 操作你的鼠標(biāo)和鍵盤。如果你寫過(guò)游戲,那么用 pygame 和 pyglet 也可以,只不過(guò)它們畢竟是開(kāi)發(fā)游戲的,要只是為了操作鼠標(biāo)和鍵盤,用它們就有點(diǎn)小題大做了。

楔子

Python 有很多的庫(kù)可以實(shí)現(xiàn)各種各樣的功能,比如使用 pynput 操作你的鼠標(biāo)和鍵盤。如果你寫過(guò)游戲,那么用 pygame 和 pyglet 也可以,只不過(guò)它們畢竟是開(kāi)發(fā)游戲的,要只是為了操作鼠標(biāo)和鍵盤,用它們就有點(diǎn)小題大做了。

下面來(lái)看看 pynput 這個(gè)庫(kù)的用法。

操作鼠標(biāo)

鼠標(biāo)的操作無(wú)非就是點(diǎn)擊按住不放、松開(kāi)、雙擊,滑動(dòng)滾輪,移動(dòng)鼠標(biāo)等等。

from pynput.mouse import Button, Controller

# 實(shí)例化 Controller 得到一個(gè)可以操作鼠標(biāo)的對(duì)象
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 賦值等于移動(dòng)鼠標(biāo),這里相當(dāng)于移動(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)
# 松開(kāi)左鍵
mouse.release(Button.left)
# 上面兩行連在一起等于一次單擊
# 如果這兩行緊接著再重復(fù)一次,那么整體會(huì)實(shí)現(xiàn)雙擊的效果
# 因?yàn)閮纱螁螕羰沁B續(xù)執(zhí)行的,沒(méi)有等待時(shí)間。
# 如果中間來(lái)一個(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)

然后是滑動(dòng)滾輪,這個(gè)需要找張圖片來(lái)演示。

圖片圖片

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

from pynput.mouse import Controller

mouse = Controller()

# 垂直方向、沿著 y 軸向下滑動(dòng) 2 個(gè) step
# 第一個(gè)參數(shù)針對(duì)水平方向,第二個(gè)參數(shù)針對(duì)垂直方向
# 具體的值表示移動(dòng)的 step 數(shù)
mouse.scroll(0, 2)

那么問(wèn)題來(lái)了,什么是 step 呢?

圖片圖片

點(diǎn)擊一次就會(huì)移動(dòng)一個(gè) step。

圖片圖片

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

from pynput.mouse import Controller

mouse = Controller()
# 水平方向:大于 0 向右,小于 0 向左
# 垂直方向:大于 0 向下,小于 0 向上
mouse.scroll(3, 0)

可能有人好奇,可不可以水平、垂直兩個(gè)方向同時(shí)移動(dòng)呢?答案是不可以,因?yàn)槭悄M人來(lái)點(diǎn)擊,無(wú)非就是效率的問(wèn)題,所以也要符合常理,而我們平時(shí)用鼠標(biāo)顯然不可能兩個(gè)方向同時(shí)移動(dòng)。

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

除了操作鼠標(biāo)之外,pynput 也支持監(jiān)控,記錄我們做了哪些操作。

from pynput.mouse import Listener, Button

def on_move(x, y):
    print(f"鼠標(biāo)移動(dòng)到: ({x}, {y})")

def on_click(x, y, button, is_press):
    if button == Button.left:
        button = "左鍵"
    else:
        button = "右鍵"
    if is_press:
        operator = "按下"
    else:
        operator = "松開(kāi)"

    print(f"鼠標(biāo){button}在 ({x}, {y}) 處{operator}")

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)移動(dòng)到: (783.17578125, 302.7890625)
鼠標(biāo)移動(dòng)到: (777.2734375, 302.7890625)
鼠標(biāo)移動(dòng)到: (769.5703125, 302.7890625)
鼠標(biāo)移動(dòng)到: (758.74609375, 302.7890625)
滑輪在 (111.03515625, 609.31640625) 處向上滑
滑輪在 (111.03515625, 609.31640625) 處向上滑
滑輪在 (111.03515625, 609.31640625) 處向上滑
滑輪在 (111.03515625, 609.31640625) 處向左滑
滑輪在 (111.03515625, 609.31640625) 處向左滑
鼠標(biāo)左鍵在 (649.44140625, 448.4765625) 處按下
鼠標(biāo)左鍵在 (649.44140625, 448.4765625) 處松開(kāi)
"""

上面實(shí)例化 Listener 時(shí),相當(dāng)于開(kāi)啟了一個(gè)線程,因?yàn)?Listener 這個(gè)類繼承自 Thread。所以我們調(diào)用 listener.join() 就相當(dāng)于阻塞在這里了,會(huì)一直監(jiān)控鼠標(biāo)事件。

如果回調(diào)函數(shù)里面返回了 False,那么監(jiān)聽(tīng)會(huì)自動(dòng)停止。

from pynput.mouse import Listener, Button

def on_click(x, y, button, is_press):
    if button == Button.right:
        print("點(diǎn)擊鼠標(biāo)右鍵,監(jiān)聽(tīng)結(jié)束")
        return False
    if is_press:
        operator = "按下"
    else:
        operator = "松開(kāi)"

    print(f"鼠標(biāo)左鍵在 ({x}, {y}) 處{operator}")


with Listener(
    on_click=on_click,
) as listener:
    listener.join()
"""
鼠標(biāo)左鍵在 (28.453125, 610.71484375) 處按下
鼠標(biāo)左鍵在 (28.453125, 610.71484375) 處松開(kāi)
點(diǎn)擊鼠標(biāo)右鍵,監(jiān)聽(tīng)結(jié)束
"""

當(dāng)然啦,程序在創(chuàng)建 Listener 的時(shí)候,使用的是 with 語(yǔ)句,會(huì)一直阻塞在這里。如果不希望它阻塞,還可以這么做。

listener = Listener(
    on_move=on_move,
    on_click=on_click,
    on_scroll=on_scroll)

# 啟動(dòng)子線程開(kāi)啟監(jiān)聽(tīng),主線程會(huì)繼續(xù)向下執(zhí)行
listener.start()
# 如果不想監(jiān)聽(tīng)了,可以調(diào)用 stop 方法結(jié)束
listener.stop()

操作鍵盤

操作鍵盤也比較簡(jiǎn)單,無(wú)非也是按下某個(gè)鍵、松開(kāi)某個(gè)鍵,在按下某個(gè)鍵(或者多個(gè))不松開(kāi)的前提下按下另一個(gè)鍵。

下面來(lái)操作一下,方法和操作鼠標(biāo)比較類似。

from pynput.keyboard import Key, Controller

# 實(shí)例化一個(gè)可以操作鍵盤的對(duì)象
keyboard = Controller()

# 按下 a 鍵,小寫
keyboard.press("a")
# 松開(kāi) a 鍵
keyboard.release("a")

# 按下 A 鍵,大寫
keyboard.press("A")
# 松開(kāi) A 鍵
keyboard.release("A")
"""
像英文字符、數(shù)字等等直接輸入相應(yīng)的字符即可
但如果是 shift、ctrl 等鍵,那么需要調(diào)用 Key 里面屬性
"""
# 按下大寫鍵
keyboard.press(Key.caps_lock)
# 松開(kāi)大寫鍵
keyboard.release(Key.caps_lock)

然后是按住某個(gè)鍵不放的前提下,按下另外的鍵。

from pynput.keyboard import Key, Controller

keyboard = Controller()

# shift 有兩個(gè)鍵,一個(gè)是左邊的、一個(gè)是右邊的,此時(shí)相當(dāng)于輸入感嘆號(hào)
with keyboard.pressed(Key.shift_l):
    keyboard.press("1")
    keyboard.release("1")

# 如果要同時(shí)按下多個(gè)鍵,那就輸入多個(gè)鍵即可
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

def on_press(key):
    # 當(dāng)按下esc,結(jié)束監(jiān)聽(tīng)
    if key == Key.esc:
        print(f"你按下了 esc,監(jiān)聽(tīng)結(jié)束")
        return False
    print(f"你按下了 {key} 鍵")

def on_release(key):
    print(f"你松開(kāi)了 {key} 鍵")


with Listener(
    on_press=on_press, 
    on_release=on_release
) as listener:
    listener.join()
"""
你按下了 'a' 鍵
你松開(kāi)了 'a' 鍵
你按下了 Key.backspace 鍵
你松開(kāi)了 Key.backspace 鍵
你按下了 Key.shift 鍵
你松開(kāi)了 Key.shift 鍵
你按下了 'c' 鍵
你松開(kāi)了 'c' 鍵
你按下了 Key.enter 鍵
你松開(kāi)了 Key.enter 鍵
你按下了 esc,監(jiān)聽(tīng)結(jié)束
"""

以上就是這個(gè)模塊的基本內(nèi)容,具體怎么使用由你自己決定。另外這個(gè)模塊在 Linux 上也是可以運(yùn)行的,但前提是必須有顯示器。

責(zé)任編輯:武曉燕 來(lái)源: 古明地覺(jué)的編程教室
相關(guān)推薦

2021-01-20 14:45:10

網(wǎng)絡(luò)安全鼠標(biāo)鍵盤

2009-03-20 11:31:12

Windows 7微軟快捷鍵

2021-08-23 15:24:40

0day黑客漏洞

2017-06-12 13:59:11

2013-11-11 17:07:49

Windows 8.1問(wèn)題

2018-04-26 16:35:44

PythonMySQL存儲(chǔ)

2011-05-06 10:31:36

筆記本鍵盤鼠標(biāo)

2018-10-16 08:40:56

Linux鎖住鍵盤桌面應(yīng)用

2021-02-05 15:50:27

PythonShell命令

2021-12-20 15:06:09

JekyllGit開(kāi)源

2020-05-11 14:55:44

CSS鼠標(biāo)前端

2017-12-05 13:12:35

Android軟鍵盤參數(shù)

2017-12-05 15:26:19

2009-12-30 10:44:38

Silverlight

2012-07-31 09:47:22

微軟Windows 8

2012-07-31 13:31:34

Windows 8鼠標(biāo)鍵盤

2010-09-30 15:59:16

JSPCookie

2018-08-22 09:00:00

Linux鎖定鍵盤包管理器

2009-01-18 17:36:27

Linux鍵盤快捷操作

2016-03-01 11:56:59

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)