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()
监听鼠标事件,并且设置鼠标钩子。这两个应该作为原子操作同时出现。
监听键盘事件,并且设置键盘钩子,同样这两个应该同时出现。
案例展示
下面是我自己写的一个测试代码,具体内容如下:
# 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 键盘鼠标监听的更多相关文章
- java鼠标与键盘事件监听
package cn.stat.p3.windowdemo; import java.awt.Button; import java.awt.FlowLayout; import java.awt.F ...
- 第35天学习打卡(输入框 TextField监听 简易计算器,组合+内部类回顾复习 画笔 鼠标监听 窗口监听 键盘监听)
1.输入框 TextField监听 package com.kuang.lesson02; import java.awt.*; import java.awt.event.ActionEven ...
- Qt之键盘事件监听-实时响应大小写Capslock按键
目录 一.开篇 二.效果展示 三.实现思路 1.重写QLlinEdit 2.全局应用程序事件 3.windows钩子 四.相关文章 原文链接:Qt之键盘事件监听-实时响应大小写Capslock按键 一 ...
- Android 软键盘的监听(监听高度,是否显示)
Android官方本身没有提供一共好的方法来对软键盘进行监听,但我们实际应用时.非常多地方都须要针对软键盘来对UI进行一些优化. 下面是整理出来的一个不错的方法.大家能够使用. public clas ...
- 用python的库监听鼠标程序测试,有程序,有现象
程序如下: # -*- coding: utf-8 -*- import pythoncom, pyHook def OnMouseEvent(event): print 'MessageNam ...
- 键盘-App监听软键盘按键的三种方式
前言: 我们在android手机上面有时候会遇到监听手机软键盘按键的时候,例如:我们在浏览器输入url完毕后可以点击软键盘右下角的“GO”按键加载url页面:在点击搜索框的时候,点击右下角的sea ...
- js对手机软键盘的监听
js还没有办法对手机软键盘直接进行监听的,但是可以有其他角度来判断软键盘是否弹起.比如输入框是否获取焦点等.focusin和focusout支持冒泡,对应focus和blur, 使用focusin和f ...
- iOS 键盘的监听 调整view的位置
iOS在处理键盘的出现和消失时需要监听UIKeyboardWillChangeFrameNotifications/UIKeyboardDidHideNotifications - (void)vie ...
- Swift3.0 键盘高度监听获取
方法:通过通知监听键盘的动态 1.键盘的动态有四种: public static let UIKeyboardWillShow: NSNotification.Name public static l ...
随机推荐
- BZOJ4711 小奇挖矿
Description [题目背景] 小奇在喵星系使用了无限非概率驱动的采矿机,以至于在所有星球上都采出了一些矿石,现在它准备建一些矿石仓 库并把矿石运到各个仓库里. [问题描述] 喵星系有n个星球, ...
- 【BZOJ3991】【SDOI2015】寻宝游戏
Description 小B最近正在玩一个寻宝游戏,这个游戏的地图中有N个村庄和N-1条道路,并且任何两个村庄之间有且仅有一条路径可达.游戏开始时,玩家可以任意选择一个村庄,瞬间转移到这个村庄,然 ...
- 洛谷mNOIP模拟赛Day2-将军令
题目背景 pdf题面和大样例链接:http://pan.baidu.com/s/1cawM7c 密码:xgxv 历史/落在/赢家/之手 至少/我们/拥有/传说 谁说/败者/无法/不朽 拳头/只能/让人 ...
- 51 nod 1188 最大公约数之和 V2
1188 最大公约数之和 V2 题目来源: UVA 基准时间限制:2 秒 空间限制:262144 KB 分值: 160 难度:6级算法题 给出一个数N,输出小于等于N的所有数,两两之间的最大公约数 ...
- 【codevs 1911 孤岛营救问题】
·为了分析方便,可以先做一个题目简化.去掉"钥匙"这个条件,那么就是一个BFS或者SPFA--现在加上该条件.如本题只给出最多两种钥匙,当然你可以继续坚持BFS等方式,时间不会太差 ...
- [bzoj4893]项链分赃
来自FallDream的博客,未经允许,请勿转载,谢谢. 有一串长度为n(n<=10^5)的项链,上面有红绿蓝三种颜色的珠子,每种颜色的珠子数目都是偶数,现在要你把它切几刀分成若干段,把其中一些 ...
- cocos2d-x-3.x 学习总结(一)
这周学习了<cocos2d-x 3.x 游戏开发之旅>的第三章,做如下总结: 1.关于创建标签对象 书中是 Label* label = Label::create(); 可是总是提示出错 ...
- React框架 dva 和 mobx 的使用感受
最近在用react写web项目,领导为了让前端便于维护要求都用react作为开发基础,框架选型不限.在使用 react 的时候或多或少会接触到状态管理,从开始学 react 到现在也挺久了,做一些前端 ...
- JSP运行过程 JSP脚本 静态动态包含 jsp指令 jsp内置对象jsp四大作用域 jsp动作元素 EL表达式 JSTL 设计模式 JSP开发模式 EL内置对象
Day38 JSP JSP的运行过程具体如下: (1)客户端发出请求,请求访问JSP文件. (2)JSP容器先将JSP文件转换成一个Java源文件(Java Servlet源程序),在转换过程中,如果 ...
- 跟着小菜学习RabbitMQ启动和基础(系列一)
前言 今天开始我们正式进入RabbitMQ系列学习,在这系列博客中也会发表.NET Core和EF Core文章,网上关于RabbitMQ例子比比皆是,我将综合网上所提供的信息并加上我个人的理解来详细 ...