网友xiangyunangua写的PyNano控制键盘例程,非常精彩:
在第一弹里尝试了用PyNano作鼠标。
既然PyNano可以模拟鼠标,当然也可以模拟为键盘了。
利用键盘信号,我们可以做很多事情(嘿嘿),这里就简单地实现为:
1. win+r调出windows启动器
2. 输入notepad并回车,打开记事本软件
3. 自动填写python之禅
编码完成后,重新插入开发板,不用做任何事情,就可以看着电脑上冒出python之禅了(这里偷懒只弄了一部分)(输入法要改成默认是英文,或者在每行再加个回车符)
效果图如下:
#-----------------------------------boot.py-----------------------------------------
import machine
import pyb
pyb.usb_mode('VCP+HID',hid=pyb.hid_keyboard) # 注意这里添加了第二个参数,就是用作键盘
#-----------------------------------main.py-----------------------------------------
详细注释如下:关于具体的细节,看注释里提到的源码
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
''')