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

