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




Anmelden zum Antworten