Wallpaper zur Laufzeit ändern
-
Hi,
ein Freund von mir möchte ein Programm, dass nach jedem Neustart den Wallpaper ändern(aber keins von diesen vielen Tools). Und wer musses machen: ich^^
Nach einigem Suchen hab ich auch den passenden Regestrierungsschlüssel gefunden um den Dekstop zu ändern, Problem ist nur: wie übernehm ich das direkt?
wenn ich den Schlüssel ändere übernimmt der PC das ganze erst nach einem Neustart.
Dies wäre für das Programm nicht weiter schlimm, ich kann die Wallpaper ja immernoch direkt beim Neustart setzten und beim Hochfahren wird halt der zuletzt ausgewählt angezeigt.
Jedoch geht das doch auch zur Laufzeit (einfacher mitm Testen und nun will ich auch gerne wissen wie das geht), aber wie?Ich hab dazu folgendes Schlagwort bekommen, weiss aber nicht in wiefern ich das mit C++ verbinden soll:
das Wallpaper kannst du mit der SystemParametersInfo API Funktion wechseln (SPI_SETDESKWALLPAPER).Das hört sich für mich so an als müsste ich einen zusätzlichen header(wenn überhaupt vorhanden) a la windows.h einbinden und damit setzen.
Grüße
Pillep.s. Ich könnte auch einen ausgewählten Wallpaper immer überschreiben, aber das ist ja uncool

-
Laut Doku muss das inetwa so aussehen:
#include <windows.h> #include <tchar.h> void foo() { TCHAR const* newWallpaper = _T("C:\\BilliePiper.bmp"); UINT flags = SPIF_UPDATEINIFILE | SPIF_SENDCHANGE; BOOL rc = SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, newWallpaper, flags); ASSERT(rc); }Hab's aber nicht ausprobiert...
Wenn du die Funktion verwendest musst du die Registry wie's aussieht nichtmal selber schreiben, das übernimmt das SPIF_UPDATEINIFILE Flag. Sagt zumindest die Doku...
-
Also so mit Copy/Paste gehts nicht...
Hast du nen Link zu einer Dokumentation zu dem Thema oder so?Laut Compiler hängt es an den beiden letzten Zeilen:
BOOL rc = SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, newWallpaper, flags); ASSERT(rc);Da ich aber auch keine Ahnung von dem Thema hab (leider..) weiss ich nichtmal was da vorsich geht^^
-
Was meldet denn der Kompiler?
-
So hier erstmal der Code fürs Programm (dürfte ja eigentlich nichts anderes sein aber vllt kann ja immer was passieren...)
#include <windows.h> #include <tchar.h> void foo() { TCHAR const* newWallpaper = _T("D:\\Bilder\\Basti\\3ddesign054.jpg"); UINT flags = SPIF_UPDATEINIFILE | SPIF_SENDCHANGE; BOOL rc = SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, newWallpaper, flags); ASSERT(rc); } int main(void) { foo(); }Meldungen:
8 invalid conversion from `const void*' to `void*' 8 initializing argument 3 of `BOOL SystemParametersInfoA(UINT, UINT, void*, UINT)' 9 `ASSERT' undeclared (first use this function)Edit: Ich hab mal nen bissel mit dem Code rumgespielt und dort wo es haperte auskommatiert bzw. was geändert. Das Programm läuft nun auch, ich hab:
TCHAR const* newWallpaper = _T("D:\\Bilder\\Basti\\3ddesign054.jpg");zu
char *string = "Pfad..."geändert und halt die letzte FUnktion auskommatiert. Nun bekomm ich aber immer einen grauen Bildschirm (der Wallpaper wird nicht gefunden)
geben ich den Pfad vllt falsch an?
-
Du musst das auch casten, bzgl. assert nimm die klein-geschriebene Version (C++) und den Header <assert.h>, also:
#include <windows.h> #include <assert.h> void foo() { TCHAR pszNewWallpaper[] = TEXT("D:\\Bilder\\Basti\\3ddesign054.jpg"); UINT flags = SPIF_UPDATEINIFILE | SPIF_SENDCHANGE; BOOL rc = SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, static_cast<void*>(pszNewWallpaper), flags); assert(rc); } int main(void) { foo(); }
-
Also deinen Code compiliert er auch, aber es tritt der selbe Effekt auf wie bei meinem geänderten (denke aber das deiner da richtiger ist als meiner^^):
Ich bekomm immer nen grauen Hintergrund, als würde er das Bild nicht finden.
Muss ich vllt zusätzlich noch die Regestrie einträge ändern?
-
Als ich damals dasselbe mit SystemParametersInfo() machen wollte, habe ich festgestellt dass die Funktion nur mit Bitmaps korrekt arbeitet (das war noch zu Win98-Zeiten)...
-
Omg...
Ja wie ein schneller Test ergab funtz die Funktion immer nur noch korekkt mit Bitmaps, oh mann..
Also gibts keinen Weg mit JPGS oder so, außer Regestrie->reboot.Wie kann ich angeben, dass der mit das Bild strechts? (dachte man müsste ne 1 übergeben, aber das Bewirkt nix)
-
Du könntest probieren erst das entsprechende Wallpaper in der Registry einzutragen, und dann folgenden Code auszuführen:
#include <windows.h> #include <assert.h> void foo() { TCHAR emptyString[] = TEXT(""); BOOL rc = SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, static_cast<void*>(emptyString), SPIF_SENDCHANGE); // wallpaper weg, nicht speichern assert(rc); rc = SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, 0, SPIF_SENDCHANGE); // auf gespeichertes wallpaper zurückwechseln assert(rc); }p.S.: stretchen per SystemParametersInfo wohl garnicht, der entsprechende Key in der Registry sollte aber einfach zu finden sein. Und wenn der Code oben das bewirkt was ich vermute, dann sollte diese Einstellung auch erhalten bleiben.
Sinn des Codeschnippsels oben ist eigentlich nur das neu in die Registry eingetragene Wallpaper anzeigen zu lassen... müsste gehen, wenn sich Windows die aktuellen Einstellungen nicht ausserhalb der Registry nochmal merkt.
-
Hab das gerade mal programmiert, aber leider arbeitet die Funtkion nur mit Bitmaps (irgendwie voll arm :P)
-
Hio, ich bins mal wieder...
Ich hab folgendes Problem mit der Funktion "RegQueryValueEx".
Habs nun geschafft in der Registry ein wenig zu schreiben etc. nur das Lesen will nicht so wirklich gewinnen. Laut MSD (http://msdn2.microsoft.com/en-us/library/ms724911.aspx) muss ich dann doch die oben genannte FUnktion nehmen oder?Problem ist, dass ich irgendwie nicht weiss was ich als "lpcbData" übergeben soll
hier mal der Code... char *value = "irgendeinWert" char *Pfad ="irgendeinPfad" char TempValue[255]; HKEY TempHKEY; RegOpenKeyEx(HKEY_CURRENT_USER,Pfad,0,KEY_ALL_ACCESS,&TempHKEY); RegQueryValueEx(HKEY_CURRENT_USER,Pfad,0,NULL,&TempValue,(CONST BYTE*)TempValue); //Fehlermeldung: cannot convert `char (*)[255]' to `BYTE*' for argument `5' to `LONG RegQueryValueExA(HKEY__*, const CHAR*, DWORD*, DWORD*, BYTE*, DWORD*)' ... RegSetValueEx(TempHKEY,"irgendeinWert",0,REG_SZ,(CONST BYTE*)value,strlen(value)); //hier gehts oben aber nichtDanke schonmal

-
Moinsen,
also erstmal n kleiner MSDN Auszug:
lpcbData [in, out] A pointer to a variable that specifies the size of the buffer pointed to by the lpData parameter, in bytes. When the function returns, this variable contains the size of the data copied to lpData. The lpcbData parameter can be NULL only if lpData is NULL.Und zu dem Fehler: N bisschen auf die Typen der Parameter achten is manchmal von Vorteil
... dein TempValue is doch n Array, also prinzipiell schon n Pointer auf den Speicher, den du gefüllt haben willst - du übergibst der Funktion aber nen Pointer auf diesen Pointer, was natürlich nich so toll is.Greetz

M.T.
-
Hehe okay, hab nochmal die Dokumentation auf msdn gelesen und das Ganze nun so geamcht:
... char *value = "irgendeinWert" char *Pfad ="irgendeinPfad" char TempValue[255]; HKEY TempHKEY; DWORD dValue = 255; RegOpenKeyEx(HKEY_CURRENT_USER,Pfad,0,KEY_ALL_ACCESS,&TempHKEY); RegQueryValueEx(HKEY_CURRENT_USER,Pfad, 0, NULL, (BYTE*)TempValue,&dValue); ... RegSetValueEx(TempHKEY,"irgendeinWert",0,REG_SZ,(CONST BYTE*)value,strlen(value));Denke das geht noch einfacher, so wie ich das unten hinbekommen habe, aber wie?