当打代码的键盘和钢琴的键盘联系起来时,会发生什么呢?
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
- 使用chrome打开https://virtualpiano.net/
- 运行这个脚本
- 之后你用键盘做的任何事情,都能听见对应的音符
使用之后发现,hjkl用多了,听到的这4个音最多了,哈哈~