python控制、监听鼠标键盘

前言


python中控制、监听键盘鼠标常用pynput模块,有时也会使用pywin32模块。

本文主要讲如何使用pynput模块控制、监听键盘。由于本人能力有限,不足之处还望指正。

前期工作


①安装pynput模块。打开cmd,输入pip install pynput即可。

②IDE的选择。建议使用pycharm或spyder,因为会自动补全代码,很方便。

③亢奋的心情。学新知识前要尽量保持亢奋,如果你现在不是很亢奋,可以先去看几个小电影。

注:安装过程中如果速度很慢可是使用国内镜像

打开cmd,输入pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple/

控制键盘


步骤

①实例化键盘对象

②模拟按压、松开按键

③模拟按键分为两类:

​ 1、space、ctrl---------使用keyboard.press(Key.space)

​ 2、普通字母,a、b、A等----------使用keyboard.press(‘a’)

## ================================================
##              控制键盘
## ================================================
from pynput.keyboard import Key, Controller
keyboard = Controller()  #实例化键盘对象

# 按键盘和释放键盘
keyboard.press(Key.space)  # 按下空格键
keyboard.release(Key.space)  # 松开空格键

# 按小写的a
keyboard.press('a')
keyboard.release('a')

# 按住shift再按a
with keyboard.pressed(Key.shift):
    keyboard.press('a')
    keyboard.release('a')

# 直接输入字符串
keyboard.type('Hello World')

注:当你不知道该按压哪个键盘时可以先运行下面监听键盘的函数,控制台会自动显示按键名称。

如下图:

易知我先按了空格键,后按了w键。只需要将输出的内容放置到keyboard.press()括号内即可

监听键盘


当键盘的有按键按下、松下会调用应绑定的函数

## ================================================
##              监听键盘
## ================================================
from pynput.keyboard import Key, Listener
keyboard = Controller()  #实例化键盘对象

def on_press(key):  # 按键被按压调用这个函数
    # 输出按压的按键名字
    print('{0} pressed'.format(key))

def on_release(key):  # 按键被松开调用这个函数
    # 输出松开的按键名字
    print('{0} release'.format(key))
    if key == Key.esc:  # 如果按了Esc键就停止监听
        return False  # Stop listener

# 连接事件以及释放
with Listener(on_press=on_press, on_release=on_release) as listener:
    listener.join()

控制鼠标


## ================================================
##              控制鼠标
## ================================================
from pynput.mouse import Button, Controller
mouse = Controller()  # 实例化对象

# 读鼠标坐标
print('The current pointer position is {0}'.format(mouse.position))

# 移动鼠标到指定位置
mouse.position = (10, 20)
print('Now we have moved it to {0}'.format(mouse.position))

# 移动鼠标到相对位置,以position为原点
mouse.move(5, -5)

# 按住和放开鼠标
mouse.press(Button.left)
mouse.release(Button.left)

# 点击鼠标左键2下
mouse.click(Button.left, 1)

# 滚动鼠标
mouse.scroll(0, 500)  # 0表示模式,500表示向上滑500,写成-500则表示向下滑500

注:可以使用监听鼠标的代码获取鼠标的实时位置

监听鼠标


## ================================================
##              监听鼠标
## ================================================
from pynput.mouse import Listener

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}'.format((x, y)))

# 连接事件以及释放
with Listener(on_move=on_move, on_click=on_click, on_scroll=on_scroll) as listener:
    listener.join()

pywin32模块简述


pywin32是比pynput更加基层的库,也可以满足以上需求。在此不做详细介绍,有兴趣同学可以百度一下。

pywin32库按压按键时使用虚拟键盘的方式,例如代码中的0x53、0x11等,

具体按键的对应关系如下: 点击这里 下载

import win32api
import win32gui

# 按下ctrl+s
win32api.keybd_event(0x11, 0, 0, 0)  # 按下ctrl
win32api.keybd_event(0x53, 0, 0, 0)  # 按下s
win32api.keybd_event(0x53, 0, win32con.KEYEVENTF_KEYUP, 0)  # 松开s
win32api.keybd_event(0x11, 0, win32con.KEYEVENTF_KEYUP, 0)  # 松开ctrl

# 按下回车
win32api.keybd_event(0x0D, 0, 0, 0)  # 按下回车
win32api.keybd_event(0x0D, 0, win32con.KEYEVENTF_KEYUP, 0)  # 松开回车

#发送文字
hWndEdit="我爱阿龙"
win32gui.SendMessage(hWndEdit,win32con.WM_CHAR,x, 0)

控制鼠标键盘可以用来干什么?


简易的消息轰炸机

注:先复制想输出的话再启动程序

pynput版本

print('Made by 帅帅龙')
from pynput.keyboard import Key, Controller
import time
keyboard = Controller()

a=input("请输入你需要循环输出的内容:")
b=eval(input('请输入你想循环输出的次数:'))
c=eval(input('逐字输出请按1,整句输出请按2:'))
print("数据已接收!请将光标移动到会话框")
time.sleep( 2 )
for i in range(3):
  print('距离程序运行还有%d秒!'%(3-i))
  time.sleep( 1 )
for i in range(b):#设置循环次数
  if c==2:
    keyboard.type(a)
    keyboard.press(Key.enter)
    keyboard.release(Key.enter)
    time.sleep(0.1)
  elif c==1:
    for t in a:
      keyboard.type(t)
      keyboard.press(Key.enter)
      keyboard.release(Key.enter)
      time.sleep(0.1)
  else:
    print('别乱输啊...')
print('消息发送完成!请关闭窗口')

win32版本

print('Made by 帅帅龙')
import win32api
import win32con
import time
b=eval(input('请输入你想循环输出的次数:'))
a=eval(input('请输入每条消息停留的间隙:'))
print("数据已接收!请将光标移动到会话框")
for i in range(3):
  print('距离程序运行还有%d秒!'%(3-i))
  time.sleep( 1 )

for i in range(b):#设置循环次数
  win32api.keybd_event(0x11,0,0,0)
  win32api.keybd_event(0x56,0,0,0)
  win32api.keybd_event(0x56,0,win32con.KEYEVENTF_KEYUP,0)
  win32api.keybd_event(0x11,0,win32con.KEYEVENTF_KEYUP,0)
  win32api.keybd_event(0x0D,0,0,0)
  win32api.keybd_event(0x0D,0,win32con.KEYEVENTF_KEYUP,0)
  time.sleep(a)
print('消息发送完成!请关闭窗口')

自己写类selenium模块


注:在这里只给大家提供一个demo,有什么问题可以私信我。

#coded by 帅帅龙
import time

def save_html(wait_time=2,save_wait_time=3,grade=1):  # 保存网页
    from pynput.keyboard import Key, Controller
    keyboard = Controller()
    time.sleep(wait_time)  #等待响应时间
    keyboard.press(Key.ctrl_l)  # 按下ctrl
    keyboard.press("s")  # 按下s
    keyboard.release("s")  # 松开s
    keyboard.release(Key.ctrl_l)  # 松开ctrl
    time.sleep(save_wait_time)  # 等待弹出保存等待窗口的时间
    keyboard.press(Key.shift)
    keyboard.release(Key.shift)
    num=1
    if grade==1:
        path=r'C:\Users\86166\Desktop\存放网址\一级\序号:'+str(num)
        for i in path:
            keyboard.type(i)
    else:
        path = r'C:\Users\86166\Desktop\存放网址\二级\序号:' + str(num)
        for i in path:
            keyboard.type(i)
    num+=1
    keyboard.press(Key.enter)
    keyboard.release(Key.enter)


def type_url(url='www.baidu.com'):  # 输入url
    from pynput.keyboard import Key, Controller
    keyboard = Controller()
    keyboard.press(Key.f6)
    keyboard.release(Key.f6)
    time.sleep(0.5)
    keyboard.press(Key.shift)
    keyboard.release(Key.shift)
    time.sleep(1)
    for i in url:
        keyboard.type(i)  # 输入网站
    keyboard.press(Key.enter)  # 跳转
    keyboard.release(Key.enter)


def scroll(end=-500,style=0):  # 滑动鼠标
    from pynput.mouse import Controller
    mouse=Controller()
    mouse.scroll(style, end)


def get_files_path(path='一级'):  # 获取文件地址
    import os
    files=os.listdir(path)
    files_path=[path + i for i in files]
    return files_path


if __name__ == '__main__':
    time.sleep(3)
    type_url()
    save_html()

用代码弹奏电子钢琴


思路:

①下载everypiano或者easypiano模拟钢琴软件

②下载相应歌曲的epo文件,并看歌曲是怎么弹奏的

③设置好时间间隔和按键顺序,启动程序

注:建议使用pywin32模块

制作吃鸡游戏脚本


思路:

①训练场使用枪支发射子弹,截图并计时

②分析某时刻的弹道轨迹,并控制鼠标移动

③设置热键,当按压这个按键时调用②中的代码,松开按键则停止射击

③启动程序后启动游戏

注:同理可以制作cf跳跳乐脚本

其他

略…

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

笼中小夜莺

嘿嘿嘿,请用金钱尽情地蹂躏我吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值