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的Django框架中的ORM建立查询API
Apr 20 Python
Python 两个列表的差集、并集和交集实现代码
Sep 21 Python
python中for用来遍历range函数的方法
Jun 08 Python
TensorFlow利用saver保存和提取参数的实例
Jul 26 Python
selenium设置proxy、headers的方法(phantomjs、Chrome、Firefox)
Nov 29 Python
PyQt5显示GIF图片的方法
Jun 17 Python
python实现最小二乘法线性拟合
Jul 19 Python
Python3离线安装Requests模块问题
Oct 13 Python
python实现名片管理器的示例代码
Dec 17 Python
在pytorch中对非叶节点的变量计算梯度实例
Jan 10 Python
python 使用递归的方式实现语义图片分割功能
Jul 16 Python
python如何将mat文件转为png
Jul 15 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 和 MySQL 基础教程(二)
2006/10/09 PHP
hadoop中一些常用的命令介绍
2013/06/19 PHP
10条php编程小技巧
2015/07/07 PHP
单击复制文字兼容各浏览器的完美解决方案
2013/07/04 Javascript
JavaScript判断是否为数组的3种方法及效率比较
2015/04/01 Javascript
Vue.js快速入门教程
2016/09/07 Javascript
简单模拟node.js中require的加载机制
2016/10/27 Javascript
vue项目中实现的微信分享功能示例
2019/01/21 Javascript
Node对CommonJS的模块规范
2019/11/06 Javascript
JavaScript接口实现方法实例分析
2020/05/16 Javascript
[01:16:37]【全国守擂赛】第三周决赛 Dark Knight vs. 一个弱队
2020/05/04 DOTA
Python抓取聚划算商品分析页面获取商品信息并以XML格式保存到本地
2018/02/23 Python
如何运行.ipynb文件的图文讲解
2019/06/27 Python
Python多叉树的构造及取出节点数据(treelib)的方法
2019/08/09 Python
对Pytorch神经网络初始化kaiming分布详解
2019/08/18 Python
Python字节单位转换实例
2019/12/05 Python
tensorflow之变量初始化(tf.Variable)使用详解
2020/02/06 Python
快速解决Django关闭Debug模式无法加载media图片与static静态文件
2020/04/07 Python
Python 实现打印单词的菱形字符图案
2020/04/12 Python
利用CSS3的border-radius绘制太极及爱心图案示例
2016/05/17 HTML / CSS
css3 实现滚动条美化效果的实例代码
2021/01/06 HTML / CSS
施工安全协议书
2013/12/11 职场文书
小班幼儿评语大全
2014/04/30 职场文书
公务员培的训心得体会
2014/09/01 职场文书
推普周国旗下讲话稿
2014/09/21 职场文书
民政局副局长民主生活会个人整改措施
2014/10/04 职场文书
工作违纪检讨书范文
2015/01/26 职场文书
2015入党自传书范文
2015/06/26 职场文书
小学同学聚会感言
2015/07/30 职场文书
2016年优秀党务工作者先进事迹材料
2016/02/29 职场文书
廉政党课工作报告案例
2019/06/21 职场文书
营销策划分析:怎么策划才能更好销量产品?
2019/09/04 职场文书
nginx搭建图片服务器的过程详解(root和alias的区别)
2021/03/31 Servers
Go timer如何调度
2021/06/09 Golang
mysql如何配置白名单访问
2021/06/30 MySQL
nginx lua 操作 mysql
2022/05/15 Servers