【新手入门】Hook(钩子)在Python中的实战应用

手把手教你为STM32F4/F7/H7的LTDC驱动适配不同尺寸的RGB屏(附时序计算工具) 本文详细介绍了如何为STM32F4/F7/H7的LTDC驱动适配不同尺寸的RGB屏幕,包括时序参数计算、LTDC初始化、DMA2D图形加速等关键技术。通过实战案例和代码示例,帮助开发者快速掌握RGB屏幕驱动开发,提升嵌入式图形显示项目的开发效率。 阅读详情

1. 钩子到底是什么?从“偷听”到“拦截”的通俗理解

很多刚接触编程的朋友,一听到“钩子”(Hook)这个词,可能觉得既神秘又高级,脑子里立刻浮现出复杂的系统底层、晦涩的API调用。别怕,今天我就用最接地气的方式,带你彻底搞懂它。你可以把钩子想象成一个“消息偷听器”或者“事件拦截器”。

想象一下这个场景:你正在和朋友在咖啡馆聊天,旁边坐着一个“监听员”。他的任务不是参与你们的对话,而是每当你们聊到“咖啡”这个词时,他就立刻在自己的小本子上记一笔。这个“监听员”就是钩子,你们聊天的“消息”就是系统里发生的事件(比如你移动了鼠标、按下了键盘),而“咖啡”这个词就是钩子要“拦截”的特定条件。钩子不改变你们聊天的核心内容,但它能在特定时刻“插一脚”,执行一些额外的操作,比如记录、修改或者干脆阻止这条消息继续传递。

在计算机世界里,钩子的应用无处不在。你用的输入法,为什么能在任何软件里弹出候选词?它很可能就用了一个键盘钩子,监听了你所有的按键输入。一些游戏辅助工具(非外挂,比如显示按键宏的合法工具)能知道你按了哪个技能键,也是通过钩子实现的。甚至一些自动化测试脚本,需要模拟用户操作,其底层原理也和钩子息息相关。

所以,钩子的核心能力就两点:监听和处理。它静静地挂在某个消息传递的通道上,一旦有它感兴趣的消息经过,就立刻跳出来说:“等等,让我先看看,处理一下,你再继续走。” 我们今天要学的,就是在Python里,如何轻松地搭建这样一个“监听站”,专门用来“偷听”鼠标和键盘的一举一动。这对于想写自动化脚本、记录用户操作、开发小工具或者单纯想理解事件驱动编程的新手来说,是绝佳的入门实践。

2. 环境准备:5分钟搭建你的第一个钩子实验场

理论说再多,不如动手敲一行代码来得实在。在开始写钩子之前,我们得先把“施工场地”准备好。放心,整个过程非常简单,就像安装一个普通的软件一样。

首先,你需要确保电脑上安装了Python。我强烈建议使用Python 3.6或以上的版本,因为很多新的库对老版本支持不太好。怎么检查?打开你的命令行(Windows上是CMD或PowerShell,Mac/Linux上是Terminal),输入 python --version 或者 python3 --version,看看版本号对不对。如果没有安装,去Python官网下载安装包,记得安装时勾选“Add Python to PATH”这个选项,这能省去后面配置环境变量的麻烦。

我们的核心武器是一个叫做 pynput 的Python库。它封装了监听和控制键盘、鼠标的复杂操作,让我们用几行简单的代码就能实现强大的功能,简直是新手的福音。安装它只需要一条命令。再次打开你的命令行,输入以下命令并回车:

pip install pynput

如果你使用的是Mac或Linux,或者遇到了权限问题,可以试试:

pip3 install pynput

或者

python -m pip install pynput

看到类似“Successfully installed pynput-1.7.x”的字样,就说明安装成功了。这里我分享一个我踩过的坑:有时候网络环境会导致pip安装很慢或者失败。别急,我们可以使用国内的镜像源来加速,比如清华的源。你可以用这条命令来安装,速度会快很多:

pip install pynput -i https://pypi.tuna.tsinghua.edu.cn/simple

安装好之后,我们可以写一个最简单的测试脚本,验证一下库是否工作正常。打开你喜欢的代码编辑器(VS Code、PyCharm甚至记事本都行),新建一个文件,比如叫 test_import.py,里面只写两行:

from pynput import mouse, keyboard
print("pynput库导入成功!环境准备就绪。")

保存后,在命令行里切换到文件所在的目录,运行 python test_import.py。如果屏幕上打印出了“pynput库导入成功!”的字样,那么恭喜你,你的钩子实验场已经完美搭建好了!整个过程顺利的话,真的用不了五分钟。接下来,我们就可以正式开始“偷听”鼠标和键盘了。

3. 鼠标钩子实战:让你的程序“看见”鼠标的一举一动

让我们先从鼠标钩子开始,因为它带来的视觉反馈非常直观,你能立刻看到效果。我们将使用 pynput.mouse 模块来创建一个鼠标监听器。这个监听器就像给鼠标雇了一个24小时不间断的“私人秘书”,鼠标做的每一件事,它都会记录下来并报告给你。

3.1 理解鼠标的三大事件:移动、点击和滚动

鼠标能做的事情,归根结底就是三件:动(移动)、点(点击)、滚(滚动)。pynput 库也相应地为我们提供了三个回调函数来处理这些事件:

  • on_move(x, y):处理鼠标移动事件。参数 x 和 y 就是鼠标光标在屏幕上的当前坐标。这个事件触发非常频繁,鼠标稍微一动就会产生大量消息。
  • on_click(x, y, button, pressed):处理鼠标点击事件。这是最有用的功能之一。参数 x, y 同样是坐标。button 告诉你被操作的是哪个键,比如 Button.left(左键)、Button.right(右键)或 Button.middle(中键)。pressed 是一个布尔值,True 表示按键被按下,False 表示按键被释放。通过它,你可以区分“按下”和“松开”这两个动作。
  • on_scroll(x, y, dx, dy):处理鼠标滚轮滚动事件。x, y 是滚动发生时鼠标的位置。dx 和 dy 表示滚动的水平量和垂直量,通常我们只关心垂直滚动 dy,向上滚是正数,向下滚是负数。

3.2 编写你的第一个鼠标监听器

理解了事件,代码就水到渠成了。下面是一个完整的、带有详细注释的示例。我建议你不要直接复制粘贴,而是跟着注释一行行敲,感受每个参数的意义。

# 导入鼠标监听所需的模块
from pynput import mouse

# 1. 定义处理鼠标移动的函数
def on_move(x, y):
    # 每次鼠标移动,都会在控制台打印当前位置
    # 我实测下来,这个事件触发太频繁了,输出刷屏很快,调试时可以暂时注释掉
    print(f'[移动] 光标坐标:({x}, {y})')

# 2. 定义处理鼠标点击的函数
def on_click(x, y, button, pressed):
    # 根据 pressed 参数判断是按下还是释放
    action = "按下" if pressed else "释放"
    # 将 button 对象转换成更易读的字符串
    btn_name = "左键" if button == mouse.Button.left else ("右键" if button == mouse.Button.right else "中键")
    print(f'[点击] {btn_name} 在位置({x}, {y}) 被{action}')

# 3. 定义处理鼠标滚动的函数
def on_scroll(x, y, dx, dy):
    # dy 是垂直滚动量,通常我们用它判断方向
    direction = "向上" if dy > 0 else "向下"
    print(f'[滚动] 在({x}, {y})位置,滚轮{direction}滚动,幅度:{abs(dy)}')

# 4. 创建并启动监听器(这是关键步骤!)
# 使用 `with` 语句可以确保监听器被正确启动和关闭,就像安全地打开关闭文件一样
with mouse.Listener(
        on_move=on_move,
        on_click=on_click,
        on_scroll=on_scroll) as listener:  # 把上面定义的三个函数“挂载”到监听器上
    # listener.join() 会让程序停在这里,持续监听,直到监听器被手动停止
    listener.join()

把这段代码保存为 mouse_hook.py,然后在命令行运行它。现在,随意移动、点击、滚动你的鼠标,看看控制台是不是像日记一样记录下了所有操作?这就实现了最基础的鼠标钩子功能。你可以尝试修改打印的信息,比如把坐标保存到一个文件里,或者当检测到特定位置的双击时,让程序播放一个提示音。这就是钩子的魅力——你拿到了事件的“控制权”,想怎么处理,全由你决定。

4. 键盘钩子实战:捕捉每一次敲击,打造你的快捷键工具

搞定了鼠标,键盘钩子就是下一个目标。键盘监听的应用场景更广,比如记录打字练习、实现全局快捷键、开发简单的宏命令工具等。pynput.keyboard 模块让这一切变得异常简单。

4.1 区分普通键与特殊键:一个关键的异常处理

键盘监听的核心是两个事件:on_press(按键按下)和 on_release(按键释放)。这里有一个新手很容易掉进去的坑:键盘按键分为两类——普通字符键(如 ‘a‘, ‘1‘, ‘/‘)和特殊功能键(如 Shift, Ctrl, F1, Enter)。

在 pynput 中,普通键对象有一个 char 属性,可以直接拿到对应的字符。而特殊键没有 char 属性,只有 name 属性(如 ‘shift‘, ‘ctrl_l‘)。如果你试图访问特殊键的 .char 属性,程序就会抛出一个 AttributeError 异常而崩溃。因此,正确的做法是在 on_press 函数里使用 try...except 结构来区分它们。这是写出健壮键盘钩子的关键一步。

4.2 构建一个带退出机制的键盘监听器

下面是一个增强版的键盘钩子示例。它不仅安全地区分了按键类型,还增加了按 Esc 键退出的功能,这样你就不用每次都去强制关闭命令行窗口了。

# 导入键盘监听所需的模块
from pynput import keyboard

# 定义处理按键按下的函数
def on_press(key):
    try:
        # 尝试获取普通字符键的字符
        # 如果 key.char 存在,说明是字母、数字、符号等
        print(f'[按下] 字符键: {key.char}')
    except AttributeError:
        # 如果抛出 AttributeError,说明是特殊功能键
        # 此时我们使用 key.name 来获取键名
        print(f'[按下] 功能键: {key}')

# 定义处理按键释放的函数
def on_release(key):
    # 无论是普通键还是功能键,释放事件中 key 对象都有统一的表示方法
    print(f'[释放] 按键: {key}')

    # 设置一个退出开关:当按下 Esc 键时,停止监听
    # keyboard.Key.esc 就是 Esc 键的对象
    if key == keyboard.Key.esc:
        print('检测到 Esc 键,监听器即将停止...')
        # 返回 False 是告诉监听器停止运行的信号
        return False

# 创建并启动键盘监听器
with keyboard.Listener(
        on_press=on_press,
        on_release=on_release) as listener:
    listener.join()

运行这个程序,然后随意在键盘上打字。你会看到控制台清晰地记录了你按下的每一个键和释放的每一个键。当你按下 Esc 键时,程序会优雅地停止,控制权交还给你。这个“返回 False 以停止监听器”的模式,是 pynput 库的一个约定,一定要记住。

4.3 进阶玩法:实现一个全局快捷键监听器

仅仅记录按键太基础了。让我们来点更实用的:实现一个全局快捷键。比如,我们想实现“按下 Ctrl+Shift+P 时,执行一个自定义函数(比如打印一句特定的话)”。

这里的关键在于,我们需要在 on_press 函数中同时检测多个按键的状态。pynput 提供了 keyboard.KeyCode 和 keyboard.HotKey 等更高级的功能,但对于新手,我们可以用一种更直观的“状态记录”方法来实现。

from pynput import keyboard

# 用一个集合来记录当前被按下的功能键
current_keys = set()

def on_press(key):
    # 将按下的键加入集合
    current_keys.add(key)
    # 打印当前按下的所有键,方便调试
    # print(f‘当前按下: {current_keys}‘)

    # 检查我们设定的组合键是否被满足
    # 条件:集合中同时包含 ctrl_l (左Ctrl), shift_l (左Shift), 和字符 ‘p‘
    # 注意:keyboard.KeyCode.from_char(‘p‘) 用于创建字符‘p‘的键对象
    if {keyboard.Key.ctrl_l, keyboard.Key.shift_l, keyboard.KeyCode.from_char(‘p‘)}.issubset(current_keys):
        print(‘>>> 快捷键 Ctrl+Shift+P 被触发!执行自定义任务... <<<‘)
        # 这里可以替换成任何你想执行的函数,比如打开一个文件、发送一个请求等
        # my_custom_function()

def on_release(key):
    # 当键释放时,从集合中移除
    if key in current_keys:
        current_keys.remove(key)
    # 同样,设置 Esc 键退出
    if key == keyboard.Key.esc:
        print(‘停止监听‘)
        return False

with keyboard.Listener(on_press=on_press, on_release=on_release) as listener:
    listener.join()

这个例子展示了钩子如何从“被动记录”升级为“主动响应”。通过维护一个按下键的集合,我们就能判断复杂的组合键状态,从而触发复杂的自动化任务。你可以把这个思路扩展,做出属于你自己的效率工具,比如一键整理桌面、快速启动常用软件等。

5. 钩子的高级应用与避坑指南

掌握了基本监听后,我们来看看如何把钩子用得更溜,以及如何避开那些我当年踩过的坑。

5.1 将监听器放在后台运行:不打扰你的主程序

前面的例子中,listener.join() 会阻塞程序,让程序一直停在监听状态。但在真实项目中,你往往希望监听在后台默默进行,同时主程序还能做别的事情。这就要用到多线程。

Python的 threading 模块可以轻松实现。我们把监听器放到一个独立的线程里去启动,这样主线程就自由了。

from pynput import keyboard
import threading
import time

def on_press(key):
    try:
        print(f‘后台监听到按键: {key.char}‘)
    except AttributeError:
        print(f‘后台监听到功能键: {key}‘)

def start_keyboard_listener():
    """这个函数会在新线程中运行监听器"""
    with keyboard.Listener(on_press=on_press) as listener:
        listener.join()

# 创建并启动监听线程
listener_thread = threading.Thread(target=start_keyboard_listener)
listener_thread.daemon = True  # 设置为守护线程,这样主程序退出时它会自动结束
listener_thread.start()

print(‘主程序开始运行,键盘监听已在后台启动...‘)
# 主程序可以继续做其他事情
for i in range(5):
    print(f‘主程序正在工作... {i+1}/5‘)
    time.sleep(1)

print(‘主程序任务完成,即将退出。后台监听线程也会随之停止。‘)

运行这个程序,你会发现主程序在打印计数,而你同时按下键盘键,控制台也会输出监听信息。两者互不干扰。这就是后台钩子的典型应用方式。

5.2 性能与权限:那些你必须知道的坑

性能坑:鼠标移动事件 on_move 的触发频率极高,如果在回调函数里执行非常耗时的操作(比如写入数据库、进行复杂的图像处理),会严重拖慢整个系统甚至导致程序卡死。最佳实践是:在钩子回调函数里只做最轻量级的操作,比如设置一个标志、把事件放入队列。 繁重的处理逻辑应该交给另一个专门的线程或进程去做。

权限坑(特别是macOS和Linux):pynput 为了监听全局事件,需要相应的系统权限。

  • macOS:首次运行可能会弹出系统提示,要求你授予“辅助功能”权限。你必须在“系统偏好设置” -> “安全性与隐私” -> “隐私” -> “辅助功能”中,勾选你的终端或IDE(如Terminal、iTerm、PyCharm)。
  • Linux:可能需要安装 python3-xlib 等依赖,具体取决于你的发行版。如果遇到权限错误,可能需要以特定方式运行脚本。

防误触坑:在编写全局快捷键时,一定要选择不常用的组合键,避免和你日常使用的软件快捷键冲突。比如 Ctrl+C、Ctrl+V 这种绝对不要用,否则你复制粘贴的时候会触发你的钩子,导致混乱。

5.3 数据持久化:从打印到记录

一直打印在控制台不是长久之计。我们可以轻松地将监听数据保存到文件,供后续分析。

from pynput import mouse
import json
import time

log_file = ‘mouse_log.json‘
event_list = []

def on_click(x, y, button, pressed):
    event = {
        ‘timestamp‘: time.time(),  # 记录事件发生的时间戳
        ‘event_type‘: ‘click‘,
        ‘x‘: x,
        ‘y‘: y,
        ‘button‘: str(button),
        ‘action‘: ‘press‘ if pressed else ‘release‘
    }
    event_list.append(event)
    # 每记录10个事件,就写入一次文件,避免频繁IO
    if len(event_list) >= 10:
        save_to_file()

def save_to_file():
    with open(log_file, ‘a‘, encoding=‘utf-8‘) as f:
        for event in event_list:
            f.write(json.dumps(event) + ‘\n‘)  # 使用JSON格式,每行一条记录
    event_list.clear()  # 清空临时列表
    print(‘数据已保存到文件。‘)

# 启动监听...

这个例子展示了如何将点击事件结构化地保存为JSON行格式,方便用其他工具分析。你可以把它扩展成一个简单的用户操作分析工具。

6. 从“监听”到“控制”:钩子的另一面

我们花了大量篇幅讲“监听”(Hook),但 pynput 库的能力不止于此。它还能“控制”(Control),即模拟鼠标和键盘操作。监听和控制结合起来,才能实现完整的自动化。

例如,你可以写一个脚本,监听到某个特定按键(如 F12)后,不仅记录下来,还自动模拟鼠标移动到屏幕某个位置并点击。这只需要用到 pynput.mouse.Controller 和 pynput.keyboard.Controller。

from pynput import keyboard, mouse
from pynput.keyboard import Key, Controller as KeyController
from pynput.mouse import Button, Controller as MouseController
import threading

keyboard_controller = KeyController()
mouse_controller = MouseController()

def on_press(key):
    if key == Key.f12:  # 监听 F12 键
        print(‘F12被按下,开始执行自动化任务...‘)
        # 在后台线程执行模拟操作,避免阻塞监听
        thread = threading.Thread(target=automate_task)
        thread.start()

def automate_task():
    # 模拟键盘输入
    keyboard_controller.type(‘Hello, Auto World!‘)
    # 模拟鼠标移动和点击
    mouse_controller.position = (500, 300)  # 移动到坐标(500, 300)
    mouse_controller.click(Button.left)  # 单击左键

with keyboard.Listener(on_press=on_press) as listener:
    listener.join()

这个简单的例子打开了自动化世界的大门。你可以用它来填充表单、执行重复的GUI操作等。但务必谨慎使用控制功能,尤其是在全局范围内,确保你的脚本不会在你不注意时误操作。

回过头看,钩子(Hook)技术本质上是一种强大的事件驱动编程范式。它让你的程序从“主动询问”变成了“被动响应”,更加高效和灵活。通过 pynput 这个利器,Python新手也能轻松踏入这个领域,从监听鼠标键盘开始,逐步构建出能感知用户意图、能与系统交互的智能小工具。记住,从简单的日志记录开始,逐步增加复杂度,多动手实验,遇到问题多查文档和社区,你会发现编程的乐趣就在于这种“让想法变成现实”的过程。我最初就是用类似的脚本,帮我自动记录工作时间的,从一个小点子开始,不断迭代,最终做出了对自己有用的工具。

LCD工程师必看:Pixelclock计算全解析(附Mipi Clk换算公式) 本文为LCD工程师深入解析Pixelclock的计算原理及其与MIPI DSI时钟的换算关系。文章从显示时序基础出发,详细推导了Pclk的核心公式,并重点阐述了如何根据Pclk、色彩深度和通道数计算MIPI Clk,同时分享了工程实践中的参数核对、时钟容差与调试技巧,是解决屏幕闪烁、花屏等问题的关键指南。 阅读详情

相关推荐

【小白必看】什么是hook(钩子)?

钩子”是一种特殊的消息处理机制,它可以监视系统或者进程中的各种事件消息,截获发往目标窗口的消息并进行处理。我们可以在系统中自定义钩子,用来监视系统中特定事件的发生,完成特定功能,如屏幕取词,监视日志,截获键盘、鼠标输入等等。钩子的种类很多,每种钩子可以截获相应的消息,如键盘钩子可以截获键盘消息,外壳钩子可以截取、启动和关闭应用程序的消息等。钩子可以分为线程钩子和系统钩子,线程钩子可以监视指定线程的事件消息,系统钩子监视系统中的所有线程的事件消息。

这个人很懒,没有描述。 1万+

ActiveMQ的几种消息持久化机制

为了避免意外宕机以后丢失信息,需要做到重启后可以恢复消息队列,消息系统一般都会采用持久化机制。 ActiveMQ的消息持久化机制有JDBC,AMQ,KahaDB和LevelDB,无论使用哪种持久化方式,消息的存储逻辑都是一致的。 就是在发送者将消息发送出去后,消息中心首先将消息存储到本地数据文件、内存数据库或者远程数据库等,然后试图将消息发送给接收者,发送成功则将消息从存储中删除,失败则继续尝...

weixin_34357962的博客 362

Python钩子函数

hook,又称钩子,在C/C++中一般叫做回调函数。钩子是从功能角度描述这种编程模式,回调则是从函数调用时间角度描述的。通常理解的hook是在一个已有的方法上加入一些钩子,使得在该方法执行前或执行后另在做一些额外的处理。如我们熟知的windows系统消息响应事件,鼠标点击对程序产生的影响是有程序自己决定的,但是程序的执行是受制于框架(windows系统),框架提供了一些通用的流程执行,但是往往框架或流程在设计时无法完全预料到以后的使用会有什么新需求,或者有些行为只有在运行时才能确定的。...

一个专注于机器学习基础与实战的技术博客,内容涵盖算法推导、模型实现、数学原理与代码实践。用通俗的语言解析复杂概念,记录学习过程中的思考与总结,适合机器学习爱好者和从业者参考。 4569

彻底搞懂 MIPI C-PHY 与 D-PHY 的区别(附速率计算实例)

D-C-PHY 并不是 MIPI 联盟定义的第三种独立 PHY 标准,而是指将 D-PHY 和 C-PHY 集成在同一 IP 模块中的组合方案。维度D-PHYC-PHYD-C-PHY(组合IP)核心优势简单、兼容性好、调试方便高带宽密度、低 EMI、省引脚灵活、节省面积、向后兼容核心劣势引脚利用效率低接收端 CDR 复杂、IP 费用可能高设计复杂度最高、IP 成本最高速率单位bpssps(需 ×2.28 才是等效 bps)支持两者引脚数4 线/通道(含时钟)

qq_41072096的博客 1009

pytorch 钩子函数hook 详解及实战

这4个 hook 中有是应用于 tensor 的,另外 3 个是针对nn.Module的。模型剪枝是一种通过减少神经网络中的参数来减小模型大小和计算量的技术。在实际应用中,模型剪枝可以有效地减小模型的体积,提高模型的推理速度,从而更适合在嵌入式设备上部署。在PyTorch中,可以使用钩子函数来实现模型剪枝。

@bangbang的博客 762

〖Python网络爬虫实战㊹〗- JavaScript Hook 的用法

最近更新在 JavaScript 逆向的时候,我们经常需要追踪某些方法的堆栈调用情况。但在很多情况下,一些 JavaScript 的变量或者方法名经过混淆之后是非常难以捕捉的。仅仅凭借这些技巧还不足以应对多数 JavaScript 逆向。本节我们来介绍一个比较常用的 JavaScript 逆向技巧 —— Hook 技术。

爱吃饼干的小白鼠的博客 3286

5 分钟掌握 Python 中的 Hook 钩子函数

1. 什么是Hook经常会听到钩子函数(hook function)这个概念,最近在看目标检测开源框架mmdetection,里面也出现大量Hook的编程方式,那到底什么是hook?ho...

Python中文社区 6405

mfcc总结,这个mel三角滤波器分组到底是如何起作用的呢?

先看fft频谱图(这是4096字节取样fft计算,横轴频率是从0到512,后边意义不大,未取,纵轴是振幅),那些我随便画的蓝色线,你有什么联想?: 再看,这绿色线,是否有一种上升后,便逐渐式微的感觉,都是三角形的,这或许也是mel当初和绝大多数人看到的: 如果在振幅上加上一条限制的黑线(振幅门槛限制),黑色线以下很多频率就没有意义了,你看,有用的频率连一半(512/2=256)都占不到...

ganggangwawa的博客 9908

Python Hook钩子函数详解

Hook钩子函数是一种回调(Callback)机制,允许程序在执行的特定点插入用户定义的代码。这种机制在事件处理、插件系统、调试工具等方面得到广泛应用。典型的Hook钩子包含预定义的事件点和用户自定义的处理函数。Python中的Hook钩子函数为开发者提供了一种灵活、可扩展的编程机制。本文深入探讨了Hook的基本概念、基本用法,以及在事件触发、插件系统等常见场景的应用。通过实例展示了动态注册、上下文管理器、AOP等高级用法,更全面地理解了Hook的多样化应用。

涛哥聊Python 5252

从零到一:RK3588平台上的星闪模块驱动移植全解析

本文详细解析了在RK3588平台上移植UB37星闪模块驱动的完整流程,涵盖内核配置、设备树适配、驱动编译、功能测试等关键步骤。通过实践指导,帮助开发者掌握星闪技术在嵌入式系统中的集成与应用,提升无线通信模块的开发效率。

qsc90123456的博客 337

DTS中video-interfaces接口详解

视频数据管道通常由外部设备组成,例如通过I2C、SPI或UART总线控制的摄像机传感器,以及SoC内部IP块(包括视频DMA引擎和视频数据处理器)。 SoC内部块由DT节点描述,与其他SoC块放置方式类似。外部设备表示为它们各自总线控制器节点的子节点,例如I2C。 所有视频设备上的数据接口都由它们的子“port”节点描述。端口的配置取决于参与数据传输的其他设备,并由“endpoint”子节...

龙图腾的博客 9008

python中的hook函数使用及应用场景

经常会听到钩子函数(hook function)这个概念,最近在看目标检测开源框架mmdetection,里面也出现大量Hook的编程方式,那到底什么是hook?hook的作用是什么?钩子hook,顾名思义,可以理解是一个挂钩,作用是有需要的时候挂一个东西上去。钩子函数是把我们自己实现的hook函数在某一时刻挂接到目标挂载点上。hook函数的作用 举个例子,hook的概念在windows桌面软件开发很常见,特别是各种事件触发的机制;

python03011的博客 2348

程序化广告行业(23/89):深度剖析广告效果评估指标

大家好,我一直希望能和大家一起在技术领域不断探索、共同进步。在之前的文章中,我们了解了程序化广告中腾讯的业务布局和广告效果评估的基础概念,今天让我们进一步深入剖析广告效果评估的各项指标,这对理解程序化广告的运作机制至关重要

yyy173611的博客 4864

python api框架 hook_5 分钟读懂Python 中的 Hook 钩子函数

1. 什么是Hook经常会听到钩子函数(hook function)这个概念,最近在看目标检测开源框架mmdetection,里面也出现大量Hook的编程方式,那到底什么是hook?hook的作用是什么?what is hook ?钩子hook,顾名思义,可以理解是一个挂钩,作用是有需要的时候挂一个东西上去。具体的解释是:钩子函数是把我们自己实现的hook函数在某一时刻挂接到目标挂载点上。hook...

weixin_39686353的博客 857

焊缝缺陷智能检测:基于 YOLO 的工业质检系统实战

从焊缝缺陷数据集的构建到模型训练,从桌面检测界面到缺陷统计输出,本文覆盖了一套工业焊缝质检系统的完整路线。这个场景的核心难点在数据层面——气孔和裂纹这类小目标的标注质量直接决定了模型的最终表现。建议先在开源数据集上跑通全链路,确认 mAP 达到可接受的水平后,再通过补充特定类型的小目标数据和提升输入分辨率来做精度优化。工业场景中,漏检一个气孔的成本和误报一个假阳性的成本不一样——根据对两类成本的承受力,调整置信度阈值来找到业务上的最佳平衡点。

m0_71589036的博客 202

地图之家总目录

地图之家总目录 cesium示例 leaflet示例

GIS之家家长 1万+

python学习之路--hook(钩子原理和使用)

**什么是钩子** 之前有转一篇关于回调函数的文章http://blog.youkuaiyun.com/Mybigkid/article/details/67644490 钩子函数、注册函数、回调函数,他们的概念其实是一样的。 钩子函数,顾名思义,就是把我们自己实现的hook函数在某一时刻挂接到目标挂载点上。 1. hook函数,就是我们自

Mybigkid的博客 4万+

小龙虾OpenClaw卸载全攻略,彻底清理缓存和配置,干净无残留!

不想要的小龙虾OpenClaw怎么彻底卸载?🦞本文教你如何彻底的卸载OpenClaw⚡️,Windows/macOS/Linux通用,干净无残留🧹

XiaoqiangClub的博客 313

Python中的钩子函数(hooks)介绍使用

python钩子函数的使用、注意事项

zpsimon的博客 5243

HQChart实战教程64-自定义分时图标题栏

分时图标题栏显示的是当前十字光标所在位置的分钟信息,显示在分时图窗口顶部。一般会显示品种的名称,日期,时间,价格,均价 涨幅,成交量,金额等等,hqchart内置会显示这些信息。如果要额外显示其他的字段,就需要通过替换格式化标题输出函数来是现实。我们在hqchart实例创建完成以后,通过OnCreatedCallback回调函数替换自己的格式化输出函数。返回 { AryText:[ { Text:文字, Color:颜色},…入参 data={ Data: 当前十字光标所在位置的分钟线 }

小银 1056

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

钩子函数是什么意思_5 分钟掌握 Python 中的 Hook 钩子函数

1. 什么是Hook经常会听到钩子函数(hook function)这个概念,最近在看目标检测开源框架mmdetection,里面也出现大量Hook的编程方式,那到底什么是hook?hook的作用是什么?what is hook ?钩子hook,顾名思义,可以理解是一个挂钩,作用是有需要的时候挂一个东西上去。具体的解释是:钩子函数是把我们自己实现的hook函数在某一时刻挂接到目标挂载点上...

weixin_39899630的博客 936

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

探索 Python 钩子函数:以json模块中的object_hook为例

本文深入解析了Python中json模块的object_hook参数,展示了如何将JSON数据直接转换为自定义类实例。通过User类和日期时间转换的实例,详细说明了object_hook的工作原理:在JSON解析为字典后,由用户自定义函数进行二次处理。文章揭示了其背后的"钩子函数"设计思想,即在不修改主流程的情况下扩展功能。这种机制不仅能提升代码的面向对象特性,还能自动处理特殊数据类型转换,使JSON反序列化更灵活高效。

YuYe_1990的博客 1026

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Python函数进阶: Hook 钩子函数

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理 本篇文章来自腾讯云 作者:用户2769421 1. 什么是Hook 经常会听到钩子函数(hook function)这个概念,最近在看目标检测开源框架mmdetection,里面也出现大量Hook的编程方式,那到底什么是hook?hook的作用是什么? what is hook ?钩子hook,顾名思义,可以理解是一个挂钩,作用是有需要的时候挂一个东西上去。具体的解释是:钩子函数是把

weixin_49345590的博客 988

python hook(钩子)函数

钩子函数、注册函数、回调函数,他们的概念其实是一样的。 回调函数牛逼的讲解:回调函数牛逼的文章 import time class LazyPerson(object): def __init__(self, name): self.name = name self.watch_tv_func = None self.have_dinner_func = None def get_up(self): print("%s get up at:%s" % (se

qq_39820671的博客 7062
上一篇: 智能拐杖的避障算法优化实战:HC-SR04超声波模块的5个调参技巧
下一篇: 头部姿态检测避坑指南:Mediapipe关键点选择与OpenCV相机参数的那些坑
sql99
博客等级 码龄19年 168粉丝 1905原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值