是谁用Python弹奏一曲东风破

是谁在用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)

个人感觉还是不错的, 完整的代码, 扫描关注我的公众号, 然后回复20200310, 获取完整代码.

wx_qr_code

发布了26 篇原创文章 · 获赞 41 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/anonymous_qsh/article/details/104783317