如何子类化Windows资源管理器';窗户

如何子类化Windows资源管理器';窗户,windows,mfc,hook,subclass,dll-injection,Windows,Mfc,Hook,Subclass,Dll Injection,我想像这样更改explorer.exe的listview的颜色 我通过GetTopWindow函数和他的家族获得了listview窗口的句柄 为了子类化explorer.exe的listview窗口,我通过以下代码将我的dll代码注入到explorer中 SetWindowsHookEx(WH_GETMESSAGE, GetMsgProc, g_hInstDll, dwExplorerListviewThreadId); explorer.exe对我的dll很感兴趣。 我在注入的代

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

我通过GetTopWindow函数和他的家族获得了listview窗口的句柄

为了子类化explorer.exe的listview窗口,我通过以下代码将我的dll代码注入到explorer中

SetWindowsHookEx(WH_GETMESSAGE, GetMsgProc, g_hInstDll,
    dwExplorerListviewThreadId);
explorer.exe对我的dll很感兴趣。 我在注入的代码中通过SetClassLongPtr(对于全局子类)对窗口过程进行子类化


SetClassLongPtr返回成功,但我的子类函数(SubclassProc)只接收WM_创建WM_销毁和WM_移动消息。发生了什么?我希望得到WM_NOTIFY和NM_CUSTOMDRAW,我认为并且假设操作系统对explorer.exe进程有特殊保护,因为否则它很容易成为恶意代码的目标,或者只是那些认为它们比实际更重要的应用程序(如果有些人坚持在每次启动应用程序时都在桌面上放一个快捷方式,想象一下,当他们能够访问explorer.exe时,他们会怎么做——所有东西都在shell中)


编辑:我对这个问题很感兴趣,并做了更多的研究,我认为还有一个更普通的原因,请参阅。(基本上:explorer.exe是窗口管理器,所以当它接收到某些消息时,还不知道消息路由,这就是为什么它们不能被消息挂钩截获的原因).

问题在于,这首先不是一个列表视图;而是使用Microsoft的内部“DirectlUI”框架,该框架在explorer中的多个位置都有使用。它不使用任何常见的控制消息,如NM_CUSTOMDRAW。几乎没有合理的方法来更改它使用的颜色


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

什么都没有(嗯,很少)资源管理器的特别之处:它实际上并不是窗口管理器本身:上面文章中提到的“窗口管理器”是USER32。自2005年那篇文章以来,情况发生了一些变化:新的DWM(桌面窗口管理器)进程现在处理一些窗口管理和组合-但主要是在图形方面;USER32仍然管理输入、钩子和所有与HWND相关的东西。没有完整的源代码很难说,但看起来GetMsgProc是钩子回调,Subclass Proc是子类窗口的回调。在我看来,这没问题。问题是edi在我发布我的原始答案后,ted-原始Qu对这两个问题都有GetMsgProc。