Python 键盘鼠标监听

Posted djuwcnhwbx

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python 键盘鼠标监听相关的知识,希望对你有一定的参考价值。

异想天开的想记录一下自己每天的键盘键位走向,于是就在网上搜索了一下相关的实现,然后就发现了一个第三方的库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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68

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

测试结果

技术分享图片

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

问题分析

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

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

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

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

拓展

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

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

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

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

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow




以上是关于Python 键盘鼠标监听的主要内容,如果未能解决你的问题,请参考以下文章

使用python监听模拟鼠标键盘事件

Java JTable 添加了一个键盘事件,和鼠标点击事件的监听,如何在我键盘事件起作用时,让鼠标事件失效

python pynput鼠标键盘监控(详细)第2部键盘监控tcy

如何通过pynput与日志记录实现键盘鼠标的监听行为?

pyHook监听用户鼠标键盘事件

Python记录键盘鼠标敲击次数