当用户双击文件以启动它时,如果文件符合特定条件,我需要执行自定义操作。
在WindowsXP中,可以使用detours在explorer.exe中挂钩ShellExecuteEx,并且可以访问文件名。我需要在Windows 7和8中做类似的事情。
如何在双击文件时执行某些代码,并且文件名可用?
如果Windows更新修补程序资源管理器,我需要一个可以继续工作的方法。
答案 0 :(得分:8)
使用procmon
进行的简单检查表明每次浏览器激活文件时(通过双击或按Enter键)。资源管理器搜索HKCR\*\ShellEx\DataHandler
。
DataHandler
是windows shell extensions的众多类型中的一种。
因此,虽然文档说明它是拖放操作的,但它似乎总是在调用时调用它 打开文件。
我已经按照How to Create Data Handlers教程了解如何注册一个,只需进行一项小修改:我已在DataHandler
下添加了HKCR\*\ShellEx\DataHandler
个自定义GUID和一个相应的CLSID
条目,并将其链接到一个什么也不做的dll。现在,每当我点击或输入"一份文件。我没有实现所有必需的接口,但根据文档:
Shell通过其IPersistFile接口初始化处理程序。 它使用此接口来请求处理程序的类标识符 (CLSID)和为其提供文件的名称。
因此理论上它应该可以被实现所需接口的dll访问,并且您可以在每次访问时访问文件名执行自定义操作而不执行任何其他操作。
我目前没有时间自己编写这样的dll(可能稍后),但它看起来是一个很好的方向,你可以探索。
答案 1 :(得分:4)
所以基本上你想要做一个防病毒软件,对吧?拦截所有I / O呼叫?你想要一些名为filters
的东西(上次我用它在旧的XP机器上)。如果您不想编写自己的驱动程序,过滤器就是您的选择!
这比所有讨厌的API钩子要好得多。 From MSDN:
你看到" Minifilter A"?那可能是你想要在接下来的几天里聚会的地方!
答案 2 :(得分:2)
有点超出我的深度,但这里有。我读了很久以前的东西,每当双击一个应用程序时,资源管理器会调用SHELL32!CExecuteApplication::Execute
。虽然没有关于它的真实文档。如果您跟踪呼叫,则最终会呼叫CreateProcess
。我想你可以挂钩。但是,如果应用程序已在运行并且它是单实例应用程序(例如MS Outlook),则CreateProcess
将不起作用。只有在资源管理器需要创建进程时才会调用此函数。
答案 3 :(得分:2)
当我尝试将所有执行调用挂钩到特定的驱动器号时,我遇到了类似的问题。最初我把shellexecuteex与绕行库连接起来。这在Windows 7中失败,因为资源管理器开始使用直接的kernel32.dll或ntdll等效调用来跳过shell API层。 处理应用程序执行的自定义处理的更好方法是实现shell文件夹。我通过添加注册表项隐藏实际的驱动器号。然后我实现了一个shell文件夹,显示隐藏的驱动器号内容的内容。通过这种方法,我能够更好地控制资源管理器中显示的项目,最终捕获双击。尽管你需要编写大量的代码来使UI与资源管理器完全相同,但这是更合适的。适合您的要求的文件化方法。