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

 
做这个东西的首要原则就是要简单,那自然用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) == '' 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) == '':
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' 这样的错误,这个时候需要把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. uva11357 Matches

    Matches UVA - 11375 题意: 给你n根matches, 你可以拼出多少个数字0~9. 不必全部用完. 解题思路: 1. 计数题, 本题可以用图来理解. 把"已经使用了i根m ...

  2. CentOS6.7 i686上安装JDK7

    内核版本: [root@heima01 java]# uname -a Linux heima01 2.6.32-573.el6.i686 #1 SMP Thu Jul 23 12:37:35 UTC ...

  3. LeetCode:灯泡开关2

    题目 现有一个房间,墙上挂有 n 只已经打开的灯泡和 4 个按钮.在进行了 m 次未知操作后,你需要返回这 n 只灯泡可能有多少种不同的状态. 假设这 n 只灯泡被编号为 [1, 2, 3 ..., ...

  4. fstream类总结

    - ofstream, ifstream, fstream 在头文件fstream中,在fstream类中,用open成员函数打开文件,实现类与文件的关联操作. - open(filename, mo ...

  5. 题解 poj3585 Accumulation Degree (树形dp)(二次扫描和换根法)

    写一篇题解,以纪念调了一个小时的经历(就是因为边的数组没有乘2 phhhh QAQ) 题目 题目大意:找一个点使得从这个点出发作为源点,流出的流量最大,输出这个最大的流量. 以这道题来介绍二次扫描和换 ...

  6. HDU-2586-How far away(LCA Tarjan离线算法)

    链接:https://vjudge.net/problem/HDU-2586 题意: 勇气小镇是一个有着n个房屋的小镇,为什么把它叫做勇气小镇呢,这个故事就要从勇气小镇成立的那天说起了,修建小镇的时候 ...

  7. POJ1741(点分治)

    分治的时候SZ感觉是错的--但是貌似第一次找好重心就够了,之后SZ别太离谱就不会T,重心随一随缘就好-- #include <cstdio> #include <cstring> ...

  8. Linux上安装Docker,并成功部署NET Core 2.0

    概述 容器,顾名思义是用来存放并容纳东西的器皿: 而容器技术伴着Docker的兴起也渐渐的映入大家的眼帘,它是一个抽象的概念,同时也是默默存在世上多年的技术,不仅能使应用程序间完全的隔离,而且还能在共 ...

  9. Table行合并操作

    此方法不可取,但几天心血 保留,已有新想法,稍后会出一个完善的Table行列合并方法 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Tran ...

  10. POJ 3735 Training little cats 矩阵快速幂

    http://poj.org/problem?id=3735 给定一串操作,要这个操作连续执行m次后,最后剩下的值. 记矩阵T为一次操作后的值,那么T^m就是执行m次的值了.(其实这个还不太理解,但是 ...