是谁在用Python弹奏一曲东风破
最近闲暇之余, 逛B站, 发现那些大神们用计算器, 用各种东西, 弹曲子, 那是弹得一个好, 作为一个手残人士, 虽然也想尝试一下, 但是吧, 我发现, 我的脑子里面想的挺好的, 可是手它, 它不听使唤啊, 一张图表达我的心情.
本着不扰民的原则(内心害怕被打), 然后决定放弃了, 但是作为程序员的我, 虽然我的手, 可能不听使唤, 但是代码, 总是听使唤的吧, 因此, 决定, 咱用Python弹奏一曲东风破. 此处是不是应该有掌声, 哈哈哈.
软件准备
- Python: 这还用说吗, 那是肯定要有的啊.
- Everyone Pinao: 一款虚拟钢琴软件, 当然, 你也可以选用其他的, 能响的应该都可以. 但是要注意键位, 我的谱子是根据我目前的键位来写的, 因此, 如果您的键位和我的不一样的话, 那就自己对应一下吧.
贴一张我的键位图:
过程
下面, 简单写一下, 我写这个程序的历程, 感觉可能我写的挺无聊的, 哈哈.
刚开始的失败
最开始, 我心想, 这个我直接用Python来写一个模拟键盘按键的脚本不就好了吗, 然后我果断的想到了pynput
, 利马安装, 迅速编码, 然后我的心情是这样的.
这里为什么不行, 为什么没有模拟成功, 哎, 我太难了.
中间的探索
不过, 就这点困难, 怎么能难到我呢, 本着不抛弃, 不放弃的原则, 我开始了一顿的查(寻)阅(问)资(度)料(娘), 然后我发现, 主要原因是, 由于pynput
这种能控制键盘的层面太浅了. 我们需要调用驱动级的键盘才有用, emmm, 然后我突然豁然开朗, 想到了一个绝妙的方案. 嘿嘿, 这里卖个关子, 来张图, 大家想想我用的什么.
我直接用Python的winapi, 这样, 难道你还能不让我控制, 小样儿, 说干就干, 利马 pip install win32api
, 不过实话说, 这个库我早就装过了, 嘿嘿, 所以这行命令, 我没执行.
果然, 这样就成功了, 非常的顺利, 下面先贴出我的键盘谱子.
成功的喜悦
这个是我根据五线谱, 手动敲的, 可能有错的地方, 反正我也不改了, 哈哈哈, 实话说, 我也听不出来, 下面贴出代码
def keydown(num):
map_virtual_key = ctypes.windll.user32.MapVirtualKeyA
time.sleep(0.4)
win32api.keybd_event(num, map_virtual_key(num, 0), 0, 0)
time.sleep(0.2)
win32api.keybd_event(num, map_virtual_key(num, 0), win32con.KEYEVENTF_KEYUP, 0)
简单说明一下上面的代码.
我们需要直接在硬件层面模拟, 因此我们需要一个MapVirtualKey的东西, 来获取实际对应的编码. 用法也很简单
win32api.keybd_event(虚拟码,扫描码,0,0)
对于虚拟码, 可以参考微软的官方文档: https://docs.microsoft.com/zh-cn/windows/win32/inputdev/virtual-key-codes 我们只需要找到软件中需要的键位的对应码就可以了.
第三个是参数是作为判断按下与抬起的标识,按下时为0即可,因为键盘的全过程是按下与抬起,所有两个keybd_event才是一个完整的过程,其中一定要给其中添加一个时间暂停的,不然还是无法使用,因为时间太短, 听不出来, 因此, 我们要对按下和弹起做一个小的延时.
第四个参数, 传0就好了. 实话说, 我也没看, 具体可以参考微软的API文档, 还是上面的那一个, 自己找找吧, 我不在这里再贴一遍了.
到这里, 我们终于可以直接用Python弹奏一曲东风破了, 上代码.
if __name__ == '__main__':
time.sleep(3)
for i in music_score:
if i != '\n' and i != ' ':
keydown(kay_map[i])
else:
time.sleep(0.5)
个人感觉还是不错的, 完整的代码 GITHUB
转载:https://blog.csdn.net/anonymous_qsh/article/details/104783317