Programmieren - alles kontrollieren 4.941 Themen, 20.708 Beiträge

Desktophintergrund automatisch ändern

chrholder / 7 Antworten / Baumansicht Nickles

Ich habe ein Programm gemacht, das in der Registry den Desktophintergrund ändert, aber das Problem ist, dass Windows den Hintergrund erst beim nächsten Neustart anzeigt.

Wie kann ich erreichen, dass Windows den Desktop ohne Neustart aktualisiert.

Ich benutze Win2000...

bei Antwort benachrichtigen
mr.escape chrholder „Desktophintergrund automatisch ändern“
Optionen
#define WIN32_LEAN_AND_MEAN    // Exclude rarely-used stuff from Windows headers

#include <windows.h>

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){
SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, "C:\\WINNT\\bild.bmp", SPIF_UPDATEINIFILE | SPIF_SENDCHANGE);
return 0;
}


Lässt man SPIF_UPDATEINIFILE weg, dann wird die einstellung nicht gespeichert und das alte bild erscheint wohl beim neustart wieder (habe es nicht ausprobiert).

mr.escape
"The man who trades freedom for security does not deserve nor will he ever receive either." - Benjamin Franklin"Wer seine Freiheit aufgibt, um Sicherheit zu erreichen, wird beides verlieren." - Georg Christoph Lichtenberg
bei Antwort benachrichtigen
chrholder mr.escape „ define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers...“
Optionen

Leider funktioniert es nicht. Habe alle übernommen, aber der Desktop wird nicht geändert...

bei Antwort benachrichtigen
chrholder mr.escape „ define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers...“
Optionen

Die Funktion scheint schon zu stimmen, allerdings gibt sie 0 zurück(also ein Fehler). Der Pfad stimmt, an was könnte es sonst noch liegen?

bei Antwort benachrichtigen
chrholder mr.escape „ define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers...“
Optionen

Sorry das ich nochmals schreibe:

Nach längerem ausprobieren habe ich herausgefunden, dass es funktioniert, wenn man anstelle des Pfades ein char-Array angibt, das den Pfad enthält. Wieso ist das so wichtig, dass es ein Array ist und nicht einfach angegeben werden kann?

bei Antwort benachrichtigen
mr.escape chrholder „Sorry das ich nochmals schreibe: Nach längerem ausprobieren habe ich...“
Optionen

Ein array ist definitiv nicht nötig, aber hast du an die doppelten backslashes im string gedacht? Der pfad ist nämlich der einzige "echte" parameter, die anderen sind lediglich konstante flags und werden entweder vollständig erkannt und verwendet oder schon beim kompilieren bemängelt (include pfad o.ä stimmt nicht).
Nur ein falsch geschriebener oder nicht existierender pfad auf der einen bzw. ein falsches bitmapformat auf anderen seite können echte probleme machen (speichermangel, dateisystemprobleme o.ä. sind wohl eher akademisch).

mr.escape

"The man who trades freedom for security does not deserve nor will he ever receive either." - Benjamin Franklin"Wer seine Freiheit aufgibt, um Sicherheit zu erreichen, wird beides verlieren." - Georg Christoph Lichtenberg
bei Antwort benachrichtigen
chrholder mr.escape „Ein array ist definitiv nicht nötig, aber hast du an die doppelten backslashes...“
Optionen

Ja, an diese habe ich gedacht, denn ansonsten hätte der Compiler irgendwie gesagt "unknown escape sequence". Ausserdem schreibe ich das so:

char array[]="C:\\Bild.bmp"

und dann gebe ich das Array in der Funktion an.

Wenn ich in der Funktion allerdings "C:\\Bild.bmp" angebe, funktioniert es nicht...

bei Antwort benachrichtigen
mr.escape chrholder „Ja, an diese habe ich gedacht, denn ansonsten hätte der Compiler irgendwie...“
Optionen

Ich habe genau das oben gepostete programm benutzt (mit einer echten pfadangabe) und es ging einwandfrei. Der rückgabewert war mir egal, da es ja ging. Möglicherweise könnte das hier zur lösung beitragen:

LPVOID lpMsgBuf;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
(LPTSTR) &lpMsgBuf,
0,
NULL
);
// Display the string.
MessageBox( NULL, (LPCTSTR)lpMsgBuf, "Error", MB_OK | MB_ICONINFORMATION );
// Free the buffer.
LocalFree( lpMsgBuf );


mr.escape
"The man who trades freedom for security does not deserve nor will he ever receive either." - Benjamin Franklin"Wer seine Freiheit aufgibt, um Sicherheit zu erreichen, wird beides verlieren." - Georg Christoph Lichtenberg
bei Antwort benachrichtigen