2011-07-04 70 views
1

我想改变的Explorer.exe的列表视图的颜色像这样如何继承Windows资源管理器的窗口

enter image description here

我通过GetTopWindow功能和他的家人得到了列表视图窗口的句柄。

enter image description here

要继承的explorer.exe的列表视图窗口,我注入我的DLL的代码通过下面的代码浏览器。

SetWindowsHookEx(WH_GETMESSAGE, GetMsgProc, g_hInstDll, 
    dwExplorerListviewThreadId); 

我的DLL是由explorer.exe loaed好。 并且我在注入的代码中将窗口过程分类为SetClassLongPtr(用于全局子类)。

SetClassLongPtr回报的成功,但我的子类功能(SubclassProc)只接收WM_CREATE WM_DESTROY和WM_MOVE消息。怎么了?我期望得到WM_NOTIFY和NM_CUSTOMDRAW

回答

0

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

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

+2

Explorer没有什么特别的东西(很好,很少):它实际上并不是窗口管理器:窗口经理“在abov中提到e文章是USER32。自2005年的文章以来,事情发生了一些变化:新的DWM(桌面窗口管理器)进程现在处理一些窗口管理和组合 - 但主要是在图形方面; USER32仍然管理输入,挂钩以及与HWND相关的所有事情。 – BrendanMcK

2

问题是,这不是一个ListView的第一个地方;它改为使用微软内部的“DirectlUI”框架,它在浏览器中的多个地方使用。它不使用任何公共控制消息,例如NM_CUSTOMDRAW。几乎没有合理的方法来改变它使用的颜色。 (另外,通常最好使用SetWindowLongPtr代替SetClassLongPtr来实现HWND的子类化:SetClassLong只改变用于创建新窗口的基础模板,但最终可能不会改变基于此的任何实例。你不应该使用相同的函数--GetMsgProc--钩子回调和子类proc;它们需要以不同的方式处理消息,钩子回调需要调用CallNextHookEx,而子类proc需要用原始的wndproc调用CallWindowProc 。但是没有一个真正重要,因为控件不是ListView的第一位...)

+0

很难说没有完整的源代码,但它看起来像GetMsgProc是钩子回调,SubclassProc是子类窗口的回调。 IMO这是好的。 –

+0

这个问题在我发布我的原始答案后进行了编辑 - 最初的Qu有两个GetMsgProc。 – BrendanMcK

相关问题