博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python监听键盘和鼠标事件
阅读量:4540 次
发布时间:2019-06-08

本文共 3442 字,大约阅读时间需要 11 分钟。

我们可以利用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-8from ctypes import *from ctypes import wintypesimport win32conSetWindowsHookEx=windll.user32.SetWindowsHookExAUnhookWindowsHookEx=windll.user32.UnhookWindowsHookExCallNextHookEx=windll.user32.CallNextHookExGetMessage=windll.user32.GetMessageAGetModuleHandle=windll.kernel32.GetModuleHandleW#保存键盘钩子函数句柄keyboard_hd = None#保存鼠标钩子函数句柄mouse_hd = Noneclass 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 HookApiif __name__== '__main__':    HookApi.start_keyboard_hook()

 

打开一个txt文件,在里面输入文字,

 

转载于:https://www.cnblogs.com/WushiShengFei/p/11063457.html

你可能感兴趣的文章
C++重载运算符练习--对people类重载“= =”运算符和“=”运算符
查看>>
Nmap命令的实用范例
查看>>
7-1 查找整数编程总结
查看>>
安装PHP以及搭建博客(一)
查看>>
关于WORD文档的读取乱码问题
查看>>
[问题记录.dotnet]取网卡信息报错"找不到"-WMI - Not found
查看>>
Codeforces Round #254 (Div. 2):B. DZY Loves Chemistry
查看>>
删除数据库数据
查看>>
codechef : Marbles 题解
查看>>
突然的明白--public static 类名 函数名()
查看>>
MAVEN打包的`parent.relativePath points at wrong local POM`问题
查看>>
git参考, 小结
查看>>
C#NumberFormatInfo类
查看>>
java:线上问题排查常用手段
查看>>
pygame-KidsCanCode系列jumpy-part16-enemy敌人
查看>>
[svc][cpu][jk]cpu的核心查看及什么是cpu的负载
查看>>
C# 平台问题
查看>>
从构建分布式秒杀系统聊聊WebSocket推送通知
查看>>
hash扩展攻击本地实验
查看>>
git常用命令
查看>>