IActiveDesktop funktioniert nicht [Win2k]
-
Ich wollte mir einen kleinen Wallpapermanager schreiben, dafür will ich jetzt natürlich auch ein "Als Wallpaper verwenden" einbauen -> dafür habe ich mich nun mit COM auseinandergesetzt und somit auch mit IActiveDesktop.
Als Test habe ich folgendes Kurzprogramm geschrieben, dass alle JPEG-Bilder eines Ordners für 3 Sekunden als Wallpaper verwendet. Soweit so gut, es gibt keine Fehler die das Programm verursacht. Doch mein Hintergrund wird nicht geändert

Hier der Code:
#define UNICODE // Unicode intern verwenden #define _UNICODE // Unicode extern verwenden7 #include <tchar.h> // Benötigt für Unicode-Konvertierung #include <windows.h> // Benötigt für allgemeine Windowsfunktionen #include <wininet.h> // Wird für die Shell-API benötigt #include <shlobj.h> // Shell-API wird für aktive Desktopelemente benötigt int WINAPI WinMain (HINSTANCE hInst, HINSTANCE hPrev, PSTR szCmdLine, int nCmdShow) { bool error = false; // COM initialisieren CoInitialize(0); // Active Desktop Handle einholen IActiveDesktop* Desktop; if(S_OK != CoCreateInstance(CLSID_ActiveDesktop, NULL, CLSCTX_INPROC_SERVER, IID_IActiveDesktop, (void**)&Desktop)) { MessageBox(0,TEXT("Sorry, konnte kein Handle auf den Active Desktop einholen."),TEXT("Fehler"),MB_OK); error = true; } else { // Erste Datei im Verzeichnis finden WIN32_FIND_DATAW wfd; HANDLE Files = FindFirstFile(TEXT("*.jpg"),&wfd); // Wenn eine Datei gefunden wurde... if(Files != INVALID_HANDLE_VALUE) { do { // ...prüfen ob sie kein Ordner ist if(wfd.dwFileAttributes != FILE_ATTRIBUTE_DIRECTORY) { // Ist dies der Fall wird sie als Desktophintergrund bestimmt if(SUCCEEDED(Desktop->SetWallpaper(wfd.cFileName,0))) { TCHAR WallpaperName [50]; Desktop->GetWallpaper(WallpaperName,50,0); MessageBox(0,WallpaperName,TEXT("Wayne"),MB_OK); // 3 Sekunden warten... Sleep(3000); } else { MessageBox(0,TEXT("Sorry, konnte eine Datei nicht als Hintergrund verwenden."),TEXT("Fehler"),MB_OK); } } } // ...und weitere Dateien suchen while(FindNextFile(Files,&wfd)); } else { MessageBox(0,TEXT("Sorry, konnte keine Datei in diesem Verzeichnis finden."),TEXT("Fehler"),MB_OK); error = true; } // Dateisuche Handle freigeben FindClose(Files); } if(!error) { MessageBox(0,TEXT("Alle Dateien wurden angezeigt."),TEXT("Fertig"),MB_OK); // Active Desktop Handle freigeben Desktop->Release(); } CoUninitialize(); // Programm beenden return(0); }Programm verwendet Unicode und Shell-API (COM).
MfG SideWinder
-
Hast Du mal einen Blick auf IActiveDesktop::ApplyChanges geworfen?
-
*plonk*
Ich werd das gleich mal einbauen und testen

MfG SideWinder
-
Jetzt sehe ich zwar, dass er den Desktop aktualisiert (stelle ich vorher selbst ein Wallpaper über Desktop -> Eigenschaften ein) ändert er es auf einen schwarzen Hintergrund. Doch wird das Bild nicht angezeigt

Gehe ich nach der Ausführung in Desktop -> Eigenschaften dann sehe ich zwar das neue Bild angezeigt und kann es dort nach einer Veränderung (zB Nebeneinander und dann wieder Strecken wählen) auch am Desktop betrachten, doch ist das nicht Sinn und Zweck.
Wie kann ich es einrichten, dass das Bild sofort zu sehen ist?
MfG SideWinder
-
Vielleicht findest du ja hier was:
- http://www.c-plusplus.net/forum/viewtopic.php?t=52515
- http://www.c-plusplus.net/forum/viewtopic.php?t=15350