如何用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
相关产品推荐
相关产品推荐

