代码改变世界

一个简易的dota改键助手

2013-06-23 17:22  HGtz2222  阅读(778)  评论(0编辑  收藏  举报

  那年,刚开始玩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