使用非托管 DLL 来自 .NET 的系统范围外壳挂钩

Posted

技术标签:

【中文标题】使用非托管 DLL 来自 .NET 的系统范围外壳挂钩【英文标题】:System Wide Shell Hook from .NET using Unmanaged DLL 【发布时间】:2010-12-08 10:57:39 【问题描述】:

我过去成功使用了以下 CodeProject 文章中提供的代码,但它似乎只能在 Vista/7 上部分工作(我猜是因为 UAC)。它适用于当前线程,但不会获取系统范围的活动。我尝试在清单中添加 requireAdministrator 并对非托管和托管程序集进行签名,但这似乎没有帮助。

Using Window Messages to Implement Global System Hooks in C#

我的主要目标是使用 SetWindowsHookEx 捕获非托管程序集中的 HSHELL_WINDOWCREATED 和 HSHELL_WINDOWDESTROYED 消息,并通知 C# 应用程序以便它可以实时使用这些信息。它基本上只需要知道系统中何时创建或销毁窗口。

我还发现了一个纯 C/C++ 示例应用程序,它在 Vista/7 中运行良好,但我真的不想用 C/C++ 编写整个应用程序,因为我更喜欢 C#。

System Wide Hook Example that Works

有人知道如何修复第一篇 CodeProject 文章中的代码,以便它也能在 Vista/7 上运行吗?或者有任何其他示例说明我无需在 C# 中创建计时器和类似的技巧即可做到这一点?

谢谢, 马克

【问题讨论】:

【参考方案1】:

看看我的程序:http://wpfklip.codeplex.com。 我已经实现了系统范围的 shell 挂钩,因此程序能够捕获创建、激活等的窗口。而且是用c#写的

【讨论】:

我不知道 User32 中存在 RegisterShellHookWindow ......这让事情变得容易多了。感谢您分享这个!毕竟我今天学到了一些新东西。 :) 我今晚要玩一下它,如果我能让它工作,那么我会给你答案。再次感谢。【参考方案2】:

这里有一个关键点:

1) Lusid 正在寻找一个 shell 钩子。由于 Lusid 链接到的第一篇文章中解释的“DLL 注入”原因,这些在 .NET 中不起作用。

2) Trickster 编写了一个键盘挂钩。这些在 C# 中工作得很好(因为它们是从窗口的某些部分而不是特定的应用程序挂钩的,并且它可以处理注入 .NET)。

一个

【讨论】:

以上是关于使用非托管 DLL 来自 .NET 的系统范围外壳挂钩的主要内容,如果未能解决你的问题,请参考以下文章

我是不是需要在 C# 中使用来自非托管 C++ dll 的原始数据类型执行 MarshalAs?

.NET 无法在同一目录中找到非托管 DLL

当它们的非托管依赖项发生冲突时,如何使用 2 个第三方 .net 库?

非托管 DLL 无法在 ASP.NET 服务器上加载

使用 .NET Native 构建时,参数不会传递给 x86 上的非托管 DLL

在 .NET 控件中部署非托管依赖 dll