异想天开的想记录一下自己每天的键盘键位走向,于是就在网上搜索了一下相关的实现,然后就发现了一个第三方的库pyHook.封装的很好,我们只需要傻瓜式的调用里面的API就可以了。

下面是我在使用pyHook 的过程中遇到的问题和经验总结。

准备工作

  • 操作系统: windows7 64位旗舰版

  • Python版本: 2.7.11

  • 第三方库:

  • IDE: PyCharm 2016.2 pro

API 基础

PyHook是一个基于Python的“钩子”库,主要用于监听当前电脑上鼠标和键盘的事件。这个库依赖于另一个Python库PyWin32,如同名字所显示的,PyWin32只能运行在Windows平台,所以PyHook也只能运行在Windows平台。

pyHook里面最重要的大致有三个API比较常用。如下:

  • HookManager()

创建一个“钩子”管家,便于接下的全局设置

  • HookManager.onMouseEvent + HookManager.HookMouse()

    监听鼠标事件,并且设置鼠标钩子。这两个应该作为原子操作同时出现。

  • HookManager.onKeyboardEvent + HookManager.HookKeyboard()

    监听键盘事件,并且设置键盘钩子,同样这两个应该同时出现。

  • 案例展示

    下面是我自己写的一个测试代码,具体内容如下:

    # coding:utf-8
    
    #    __author__ = 'Mark sinoberg'
    #    __date__ = '2016/6/24'
    #    __Desc__ = 简单的入门示例程序
    import pyHook
    import pythoncom
    from time import *
    
    result = ''
    
    def onMouseEvent(event):
        # 监听鼠标事件
        print "Message Name :", event.MessageName
        print "Message:",event.Message
        print "Time: " , event.Time
        print "Window: ",event.Window
        print "Window Name : " ,event.WindowName
        print "Position : ",event.Position
        print "Wheel : ",event.Wheel
        print "Injected: ",event.Injected
    
        # 需要注意的是返回True,以便将事件传给其他的处理程序,如果返回False的话,鼠标事件在这里就会被拦截,即鼠标会僵在此处失去响应
        return True
    
    def onKeyboardEvent(event):
        # 监听键盘事件
        print "MessageName:", event.MessageName
        print "Message:", event.Message
        print "Time:", event.Time
        print "Window:", event.Window
        print "WindowName:", event.WindowName
        print "Ascii:", event.Ascii, chr(event.Ascii)
        print "Key:", event.Key
        print "KeyID:", event.KeyID
        print "ScanCode:", event.ScanCode
        print "Extended:", event.Extended
        print "Injected:", event.Injected
        print "Alt", event.Alt
        print "Transition", event.Transition
        print "---"
        # 同鼠标事件监听函数的返回值
        # 写一个保存到本地文件的方法,而且应该以写二进制的方式来写入,设置result为全局的,避免文件被覆盖
        global result
        file = open(r'F:/log.txt','wb')
        result = result + "Time : " + str(asctime())+"|:"+"WindowName:"+str( event.WindowName)+"|"+"Key:"+str( event.Key)+"|"+"MessageName:"+str( event.MessageName)
        file.writelines(result)
        if event.Key == "q":
            file.close()
        return True
    
    def main():
        # 创建一个:钩子“管理对象
        hm = pyHook.HookManager()
        # 监听所有的键盘事件
        hm.KeyDown = onKeyboardEvent
        #设置键盘”钩子“
        hm.HookKeyboard()
        # 监听鼠标事件
        hm.mouseAll = onMouseEvent
        # 设置鼠标钩子
        hm.HookMouse()
        # 进入循环侦听,需要手动进行关闭,否则程序将一直处于监听的状态。可以直接设置而空而使用默认值
        pythoncom.PumpMessages()
        # 我也不知道为什么直接放置到main函数中不管用
    
    if __name__ == "__main__":
        main()

    global result 的设置,这样就可以记录下来之前的result来保证之前的数据不被覆盖!

    测试结果

    这是实时的检测结果,是我在程序中添加设置result为全局的,避免文件被覆盖

    时所截获的数据流。

    问题分析

    在上面的代码中,注释已经做的很详细了。但还是有一些奇怪的现象要讲一讲:

    • main函数:这里单独定义了一个main函数,然后让主函数来进行调用。也许,你会认为这不是多此一举吗?然而,事实是只有这样才能让代码顺利执行下去。真的是有悖常理。

    • 使用了全局变量result: 这里就是为了防止在向文件中写入数据的时候覆盖之前的文件信息 。

    • 在判断键盘按下Q键的时候,停止键盘事件的记录。如果想彻底的停止程序的监听的话,需要调用win32api.PostQuitMessage().

    拓展

    有了这些基础性的知识之后,就可以大胆的思考做一些有意思的东西了。除了记录自己在电脑上的行为,还可以将这些数据整合起来,利用数据挖掘的相关的技术,做更加高深的处理。

    或者,你想偷偷的知道别人在电脑上的操作行为,这些都可以很愉快的实现。

    而且通过发邮件的形式或者链接远程服务器的方式同样可以远程的进行更Hack的操作。

    这里只是抛砖引玉,有兴趣的不妨在下面留言哦。

    Python 键盘鼠标监听的更多相关文章

    1. java鼠标与键盘事件监听

      package cn.stat.p3.windowdemo; import java.awt.Button; import java.awt.FlowLayout; import java.awt.F ...

    2. 第35天学习打卡(输入框 TextField监听 简易计算器,组合+内部类回顾复习 画笔 鼠标监听 窗口监听 键盘监听)

      1.输入框 TextField监听  package com.kuang.lesson02; ​ import java.awt.*; import java.awt.event.ActionEven ...

    3. Qt之键盘事件监听-实时响应大小写Capslock按键

      目录 一.开篇 二.效果展示 三.实现思路 1.重写QLlinEdit 2.全局应用程序事件 3.windows钩子 四.相关文章 原文链接:Qt之键盘事件监听-实时响应大小写Capslock按键 一 ...

    4. Android 软键盘的监听(监听高度,是否显示)

      Android官方本身没有提供一共好的方法来对软键盘进行监听,但我们实际应用时.非常多地方都须要针对软键盘来对UI进行一些优化. 下面是整理出来的一个不错的方法.大家能够使用. public clas ...

    5. 用python的库监听鼠标程序测试,有程序,有现象

      程序如下: # -*- coding: utf-8 -*- import pythoncom, pyHook  def OnMouseEvent(event):   print 'MessageNam ...

    6. 键盘-App监听软键盘按键的三种方式

      前言:   我们在android手机上面有时候会遇到监听手机软键盘按键的时候,例如:我们在浏览器输入url完毕后可以点击软键盘右下角的“GO”按键加载url页面:在点击搜索框的时候,点击右下角的sea ...

    7. js对手机软键盘的监听

      js还没有办法对手机软键盘直接进行监听的,但是可以有其他角度来判断软键盘是否弹起.比如输入框是否获取焦点等.focusin和focusout支持冒泡,对应focus和blur, 使用focusin和f ...

    8. iOS 键盘的监听 调整view的位置

      iOS在处理键盘的出现和消失时需要监听UIKeyboardWillChangeFrameNotifications/UIKeyboardDidHideNotifications - (void)vie ...

    9. Swift3.0 键盘高度监听获取

      方法:通过通知监听键盘的动态 1.键盘的动态有四种: public static let UIKeyboardWillShow: NSNotification.Name public static l ...

    随机推荐

    1. 【BZOJ1059】【ZJOI2007】矩阵游戏

      Description 小Q是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩一个电脑益智游戏――矩阵游戏.矩阵游戏在一个N*N黑白方阵进行(如同国际象棋一般,只是颜色是随意的).每次可以对该矩阵进行两 ...

    2. 51 nod 1406 与查询

      1406 与查询 题目来源: CodeForces 基准时间限制:2 秒 空间限制:131072 KB 分值: 80 难度:5级算法题   有n个整数.输出他之中和x相与之后结果为x的有多少个.x从0 ...

    3. hdu 5052 树链剖分

      Yaoge’s maximum profit Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/ ...

    4. [Codeforces Round#417 Div.2]

      来自FallDream的博客,未经允许,请勿转载,谢谢. 有毒的一场div2 找了个1300的小号,结果B题题目看错没交  D题题目剧毒 E题差了10秒钟没交上去. 233 ------- A.Sag ...

    5. bzoj2839: 集合计数 容斥+组合

      2839: 集合计数 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 523  Solved: 287[Submit][Status][Discuss] ...

    6. 《Java技术》第三次作业--面向对象——继承、抽象类、接口

      1.阅读下面程序,分析是否能编译通过?如果不能,说明原因.应该如何修改?程序的运行结果是什么?为什么子类的构造方法在运行之前,必须调用父 类的构造方法?能不能反过来? class Grandparen ...

    7. windows的常用快捷键(实用篇)

      整理一下windows的常用快捷键,有些快捷键老不用都忘记了,这里整理一下方便自己以后忘记时翻阅. 一.Fn键的使用 1.F1帮助 2.F2重命名 3.F3打开搜索 4.F4打开地址栏常用地址 5.F ...

    8. Log4j使用详解

      1 Log4j配置说明 1.1 配置文件Log4j可以通过java程序动态设置,该方式明显缺点是:如果需要修改日志输出级别等信息,则必须修改java文件,然后重新编译,很是麻烦: log4j也可以通过 ...

    9. 初识Redis系列之一:简单介绍

      一:Redis是什么? Redis全称:REmote DIctionary Server(Redis) .Redis是一个由Salvatore Sanfilippo写的key-value存储系统,AN ...

    10. Struts中的找不到StringUtils异常

      今天在Struts2框架下使用JSON插件时,程序保存找不到类org/apache/commons/lang/xwork/StringUtils,我纳闷了,commons-lang-2.5.jar和c ...