2015-06-04 9 views
35

Ich versuche, an einem Projekt zu arbeiten, wo ich das Windows 7 Wallpaper entweder mit OpenGL/DirectX oder GDI animieren kann. Ich sah, wie sich die Windows-Desktop-Fenster werden angelegt, und ich herausgefunden das ganzeWas behandelt eigentlich die Zeichnung des Windows Wallpaper?

"Progman" -> "SHELLDLL_DefView" -> "SysListView32"

Hierarchie. Ich habe versucht, SysListView32 WndProc anhängen und versuchte mit den Nachrichten mit einem injizierten C# dll rum, so dass ich verhindern konnte, dass der Desktop das Hintergrundbild zu zeichnen, wenn ich gezwungen, es über die Systemsteuerung -> personalisieren Menü zu ändern. Nichts davon verhinderte, dass das Hintergrundbild aktualisiert wurde. Daher dachte ich, dass explorer.exe nicht wirklich das Zeichnen des Hintergrunds handhabt.

Um dies zu bestätigen, tötete ich explorer.exe und richte ein kleines C# -Programm ein, das das Hintergrundbild eines 10-Sekunden-Timers in einen zufälligen verwandelt. Wie ich erwartet hatte, änderte sich das Hintergrundbild, was mich zu der Annahme verleitete, dass explorer.exe nicht wirklich mit dem Zeichnen des Hintergrundbildes fertig wird!

Leider ist das, wo ich komplett verloren bin. Ich habe keine Ahnung, was sonst noch für das Zeichnen der Tapete verantwortlich ist und wie ich die Zeichnung übernehmen kann, damit ich mit der Zeichnung umgehen kann. Ich habe versucht, dies jetzt für ein paar Tage zu googeln, mit wenig Fortschritt. Ich hoffe, dass mich hier jemand in die richtige Richtung führen kann.

+17

['GetDesktopWindow'] (https://msdn.microsoft.com/en-us/library/ms633504) gibt ein Handle für das Desktop-Fenster mit dem Hintergrundbild zurück. In Windows 7 hat dieses Fenster eine Kernel-Modus-Fensterprozedur "win32k! XxxDesktopWndProc" (von win32k.sys), die "win32k! XxxInternalPaintDesktop" aufruft. Ähnliche Funktionen sind 'win32k! XxxDrawWallpaper' und' win32k! XxxSetDeskWallpaper'. Es gibt auch den Benutzermodus ['PaintDesktop'] (https://msdn.microsoft.com/en-us/library/dd162758), der schließlich' win32k! XxxInternalPaintDesktop' aufruft. – eryksun

+3

@eryksun: Dies sollte eine Antwort sein. – ybungalobill

+4

Der vlc Media Player verfügt über eine Funktion, um ein Video als Hintergrundbild anzuzeigen. Sie könnten überprüfen, wie sie es tun (wahrscheinlich die Art, wie @eryksun beschrieben wird) –

Antwort

0

Der Desktop Window Manager ist verantwortlich für das Zeichnen des Hintergrundbildes. Es ist als Windows-Dienst implementiert.

1

Der Desktop (einschließlich der Bitmap) wird tatsächlich vom Fenstersystem selbst gezeichnet. Das ist also im Grunde genommen ziemlich tief und alt. Also nach den Änderungen, die seit NT4 passiert sind, nehme ich an, dass das Gemälde tatsächlich in win32k.sys gemacht wird. Der Treiber wurde erstellt, um win32.dll zu ersetzen, die alles im Benutzermodus mit Kontextwechsel getan hätte.

Dies gesagt, es geht konform mit was Erykson zu Ihrer Frage kommentiert: win32k!xxxInternalPaintDesktop ist der Bösewicht.

Allerdings sollte es möglich sein, die DC des Desktop HWND (0 afaik) zu erwerben und an Ihre eigene Zeichnung anzuhängen. Nicht sicher, ob Sie es in ein DirectX DC verwandeln können, aber das liegt an Ihnen, es zu versuchen.

BTW. Es ist möglich, fremde Fenster (HWNDs) und zugehörige Gerätekontexte (DCs) erneut zu überlisten und zu erfassen. Sie müssen jedoch möglicherweise privilegiert oder ein Administrator sein. (Sicherheit geprüft)

+0

Ich habe zu GetDC Lage gewesen (0) und ziehen dazu, aber das zieht über die Desktop-Icons, so dass ich es nicht für meine Zwecke verwenden kann. Ich werde mich irgendwie damit beschäftigen, 'win32k! XxxInternalPaintDesktop' einzuhaken. – logisticalerror

+0

Sie zeichnen "über" die Symbole, weil der Explorer nicht wieder nach Ihnen zeichnet. Weil Explorer im Grunde das Gleiche tut. Das ist also ein gewöhnlicher Malereffekt (man löscht das vorhergehende) – Robetto

+0

Also sollte ich in der Lage sein, Explorer's WM_PAINT zu greifen, dann meine Malerei zu machen, und dann den Explorer malen lassen? – logisticalerror