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脚本
Apr 05 Python
Python入门学习之字符串与比较运算符
Oct 12 Python
简述Python中的进程、线程、协程
Mar 18 Python
Python实现的简单dns查询功能示例
May 24 Python
python 使用sys.stdin和fileinput读入标准输入的方法
Oct 17 Python
对matplotlib改变colorbar位置和方向的方法详解
Dec 13 Python
Python正则表达式和re库知识点总结
Feb 11 Python
Python字典的基本用法实例分析【创建、增加、获取、修改、删除】
Mar 05 Python
利用python计算windows全盘文件md5值的脚本
Jul 27 Python
python类的实例化问题解决
Aug 31 Python
Python列表删除重复元素与图像相似度判断及删除实例代码
May 07 Python
python多次执行绘制条形图
Apr 20 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 zend 相对路径问题
2009/01/12 PHP
php 分页原理详解
2009/08/21 PHP
php中使用Curl、socket、file_get_contents三种方法POST提交数据
2011/08/12 PHP
解析PHP强制转换类型及远程管理插件的安全隐患
2014/06/30 PHP
跟随鼠标旋转的文字
2006/11/30 Javascript
JQuery的read函数与js的onload不同方式实现
2013/03/18 Javascript
JavaScript 对任意元素,自定义右键菜单的实现方法
2013/05/08 Javascript
Jquery封装tab自动切换效果的具体实现
2013/07/13 Javascript
基于JS实现密码框(password)中显示文字提示功能代码
2016/05/27 Javascript
最细致的vue.js基础语法 值得收藏!
2016/11/03 Javascript
vue.js项目中实用的小技巧汇总
2017/11/29 Javascript
JS中Object对象的原型概念基础
2018/01/29 Javascript
浅谈JS对象添加getter与setter的5种方法
2018/06/09 Javascript
基于vue.js中关于下拉框的值默认及绑定问题
2018/08/22 Javascript
vue解决弹出蒙层滑动穿透问题的方法
2018/09/22 Javascript
JS实现的简单tab切换功能完整示例
2019/06/20 Javascript
微信小程序自定义模态弹窗组件详解
2019/12/24 Javascript
vue+axios全局添加请求头和参数操作
2020/07/24 Javascript
[01:03:50]DOTA2-DPC中国联赛 正赛 CDEC vs DLG BO3 第二场 2月7日
2021/03/11 DOTA
python实现在windows下操作word的方法
2015/04/28 Python
python实现获取Ip归属地等信息
2016/08/27 Python
对dataframe进行列相加,行相加的实例
2018/06/08 Python
python pygame模块编写飞机大战
2018/11/20 Python
python利用wx实现界面按钮和按钮监听和字体改变的方法
2019/07/17 Python
Python Request爬取seo.chinaz.com百度权重网站的查询结果过程解析
2019/08/13 Python
Python3将jpg转为pdf文件的方法示例
2019/12/13 Python
python list等分并从等分的子集中随机选取一个数
2020/11/16 Python
CSS3 text shadow字体阴影效果
2016/01/08 HTML / CSS
GUESS德国官网:美国牛仔服装品牌
2017/02/14 全球购物
澳大利亚巧克力花束和礼品网站:Tastebuds
2019/03/15 全球购物
Java如何获得ResultSet的总行数
2016/09/03 面试题
市场营销方案范文
2014/03/11 职场文书
文化宣传方案
2014/03/13 职场文书
励志演讲稿500字
2014/08/21 职场文书
三好学生先进事迹材料
2014/08/28 职场文书
css3实现的加载动画效果
2021/04/07 HTML / CSS