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

标签 windows mfc hook subclass dll-injection

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

enter image description here

我是通过GetTopWindow函数及其家族获得了listview窗口的句柄。

enter image description here

为了子类化 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/

相关文章:

java - 我可以在32位Windows操作系统上运行64位java程序吗

python - 如何从 Python 源文件中提取函数的调用图?

c++ - 使用文件中的数据在对话框中显示多个图像 (C++ MFC)

c++ - 系统范围的钩子(Hook)不在主程序之外运行

svn - Subversion中如何区分普通commit和merge?

windows - 安排Powershell脚本每小时运行一次

c++ - 在没有正则表达式的情况下验证电子邮件地址

visual-c++ - 如何在 VC++ 中将两个资源合并到一个项目中?

c# - 读取文件时引发事件?

c++ - 限制连接 BSTR 的参数类型