如何子类化Windows资源管理器的窗口

时间:2011-07-04 11:28:06

标签: windows mfc hook subclass dll-injection

我想像这样改变explorer.exe的listview的颜色

enter image description here

我通过GetTopWindow函数和他的家人得到了listview窗口的句柄。

enter image description here

为了继承explorer.exe的listview窗口,我通过以下代码将我的dll代码注入到资源管理器中。

SetWindowsHookEx(WH_GETMESSAGE, GetMsgProc, g_hInstDll,
    dwExplorerListviewThreadId);

我的dll很好地被explorer.exe借用了。 我在注入的代码中通过 SetClassLongPtr (对于全局子类)将窗口过程子类化。

SetClassLongPtr 返回成功但我的子类函数( SubclassProc )仅接收WM_CREATE WM_DESTROY和WM_MOVE消息。怎么了?我希望得到 WM_NOTIFY和NM_CUSTOMDRAW

2 个答案:

答案 0 :(得分:2)

问题是这首先不是ListView;它改为使用微软的内部“DirectlUI”框架,该框架在资源管理器的几个地方使用。它不使用任何公共控制消息,例如NM_CUSTOMDRAW。改变它使用的颜色几乎没有合理的方法。

(另外,通常最好使用SetWindowLongPtr而不是SetClassLongPtr来子类化HWND:SetClassLong只更改用于创建新窗口的基础模板,但最终可能不会更改任何基于此的实例。而你不应该对钩子回调和子类proc使用相同的函数 - GetMsgProc;它们需要以不同的方式处理消息,钩子回调需要调用CallNextHookEx,而子类proc需要用原始的wndproc调用CallWindowProc。但这一切都不重要,因为控件首先不是ListView ...)

答案 1 :(得分:0)

我认为并且假设操作系统对explorer.exe进程有特殊保护,因为否则它会成为恶意代码的简单目标,或者只是认为它们比实际更重要的应用程序(如果有人坚持的话)每次启动应用程序时在桌面上放置一个快捷方式,想象一下当他们对explorer.exe进行访问时他们会做什么 - shell中的所有内容。

编辑:我对这个问题很感兴趣并做了一些更多的研究,我认为有一个更平凡的原因,见http://blogs.msdn.com/b/oldnewthing/archive/2005/09/07/461912.aspx。 (基本上:explorer.exe是窗口管理器,所以当它收到某些消息时它们还不知道消息路由,这就是为什么它们不能被消息钩子截获的。)