• 利用Python的pyHook包来进行键盘监听


    最近在实习的时候发现一件很蛋疼的事情,那就是我们组的项目因为有后台进程,所有每次运行完以后后台进程都必须要自己手动关闭,每次编译之前忘记关就会有一大堆编译错误,我就想直接弄个可以快捷键直接关闭算了

     
    做这个东西的首要原则就是要简单,那自然用python做是最好的了,我们可以用pyHook这个包就可以很方便做到监听键盘的功能
     
    pyHook需要绑定一个消息处理函数,pyHook会传一个KeyboardEvent这样一个类进来
     
    class KeyboardEvent(HookEvent):
        '''
        Holds information about a mouse event.
        @ivar KeyID: Virtual key code
        @type KeyID: integer
        @ivar ScanCode: Scan code
        @type ScanCode: integer
        @ivar Ascii: ASCII value, if one exists
        @type Ascii: string
        '''
        def __init__(self, msg, vk_code, scan_code, ascii, flags, time, hwnd, window_name):
            '''Initializes an instances of the class.'''
            HookEvent.__init__(self, msg, time, hwnd, window_name)
            self.KeyID = vk_code
            self.ScanCode = scan_code
            self.Ascii = ascii
            self.flags = flags
        def GetKey(self):
            '''
            @return: Name of the virtual keycode
            @rtype: string
            '''
            return HookConstants.IDToName(self.KeyID)
        def IsExtended(self):
            '''
            @return: Is this an extended key?
            @rtype: boolean
            '''
            return self.flags & 0x01
        def IsInjected(self):
            '''
            @return: Was this event generated programmatically?
            @rtype: boolean
            '''
            return self.flags & 0x10
        def IsAlt(self):
            '''
            @return: Was the alt key depressed?
            @rtype: boolean
            '''
            return self.flags & 0x20
        def IsTransition(self):
            '''
            @return: Is this a transition from up to down or vice versa?
            @rtype: boolean
            '''
            return self.flags & 0x80
        Key = property(fget=GetKey)
        Extended = property(fget=IsExtended)
        Injected = property(fget=IsInjected)
        Alt = property(fget=IsAlt)
        Transition = property(fget=IsTransition)
     
    虽然我觉得这个包有点不合理的地方就是没办法一下子拿到组合键,只能通过自己搞个规则来判断是不是组合键,不过能用就行
    官网上已经有很完整的监听初始化例程了,我们可以把我们的消息处理封装到一个类中:
     
    import pythoncom
    import pyHook
    import os
    class KeyboardMgr:
        m_bZeroKeyPressed = False
        m_bShiftKeyPressed = False
        def on_key_pressed(self, event):
            if str(event.Key) == 'Lshift' or str(event.Key) == 'Rshift' and self.m_bZeroKeyPressed != True:
                self.m_bShiftKeyPressed = True
            if event.Alt == 32 and str(event.Key) == '0' and self.m_bShiftKeyPressed == True:
                os.system('TASKKILL /F /IM abc.exe /T')
            return True
        def on_key_up(self, event):
            if str(event.Key) == 'Lshift' or str(event.Key) == 'Rshift':
                self.m_bShiftKeyPressed = False
            elif str(event.Key) == '0':
                self.m_bZeroKeyPressed = False
            return True
    keyMgr = KeyboardMgr()
    hookMgr = pyHook.HookManager()
    hookMgr.KeyDown = keyMgr.on_key_pressed
    hookMgr.KeyUp = keyMgr.on_key_up
    hookMgr.HookKeyboard()
    pythoncom.PumpMessages()
     
    PS:注意pythoncom这个包的引用,可能会出现 No system module 'pywintypes' 这样的错误,这个时候需要把libsite-packageswin32路径下的pywintypes??.dll(问号是你的版本号)拷贝到libsite-packageswin32lib这里即可,如果遇到了类似的问题也是一样解决
     
    杀死进程直接用windows的taskkill命令就可以了,这样每次调试前我只用按一下快捷键就可以后台进程全关了
     
  • 相关阅读:
    docker-dockerfile构建与部署nginx
    淘宝镜像安装
    css3 中的变量 var 的使用
    CSS样式清除
    css 样式初始化(rem兼容)
    canvas截屏网页为图片下载到本地-html2canvas.js
    移除JSON对象中的某个属性
    js 常用方法集合(持续更新)
    小程序获取上个页面vm对象 解决百度小程序返回上一页不更新onShow更新(适用于uni-app)
    小程序 请求Promise简单封装
  • 原文地址:https://www.cnblogs.com/Philip-Tell-Truth/p/7102560.html
Copyright © 2020-2023  润新知