2015-06-04 22 views
35

Sto provando a lavorare su un progetto in cui posso animare lo sfondo di Windows 7, con opengl/directx o GDI. Ho guardato in quanto le finestre desktop di Windows sono disposti, e ho capito tuttoChe cosa effettivamente gestisce il disegno dello sfondo di Windows?

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

gerarchia. Ho provato ad agganciare il WndProc di SysListView32 e ho provato a fare scherzi con i messaggi usando una C# dll iniettata in modo da impedire al desktop di disegnare lo sfondo quando ho forzato la modifica tramite il Pannello di controllo -> Menu Personalizza. Niente di tutto ciò ha effettivamente impedito l'aggiornamento dello sfondo, quindi ho capito che explorer.exe in realtà non gestisce il disegno dello sfondo.

Per confermare questo, ho ucciso explorer.exe e ho impostato un piccolo programma C# che cambia lo sfondo su un timer da 10 secondi a uno casuale. Come mi aspettavo, lo sfondo continuava a cambiare, portandomi a credere che explorer.exe non gestisse il disegno dello sfondo!

Sfortunatamente, questo è il punto in cui sono completamente perso. Non ho idea di cos'altro è responsabile per disegnare lo sfondo e come posso prendere in carico il disegno, così posso gestire il disegno. Ho provato a google questo per alcuni giorni, con pochi progressi. Spero che qualcuno qui possa guidarmi nella giusta direzione.

+17

['GetDesktopWindow'] (https://msdn.microsoft.com/en-us/library/ms633504) restituisce un handle per la finestra del desktop con lo sfondo. In Windows 7 questa finestra ha una procedura della finestra in modalità kernel 'win32k! XxxDesktopWndProc' (da win32k.sys), che chiama' win32k! XxxInternalPaintDesktop'. Le funzioni correlate sono 'win32k! XxxDrawWallpaper' e' win32k! XxxSetDeskWallpaper'. C'è anche la modalità utente ['PaintDesktop'] (https://msdn.microsoft.com/en-us/library/dd162758), che alla fine chiama' win32k! XxxInternalPaintDesktop'. – eryksun

+3

@eryksun: questa dovrebbe essere una risposta. – ybungalobill

+4

Il lettore multimediale vlc ha una funzione per mostrare un video come sfondo del desktop. Puoi controllare come lo fanno (probabilmente come descritto da @eryksun) –

risposta

0

Il Desktop Window Manager è responsabile del disegno dello sfondo. È implementato come servizio di Windows.

1

Il desktop (inclusa la bitmap su di esso) viene effettivamente disegnato dal sistema di finestre stesso. Quindi questo è fondamentalmente abbastanza profondo e vecchio. Quindi, in base ai cambiamenti avvenuti dopo NT4, suppongo che il dipinto sia effettivamente eseguito in win32k.sys. Il driver è stato creato per sostituire win32.dll che avrebbe fatto tutto in modalità utente con il cambio di contesto.

Detto questo, è conforme a ciò che erykson ha commentato alla tua domanda: win32k!xxxInternalPaintDesktop è il cattivo.

Tuttavia dovrebbe essere possibile acquisire il DC del Desktop HWND (0 afaik) e collegarlo al proprio disegno. Non sei sicuro di poterlo trasformare in DirectX DC, ma spetta a te provarlo.

BTW. È possibile reintestare e acquisire finestre esterne (HWND) e contesti dispositivo (DC) associati. Tuttavia potrebbe essere necessario avere privilegi o un amministratore. (sicurezza controllata)

+0

Sono stato in grado di GetDC (0) e disegnare ad esso, ma questo disegna sopra le icone del desktop, quindi non posso usarlo esattamente per i miei scopi. Guarderò in qualche modo agganciando 'win32k! XxxInternalPaintDesktop'. – logisticalerror

+0

Stai disegnando "sopra" le icone perché Explorer non si disegna dopo di te. Perché Explorer fondamentalmente fa lo stesso. Quindi questo è un normale effetto pittore (si cancella il precedente) – Robetto

+0

Quindi dovrei essere in grado di afferrare Explorer WM_PAINT, fare la mia pittura allora, e poi lasciare che Explorer faccia dipingere? – logisticalerror