• 利用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命令就可以了,这样每次调试前我只用按一下快捷键就可以后台进程全关了
     
  • 相关阅读:
    Linux 网络流量实时监控工具之ntopng详解
    linux wget 命令用法详解(附实例说明)
    Linux curl使用简单介绍
    数据库中随机查询数据
    【算法】验证码识别基础方法及源码(转)
    CentOS 7静默(无图形化界面)安装Oracle 11g
    史上最详细最全的Linux上安装Oracle的教程-centos7
    如何实现Docker镜像和容器实例的备份迁移
    oozie timezone时区配置
    通过hue提交oozie定时任务
  • 原文地址:https://www.cnblogs.com/Philip-Tell-Truth/p/7102560.html
Copyright © 2020-2023  润新知