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

Python实现文件钩子获取远程拖放路径,求转译C++文件钩子示例

Python实现文件系统钩子捕获拖放临时文件路径

要解决拖放后无法获取目标路径的问题,我们可以通过挂钩Windows系统的文件操作API来直接拦截拖放过程中生成的临时文件路径,替代watchdog的目录监控方案。以下是基于easyhook库的实现:

依赖安装

首先安装所需的Python库:

pip install easyhook pywin32

核心代码实现

import easyhook
import win32api
from ctypes import c_wchar_p

# 钩子函数:拦截MoveFileW调用(拖放操作通常会触发该API)
def hook_MoveFileW(original_func, lpExistingFileName, lpNewFileName):
    # 过滤临时文件路径(可根据实际场景调整过滤规则)
    temp_dir = win32api.GetTempPath()
    if temp_dir in lpNewFileName:
        print(f"捕获拖放临时文件: {lpNewFileName}")
    
    # 必须调用原函数保证文件操作正常执行
    return original_func(lpExistingFileName, lpNewFileName)

def setup_file_hook():
    # 获取kernel32.dll中MoveFileW的函数地址
    kernel32 = win32api.LoadLibrary("kernel32.dll")
    move_file_addr = win32api.GetProcAddress(kernel32, "MoveFileW")
    
    # 注册API钩子
    easyhook.Hook(move_file_addr, hook_MoveFileW, None)
    
    print("文件钩子已启动,执行拖放操作即可捕获路径...")
    # 启动消息循环保持程序运行
    win32api.MessageLoop()

if __name__ == "__main__":
    try:
        # 注意:需要以管理员权限运行脚本才能成功挂钩系统API
        setup_file_hook()
    except Exception as e:
        print(f"钩子初始化失败: {str(e)}")

关键说明

  • API选择:拖放操作在Windows下通常会调用MoveFileW或CopyFileW,这里以MoveFileW为例,可根据实际情况添加对其他文件操作API的挂钩。
  • 路径过滤:通过判断目标路径是否在系统临时目录(GetTempPath()),可以过滤掉无关的文件移动操作,只保留拖放生成的临时文件。
  • 权限要求:挂钩系统级API必须以管理员权限运行Python脚本,否则会因权限不足导致钩子注册失败。
  • 替代方案:如果easyhook无法满足需求,也可以通过ctypes直接调用Win32 API的SetWindowsHookEx实现底层钩子,但实现复杂度更高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 06:25:40