Как создать подкласс Windows Explorer - PullRequest
2 голосов
/ 04 июля 2011

Я хочу изменить цвет списка просмотра explorer.exe следующим образом

enter image description here

Я получил дескриптор окна просмотра списка функцией GetTopWindow и его семьей.

enter image description here

Для создания подкласса в окне просмотра файла explorer.exe я ввел свой код dll в проводник, выполнив следующий код.

SetWindowsHookEx(WH_GETMESSAGE, GetMsgProc, g_hInstDll,
    dwExplorerListviewThreadId);

Моя dll хорошо загружена explorer.exe. И я подклассифицировал оконную процедуру с помощью SetClassLongPtr (для глобального подкласса) во введенном коде.

SetClassLongPtr возвращает успех, но моя функция подкласса ( SubclassProc ) получает только сообщения WM_CREATE WM_DESTROY и WM_MOVE. В чем дело? Я ожидал получить WM_NOTIFY и NM_CUSTOMDRAW .

Ответы [ 2 ]

2 голосов
/ 05 июля 2011

Проблема в том, что это не ListView.вместо этого он использует внутреннюю среду Microsoft DirectlUI, которая используется в проводнике в нескольких местах.Он не использует никаких сообщений общего управления, таких как NM_CUSTOMDRAW.Нет практически никакого разумного способа изменить используемые им цвета.

(Кроме того, обычно лучше использовать SetWindowLongPtr вместо SetClassLongPtr для создания подклассов HWND: SetClassLong изменяет только базовый шаблон, который используется для создания новых окон,но может не закончиться изменением каких-либо экземпляров, которые были основаны на этом. И вам не следует использовать одну и ту же функцию - GetMsgProc - как для обратного вызова ловушки, так и для процедуры подкласса, они должны обрабатывать сообщение различными способами, обратный вызов ловушки требуетдля вызова CallNextHookEx, в то время как proc подкласса должен вызывать CallWindowProc с исходным wndproc, но на самом деле все это не имеет значения, поскольку элемент управления не является ListView в первую очередь ...)

0 голосов
/ 04 июля 2011

Я думаю и предполагаю, что в ОС предусмотрены специальные средства защиты для процесса explorer.exe, потому что в противном случае это было бы легкой целью для вредоносного кода или просто приложений, которые считают, что они важнее, чем на самом деле (если некоторые люди настаивают на этом)ставя ярлык на рабочий стол каждый раз, когда вы запускаете приложение, представьте, что они будут делать, когда у них будет такой доступ к explorer.exe - все в оболочке).

РЕДАКТИРОВАТЬ: Я был заинтригованвопрос и сделал еще несколько исследований, я думаю, что есть более приземленная причина, см. http://blogs.msdn.com/b/oldnewthing/archive/2005/09/07/461912.aspx. (в основном: explorer.exe - оконный менеджер, поэтому пока не знает о маршрутизации сообщений, когда получает определенные сообщения, что являетсяпочему они не могут быть перехвачены перехватчиками сообщений).

...