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实现3行代码解简单的一元一次方程
Aug 18 Python
python获取当前时间对应unix时间戳的方法
May 15 Python
python实现的简单抽奖系统实例
May 22 Python
python文件特定行插入和替换实例详解
Jul 12 Python
python实现BackPropagation算法
Dec 14 Python
Python实现快速傅里叶变换的方法(FFT)
Jul 21 Python
python实现微信小程序自动回复
Sep 10 Python
Python基于datetime或time模块分别获取当前时间戳的方法实例
Feb 19 Python
Python日志无延迟实时写入的示例
Jul 11 Python
给你一面国旗 教你用python画中国国旗
Sep 24 Python
python中bytes和str类型的区别
Oct 21 Python
pytorch中tensor.expand()和tensor.expand_as()函数详解
Dec 27 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
二次元帅气男生排行榜,只想悄悄收藏系列
2020/03/04 日漫
兼容性最强的PHP生成缩略图的函数代码(修改版)
2011/01/18 PHP
twig模板获取全局变量的方法
2016/02/05 PHP
thinkphp框架下404页面设置 仅三步
2016/05/14 PHP
PHP文件操作实例总结
2016/09/27 PHP
Laravel框架基于ajax和layer.js实现无刷新删除功能示例
2019/01/17 PHP
js中关于String对象的replace使用详解
2011/05/24 Javascript
使用javascript:将其它类型值转换成布尔类型值的解决方法详解
2013/05/07 Javascript
JS 修改URL参数(实现代码)
2013/07/08 Javascript
js日期对象兼容性的处理方法
2014/01/28 Javascript
分享10个原生JavaScript技巧
2015/04/20 Javascript
浅谈Javascript线程及定时机制
2015/07/02 Javascript
jQuery实现带渐显效果的人物多级关系图代码
2015/10/16 Javascript
解决jquery中动态新增的元素节点无法触发事件问题的两种方法
2015/10/30 Javascript
微信小程序开发经验总结(推荐)
2017/01/11 Javascript
JavaScript实现旋转轮播图
2020/08/18 Javascript
浅谈react前后端同构渲染
2017/09/20 Javascript
vue 使用饿了么UI仿写teambition的筛选功能
2021/03/01 Vue.js
python网络编程学习笔记(五):socket的一些补充
2014/06/09 Python
python爬虫入门教程--正则表达式完全指南(五)
2017/05/25 Python
Python设计模式之门面模式简单示例
2018/01/09 Python
Python利用pandas处理Excel数据的应用详解
2019/06/18 Python
python集合能干吗
2020/07/19 Python
Python爬虫基于lxml解决数据编码乱码问题
2020/07/31 Python
简述python Scrapy框架
2020/08/17 Python
python 两种方法修改文件的创建时间、修改时间、访问时间
2020/09/26 Python
Python 数据分析之逐块读取文本的实现
2020/12/14 Python
css3 box-shadow阴影(外阴影与外发光)图示讲解
2017/08/11 HTML / CSS
爱普生美国官网:Epson美国
2018/11/05 全球购物
大专应届生个人简历的自我评价
2013/10/15 职场文书
资产经营总监岗位职责范文
2013/12/01 职场文书
失业者真诚求职信范文
2013/12/25 职场文书
《山中访友》教学反思
2016/02/24 职场文书
教你怎么用python爬取爱奇艺热门电影
2021/05/20 Python
MySQL 如何设计统计数据表
2021/06/15 MySQL
前端JS获取URL参数的4种方法总结
2022/04/05 Javascript