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