0

防止XY问题的上下文:(因为很可能有一个更简单的解决方案)

explorer.exe我的目标是在用户拖动文件(以及使用剪贴板剪切和复制内容)时跟踪文件的移动。我尝试使用 Windows Shell 扩展来解决这个问题,但是我实现的接口似乎从未触发过。我遵循了 CodeProject 中的这个指南,它工作得很好。但是,当我实现IFileOperation接口时,在这些用户操作期间,我的任何函数都没有被调用explorer.exe(我应该*.rgs从教程中添加另一个地方吗?IFileOperation 接口的一些特定注册位置,如 txtfile 是对于上下文菜单?)。

作为回应,编写了一个 DLL 文件,该文件使用和其他 CodeProject 教程挂钩函数调用ntdll.dll,这一切都发生在. 我没有像教程中那样使用注册表项,而是使用第三方 DLL 注入程序来强制加载我的 DLL。通过过滤、和调用,我可以区分移动和复制操作。它工作得很好!mhookDLLMainAppInitexplorer.exeNtReadFileNtWriteFileNtSetInformationFile

问题:

虽然代码注入很麻烦,所以我返回并将我DLLMain的与第一个指南合并,以便我的挂钩代码驻留在 shell 扩展中。当explorer.exe加载 shell 扩展时,我的挂钩代码也会被执行。好吧,explorer.exe它很聪明,只在需要时加载 DLL。为了让我的挂钩代码开始工作,我需要右键单击一个文本文件以调用原始指南的外壳扩展代码,此时 DLL 似乎从那时起保持加载状态。

问题:

是否有一个我可以伪实现的 shell 扩展接口,以便explorer.exe在启动时加载我的 shell 扩展,并且从不卸载它?我正在做的事情有更优雅的解决方案吗?

编辑:有一个关于 BHO 的类似帖子explorer.exe,它iexplorer.exe在启动时加载。当我读到它时,我以为这只是一个 IE 的东西,但我错了。您可以编写一个附加密钥(NoExplorer)来防止explorer.exe加载它,但是是否有类似的命令可以防止 IE 加载它?我的所有搜索都在不断提出 NoExplorer。

编辑:通过一些经验实验,ICopyHook接口尽可能接近持久的外壳扩展。没有调用 IFileOperation 的原因是因为explorer.exe没有调用它,而是它来自其他程序,请求外壳程序在该接口下执行特定操作。无论如何,我已经实现了一个相当空的 ICopyHook shell 扩展,它似乎explorer.exe在启动后不久就加载了,尽管它非常不确定。如果有人有更好的解决方案,请分享。

4

1 回答 1

1
There is an additional key (NoExplorer) you can write to prevent explorer.exe from loading it, but is there a similar command to prevent IE from loading it?

当您的外壳扩展被 Internet Explorer 加载时,只需在 DllMain DLL_PROCESS_ATTACH中返回FALSE 。

于 2013-08-02T07:17:58.670 回答