2011-07-04 67 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

相關問題