我打算在文件打开时双击任何浏览器调用(双击,上下文菜单打开等),但我找不出哪个功能。资源管理器使用什么来打开文件?
最初,我以为是ShellExecute,因为就我所知,它做的是同样的事情,但在挂钩之后,我了解到它仅在打开新的资源管理器窗口时才会使用。
任何想法,我应该挂钩功能?
我打算在文件打开时双击任何浏览器调用(双击,上下文菜单打开等),但我找不出哪个功能。资源管理器使用什么来打开文件?
最初,我以为是ShellExecute,因为就我所知,它做的是同样的事情,但在挂钩之后,我了解到它仅在打开新的资源管理器窗口时才会使用。
任何想法,我应该挂钩功能?
如果你想截取这些东西,只需注册自己作为shell项目的默认动词。这里有一些samples。
如果你只是想知道,如果有人改变了一些文件,你有兴趣,你应该更改通知通过FindFirstChangeNotification()和相关API注册。
我们不想'拦截',我们只是想通知,假设通过拦截你的意思是完全覆盖默认行为。我考虑过这样做,然后把它传递给ShellExecute,但是资源管理器显然没有这样做,所以它让我有点疲倦。我们不想改变默认行为_at all_。 – 2009-11-24 18:07:30
我对正在更改的文件不感兴趣。我很想知道用户何时从资源管理器打开文件。 – 2009-11-24 18:37:22
这听起来像AppInit_DLLs
注册表键值就足够好了。
做一个简单的DLL和调用GetCommandLine()
在你的DllMain函数,以完整的命令行得到正在执行的应用程序。
有一种更简单的方法可以做到这一点,其中包括编写一个可以订阅CreateProcess函数通知的设备驱动程序。但是对任何探险者来说,一个简单的钩子将是我们的首选方法。 – 2009-11-25 16:57:17
比写一个设备驱动程序(但更有趣的)许多简单的是MS研究工具detours。玩的开心!
Detours是无用的,因为我不知道需要挂钩什么功能(尽管我已经断定该功能并未从浏览器公开),并且需要我们购买许可证才能添加一个非常小的功能。最重要的是,我已经编写了钩子函数的代码。 – 2009-12-12 23:45:39
嗯。 。 。那么这是一个困惑。 。 。以下是另一个想法: - 按照我的建议绕行 - 在截获的文件中设置断点打开系统调用 - 查看堆栈跟踪中的funcs。 。 。 然后你会有实际的拦截功能。 。 。我从来没有这样做过。 。不知道它是否会起作用。也许不会! TheEruditeTroglodyte – TheEruditeTroglodyte 2009-12-15 03:43:39
可以肯定的是,您还检查了ShellExecuteEx? :)否则,只需要CreateProcess ... – OregonGhost 2009-11-24 17:23:22
目的是什么?防止用户打开某些文件? – 2009-11-24 17:25:30
写入设备驱动程序以接收CreateProcess通知是另一种选择。 目的是跟踪用户是否已打开的文件,因为我们的程序修改它(显然不是100%准确,但是这是我能想到的最好的办法) – 2009-11-24 18:05:36