2

我想像这样更改 explorer.exe 的列表视图的颜色

在此处输入图像描述

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

在此处输入图像描述

为了子类化 explorer.exe 的列表视图窗口,我通过以下代码将我的 dll 代码注入资源管理器。

SetWindowsHookEx(WH_GETMESSAGE, GetMsgProc, g_hInstDll,
    dwExplorerListviewThreadId);

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

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

4

2 回答 2

2

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

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

于 2011-07-04T22:41:07.873 回答
0

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

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

于 2011-07-04T12:25:03.753 回答