You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python的winotify库处理Windows通知点击事件?

关于winotify绑定通知点击事件的问题

一、winotify的局限

winotify库不支持直接绑定自定义点击回调函数,你代码中给notification.on_click赋值的操作是无效的——该库仅封装了Windows Toast通知的基础显示逻辑,未实现通知交互的回调处理机制。

二、可行的替代方案

1. 使用win10toast-click库

这是win10toast的分支版本,专门支持通知点击回调,安装命令:

pip install win10toast-click

示例代码:

from win10toast_click import ToastNotifier

def on_notification_click():
    print("Notification clicked!")

toaster = ToastNotifier()
toaster.show_toast(
    title="My Notification",
    msg="Click me!",
    duration=5,  # 通知显示时长(秒)
    threaded=True,  # 避免阻塞主线程
    callback_on_click=on_notification_click
)

2. 调用Windows原生API(ctypes实现)

如果不想依赖第三方库,可通过ctypes直接调用Windows原生的Toast通知API,手动注册事件监听器。核心是实现INotificationActivationCallback接口来处理点击事件,示例简化代码如下:

import ctypes
from ctypes import wintypes

# 定义COM接口基础结构
class INotificationActivationCallback(ctypes.Structure):
    _fields_ = [("lpVtbl", ctypes.c_void_p)]

# 点击事件回调函数
def OnActivated(this, app_id, args, data, count):
    print(f"Notification clicked! App ID: {app_id}, Args: {args}")
    return 0

# 构建虚表(简化实现,完整需覆盖所有接口方法)
vtbl = (ctypes.c_void_p * 4)()
vtbl[3] = ctypes.cast(OnActivated, ctypes.c_void_p)
callback = INotificationActivationCallback()
callback.lpVtbl = ctypes.cast(vtbl, ctypes.c_void_p)

# 注册激活器(需完成COM初始化、App ID注册等完整流程,此处仅展示核心逻辑)
# 注意:该方法需要正确配置Windows应用模型ID,部分场景需管理员权限

3. 使用plyer库(跨平台兼容)

若需跨Windows、Linux、macOS平台,plyer库提供统一的通知接口,且支持点击回调:
安装命令:

pip install plyer

示例代码:

from plyer import notification
import time

def on_notification_click():
    print("Notification clicked!")

notification.notify(
    title="My Notification",
    message="Click me!",
    app_name="MyApp",
    timeout=10,
    toast=True,  # Windows下启用Toast样式通知
    callback=on_notification_click
)

# 需保持主线程运行以接收回调
time.sleep(15)

内容的提问来源于stack exchange,提问作者sadra hoseini

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 15:41:13