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时间处理方法(详解)
Aug 14 Python
python下实现二叉堆以及堆排序的示例
Sep 29 Python
Python scikit-learn 做线性回归的示例代码
Nov 01 Python
Python使用re模块正则提取字符串中括号内的内容示例
Jun 01 Python
python的scikit-learn将特征转成one-hot特征的方法
Jul 10 Python
Window 64位下python3.6.2环境搭建图文教程
Sep 19 Python
pygame游戏之旅 添加碰撞效果的方法
Nov 20 Python
Django model反向关联名称的方法
Dec 15 Python
Python 二叉树的层序建立与三种遍历实现详解
Jul 29 Python
pytorch中的上采样以及各种反操作,求逆操作详解
Jan 03 Python
python数据类型可变不可变知识点总结
Mar 06 Python
浅谈Python中的字符串
Jun 10 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即时捕捉PHP中的错误并发送email通知的实现代码
2013/01/19 PHP
php中上传文件的的解决方案
2018/09/25 PHP
PHP面向对象程序设计重载(overloading)操作详解
2019/06/13 PHP
jQuery使用手册之 事件处理
2007/03/24 Javascript
用javascript实现自定义标签
2007/05/08 Javascript
jQuery数组处理方法汇总
2011/06/20 Javascript
JS实现图片横向滚动效果示例代码
2013/09/04 Javascript
js使下拉列表框可编辑不止是选择
2013/12/12 Javascript
Google Maps API地图应用示例分享
2014/10/23 Javascript
js实现网页图片延时加载 提升网页打开速度
2016/01/26 Javascript
文件上传的几个示例分享【推荐】
2016/12/16 Javascript
js设置随机切换背景图片的简单实例
2017/11/12 Javascript
使用vue-route 的 beforeEach 实现导航守卫(路由跳转前验证登录)功能
2018/03/22 Javascript
使用Nuxt.js改造已有项目的方法
2018/08/07 Javascript
4个顶级JavaScript高级文本编辑器
2018/10/10 Javascript
详解Vue项目中实现锚点定位
2019/04/24 Javascript
bootstrap-paginator服务器端分页使用方法详解
2020/02/13 Javascript
详解ES6新增字符串扩张方法includes()、startsWith()、endsWith()
2020/05/12 Javascript
PHP读取远程txt文档到数组并实现遍历
2020/08/25 Javascript
Python中解析JSON并同时进行自定义编码处理实例
2015/02/08 Python
python使用psutil模块获取系统状态
2016/08/27 Python
python实现手机通讯录搜索功能
2018/02/22 Python
Django框架实现的普通登录案例【使用POST方法】
2019/05/15 Python
200行python代码实现2048游戏
2019/07/17 Python
Python文字截图识别OCR工具实例解析
2020/03/05 Python
解决Python 异常TypeError: cannot concatenate 'str' and 'int' objects
2020/04/08 Python
Python实现列表中非负数保留,负数转化为指定的数值方式
2020/06/04 Python
使用简单的CSS3属性实现炫酷读者墙效果
2014/01/08 HTML / CSS
夜大毕业自我鉴定
2013/10/11 职场文书
项目管理计划书
2014/01/09 职场文书
中国入世承诺
2014/04/01 职场文书
倡议书格式
2014/08/30 职场文书
2014年保密工作总结
2014/11/22 职场文书
社区国庆节活动总结
2015/03/23 职场文书
2015年教师节感恩寄语
2015/03/23 职场文书
漂亮妈妈观后感
2015/06/08 职场文书