那年,刚开始玩dota的时候, 发现物品栏的快捷键太不好按鸟(集中在小键盘的数字键)。于是各种改键工具应运而生,像最经典的warkey, 不知不觉就用了好多年。如今,各种改键工具越来越强大了, 支持各种,甚至是喊话什么的~不过最经典的warkey,实际上只是简单的键盘映射, 于是今天突然想起来就也写了一个。使用python的pyHook,还是很方便的完成了功能。

import pythoncom
import pyHook
import win32api
import win32con keyMap={'Num7':'Q', 'Num4':'Capital', 'Num1':'Z', 'Num8':'', 'Num5':'', 'Num2':'X', 'startFlag':'Oem_5' } #这个Oem_5实际上是键盘上的 \ startFlag=False def switchFlag():
global startFlag
if startFlag:
print 'warkey stop'
startFlag=False
else :
print 'warkey start'
startFlag=True def checkFlag():
return startFlag def onKeyboardEvent(event):
print 'Key:%s\n' % str(event.Key)
if str(event.Key) == keyMap['startFlag']:
switchFlag() if checkFlag():
if str(event.Key) == keyMap['Num7']:
win32api.keybd_event(103, 0, 0, 0) # Q -> Num7
win32api.keybd_event(103, 0, win32con.KEYEVENTF_KEYUP, 0)
elif str(event.Key) == keyMap['Num4']:
win32api.keybd_event(100, 0, 0, 0) # Capital -> Num4
win32api.keybd_event(100, 0, win32con.KEYEVENTF_KEYUP, 0)
elif str(event.Key) == keyMap['Num1']:
win32api.keybd_event(97, 0, 0, 0) # Z -> Num1
win32api.keybd_event(97, 0, win32con.KEYEVENTF_KEYUP, 0)
elif str(event.Key) == keyMap['Num8']:
pass
elif str(event.Key) == keyMap['Num5']:
pass
elif str(event.Key) == keyMap['Num2']:
win32api.keybd_event(98, 0, 0, 0) # X -> Num2
win32api.keybd_event(98, 0, win32con.KEYEVENTF_KEYUP, 0)
else:
pass if __name__ == "__main__":
print 'start listen'
hm=pyHook.HookManager()
hm.KeyDown=onKeyboardEvent
hm.HookKeyboard()
pythoncom.PumpMessages()

按 “\”切换开启/关闭状态

然后将Q,cap lock, Z, X分别映射到四个小键盘数字键

下次老大带着去网吧公款dota, 万一一时找不到合适的改键工具,就可以用自己的这个了=w=

附录:

键盘键码对应表

http://wenku.baidu.com/view/bff70805a6c30c2259019ef4.html

05-07 13:06