文档章节

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

shaoziyang
 shaoziyang
发布于 2016/11/27 10:59
字数 758
阅读 28
收藏 0

网友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
''')

 

 

本文转载自:http://www.micropython.org.cn/forum.php?mod=viewthread&tid=391&page=1#pid937

共有 人打赏支持
shaoziyang
粉丝 12
博文 76
码字总数 25946
作品 0
武汉
程序员
私信 提问
vc+如何实现模拟键盘输入,自动输入文字(创世纪篇)

键盘对于每个操作电脑的人员来说是最熟悉不过的了。键盘上的按键可分为两类: 按下后会在电脑的输入窗口上出现对应字符的按键,如字母键和数字键等,我们称之为字符键;按下后虽然看不到字符但...

crossmix
2015/07/30
0
0
android 记一次解决键盘遮挡问题

文章链接:https://mp.weixin.qq.com/s/1gkMtLu0BTXOUOj6isDjUw 日常android开发过程中,会遇到编辑框输入内容弹出软键盘,往往会出现键盘遮挡内容,或者出现页面整体上移的,或多或少在体验...

程序猿tx
12/09
0
0
在VC中实现模拟键盘,输入内容并显示在ListBox中。

网上找的,还没试过,希望对楼主有帮助 模拟键盘按键 自动输入文字 键盘对于每个操作电脑的人员来说是最熟悉不过的了。键盘上的按键可分为两类: 按下后会在电脑的输入窗口上出现对应字符的按...

云栖希望。
2017/12/04
0
0
ARM与嵌入式linux入门建议

由于很多人总问这个问题,所以这里做一个总结供大家参考。这里必须先说明,以下的步骤都是针对Linux系统的,并不面向WinCE。也许你会注意到,现在做嵌入式的人中,做linux研究的人远比做Win...

muliuhai
2017/08/04
0
0
基于STM32(ARM Cortex M3)的Arduino——Spurce (支持Eclip...

很多电子专业的学生,或者刚刚入行的电子工程师都有一个困惑。电子行业范畴这么大,这么多细分行业,不知该如何抉择。诸如硬件、软件、Layout 、单片机、 ARM ……这么多名词让人眼花缭乱,职...

soliddigi
2011/09/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

CDH安装SENTRY

1. 背景 虽然在集群上部署了kerberos认证,但是kerberos只是对用户层面进行认证,凡是认证通过的用户都有全量的访问权限,这很不安全,需要进一步对用户的权限进行控制,Sentry 的作用就是这...

hblt-j
5分钟前
0
0
Ubuntu 18.04 PostgreSQL 11 apt 默认安装某些问题解析

首先默认安装软件(本文以PostgreSQL 11.1为例,其他版本类似)。 sudo apt install postgresql-11 等待软件自动安装并完成配置,启动服务。 服务状态如下: vmware@vmware-virtual-machine:...

白豆腐徐长卿
5分钟前
0
0
一步步动手实现高并发的Reactor模型 —— Kafka底层如何充分利用多线程优势去处理网络I/O与业务分发

一、从《Apeche Kafka源码剖析》上搬来的概念和图 Kafka网络采用的是Reactor模式,是一种基于事件驱动的模式。熟悉Java编程的读者应该了解Java NIO提供了Reactor模式的API。常见的单线程Jav...

Anur
9分钟前
0
0
数字信号处理各种处理及图象

https://wenku.baidu.com/view/b1bb67f1f90f76c661371a75.html?sxts=1544696459935

whoisliang
12分钟前
0
0
rabbitmq学习

使用docker安装rabbit docker run -d --hostname my-rabbit --name rabbit -p 8080:15672 rabbitmq:management--hostname:指定容器主机名称--name:指定容器名称-p:将mq端口号映射到本地...

元谷
27分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部