2

このようにexplorer.exeのリストビューの色を変えたい

ここに画像の説明を入力

GetTopWindow 関数とそのファミリによって、リストビュー ウィンドウのハンドルを取得しました。

ここに画像の説明を入力

explorer.exe のリストビュー ウィンドウをサブクラス化するために、次のコードで dll コードを Explorer に挿入しました。

SetWindowsHookEx(WH_GETMESSAGE, GetMsgProc, g_hInstDll,
    dwExplorerListviewThreadId);

私のdllはexplorer.exeによってうまく読み込まれます。そして、挿入されたコードでSetClassLongPtr (グローバル サブクラス用) によってウィンドウ プロシージャをサブクラス化しました。

SetClassLongPtrは成功を返しますが、サブクラス関数 ( SubclassProc ) は WM_CREATE WM_DESTROY および WM_MOVE メッセージしか受け取りません。どうしたの?WM_NOTIFY と NM_CUSTOMDRAWを取得することを期待していました。

4

2 に答える 2

2

問題は、そもそもこれが ListView ではないことです。代わりに、エクスプローラーのいくつかの場所で使用されている Microsoft の内部 "DirectlUI" フレームワークを使用しています。NM_CUSTOMDRAW などの Common Control メッセージは使用しません。使用する色を変更する合理的な方法はほとんどありません。

(また、一般に、HWND のサブクラス化には SetClassLongPtr の代わりに SetWindowLongPtr を使用するのが最善です: SetClassLong は、新しいウィンドウの作成に使用される基になるテンプレートのみを変更しますが、それに基づくインスタンスを変更することにはならない場合があります。同じ関数 (GetMsgProc) をフック コールバックとサブクラス プロシージャの両方に使用する; それらは異なる方法でメッセージを処理する必要があり、フック コールバックは CallNextHookEx を呼び出す必要があり、サブクラス プロシージャは元の wndproc で CallWindowProc を呼び出す必要があります。そもそもコントロールが ListView ではないため、これは非常に重要です...)

于 2011-07-04T22:41:07.873 に答える
0

OSにはexplorer.exeプロセスに対する特別な保護があると思います.そうしないと、悪意のあるコードや、実際よりも重要であると考えるアプリケーションの簡単なターゲットになるためです.アプリケーションを起動するたびにデスクトップにショートカットが表示される場合、explorer.exe (シェル内のすべて) にこの種のアクセス権があれば、彼らが何をするか想像してみてください)。

編集:私は質問に興味をそそられ、さらに調査を行いました。もっと平凡な理由があると思います。(基本的に、explorer.exe はウィンドウ マネージャーであるため、特定のメッセージを受信したときのメッセージ ルーティングについてまだ認識していないため、メッセージ フックでインターセプトできません)。

于 2011-07-04T12:25:03.753 に答える