Python监听键盘和鼠标事件
我们可以利用windows提供的api函数来实现对系统键盘事件和鼠标事件的监听,主要利用的是SetWindowsHookEx函数,这个函数可以允许调用者传入一个钩子函数也叫回调函数,当指定的事件发生时,你
传入的函数就会被触发,有些事件是进程级的,有些事件是系统级的,这里我们用WH_KEYBOARD_LL来监听系统键盘事件,用WH_MOUSE_LL来监听鼠标事件,注意不是WH_KEYBOARD,使用WH_KEYBOARD是无法监听到外部
程序的事件的,这个可以在windows官方文档里面看到说明,要用WH_KEYBOARD来监听系统键盘必须写dll去实现。
因为用到了一些宏定义在win32con里面已经有了,所以需要安装一下pypiwin32,当然如果你将这些宏定义写在自己的文件中,那么就不用安装pypiwin32了。
输入:pip install pypiwin32 安装pypiwin32。
# coding=utf-8
from ctypes import *
from ctypes import wintypes
import win32con SetWindowsHookEx=windll.user32.SetWindowsHookExA
UnhookWindowsHookEx=windll.user32.UnhookWindowsHookEx
CallNextHookEx=windll.user32.CallNextHookEx
GetMessage=windll.user32.GetMessageA
GetModuleHandle=windll.kernel32.GetModuleHandleW
#保存键盘钩子函数句柄
keyboard_hd = None
#保存鼠标钩子函数句柄
mouse_hd = None class KBDLLHOOKSTRUCT(Structure):
_fields_ = [
('vkCode',c_int),
('scanCode', c_int),
('flags', c_int),
('time', c_int),
('dwExtraInfo', c_uint),
('',c_void_p)
] class POINT(Structure):
_fields_ = [
('x',c_long),
('y',c_long)
] class MSLLHOOKSTRUCT(Structure):
_fields_ = [
('pt',POINT),
('hwnd',c_int),
('wHitTestCode',c_uint),
('dwExtraInfo',c_uint),
] def wait_for_msg():
msg = wintypes.MSG()
GetMessage(msg, 0, 0, 0) def keyboard_pro(nCode, wParam, lParam):
"""
函数功能:键盘钩子函数,当有按键按下时此函数被回调
"""
if nCode == win32con.HC_ACTION:
KBDLLHOOKSTRUCT_p = POINTER(KBDLLHOOKSTRUCT)
param=cast(lParam,KBDLLHOOKSTRUCT_p)
print(param.contents.vkCode)
return CallNextHookEx(keyboard_hd, nCode, wParam, lParam) def start_keyboard_hook():
"""
函数功能:启动键盘监听
"""
HOOKPROTYPE = CFUNCTYPE(c_int, c_int, c_int, POINTER(c_void_p))
pointer = HOOKPROTYPE(keyboard_pro)
keyboard_hd = SetWindowsHookEx(
win32con.WH_KEYBOARD_LL,
pointer,
GetModuleHandle(None),
0)
wait_for_msg() def stop_keyboard_hook():
"""
函数功能:停止键盘监听
"""
UnhookWindowsHookEx(keyboard_hd) def mouse_pro(nCode, wParam, lParam):
"""
函数功能:鼠标钩子函数,当有鼠标事件,此函数被回调
"""
if nCode == win32con.HC_ACTION:
MSLLHOOKSTRUCT_p = POINTER(MSLLHOOKSTRUCT)
param=cast(lParam,MSLLHOOKSTRUCT_p)
#鼠标左键点击
if wParam == win32con.WM_LBUTTONDOWN:
print("左键点击,坐标:x:%d,y:%d" % (param.contents.pt.x,param.contents.pt.y))
elif wParam == win32con.WM_LBUTTONUP:
print("左键抬起,坐标:x:%d,y:%d" % (param.contents.pt.x, param.contents.pt.y))
elif wParam == win32con.WM_MOUSEMOVE:
print("鼠标移动,坐标:x:%d,y:%d" % (param.contents.pt.x, param.contents.pt.y))
elif wParam == win32con.WM_RBUTTONDOWN:
print("右键点击,坐标:x:%d,y:%d" % (param.contents.pt.x, param.contents.pt.y))
elif wParam == win32con.WM_RBUTTONUP:
print("右键抬起,坐标:x:%d,y:%d" % (param.contents.pt.x, param.contents.pt.y))
return CallNextHookEx(mouse_hd, nCode, wParam, lParam) def start_mouse_hook():
"""
函数功能:启动鼠标监听
"""
HOOKPROTYPE = CFUNCTYPE(c_int, c_int, c_int, POINTER(c_void_p))
pointer = HOOKPROTYPE(mouse_pro)
mouse_hd = SetWindowsHookEx(
win32con.WH_MOUSE_LL,
pointer,
GetModuleHandle(None),
0)
wait_for_msg() def stop_mouse_hook():
"""
函数功能:停止鼠标监听
"""
UnhookWindowsHookEx(mouse_hd)
测试代码:
import HookApi if __name__== '__main__':
HookApi.start_keyboard_hook()
打开一个txt文件,在里面输入文字,

Python监听键盘和鼠标事件的更多相关文章
- Atitit。监听键盘上下左右方向键事件java js jquery c#.net
Atitit.监听键盘上下左右方向键事件java js jquery c#.net 1. Keyword1 2. 通用的实现流程1 3. Js的实现1 3.1. Bind control ,eve ...
- python 监听键盘事件pyHook
#coding=utf- import pyHook import pythoncom # 监听到鼠标事件调用 def onMouseEvent(event): if(event.MessageNam ...
- cocos2d JS 监听键盘触摸响应事件(cc.EventListener.KEYBOARD)
除了可以监听键盘按键,还可以是终端设备的各个菜单键,都能使用同一个监听器来进行处理. //给statusLabel绑定键盘事件 cc.eventManager.addListener({ event: ...
- selenium python (三)鼠标事件
# -*- coding: utf-8 -*-#鼠标事件 #ActionChains类中包括: # context_click() 右击: ...
- python+selenium三:鼠标事件与键盘事件
1.鼠标事件:# 每个模拟事件后需加.perform() 才会执行# context_click() 右击# double_click() 双击# drag_and_drop(source, targ ...
- python 监听键盘事件
#coding=utf- from tkinter import * root=Tk() def callback(event): print("点击键盘",repr(event. ...
- selenium-键盘和鼠标事件
常见的键盘操作 from selenium.webdriver.common.keys import Keys 模拟enter键:send_keys(Keys.ENTER)键盘F1~F12: send ...
- 转:python webdriver API 之鼠标事件
前面例子中我们已经学习到可以用 click()来模拟鼠标的单击操作,而我们在实际的 web 产品测试中 发现,有关鼠标的操作,不单单只有单击,有时候还要和到右击,双击,拖动等操作,这些操作包含在Act ...
- Python自动化中的鼠标事件
1)form selenium.webdriver.common.action_chains import ActionChains 导入该模块 2)ActionChains(driver) :用于 ...
随机推荐
- oracle row_number() over(partition by .. order by ..)和rank() over(partition by .. order by ..) 和dense_rank() over(partition by .. order by ..)的相似点与区别
新建一个测试表 create table dim_ia_test2(device_number varchar2(20),desc2 varchar2(20)) 插入数据后得到: 一.oracle r ...
- MySQL 快速删除大量数据
千万级数据量 方案1. 直接使用delete 因delete执行速度与索引量成正比,若表中索引量较多,使用delete会耗费数小时甚至数天的时间 方案2. (1)创建临时表,表结构与原表结构相同 ...
- Ubuntu只读文件系统修复方法
首先备份重要数据 fsck.ext4 -p /dev/sdb5 reboot
- w5500驱动使用方法调试笔记
1.w5500有两种方式可以运行的,server端一般用中断的方式,效率比较高,client使用查询的模式,本身自带2k的发送缓存和2k的接收缓存.2.查询模式:有数据的时候,查询模式可以每隔一段时间 ...
- hdu4027-Can you answer these queries? -(线段树+剪枝)
题意:给n个数,m个操作,分两种操作,一种是将一段区间的每个数都开根号,另一种是查询区间和. 解题:显然对每个数开根号不能用lazy的区间更新.一个一个更新必然爆时间,对1开根号还是1,如果一段区间都 ...
- linux学习15 Linux系统用户和组全面讲解
一.用户,组和权限管理 1.多用户(Multi-tasks),多任务(Multi-Users).对计算机而言,每一个使用者就是一个用户. 2.每个使用者: a.用户标识,密码: 认证(Authenti ...
- benchmarkdotnet dotnet 基准测试类库试用(一)
使用基准测试对于我们应用的性能优化是比较好的方式,可以快速看出优化的结果同时可以给出报告结果 benchmarkdotnet 是dotnet 版本的一个工具,以下是一个简单的试用 环境准备 我使用的是 ...
- EF core 性能调优
Entity Framework Core performance tuning – a worked example Last Updated: February 25, 2019 | Create ...
- ImportError: cannot import name 'DjangoSuitConfig'
pip3.6 install https://github.com/darklow/django-suit/tarball/v2
- 【POJ3087】Shuffle'm Up
本题传送门 本题知识点:宽度优先搜索 模拟 + map 本题题意有点懵.就是单纯的把S1像例子那样插到S2里,根本不是什么宽搜题,因为只是一个方向就可以了.说是搜索题倒是有点意思,因为要查重. 不过c ...