Python监听键盘和鼠标事件的示例代码
作者:平凡的编程者 发布时间:2022-06-14 07:05:23
标签:python,监听,键盘,鼠标
我们可以利用windows提供的api函数来实现对系统键盘事件和鼠标事件的监听,主要利用的是SetWindowsHookEx函数,这个函数可以允许调用者传入一个钩子函数也叫回调函数,当指定的事件发生时,你
传入的函数就会被触发,有些事件是进程级的,有些事件是系统级的,这里我们用WH_KEYBOARD_LL来监听系统键盘事件,用WH_MOUSE_LL来监听鼠标事件,注意不是WH_KEYBOARD,使用WH_KEYBOARD是无法监听到外部
程序的事件的,这个可以在windows官方文档里面看到说明,要用WH_KEYBOARD来监听系统键盘必须写dll去实现。
因为用到了一些宏定义在win32con里面已经有了,所以需要安装一下pypiwin32,当然如果你将这些宏定义写在自己的文件中,那么就不用安装pypiwin32了。
安装pypiwin32
pip install 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()
运行效果
来源:https://www.cnblogs.com/WushiShengFei/p/11063457.html
0
投稿
猜你喜欢
- 目标打包Python selenium 自动化脚本(如下run.py文件)为exe执行文件,使之可以直接在未安装python环境的windo
- 本文实例讲述了Python基于property实现类的特性操作。分享给大家供大家参考,具体如下:Python中的特性是一个函数,但是在使用的
- 1 什么是 NumpyNumPy,是 Numerical Python 的简称,用于高性能科学计算和数据分析的基础包,像数学科学工具(pan
- 用re或者string.find.以下是re代码import re#文本所在TXT文件file = '123.txt'#关键
- 想要追赶 Python 的热潮,应该如何学习呢?现在许多人在自学之外,都会选择去培训机构学习。选择培训机构的的标准是什么呢?什么样的pyth
- 前言Python爬虫要经历爬虫、爬虫被限制、爬虫反限制的过程。当然后续还要网页爬虫限制优化,爬虫再反限制的一系列道高一尺魔高一丈的过程。爬虫
- 一、说在前面 需求:有一张长为960,宽为96的图片,需要将其分割成10张96*96的图
- 于是写测试程序。。。不行 下载最新的ODBC。。。还是不行 通过sql plus查询。。。咦?竟然也查不到。。。 于是,折腾。。。折腾。。。
- 1、在全局settings文件中配置```MEDIA_URL = '/media/'MEDIA_ROOT = os.path
- 函数声明为:func Notify(c chan<- os.Signal, sig ...os.Signal)官方描述:Notify函
- 因为主键可以唯一标识某一行记录,所以可以确保执行数据更新、删除的时候不会出现张冠李戴的错误。当然,其它字段可以辅助我们在执行这些操作时消除共
- 一、原型模式原型是相对于复制、克隆而言的,但是不同于模板,模板创造出的东西是一模一样,而原型创造出的东西是允许存在差异化和个性化的。原型模式
- class Node: def __init__(self,dataval=None): self.d
- 在默认的情况下,MySQL搜索不区分大小写(但某些字符集始终区分大小写,如czech)。这意味着,如果你使用col_name LIKE
- 介绍最近在研究目标检测方面的小东西,需要到对桌面进行实时捕捉画面,获取画面后再检测,达到实时桌面目标检测的目的,所以写了一段小代码来实现该功
- 析构函数:当某个对象成为垃圾或者当对象被显式销毁时执行。GC(Garbage Collector) 在PHP中,没有任何变量指向这个对象时,
- 因为自己在设计的时候就对这些东西经常不是很在意,以为是很小的事情,结果往往给自己搞出不少的麻烦。可能大家没有我这么粗心,不过还是想提醒一下跟
- 本文要实现的功能是:根据下拉列表的选项将数据库中对应的内容显示在页面,选定要排除的选项后,提交剩余的选项到数据库。为了方便前后台交互,利用了
- 一、CSRF:保护机制Django预防CSRF攻击的方法是在用户提交的表单中加入一个csrftoken的隐含值,这个值和服务器中保存的csr
- 本程序有两文件test.asp 和tree.asp 还有一些图标文件 1。test.asp 调用类生成树 代码如下<%@