键盘:代码?钢琴

当打代码的键盘和钢琴的键盘联系起来时,会发生什么呢?

1. Code

# coding: utf-8

import pyHook
import pythoncom
import win32api, win32gui, win32con
import time

class Player(object):
    def __init__(self):
        # open https://virtualpiano.net/
        self.window_name = 'Virtual Piano | The Original Best Piano App Online - Google Chrome'
        self._y = 530
        self.ori = 320 # x
        self.per = 35
        self.keys = [str(x) for x in range(1, 10)]
        self.keys.append(0)
        self.keys += ['q','w','e','r','t','y','u','i','o','p', \
                 'a','s','d','f','g','h','j','k','l', \
                 'z','x','c','v','b','n','m']
        self.keys_dict = {}
        for enum, key in enumerate(self.keys):
            self.keys_dict[key] = enum

    def pos(self, ind):
        return (self.ori + self.per * ind, self._y)

    def delay(self, length=0.5):
        time.sleep(length)

    def click(self, keyStr):
        (x, y) = self.pos(self.keys_dict[keyStr])
        hld = win32gui.FindWindow(None, self.window_name)
        if hld > 0:
            lParam = win32api.MAKELONG(x, y)
            win32gui.PostMessage(hld, win32con.WM_LBUTTONDOWN, win32con.MK_LBUTTON, lParam)
            win32gui.PostMessage(hld, win32con.WM_LBUTTONUP, win32con.MK_LBUTTON, lParam)

    def play(self, keyStr, ifDelay=True):
        if keyStr not in self.keys:
            return
        self.click(keyStr)
        if ifDelay:
            self.delay()

player = Player()

def onKeyboardEvent(event):
    player.play(event.Key.lower(), ifDelay=False)
    return True

def main():
    hm = pyHook.HookManager()
    hm.KeyDown = onKeyboardEvent
    hm.HookKeyboard()
    pythoncom.PumpMessages()

if __name__ == '__main__':
    main()

依赖模块:
- win32api, win32gui, win32con: 比较好安装,一般windows下用anaconda,默认就有。
- pyHook[py2.7 & 64位]: 下载地址
- pythoncom[py2.7]: 下载地址

2. Usage

  1. 使用chrome打开https://virtualpiano.net/
  2. 运行这个脚本
  3. 之后你用键盘做的任何事情,都能听见对应的音符

使用之后发现,hjkl用多了,听到的这4个音最多了,哈哈~

你可能感兴趣的:(python)