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

 
做这个东西的首要原则就是要简单,那自然用python做是最好的了,我们可以用pyHook这个包就可以很方便做到监听键盘的功能
 
pyHook需要绑定一个消息处理函数,pyHook会传一个KeyboardEvent这样一个类进来
 
  1. class KeyboardEvent(HookEvent):
  2. '''
  3. Holds information about a mouse event.
  4. @ivar KeyID: Virtual key code
  5. @type KeyID: integer
  6. @ivar ScanCode: Scan code
  7. @type ScanCode: integer
  8. @ivar Ascii: ASCII value, if one exists
  9. @type Ascii: string
  10. '''
  11. def __init__(self, msg, vk_code, scan_code, ascii, flags, time, hwnd, window_name):
  12. '''Initializes an instances of the class.'''
  13. HookEvent.__init__(self, msg, time, hwnd, window_name)
  14. self.KeyID = vk_code
  15. self.ScanCode = scan_code
  16. self.Ascii = ascii
  17. self.flags = flags
  18. def GetKey(self):
  19. '''
  20. @return: Name of the virtual keycode
  21. @rtype: string
  22. '''
  23. return HookConstants.IDToName(self.KeyID)
  24. def IsExtended(self):
  25. '''
  26. @return: Is this an extended key?
  27. @rtype: boolean
  28. '''
  29. return self.flags & 0x01
  30. def IsInjected(self):
  31. '''
  32. @return: Was this event generated programmatically?
  33. @rtype: boolean
  34. '''
  35. return self.flags & 0x10
  36. def IsAlt(self):
  37. '''
  38. @return: Was the alt key depressed?
  39. @rtype: boolean
  40. '''
  41. return self.flags & 0x20
  42. def IsTransition(self):
  43. '''
  44. @return: Is this a transition from up to down or vice versa?
  45. @rtype: boolean
  46. '''
  47. return self.flags & 0x80
  48. Key = property(fget=GetKey)
  49. Extended = property(fget=IsExtended)
  50. Injected = property(fget=IsInjected)
  51. Alt = property(fget=IsAlt)
  52. Transition = property(fget=IsTransition)
 
虽然我觉得这个包有点不合理的地方就是没办法一下子拿到组合键,只能通过自己搞个规则来判断是不是组合键,不过能用就行
官网上已经有很完整的监听初始化例程了,我们可以把我们的消息处理封装到一个类中:
 
  1. import pythoncom
  2. import pyHook
  3. import os
  4. class KeyboardMgr:
  5. m_bZeroKeyPressed = False
  6. m_bShiftKeyPressed = False
  7. def on_key_pressed(self, event):
  8. if str(event.Key) == 'Lshift' or str(event.Key) == 'Rshift' and self.m_bZeroKeyPressed != True:
  9. self.m_bShiftKeyPressed = True
  10. if event.Alt == 32 and str(event.Key) == '' and self.m_bShiftKeyPressed == True:
  11. os.system('TASKKILL /F /IM abc.exe /T')
  12. return True
  13. def on_key_up(self, event):
  14. if str(event.Key) == 'Lshift' or str(event.Key) == 'Rshift':
  15. self.m_bShiftKeyPressed = False
  16. elif str(event.Key) == '':
  17. self.m_bZeroKeyPressed = False
  18. return True
  19. keyMgr = KeyboardMgr()
  20. hookMgr = pyHook.HookManager()
  21. hookMgr.KeyDown = keyMgr.on_key_pressed
  22. hookMgr.KeyUp = keyMgr.on_key_up
  23. hookMgr.HookKeyboard()
  24. pythoncom.PumpMessages()
 
PS:注意pythoncom这个包的引用,可能会出现 No system module 'pywintypes' 这样的错误,这个时候需要把lib\site-packages\win32路径下的pywintypes??.dll(问号是你的版本号)拷贝到lib\site-packages\win32\lib这里即可,如果遇到了类似的问题也是一样解决
 
杀死进程直接用windows的taskkill命令就可以了,这样每次调试前我只用按一下快捷键就可以后台进程全关了
 

利用Python的pyHook包来进行键盘监听的更多相关文章

  1. C语言非阻塞式键盘监听

    监听键盘可以使用C语言的字符输入函数,例如 getchar.getch.getche 等,使用getche函数监听键盘的例子: #include <stdio.h> #include &l ...

  2. js 获取当前焦点所在的元素、给元素和input控件添加键盘监听事件、添加页面级的键盘监听事件

    页面级的键盘监听事件 document.onkeydown = function (event) { var e = event || window.event || arguments.callee ...

  3. 使用HTML+CSS,jQuery编写的简易计算器后续(添加了键盘监听)

    之前发布了一款简易的计算器,今天做了一下修改,添加了键盘监听事件,不用再用鼠标点点点啦 JS代码: var yunSuan = 0;// 运算符号,0-无运算;1-加法;2-减法;3-乘法;4-除法 ...

  4. [置顶] java Gui 键盘监听事件

    简单写一个java Gui键盘监听事件,实现的效果就是按下键盘控制台输出你按下的键.比如:按下A控制台就输出A 效果如图: 以下把实现的效果分为几个步骤: 1.新建一个窗体类继承窗体: 2.给这个窗体 ...

  5. java swing button和键盘监听冲突问题

    原因: 点击button会让jframe失去焦点,然后键盘监听不起作用 解决: 让jframe重新获取焦点就行了 jf.setFocusable(true); // JFrame jf = new J ...

  6. ios --键盘监听JYKeyBoardListener

    没有前言,就是一个简单的键盘监听,自动调整输入框的位置不被键盘遮挡 .h // // JYKeyBoardListener.h // // Created by JianF.Sun on 17/9/2 ...

  7. JPanel添加键盘监听事件

    因为在自己的游戏需求中谢了要用键盘控制飞机的移动,所以用到键盘监听事件,但是使用了JPanel之后添加了键盘监听事件,按相应的方向键飞机并没有反应.但是如果是为JFrame的内容面板加则会有反应. 为 ...

  8. C#全局键盘监听(Hook)

    一.为什么需要全局键盘监听? 在某些情况下应用程序需要实现快捷键执行特定功能,例如大家熟知的QQ截图功能Ctrl+Alt+A快捷键,只要QQ程序在运行(无论是拥有焦点还是处于后台运行状态),都可以按下 ...

  9. 【转】【C#】全局键盘监听

    using System; using System.Collections.Generic; using System.Text; using System.Runtime.InteropServi ...

随机推荐

  1. [poj]开关类问题 枚举 位运算

    poj 1222  EXTENDED LIGHTS OUT 开关只有两种方案 按和不按,按两次相当于关 只用枚举第一排开关的按法即可,剩下的行为使上一排的灯全部关闭,按法可以确定,并且是唯一的. 最后 ...

  2. 图像像素灰度内插(Matlab实现)

    常用的像素灰度内插法:最近邻元法.双线性内插法.三次内插法 %%像素灰度内插 factor = 0.75;%缩放比 u = 0.6;v = 0.7; itp1 = uint8(zeros(ceil(h ...

  3. 测试REST Web服务

    EST Web服务的测试计划 线程组 HTTP请求 与任何Jmeter测试一样,我们首先需要创建一个线程组以及一个HTTP请求采样器. 如果您现在运行测试,则可能会收到错误,响应代码为415,响应消息 ...

  4. Codeforces Round #564 (Div. 2) A. Nauuo and Votes

    链接:https://codeforces.com/contest/1173/problem/A 题意: Nauuo is a girl who loves writing comments. One ...

  5. BestCoder Round #81 (div.2) 1003 String

    题目地址:http://bestcoder.hdu.edu.cn/contests/contest_showproblem.php?cid=691&pid=1003题意:找出一个字符串满足至少 ...

  6. 前端CSS(3)

    前端基础CSS(3)   一.文本属性和字体属性(常用的) 1.文本属性 text-align:left|right|center|justify(两端对齐,只适用于英文);   /*对齐方式*/ c ...

  7. 熔断降级(Polly)

    熔断降级(Polly) https://www.cnblogs.com/qhbm/p/9224307.html 一. 什么是熔断降级 熔断就是"保险丝".当出现某些状况时,切断服务 ...

  8. C#远程连接sqlserver时,尝试读取或写入受保护的内存

    管理员身份运行 cmd ->  输入 netsh winsock reset

  9. Python踩坑之旅其二裸用os.system的原罪

    目录 1.1 踩坑案例 1.2 填坑解法 1.3 坑位分析 1.4.1 技术关键字 1.5 填坑总结 2. 前坑回顾 2.1 Linux中, 子进程拷贝父进程哪些信息 2.2 Agent常驻进程选择& ...

  10. Get和Post的初步探究

    Get请求和Post请求这两种基本请求类型,大部分开发者心里大概都有所谓的"标准答案",但博主最近用Postman测试接口的时候,遇到传参的问题:用post请求,参数放在reque ...