阻止XY Problem的上下文:(因为很可能是一个更简单的解决方案)
我的目标是在用户拖动文件时跟踪explorer.exe
的文件移动(以及使用剪贴板剪切和复制内容)。我尝试使用Windows Shell扩展来解决这个问题,但是我实现的接口似乎从未触发过。我按照CodeProject的this指南进行了很好的工作。但是,当我实现IFileOperation接口时,explorer.exe
在这些用户操作期间没有调用过任何函数(我是否应该将另一个地方添加到*.rgs
文件中教程?像txtfile这样的IFileOperation接口的一些特定注册位置用于上下文菜单?)。
作为回应,编写了一个DLL文件,该文件使用ntdll.dll
和this其他CodeProject教程挂钩mhook
函数调用,所有这些都发生在DLLMain
内。我没有使用教程中的AppInit
注册表项,而是使用third party DLL injection program强制explorer.exe
加载我的DLL。通过过滤NtReadFile
,NtWriteFile
和NtSetInformationFile
来电,我可以区分移动和复制操作。它工作得很好!
问题:
代码注入很麻烦,所以我回去并将我的DLLMain
与第一个指南合并,以便我的挂钩代码驻留在shell扩展中。当explorer.exe
加载shell扩展时,我的挂钩代码也会被执行。好吧,explorer.exe
很聪明,只能根据需要加载DLL。为了让我的钩子代码开始工作,我需要右键单击一个文本文件,以便调用原始指南的shell扩展代码,此时DLL似乎从那时起保持加载状态。
问题:
是否有一个我可以伪实现的shell扩展接口,以便explorer.exe
在启动时加载我的shell扩展,并且永远不会卸载它?对我正在做的事情有更优雅的解决方案吗?
编辑:有一个类似的post涉及BHO,它在启动时同时加载explorer.exe
和iexplorer.exe
。当我读到它时,我原以为它只是一个IE浏览器,但我错了。您可以编写一个额外的密钥(NoExplorer)来阻止explorer.exe
加载它,但有没有类似的命令阻止IE加载它?我的所有搜索都在不断推出NoExplorer。
编辑:通过一些经验实验,ICopyHook接口尽可能接近持久的shell扩展。没有调用IFileOperation的原因是因为explorer.exe
没有调用它,而是来自其他程序请求shell在该接口下执行特定操作。在任何情况下,我都实现了一个相当空的ICopyHook shell扩展,它似乎在启动后不久加载到explorer.exe
,尽管它是非常不确定的。如果有人有更好的解决方案,请分享。
答案 0 :(得分: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扩展程序由Internet Explorer加载时,只需在DllMain DLL_PROCESS_ATTACH 中返回 FALSE 。