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开发的单词频率统计工具wordsworth使用方法
Jun 25 Python
Python使用Redis实现作业调度系统(超简单)
Mar 22 Python
Python测试人员需要掌握的知识
Feb 08 Python
python爬虫实例详解
Jun 19 Python
Python基于pyCUDA实现GPU加速并行计算功能入门教程
Jun 19 Python
python的json中方法及jsonpath模块用法分析
Dec 06 Python
使用Python操作ArangoDB的方法步骤
Feb 02 Python
python异常处理、自定义异常、断言原理与用法分析
Mar 23 Python
Python转换字典成为对象,可以用"."方式访问对象属性实例
May 11 Python
Python3安装模块报错Microsoft Visual C++ 14.0 is required的解决方法
Jul 28 Python
python 提取html文本的方法
May 20 Python
python中的plt.cm.Paired用法说明
May 31 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中文分词系统SCWS安装和使用实例
2014/04/11 PHP
php+mysql+jquery实现简易的检索自动补全提示功能
2017/04/15 PHP
详细解读php的命名空间(二)
2018/02/21 PHP
Yii2框架控制器、路由、Url生成操作示例
2019/05/27 PHP
js传值 判断
2006/10/26 Javascript
jquery 插件 web2.0分格的分页脚本,可用于ajax无刷新分页
2008/12/25 Javascript
JavaScript 事件系统
2010/07/22 Javascript
jquery 跳到顶部和底部动画2句代码简单实现
2013/07/18 Javascript
JavaScript实现当网页加载完成后执行指定函数的方法
2015/03/21 Javascript
JS对字符串编码的几种方式使用指南
2015/05/14 Javascript
JS实现左右无缝轮播图代码
2016/05/01 Javascript
javascript执行环境及作用域详解
2016/05/05 Javascript
浅谈js中startsWith 函数不能在任何浏览器兼容的问题
2017/03/01 Javascript
30分钟快速入门掌握ES6/ES2015的核心内容(上)
2018/04/18 Javascript
vue轮播组件实现$children和$parent 附带好用的gif录制工具
2019/09/26 Javascript
jQuery Raty星级评分插件使用方法实例分析
2019/11/25 jQuery
jQuery使用ajax传递json对象到服务端及contentType的用法示例
2020/03/12 jQuery
python生成词云的实现方法(推荐)
2017/06/13 Python
Python3实战之爬虫抓取网易云音乐的热门评论
2017/10/09 Python
Python设计模式之门面模式简单示例
2018/01/09 Python
python事件驱动event实现详解
2018/11/21 Python
将python图片转为二进制文本的实例
2019/01/24 Python
Python对象转换为json的方法步骤
2019/04/25 Python
pandas实现将日期转换成timestamp
2019/12/07 Python
pandas apply使用多列计算生成新的列实现示例
2021/02/24 Python
杭州SQL浙江浙大网新恩普软件有限公司
2013/07/27 面试题
const和static readonly区别
2013/05/20 面试题
茶叶生产计划书
2014/01/10 职场文书
公司中层干部的自我评价分享
2014/03/01 职场文书
大学学习计划书范文
2014/05/02 职场文书
机械设计专业大学生职业生涯规划书范文
2014/09/13 职场文书
幼儿园老师个人总结
2015/02/28 职场文书
未婚证明范本
2015/06/15 职场文书
导游词书写之黄山
2019/08/06 职场文书
如何使用JavaScript策略模式校验表单
2021/04/29 Javascript
MySQL中VARCHAR与CHAR格式数据的区别
2021/05/26 MySQL