网友xiangyunangua写的PyNano控制键盘精彩例程

网友xiangyunangua写的PyNano控制键盘例程,非常精彩:

 

在第一弹里尝试了用PyNano作鼠标。
既然PyNano可以模拟鼠标,当然也可以模拟为键盘了。
利用键盘信号,我们可以做很多事情(嘿嘿),这里就简单地实现为:
    1. win+r调出windows启动器
    2. 输入notepad并回车,打开记事本软件
    3. 自动填写python之禅
编码完成后,重新插入开发板,不用做任何事情,就可以看着电脑上冒出python之禅了(这里偷懒只弄了一部分)(输入法要改成默认是英文,或者在每行再加个回车符)
效果图如下:
200923ry8135pr357p5o35.png 

#-----------------------------------boot.py-----------------------------------------
import machine
import pyb
pyb.usb_mode('VCP+HID',hid=pyb.hid_keyboard) # 注意这里添加了第二个参数,就是用作键盘

#-----------------------------------main.py-----------------------------------------
203020xvdkk8pjbbxune3k.png 

详细注释如下:关于具体的细节,看注释里提到的源码

import pyb
hid=pyb.USB_HID() # 获取hid对象

#KEY_A=0x04;KEY_B=0x05;KEY_C=0x06;KEY_D=0x07;KEY_E=0x08;KEY_F=0x09;KEY_G=0x0A;KEY_H=0x0B;KEY_I=0x0C;
#KEY_J=0x0D;KEY_K=0x0E;KEY_L=0x0F;KEY_M=0x10;KEY_N=0x11;KEY_O=0x12;KEY_P=0x13;KEY_Q=0x14;KEY_R=0x15;
#KEY_S=0x16;KEY_T=0x17;KEY_U=0x18;KEY_V=0x19;KEY_W=0x1A;KEY_X=0x1B;KEY_Y=0x1C;KEY_Z=0x1D;KEY_ENTER=0x28;
# 采用字典形式
ch = {
    'a' : 0x04, 'b' : 0x05, 'c' : 0x06, 'd' : 0x07,
    'e' : 0x08, 'f' : 0x09, 'g' : 0x0a, 'h' : 0x0b,
    'i' : 0x0c, 'j' : 0x0d, 'k' : 0x0e, 'l' : 0x0f,
    'm' : 0x10, 'n' : 0x11, 'o' : 0x12, 'p' : 0x13,
    'q' : 0x14, 'r' : 0x15, 's' : 0x16, 't' : 0x17,
    'u' : 0x18, 'v' : 0x19, 'w' : 0x1a, 'x' : 0x1b,
    'y' : 0x1c, 'z' : 0x1d, '\n': 0x28, ' ' : 0x2C,
}
# 普通键值从 usbh_hid_keybd.h 源码中获取

KBD_RIGHT_CTRL  = 0x10
KBD_RIGHT_SHIFT = 0x20
KBD_RIGHT_ALT   = 0x40
KBD_RIGHT_GUI   = 0x80 # win键
# 特殊键的值从 usbh_hid_keybd.c 源码中获取,
# 直接在micropython源码根目录搜文件名即可

def release_key():
    # 松开按键信号
    hid.send(bytearray(8)) # 每次键盘信息传递为8个字节
    pyb.delay(10)
    
def press_key(key, specialkey):
    # 按下按键信号,接收普通键值列表和特殊键值
    buf = bytearray(8) # 每次键盘信息传递为8个字节
    buf[0] = specialkey # 对于像ctrl和win这种特殊键,要放在第一个字节上
    if len(key) > 6: # 一次最多六个键一起按
        raise KeyError # 随便用了个异常抛出
    for i,k in enumerate(key): # 依次填充按键到buf
        buf[2+i] = k # 后6个字节用来填充普通键值
    hid.send(buf)
    pyb.delay(10) # 延时
    
def send_key(key, specialkey = 0x00, delay = 500): # specialkey = 0x00表示不按下任何特殊键
    # 逻辑上合并上两个函数
    key = [ch[i] for i in key] # 将字符串转换为对应键值列表
    i = 0 # i作索引,初始化为0
    while i < len(key): # 6个一组发送键盘信息
        press_key(key[i:i+6], specialkey) # python冒号后面索引越界没有关系
        release_key() # 每次按完键后要松开
        i += 6
    pyb.delay(delay)

pyb.delay(1000) # 等待启动完成,有的电脑插上usb后反应比较慢,延迟可适当增多
send_key('r', specialkey = KBD_RIGHT_GUI) # 发送 win + r
send_key('notepad\n\n', delay = 0) # 调用记事本
send_key('''the zen of python

beautiful is better than ugly
explicit is better than implicit
simple is better than complex
complex is better than complicated
flat is better than nested
sparse is better than dense
readability counts

by wonderful micropython
''')

 

 

转载于:https://my.oschina.net/shaoziyang/blog/794901

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值