inhalt eines ordners?



  • nabend
    ich will ein programm schreiben, welches das windows-hintergrundbild nach jedem neustart ändert. die bilder liegen in einem ordner auf der festplatte und sollen nacheinander (oder in späteren versionen per random) angewählt und als hintergrundbild eingesetzt werden.
    jetzt das problem: ich könnte den user den pfad jedes einzelnen bildes in eine textdatei schreiben lassen und diese textdatei äußerst umständlich auslesen lassen. oder aber es gibt irgendeine möglichkeit, den inhalt (also die dateien) eines ordners abzufragen und zu verarbeiten. sicherlich komme ich um eine speicherung in der textdatei nicht herum, aber es ist doch schon sehr umständlich die dateien per hand einzuschreiben.

    wär nett wenn ihr mir ein paar denkanstöße gebt, der code wächst dank der ausleseung aus der textdatei langsam ins gigantische ... 🙄

    SirNoname



  • Mach doch mal folgendes:
    Mit FindFirstFile startest Du die Suche nach allen *.BMP (oder JPG oder wasweißich) in einem bestimmten Ordner.
    FindNextFile gehört dazu und liefert Dir den Dateinamen auf die nächste Datei. Es werden alle Dateien Alphabetisch geordnet von der Funktion geliefert. Somit könntest Du einen Array mit lauter Dateinamen füllen und dann per Zufall (oder halt alphabetisch) einen Dateinamen aus dem Array auswählen.

    Den momentan gewählten Array-Index kannst Du ja mit RegCreateKeyEx und seinen entsprechenden Registry-Schreibe-Funktionen in der Registry speichern (ist irgendwie eleganter als eine Textdatei)...



  • oder in eine ini Datei - ist aber ja relativ egal
    Schau mal in die FAQ: Dateien in einem Verzeichnis auflisten (FindFirstFile/FindNextFile)



  • nabend
    auch wenns spät ist, aber danke für die hilfe. hab jetzt stundenlang rumherprobiert und getestet wie blöd, das prog scheint zu funktionieren!

    😃 🕶 👍 💡

    eine kleine frage gibs da aber doch noch: wonach geht der "FindNextFile" - befehl eigentlich? also nach name oder typ der datei anscheinend nicht ... und nach änderungsdatum oder größe scheinbar auch nicht ... etwa ein alternativer zufallsgenerator? 😕

    SirNoname



  • verdammt ...

    ok ... zu früh gefreut ... ich nehm alles zurück 😢

    ich kann mit

    SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, pfad, 0);
    

    nur einen vollständigen pfad angeben. den hab ich aber nicht, da ich nur die namen der dateien in einem ordner kenne.
    kurz: ich hab den ersten teil des pfades (c:\\abc) und den zweiten in form eines "wfd.cFileName". (kommt aus:)

    HANDLE fHandle; 
    WIN32_FIND_DATA wfd;
    
    void main()             
    {  
    fHandle=FindFirstFile("c:\\bilder\\*",&wfd);
    FindNextFile(fHandle,&wfd);
    }
    

    wir krieg ich daraus nen vernünftigen pfad?! 😕

    SirNoname



  • lstrcat



  • 👍 👍 👍

    thx @ flenders, das hat mir sehr weitergeholfen!

    ich mein ... das klappt jetzt zwar immernoch nicht (hintergrundbild wandelt sich in das blaue standart-windows-langeweile-hintergrundbild um), aber das krieg ich denk ich mal irgendwie hin. ich mein is ja auch schon oft genug diskutiert wurden hier.
    wen es doch interessiert, hier der befehl mit dem ich es versuche:

    SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, pfad, 0);
    

    cu und schön abend noch!

    SirNoname



  • morgen!
    also wie gesagt, hab noch n bisl rumexperimentiert (und gesucht), und siehe da es funzt. zumindest teilweise 😉
    problem (welches hier im forum auch schon ausführlichst besprochen wurde): es können nur bitmaps sofort als hintergrundbild übernommen werden. bei jpg`s gibs probleme und man sieht den vielsagenden standart - wallpaper. durch zufall hab ich aber rausgefunden, dass man durch 2 mal rechtsklick -> eigenschaften -> "OK" den gewünschten effekt hat: das wallpaper ändert sich!
    nun kann ich aber nicht vom user verlangen, oben beschriebenes auszuführen, also was passiert bei diesem prozess? der desktop muss ja aktualisiert werden ... aber warum 2 mal? oder geht da noch was andres von statten? ...

    SirNoname



  • Hast du mal etwas mit InvalidateRect, RedrawWindow, PaintDesktop, etc. rumprobiert?



  • @noname

    ich versuche gerade so ein ähnliches Prog zu schreiben .... gleichzeitig mein Einstieg in die COM Programmierung.

    bei der IActiveDesktop::SetWallpaper kannst du auch JPG's übergeben die das Objekt automatisch in bmp's umwandelt und speichert.
    Hatt nur den sonst auch vorhandenen Nachteil das Bilder bei Übergrösse nicht "zurückverzehrt" also passend an die Desktopoberfläche angepasst werden.

    falls gewünscht kann ich ein bissl Code veröffentlichen ....

    Servus


Anmelden zum Antworten