【问题标题】:How to hook C++ in Explorer's rename event如何在资源管理器的重命名事件中挂钩 C++
【发布时间】:2011-02-05 22:53:36
【问题描述】:

我的标题再清楚不过了。 :P

每当用户在 Windows 资源管理器中重命名文件时(并且仅在资源管理器中),我都想运行我的程序。这是一个简单的模型:

一个简单的教程链接将非常有帮助。我什么也找不到。 :/

提前谢谢你。

附:我是 C++ 新手

【问题讨论】:

  • 为什么只有资源管理器?你会在常见的打开/保存对话框中计算重命名操作吗?
  • @pek:没关系,只要明白回答一个隐藏的问题真的很难。
  • @pek 打开/保存对话框在进程中而不是在资源管理器中运行。还有你的态度不利于接受帮助。既然您似乎已经知道您将实施的确切解决方案,那么是什么阻止您这样做?
  • “我不认为需要更多细节”非常强烈地告诉我们“我不想告诉你,因为它是邪恶的/我认为你会窃取我的想法。”无论哪种方式,我们都不太愿意帮助您。当您对所面临的问题持开放态度时,Stack Overflow 最有效,尤其是当实际解决方案可能与您所追求的解决方案无关时。
  • 我想附和 Jonathan Grynspan 和 Fred Nurk 所说的话。另外,我有一个问题:您想知道文件是在更改提交到磁盘之前重命名还是之后是否正常?

标签: c++ winapi


【解决方案1】:

看起来 Windows API 挂钩可能是您最好的选择。您需要拦截与 Windows 文件重命名相关的所有调用(即 MoveFile、MoveFileEx、SHFileOperation,可能还有更多)。有一些商业和开源解决方案; Microsoft DetoursMadshi's madCodeHook 和免费的开源 EasyHook

如果正确完成,此方法将允许您捕获系统上的所有文件重命名。

【讨论】:

  • 非常有趣的库列表!我肯定在调查他们!谢谢!
  • 很乐意提供帮助,虽然我附和 @JimR 希望这不是为了邪恶。
【解决方案2】:

我会尽可能避免挂钩 API。它变得非常丑陋非常快。

我认为有两种方法可以解决这个问题。
两种方式都有一些共同的因素:

  • ReadDirectoryChangesW API。有关该 API 的非常好的实现,请参阅此 article
  • 您需要最小化您的依赖关系,所以... 使用 Microsoft 编译器,链接到 DLL 运行时,尽可能坚持使用 C 等等。这样可以减少问题。将东西加载到 shell 内存空间已经够麻烦了。

方法一是使用资源管理器外壳扩展中的ReadDirectoryChangesW,它什么都不做。保持最小。我有理由确定我在 Microsoft 的一些文档中看到了一个“什么都不做”的 shell 扩展作为示例。

方法二是将您的代码打包为 DLL,并使用系统挂钩将您的 DLL 仅加载到资源管理器中。系统挂钩应仅在 Explorer 中加载,以防止通过 ReadDirectoryChangesW 发送虚假通知。

希望这会有所帮助,并且您不会将它用于邪恶的事情。

【讨论】:

  • 呵呵呵呵...从来没有想过用重命名钩子造成伤害... ;) 感谢您的出色回答!
猜你喜欢
  • 2010-09-06
  • 1970-01-01
  • 2012-05-28
  • 2019-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-07
  • 1970-01-01
相关资源
最近更新 更多