我想像这样改变 explorer.exe ListView 的颜色
我是通过GetTopWindow函数及其家族获得了listview窗口的句柄。
为了子类化 explorer.exe 的 listview 窗口,我通过以下代码将我的 dll 代码注入(inject)到 explorer。
SetWindowsHookEx(WH_GETMESSAGE, GetMsgProc, g_hInstDll,
dwExplorerListviewThreadId);
我的 dll 很好地被 explorer.exe 加载了。 我在注入(inject)代码中通过 SetClassLongPtr(对于全局子类)将窗口过程子类化。
SetClassLongPtr 返回成功,但我的子类函数 (SubclassProc) 仅收到 WM_CREATE WM_DESTROY 和 WM_MOVE 消息。怎么了?我希望得到 WM_NOTIFY 和 NM_CUSTOMDRAW。
最佳答案
问题在于,这首先不是 ListView;它使用 Microsoft 的内部“DirectlUI”框架,该框架在资源管理器中的多个地方使用。它不使用任何公共(public)控制消息,例如 NM_CUSTOMDRAW。几乎没有合理的方法来改变它使用的颜色。
(此外,通常最好使用 SetWindowLongPtr 而不是 SetClassLongPtr 来对 HWND 进行子类化:SetClassLong 仅更改用于创建新窗口的基础模板,但最终可能不会更改基于该模板的任何实例。而且你钩子(Hook)回调和子类 proc 不应该使用相同的函数 - GetMsgProc;它们需要以不同的方式处理消息,钩子(Hook)回调需要调用 CallNextHookEx 而子类 proc 需要使用原始 wndproc 调用 CallWindowProc。但这些都不重要,因为控件首先不是 ListView...)
关于windows - 如何子类化 Windows 资源管理器的窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6570844/