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 从远程服务器下载东西的代码
Feb 10 Python
Python 批量合并多个txt文件的实例讲解
May 08 Python
python3基于OpenCV实现证件照背景替换
Jul 18 Python
对web.py设置favicon.ico的方法详解
Dec 04 Python
在Pandas中DataFrame数据合并,连接(concat,merge,join)的实例
Jan 29 Python
python实现将列表中各个值快速赋值给多个变量
Apr 02 Python
Python实现多线程下载脚本的示例代码
Apr 03 Python
Pycharm及python安装详细步骤及PyCharm配置整理(推荐)
Jul 31 Python
Pycharm IDE的安装和使用教程详解
Apr 30 Python
Python常见反爬虫机制解决方案
Jun 01 Python
Python实现手绘图效果实例分享
Jul 22 Python
jupyter 添加不同内核的操作
Feb 06 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新手上路(六)
2006/10/09 PHP
PHP快速排序quicksort实例详解
2016/09/28 PHP
thinkPHP中session()方法用法详解
2016/12/08 PHP
laravel ORM关联关系中的 with和whereHas用法
2019/10/16 PHP
在Laravel 中实现是否关注的示例
2019/10/22 PHP
js 实现打印网页中定义的部分内容的代码
2010/04/01 Javascript
jquery防止重复执行动画避免页面混乱
2014/04/22 Javascript
javascript 常见功能汇总
2015/06/11 Javascript
超赞的动手创建JavaScript框架的详细教程
2015/06/30 Javascript
js实现仿微博滚动显示信息的效果
2015/12/21 Javascript
详解jQuery中的empty、remove和detach
2016/04/11 Javascript
vue实现ToDoList简单实例
2017/02/07 Javascript
NodeJS实现图片上传代码(Express)
2017/06/30 NodeJs
JavaScript实现二维坐标点排序效果
2017/07/18 Javascript
JS计算输出100元钱买100只鸡问题的解决方法
2018/01/04 Javascript
详解开发react应用最好用的脚手架 create-react-app
2018/04/24 Javascript
关于vue3默认把所有onSomething当作v-on事件绑定的思考
2020/05/15 Javascript
详解js中的原型,原型对象,原型链
2020/07/16 Javascript
解决vue+elementui项目打包后样式变化问题
2020/08/03 Javascript
Antd下拉选择,自动匹配功能的实现
2020/10/24 Javascript
iview实现动态表单和自定义验证时间段重叠
2021/01/10 Javascript
python中实现php的var_dump函数功能
2015/01/21 Python
python中matplotlib实现最小二乘法拟合的过程详解
2017/07/11 Python
python绘制双Y轴折线图以及单Y轴双变量柱状图的实例
2019/07/08 Python
python实现监控阿里云账户余额功能
2019/12/16 Python
Python3直接爬取图片URL并保存示例
2019/12/18 Python
Python 下载Bing壁纸的示例
2020/09/29 Python
CSS3 实现footer 固定在底部(无论页面多高始终在底部)
2019/10/15 HTML / CSS
方太官方网上商城:销售方太抽油烟机、燃气灶、消毒柜等
2017/01/17 全球购物
意大利香水和彩妆护肤品购物网站:Ditano
2017/08/13 全球购物
最新的大学生找工作自我评价
2013/09/29 职场文书
初中地理教学反思
2014/01/11 职场文书
四风个人对照检查材料思想汇报(办公室通用版)
2014/10/07 职场文书
网聊搭讪开场白
2015/05/28 职场文书
2016年大学生实习单位评语
2015/12/01 职场文书
2016大学生诚信考试承诺书
2016/03/25 职场文书