2009-11-24 137 views
0

我打算在文件打开时双击任何浏览器调用(双击,上下文菜单打开等),但我找不出哪个功能。资源管理器使用什么来打开文件?

最初,我以为是ShellExecute,因为就我所知,它做的是同样的事情,但在挂钩之后,我了解到它仅在打开新的资源管理器窗口时才会使用。

任何想法,我应该挂钩功能?

+1

可以肯定的是,您还检查了ShellExecuteEx? :)否则,只需要CreateProcess ... – OregonGhost 2009-11-24 17:23:22

+0

目的是什么?防止用户打开某些文件? – 2009-11-24 17:25:30

+0

写入设备驱动程序以接收CreateProcess通知是另一种选择。 目的是跟踪用户是否已打开的文件,因为我们的程序修改它(显然不是100%准确,但是这是我能想到的最好的办法) – 2009-11-24 18:05:36

回答

0

如果你想截取这些东西,只需注册自己作为shell项目的默认动词。这里有一些samples

如果你只是想知道,如果有人改变了一些文件,你有兴趣,你应该更改通知通过FindFirstChangeNotification()和相关API注册。

+0

我们不想'拦截',我们只是想通知,假设通过拦截你的意思是完全覆盖默认行为。我考虑过这样做,然后把它传递给ShellExecute,但是资源管理器显然没有这样做,所以它让我有点疲倦。我们不想改变默认行为_at all_。 – 2009-11-24 18:07:30

+0

我对正在更改的文件不感兴趣。我很想知道用户何时从资源管理器打开文件。 – 2009-11-24 18:37:22

0

有一些ShellExecute挂钩,但现在(XP之后)已弃用,因为每个人都用它们来实现最奇怪的目的。有关详细信息,请参阅this,有关某些文档,请参阅this

+0

是的,我们最初使用这些。我们试图找到一个可以在Vista上运行的解决方案,因此可以调用任何函数,假设有人知道哪个函数是动态链接库的一部分。 – 2009-11-25 16:58:05

0

这听起来像AppInit_DLLs注册表键值就足够好了。

做一个简单的DLL和调用GetCommandLine()在你的DllMain函数,以完整的命令行得到正在执行的应用程序。

+0

有一种更简单的方法可以做到这一点,其中包括编写一个可以订阅CreateProcess函数通知的设备驱动程序。但是对任何探险者来说,一个简单的钩子将是我们的首选方法。 – 2009-11-25 16:57:17

-1

比写一个设备驱动程序(但更有趣的)许多简单的是MS研究工具detours。玩的开心!

+0

Detours是无用的,因为我不知道需要挂钩什么功能(尽管我已经断定该功能并未从浏览器公开),并且需要我们购买许可证才能添加一个非常小的功能。最重要的是,我已经编写了钩子函数的代码。 – 2009-12-12 23:45:39

+0

嗯。 。 。那么这是一个困惑。 。 。以下是另一个想法: - 按照我的建议绕行 - 在截获的文件中设置断点打开系统调用 - 查看堆栈跟踪中的funcs。 。 。 然后你会有实际的拦截功能。 。 。我从来没有这样做过。 。不知道它是否会起作用。也许不会! TheEruditeTroglodyte – TheEruditeTroglodyte 2009-12-15 03:43:39