Python监听键盘和鼠标事件的示例代码


Posted in Python onNovember 18, 2020

我们可以利用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()

运行效果

Python监听键盘和鼠标事件的示例代码

以上就是Python监听键盘和鼠标事件的示例代码的详细内容,更多关于Python监听键盘和鼠标事件的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python中的深拷贝和浅拷贝详解
Jun 03 Python
用Python将动态GIF图片倒放播放的方法
Nov 02 Python
Python Socket实现简单TCP Server/client功能示例
Aug 05 Python
使用pycharm设置控制台不换行的操作方法
Jan 19 Python
使用Django简单编写一个XSS平台的方法步骤
Mar 25 Python
python安装virtualenv虚拟环境步骤图文详解
Sep 18 Python
python3.8 微信发送服务器监控报警消息代码实现
Nov 05 Python
Python写出新冠状病毒确诊人数地图的方法
Feb 12 Python
基于python图像处理API的使用示例
Apr 03 Python
python 代码运行时间获取方式详解
Sep 18 Python
python matplotlib绘制三维图的示例
Sep 24 Python
基于tensorflow __init__、build 和call的使用小结
Feb 26 Python
Opencv python 图片生成视频的方法示例
Nov 18 #Python
calendar在python3时间中常用函数举例详解
Nov 18 #Python
Python 远程开关机的方法
Nov 18 #Python
python 元组和列表的区别
Dec 30 #Python
基于Python爬取搜狐证券股票过程解析
Nov 18 #Python
Python + opencv对拍照得到的图片进行背景去除的实现方法
Nov 18 #Python
Anaconda的安装与虚拟环境建立
Nov 18 #Python
You might like
php下连接mssql2005的代码
2011/01/17 PHP
php设计模式 Facade(外观模式)
2011/06/26 PHP
Laravel框架中扩展函数、扩展自定义类的方法
2014/09/04 PHP
对比PHP对MySQL的缓冲查询和无缓冲查询
2016/07/01 PHP
PHP crypt()函数的用法讲解
2019/02/15 PHP
css图片自适应大小
2007/11/28 Javascript
Js 获取HTML DOM节点元素的方法小结
2009/04/24 Javascript
图片上传即时显示缩略图的js代码
2009/05/27 Javascript
Js 中debug方式
2010/02/07 Javascript
js内存泄露的几种情况详细探讨
2013/05/31 Javascript
jQuery 取值、赋值的基本方法整理
2014/03/31 Javascript
JS实现动态给图片添加边框的方法
2015/04/01 Javascript
AngularJs表单验证实例详解
2016/05/30 Javascript
JS实现点击事件统计的简单实例
2016/07/10 Javascript
jQuery实现根据滚动条位置加载相应内容功能
2016/07/18 Javascript
jQuery.Form上传文件操作
2017/02/05 Javascript
Vue.js基础指令实例讲解(各种数据绑定、表单渲染大总结)
2017/07/03 Javascript
Vue项目路由刷新的实现代码
2019/04/17 Javascript
vue.js多页面开发环境搭建过程
2019/04/24 Javascript
layui实现数据分页功能
2019/07/27 Javascript
微信小程序开发(一):服务器获取数据列表渲染操作示例
2020/06/01 Javascript
解决vue单页面多个组件嵌套监听浏览器窗口变化问题
2020/07/30 Javascript
[38:38]完美世界DOTA2联赛PWL S3 access vs Rebirth 第二场 12.17
2020/12/18 DOTA
Python中用Spark模块的使用教程
2015/04/13 Python
python批量修改图片大小的方法
2018/07/24 Python
如何利用Python分析出微信朋友男女统计图
2019/01/25 Python
Python Tornado核心及相关原理详解
2020/06/24 Python
Python程序慢的重要原因
2020/09/04 Python
python 三种方法实现对Excel表格的读写
2020/11/19 Python
酒店管理专业毕业生推荐信
2013/11/10 职场文书
学校评语大全
2014/05/06 职场文书
产品发布会策划方案
2014/05/12 职场文书
早读课迟到检讨书
2014/09/25 职场文书
辞职报告(范文三篇)
2019/08/27 职场文书
如何利用pygame实现打飞机小游戏
2021/05/30 Python
Python中的嵌套循环详情
2022/03/23 Python