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入门篇之列表和元组
Oct 17 Python
python中Genarator函数用法分析
Apr 08 Python
python字典排序实例详解
May 20 Python
python实现批量下载新浪博客的方法
Jun 15 Python
python数据预处理之将类别数据转换为数值的方法
Jul 05 Python
pandas多级分组实现排序的方法
Apr 20 Python
python+pyqt5实现图片批量缩放工具
Mar 18 Python
Python3 实现串口两进程同时读写
Jun 12 Python
Python调用.NET库的方法步骤
Dec 27 Python
Python计算公交发车时间的完整代码
Feb 12 Python
python GUI库图形界面开发之PyQt5开发环境配置与基础使用
Feb 25 Python
python3让print输出不换行的方法
Aug 24 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
WordPress判断用户是否登录的代码
2011/03/17 PHP
php 根据url自动生成缩略图并处理高并发问题
2014/01/23 PHP
php计算整个目录大小的方法
2015/06/19 PHP
php基于PDO实现功能强大的MYSQL封装类实例
2017/02/27 PHP
PHP开发实现微信退款功能示例
2017/11/25 PHP
dtree 网页树状菜单及传递对象集合到js内,动态生成节点
2012/04/14 Javascript
jQuery异步加载数据并添加事件示例
2014/08/24 Javascript
比例尺、缩略图、平移缩放之百度地图添加控件方法
2015/08/03 Javascript
莱鸟介绍javascript onclick事件
2016/01/06 Javascript
基于JavaScript表单脚本(详解)
2017/10/18 Javascript
tangram.js库实现js类的方式实例分析
2018/01/06 Javascript
vue移动端路由切换实例分析
2018/05/14 Javascript
小程序tab页无法传递参数的方法
2018/08/03 Javascript
VUE实现密码验证与提示功能
2019/10/18 Javascript
优化Vue中date format的性能详解
2020/01/13 Javascript
详解Vue3中对VDOM的改进
2020/04/23 Javascript
Python下singleton模式的实现方法
2014/07/16 Python
Python文件去除注释的方法
2015/05/25 Python
Python实现的使用telnet登陆聊天室实例
2015/06/17 Python
Python实现的堆排序算法原理与用法实例分析
2017/11/22 Python
python使用pycharm环境调用opencv库
2018/02/11 Python
使用OpenCV circle函数图像上画圆的示例代码
2019/12/27 Python
基于pytorch 预训练的词向量用法详解
2020/01/06 Python
完美解决jupyter由于无法import新包的问题
2020/05/26 Python
python 解决pycharm运行py文件只有unittest选项的问题
2020/09/01 Python
python 两种方法修改文件的创建时间、修改时间、访问时间
2020/09/26 Python
python利用opencv保存、播放视频
2020/11/02 Python
python爬虫看看虎牙女主播中谁最“顶”步骤详解
2020/12/01 Python
HTML5+CSS3应用详解
2014/02/24 HTML / CSS
Kingsoft金山公司C/C++笔试题
2016/05/10 面试题
播音主持女孩的自我评价分享
2013/11/20 职场文书
房屋委托书范本
2014/04/04 职场文书
植树节口号
2014/06/21 职场文书
党员自我对照检查材料
2014/08/19 职场文书
纪检干部先进事迹材料
2014/08/23 职场文书
500字作文之关于爸爸
2019/11/14 职场文书