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实现DNS正向查询、反向查询的例子
Apr 25 Python
给Python初学者的一些编程技巧
Apr 03 Python
初步介绍Python中的pydoc模块和distutils模块
Apr 13 Python
python开发之for循环操作实例详解
Nov 12 Python
再谈Python中的字符串与字符编码(推荐)
Dec 14 Python
Python用 KNN 进行验证码识别的实现方法
Feb 06 Python
Python实现的查询mysql数据库并通过邮件发送信息功能
May 17 Python
python 内置模块详解
Jan 01 Python
python绘制双Y轴折线图以及单Y轴双变量柱状图的实例
Jul 08 Python
Django实现将views.py中的数据传递到前端html页面,并展示
Mar 16 Python
python生成word合同的实例方法
Jan 12 Python
Python字节单位转换(将字节转换为K M G T)
Mar 02 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
获得Google PR值的PHP代码
2007/01/28 PHP
php 无法载入mysql扩展
2010/03/12 PHP
PHP和JavaScrip分别获取关联数组的键值示例代码
2013/09/16 PHP
thinkphp3.0输出重复两次的解决方法
2014/12/19 PHP
PHP基于phpqrcode类生成二维码的方法详解
2018/03/14 PHP
JS仿flash上传头像效果实现代码
2011/07/18 Javascript
jQuery中live方法的重复绑定说明
2011/10/21 Javascript
JavaScript判断变量是否为undefined的两种写法区别
2013/12/04 Javascript
利用javascript数组长度循环数组内所有元素
2013/12/27 Javascript
理运用命名空间让js不产生冲突避免全局变量的泛滥
2014/06/15 Javascript
javascript浏览器窗口之间传递数据的方法
2015/01/20 Javascript
jquery实现标签上移、下移、置顶
2015/04/26 Javascript
jquery表单插件Autotab使用方法详解
2016/06/24 Javascript
Bootstrap基本样式学习笔记之表格(2)
2016/12/07 Javascript
javascript 显示全局变量与隐式全局变量的区别
2017/02/09 Javascript
Bootstrap 设置datetimepicker在屏幕上面弹出设置方法
2017/03/21 Javascript
Vue2 Vue-cli中使用Typescript的配置详解
2017/07/24 Javascript
Angular2学习笔记之数据绑定的示例代码
2018/01/03 Javascript
微信小程序自定义弹窗wcPop插件
2018/11/19 Javascript
微信小程序实现九宫格抽奖
2020/04/15 Javascript
JavaScript实现美化滑块效果
2019/05/17 Javascript
使用vue实现一个电子签名组件的示例代码
2020/01/06 Javascript
Python写的英文字符大小写转换代码示例
2015/03/06 Python
Python中实现结构相似的函数调用方法
2015/03/10 Python
Python中一行和多行import模块问题
2018/04/01 Python
vim自动补全插件YouCompleteMe(YCM)安装过程解析
2019/10/21 Python
python解析xml文件方式(解析、更新、写入)
2020/03/05 Python
jupyter lab文件导出/下载方式
2020/04/22 Python
python爬虫scrapy框架的梨视频案例解析
2021/02/20 Python
世界上最大的乐谱选择:Sheet Music Plus
2020/01/18 全球购物
存储过程的优缺点是什么
2015/01/10 面试题
禁毒宣传活动总结
2014/08/26 职场文书
普通党员个人整改措施
2014/10/27 职场文书
2014企业年终工作总结
2014/12/23 职场文书
企业计划生育责任书
2015/05/09 职场文书
MySQL数据库10秒内插入百万条数据的实现
2021/11/01 MySQL