H
Hallo liebes Forum,
unter Windows 95/98 bis Windows 10 war es bisher kein (großes) Problem, mittels z.B. FindWindowA(...) etc. auf das Fensterhandle des Desktophintergrundes zuzugreifen oder einen hierfür nach meinem Kenntnisstand von MS undokumentierten "WorkerW-Hack" zu nutzen, um ein HDC zu erzeugen bzw. sich das HDC zu nehmen und mittels GDI, OpenGL oder DirectX hierein zu zeichnen. So habe ich schon einige, zum Teil auch schon recht ansprechende, animierte Desktophintergründe erstellt, welche schön hinter den Desktopsymbolen des Progman ihre Animationen darstellen (einfache bis komplexe Shader oder "kleine" 3D Animationen - das spielt hier aber erstmal keine Rolle).
Seit der Installation von Windows 11 versuche ich nun immer mal wieder, Teile meines alten Quellcodes, welcher unter Windows 10 auch immer noch einwandfrei läuft, auch unter Windows 11 zum Laufen zu bekommen - doch bisher leider nur erfolglos. Die Programme melden keine Fehler und machen halt nur für den User unsichtbar im Hintergrund, was sie sollen. Sie schreiben das Ergebnis meiner Grafikoperationen in das Fenster, welches ich (hier für Windows 10) mit der Funktion "FindDeskWorkerW()" hierfür bereitstelle:
HWND FindDeskWorkerW() {
HWND progman = FindWindowA("Progman", NULL);
SendMessageTimeoutA(progman, 0x052C, 0, 0, SMTO_NORMAL, 1000, NULL);
Sleep(100);
HWND shellWorkerW = NULL;
shellWorkerW = FindWindowExA(NULL, NULL, "WorkerW", NULL);
while (shellWorkerW) {
HWND shellView = FindWindowExA(shellWorkerW, NULL, "SHELLDLL_DefView", NULL);
if (shellView) {
HWND wallpaperLayer = GetWindow(shellWorkerW, GW_HWNDNEXT);
char className[256];
GetClassNameA(wallpaperLayer, className, 256);
if (std::string(className) == "WorkerW") {
doDebug("Search", "Hintergrund-Layer gefunden. Setze Parent.");
return wallpaperLayer;
}
}
shellWorkerW = FindWindowExA(NULL, shellWorkerW, "WorkerW", NULL);
}
return progman; // Fallback, falls was schief geht....
}
Zum Suchen des richtigen Windowhandles habe ich ein kleines Programm geschrieben, welches rekursiv durch alle unter Windows vorhandenen HWND's inkl. Kinder, Enkel und Schwesterfenster (die ganze Familie ) iteriert und jeweils mittels GDI ein kleines rotes Quadrat(10,10,110,110) mittels fillrect() darstellt und evtl. Zugriffsfehler, welche hier durchaus auftreten können, abfängt. Leider konnte ich auch mit diesem "Desktophintergundbild-HWND-Suchprogramm" kein rotes Quadrat sehen - weder die Symbole des Progman noch des Wallpaper wurden rot eingefärbt oder zeigten irgendwelche ungewöhnlichen Grafik-Fragmente... einige zum testen geöffnet Fenster (Notepad, Chrome, Outlook, ...etc.) zeigten mir rote Quadrate bzw. teilweise auch nur Fragmente davon, aber der Desktop selbst und die Desktopsymbole des Progman blieben sauber - was ich schon sehr komisch fand... wo wird in Windows11 der Desktophintergrund hin gerendert oder die in den Anzeigeeinstellungen einstellbare Foto-Diashow ?
Auch unter Einsatz von Copilot & Co. konnte ich bisher hier keine positiven Ergebnisse unter Windows 11 erzielen. Daher nun mal die Frage ins Forum - vielleicht hat das ja schonmal jemand von euch hinbekommen oder kennt eine API-Schnittstelle von Windows, welche auf den richtigen Speicherbereich der Grafikkarte zeigt, in welchem sich das Hintergrundbild aktuell befindet.
Für jeglichen Tip in die richtige Richtung wäre ich sehr Dankbar.