Nochmal Desktop Hintergrundbild



  • Ich hatte die Zeile gefunden wie man ein Hintergrundbild in Windows ändert.
    SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, TEXT("Kugeln.bmp"), SPIF_SENDCHANGE);
    Um es zu testen hab ich mit MSVC++ eine Hallo Welt Anweisung erstellt.
    Weil es nicht funktioniert habe ich:
    Die Zeile insgesamt 4 mal in Winmain an verschiedenen Stellen eingefügt(, so das sie auf jeden Fall aufgerufen wird-> u.a. am Anfang)

    und ich habe die Datei Kugeln.bmp sowohl in
    1)Windows
    2)C:
    3)Das laufwerk des programms
    4)Programmorder
    plaziert.

    Jetzt funktioniert das Programm immer noch nicht, denn nach dem schließen dieses hallo-Welt- Programms blieb das Hintergrundbild so wie es vorher war.

    Woran kann das liegen?



  • Bist Du sicher, dass TEXT() benötigt wird?



  • Anstatt die Funktion viermal aufzurufen und Bitmapdateien durch die Gegend zu schieben, wäre es wohl besser gewesen, ein einziges mal den Rückgabewert zu prüfen und gegebenenfalls GetLastError aufzurufen.



  • es kann auch sein, das du unter windows das active desktop aktiviert hast....



  • OK ich hab get Last Error eingefügt und 120 erhalten
    d.h.
    "This function is not supported on this system. "

    Woran kann das liegen? Ich benutze W98



  • Hehe, das kenne ich irgendwoher (hatte das auch).
    Die Bitmap sollte wirklich ne Bitmap sein und im Windows-Verzeichnis liegen - keine absolute Pfadangabe machen!
    Und versuch mal nicht nur SPIF_SENDCHANGE sondern noch dazu SPIF_UPDATEINIFILE



  • kuck mal hier besonders geeky´s letzter beitrag:
    [url] Wallpaper ändern? [/url]



  • Ok danke hat mir alles sehr geholfen.
    Ich hab jetzt ein Programm geschrieben, was beim starten von Windows die Adressen von verschiedenen Hintergrundbilddateien einließt, daraus dann eine zufällige auswählt und es als Hintergrundbild speichert.
    (Aber Windows wird nicht sagt, dass ein neues da ist, so dass es erst beim nächsten mal aufgerufen wird. Dadurch verschwindet das "Flackern" am Anfang beim Wechsel zwischen 2 Bildern).

    Das Programm funktionierte,
    bis ich die 4 Zeilen mit delete(ganz unten) eigefügt hatte.
    Warum?
    Passt zwar jetzt nicht genau zum Thema, aber ich wollte für sowas kurzes kein neues Thema aufmachen.

    char *Kartenname[30];
    #define Datei_fuer_Dateinamen "Dateien.txt"
    
    void readstr(FILE *f,char *string)
    {   // aus dem Nehe Quellcode
       do
       {
          fgets(string, 255, f);
       } while ((string[0] == '/') || (string[0] == '\n'));
       return;
    }
    
    (...)
    /* Winmain */
    
       char Zeilenspeicher[255];
       FILE *Dateifile;
       int loop_max;
       char eine_zeile[255];
       Dateifile = fopen(Datei_fuer_Dateinamen, "rt");
       readstr(Dateifile,eine_zeile);
       sscanf(eine_zeile, "Anzahl %d", &loop_max);                           // Dateiname der Karte
       for (int loop=0; loop<loop_max; loop++)
       {
          readstr(Dateifile,eine_zeile);
          sscanf(eine_zeile, "Datei %s", &Zeilenspeicher);               // Anzahl der Zeichnen herausfinden und alle ~ zu Leerzeichen machen
          int i;
          for (i=0; Zeilenspeicher[i];i++)
          {
             if (Zeilenspeicher[i]== '~')
                Zeilenspeicher[i] = ' ';
    
          }
          Kartenname[loop]=new char[i];
          sprintf(Kartenname[loop], "%s", Zeilenspeicher);
       }
       fclose(Dateifile);
    
       srand(time(0));   
       int Zufallsindex=rand()%loop_max;
    
       // wenn ich diese 4 Zeilen einfüge stürzt er ab
       for (loop=0; loop<loop_max; loop++)
       {
          delete [] Kartenname[loop];
       }
    
       SetWallpaper(Kartenname[Zufallsindex],0);
    

    [ Dieser Beitrag wurde am 10.11.2002 um 18:07 Uhr von Janko editiert. ]



  • Seit wann löscht man Speicher, wenn man ihn danach noch benutzt??



  • Oh sorry.
    Aber andersrum bricht er auch mit der gleichen Fehlermeldung ab.
    und auch dann wenn ich nur folgenden Befehl am Ende schreibe:

    delete [] Kartenname[0];
    

    Die Fehlermeldung lautet:

    -----------------------------------
    Microsoft Visual C++ Debug Libary:
    -----------------------------------
    Debug Error!
    Program: ...\HINTERGRUNDBILD.EXE
    DAMAGE: after Normal block (#19) at 0x00780E80
    
    (Press Retry to debug the application)
    |Beenden| |Wiederholen| |Ignorieren|
    -----------------------------------
    

    [ Dieser Beitrag wurde am 12.11.2002 um 18:36 Uhr von Janko editiert. ]



  • das hintergrundbild muss von dir in den windows ordner kopiert werden



  • Was hat das jetzt damit zu tun das Programm läuft doch zu 100% ich bekomme nur nicht den von mir reservierten Speicher wieder frei



  • delete Kartenname[0];



  • Zeig doch bitte nochmal den code ab dem fclose(Dateifile); 🙂

    In diesem Codeausschnitt sind ein paar Ungereimtheiten:

    sscanf(eine_zeile, "Datei %s", &Zeilenspeicher);               // Anzahl der Zeichnen herausfinden und alle ~ zu Leerzeichen machen
          int i;
          for (i=0; Zeilenspeicher[i];i++)
          {
             if (Zeilenspeicher[i]== '~')
                Zeilenspeicher[i] = ' ';
    
          }
          Kartenname[loop]=new char[i];
    

    Bist du da ganz sicher, dass i immer größer als 0 ist? Mach am besten noch ein kleines if rein, schaden kanns nicht. 🙂
    Vor allem: es muss new char[i + 1] lauten. Jeder string in C/C++ wird durch ein 0 Zeichen abgeschlossen. Das belegt auch ein byte.

    [ Dieser Beitrag wurde am 12.11.2002 um 22:58 Uhr von cd9000 editiert. ]


Anmelden zum Antworten