Wechselndes Hintergrundbild mit einem BATCH-Script realisieren?
Wechselndes Hintergrundbild mit BATCH-Script?
Hallo zusammen,
bei meinem Windows XP würde ich gerne das Hintergrundbild wechseln lassen - eben nach einer gewissen Zeitspanne.
Es gibt dazu zwar Programme, doch ich möchte dafür nicht noch eine Anwendung aufspielen, die ich ansonsten nicht benötige. Habe eh schon ein Batch-Script, welche bei dem System-Start lädt und für mich ein paar Arbeiten automatisch durchführt, daher würde ich jenes gerne erweitern.
Die Frage ist nur, wie ich das nun anstelle?
Wie ich im Batch zu einem Verzeichnis gehe und eine Datei aufrufe weiß ich. Doch nicht, wie ich das nun für meinen Zweck abändern kann.
Vielleicht hat ja jemand von euch eine Idee?
LG Tobias
Hallo zusammen,
bei meinem Windows XP würde ich gerne das Hintergrundbild wechseln lassen - eben nach einer gewissen Zeitspanne.
Es gibt dazu zwar Programme, doch ich möchte dafür nicht noch eine Anwendung aufspielen, die ich ansonsten nicht benötige. Habe eh schon ein Batch-Script, welche bei dem System-Start lädt und für mich ein paar Arbeiten automatisch durchführt, daher würde ich jenes gerne erweitern.
Die Frage ist nur, wie ich das nun anstelle?
Wie ich im Batch zu einem Verzeichnis gehe und eine Datei aufrufe weiß ich. Doch nicht, wie ich das nun für meinen Zweck abändern kann.
Vielleicht hat ja jemand von euch eine Idee?
LG Tobias
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 170199
Url: https://administrator.de/contentid/170199
Ausgedruckt am: 22.11.2024 um 16:11 Uhr
13 Kommentare
Neuester Kommentar
Hallo Tobias,
eine weitere Möglichkeit, um das ganze ohne Batchdatei zu realisieren (ständig im Hintergrund laufende Batchdateien erzeugen eine hohe Prozessorlast), wäre IrfanView. Das ist ein Bildbetrachter/-konverter/-manipulator für sehr viele Grafikformate (teilweise Plugins nötig, die auch auf der Homepage erhältlich sind), lässt sich über die Kommandozeile verwenden, hat aber auch Batchkonvertierung/-umbenennung über die GUI eingebaut, bietet die Möglichkeit, Diashows zu erstellen und auf CD zu brennen und vieles mehr; ein rundum nützliches und kostenloses Programm, gehört bei mir zu den Standardprogrammen für Neuinstallationen.
Für Dich interessant ist die Möglichkeit, eine Diashow zu erstellen (Anzeigezeit für ein Bild ist über das Programm einstellbar) und als SCR-Datei (Bildschirmschoner-Datei) zu speichern. Diese Datei ins System32-Verzeichnis kopieren und Du kannst Deine selbst erstellte Diashow über den normalen Windows-Dialog für Bildschirmschoner auswählen.
Gruß
Friemler
eine weitere Möglichkeit, um das ganze ohne Batchdatei zu realisieren (ständig im Hintergrund laufende Batchdateien erzeugen eine hohe Prozessorlast), wäre IrfanView. Das ist ein Bildbetrachter/-konverter/-manipulator für sehr viele Grafikformate (teilweise Plugins nötig, die auch auf der Homepage erhältlich sind), lässt sich über die Kommandozeile verwenden, hat aber auch Batchkonvertierung/-umbenennung über die GUI eingebaut, bietet die Möglichkeit, Diashows zu erstellen und auf CD zu brennen und vieles mehr; ein rundum nützliches und kostenloses Programm, gehört bei mir zu den Standardprogrammen für Neuinstallationen.
Für Dich interessant ist die Möglichkeit, eine Diashow zu erstellen (Anzeigezeit für ein Bild ist über das Programm einstellbar) und als SCR-Datei (Bildschirmschoner-Datei) zu speichern. Diese Datei ins System32-Verzeichnis kopieren und Du kannst Deine selbst erstellte Diashow über den normalen Windows-Dialog für Bildschirmschoner auswählen.
Gruß
Friemler
Dann musst Du einfach mal den Taskmanager öffnen und Dir die Registerkarte "Leistung" ansehen. Wenn Du nichts rechenintensives am Rechner machst, fällt die hohe Prozessorlast nicht auf.
Gruß
Friemler
Hallo Tobias,
das ist zwar schon etwas spezieller, aber machbar (<100 Zeilen Code). Könnte eine gute Fingerübung sein, um mein vor sich hin rostendes C++ wieder ein wenig aus der Versenkung zu holen. Schöne Feierabendsbeschäftigung (abhängig vom Wetter ).
Fasse mal zusammen: Du suchst ein Kommandozeilentool, dem du das Verzeichnis mit deinen Bildern, den Wallpaperstyle und die Zykluszeit als Argumente übergeben kannst.
Falls so OK, werde ich mich morgen mal daran versuchen.
Grüße
rubberman
das ist zwar schon etwas spezieller, aber machbar (<100 Zeilen Code). Könnte eine gute Fingerübung sein, um mein vor sich hin rostendes C++ wieder ein wenig aus der Versenkung zu holen. Schöne Feierabendsbeschäftigung (abhängig vom Wetter ).
Fasse mal zusammen: Du suchst ein Kommandozeilentool, dem du das Verzeichnis mit deinen Bildern, den Wallpaperstyle und die Zykluszeit als Argumente übergeben kannst.
Falls so OK, werde ich mich morgen mal daran versuchen.
Grüße
rubberman
Hallo Tobias,
ich denke ich habe es etwa so hinbekommen, wie du wolltest.
Der Code ist C++/CLI, also compilerspezifisch für Microsoft VC.
Beispiel:
Wallpaper "C:\images" 0 60
... wechselt das Wallpaper mit allen Dateien in "C:\images", zentriert und im Minutentakt.
Übrigens wird versucht jede Datei in diesem Verzeichnis als Wallpaper zu verwenden (mit Ausnahme der Systemdateien desktop.ini und thumbs.db). Also möglichst nur Bilder ins Verzeichnis legen.
Falls du den Code nicht selbst compilieren kannst / willst, habe ich dir hier das Binary temporär zum Download abgelegt.
wallpaper.exe
Grüße
rubberman
ich denke ich habe es etwa so hinbekommen, wie du wolltest.
// wallpaper.cpp
#define WINVER 0x0501
#define _WIN32_WINNT 0x0501
#include <stdio.h>
#include <tchar.h>
#include <windows.h>
#include <wininet.h>
#include <shlobj.h>
#include <errno.h>
void help()
{
printf("Changes The Desktop Wallpaper.\n\nWALLPAPER Directory Style Wait\nWALLPAPER /?\n\n Directory Path And Folder Name The Wallpaper Files Are Placed.\n Style 0 = Center; 1 = Tile; 2 = Stretch.\n Wait Seconds To Wait Before Next Changing.\n /? Displays This Help.\n\n RETURN CODES:\n 3 Syntax Error\n 2 Folder Not Found\n 1 Process Failed\n\n");
}
int changeWP(WCHAR *filename, DWORD dwstyle)
{
IActiveDesktop *pActiveDesktop = NULL;
::CoInitialize(NULL);
if (FAILED(CoCreateInstance(CLSID_ActiveDesktop, NULL, CLSCTX_INPROC_SERVER, IID_IActiveDesktop, (LPVOID*) &pActiveDesktop))) return 1;
if (FAILED(pActiveDesktop->SetWallpaper(filename, 0))) return 1;
WALLPAPEROPT wpo;
wpo.dwSize = sizeof(wpo);
wpo.dwStyle = dwstyle;
if (FAILED(pActiveDesktop->SetWallpaperOptions(&wpo, NULL))) return 1;
if (FAILED(pActiveDesktop->ApplyChanges(AD_APPLY_ALL))) return 1;
pActiveDesktop->Release();
::CoUninitialize();
return 0;
}
int _tmain(int argc, _TCHAR *argv)
{
if (argc < 2) {help(); return 3;}
if ((_tcscmp(argv[1], _T("/?")) == 0) && (argc == 2)) {help(); return 0;}
if (argc != 4) {help(); return 3;}
_TCHAR *endptr = NULL;
long lStyle = _tcstol(argv[2], &endptr, 10);
if (errno == ERANGE) {help(); return 3;}
if (_tcscmp(endptr, _T("\0")) != 0) {help(); return 3;}
if ((lStyle < 0) || (lStyle > 2)) {help(); return 3;}
long lWait = _tcstol(argv[3], &endptr, 10);
if (errno == ERANGE) {help(); return 3;}
if (_tcscmp(endptr, _T("\0")) != 0) {help(); return 3;}
if (lWait < 0) {help(); return 3;}
WCHAR path[1024];
swprintf_s(path, 1024, L"\\\\?\\%s", argv[1]);
if (GetFileAttributesW(path) == INVALID_FILE_ATTRIBUTES) return 2;
WCHAR dpath[1024], fpath[1024];
HANDLE fHandle;
WIN32_FIND_DATA wfd;
swprintf_s(dpath, 1024, L"%s\\*", path);
while (1)
{
fHandle = FindFirstFileW(dpath, &wfd);
do
{
if (!((wfd.cFileName=='.') && ((wfd.cFileName[1]=='.' && wfd.cFileName[2]==0) || wfd.cFileName[1]==0)))
{
if (!(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && (CompareStringW(LOCALE_USER_DEFAULT, NORM_IGNORECASE, wfd.cFileName, -1, _T("desktop.ini"), -1) != 2) && (CompareStringW(LOCALE_USER_DEFAULT, NORM_IGNORECASE, wfd.cFileName, -1, _T("thumbs.db"), -1) != 2))
{
swprintf_s(fpath, 1024, L"%s\\%s", argv[1], wfd.cFileName);
if (changeWP(fpath, (DWORD)lStyle)) return 1;
Sleep((DWORD)lWait * 1000);
}
}
}
while (FindNextFileW(fHandle, &wfd));
FindClose(fHandle);
}
return 0;
}
Zitat von @Muckel1986:
Hallo rubberman,
genau soetwas suche ich:
So sieht dann meine Umsetzung aus:Hallo rubberman,
genau soetwas suche ich:
- Angeben eines Verzeichnis, in dem sich Bilder (*.jpg, *.png) befinden
- Ausgabe der Bilder als Hintergrundbild
- Angabe einer Zeit (z.B. alls 10 Minuten, jede Stunde, etc), nach der das Hintergrundbild geändert wird.
- Bilder sollten dabei Zentriert werden.
- Angabe einer Hintergrundfarbe für den Bereich, wo dann kein Bild ist (da kann aber auch die in Windows eingestellte
Changes The Desktop Wallpaper.
WALLPAPER Directory Style Wait
WALLPAPER /?
Directory Path And Folder Name The Wallpaper Files Are Placed.
Style 0 = Center; 1 = Tile; 2 = Stretch.
Wait Seconds To Wait Before Next Changing.
/? Displays This Help.
RETURN CODES:
3 Syntax Error
2 Folder Not Found
1 Process Failed
Wallpaper "C:\images" 0 60
... wechselt das Wallpaper mit allen Dateien in "C:\images", zentriert und im Minutentakt.
Übrigens wird versucht jede Datei in diesem Verzeichnis als Wallpaper zu verwenden (mit Ausnahme der Systemdateien desktop.ini und thumbs.db). Also möglichst nur Bilder ins Verzeichnis legen.
Zitat von @Muckel1986:
Die Frage wäre vilt. noch, wie C++ das löst. Also ob das auch einfach den Registry Eintrag ändert?
Gute Frage. Mein Programm nutzt die Methoden des Active Desktop, so als würdest du per Rechtsklick auf den Desktop das Wallpaper ändern. Was davon Registryeinträge sind und was nicht, habe ich mir noch nicht genauer angesehen. Ich möchte auch gar nicht wissen, wieviele Änderungen der Registry im Laufe einer Windowssitzung vorgenommen werden. Da sollten ein paar mehr oder weniger nicht ins Gewicht fallen. Schließlich ist es Sinn der Registry Informationen und Einstellungen zu beinhalten. Also würde ich an deiner Stelle nicht zu viele Gedanken daran verschwenden.Die Frage wäre vilt. noch, wie C++ das löst. Also ob das auch einfach den Registry Eintrag ändert?
Falls du den Code nicht selbst compilieren kannst / willst, habe ich dir hier das Binary temporär zum Download abgelegt.
wallpaper.exe
Grüße
rubberman
Hallo Tobias.
Nein. Unter dem Active Desktop, den du meinst, versteht man beispielsweise eine HTML Seite auf dem Desktop anzuzeigen. Ich beziehe mich hierauf:
IActiveDesktop Interface
Sorry für die Verwirrung.
Ein compiliertes C++ Programm ist hingegen schon in Maschinensprache "übersetzt", was zur Laufzeit einfach weniger Ressourcen frisst.
Grüße
rubberman
Zitat von @Muckel1986:
Also ich ändere mein Hintergrundbild sonst so, dass ich auf dem Desktop mit rechts klicke, dann auf Eigenschaften klicke, dann den Reiter Desktop auswähle und dort eben ein anderes auswähle.
Mein Programm nutzt die dabei aufgerufenen Prozesse.Also ich ändere mein Hintergrundbild sonst so, dass ich auf dem Desktop mit rechts klicke, dann auf Eigenschaften klicke, dann den Reiter Desktop auswähle und dort eben ein anderes auswähle.
Nein. Unter dem Active Desktop, den du meinst, versteht man beispielsweise eine HTML Seite auf dem Desktop anzuzeigen. Ich beziehe mich hierauf:
IActiveDesktop Interface
Sorry für die Verwirrung.
Zitat von @Muckel1986:
Wie kommt es, dass ein kleines BATCH-Script mehr Prozessorleistung benötigt, als so ein C++ Script, welches compiliert wurde?
Das kommt vermutlich daher, dass Scriptsprachen zunächst interpretiert werden müssen. Weiterhin sind eine Vielzahl der "Befehle" in einem Batchscript eigentlich externe Tools, die sich im Verzeichnis system32 finden lassen. Allein das Aufrufen dieser Tools benötigt eine Menge Zeit und CPU Leistung.Wie kommt es, dass ein kleines BATCH-Script mehr Prozessorleistung benötigt, als so ein C++ Script, welches compiliert wurde?
Ein compiliertes C++ Programm ist hingegen schon in Maschinensprache "übersetzt", was zur Laufzeit einfach weniger Ressourcen frisst.
Zitat von @Muckel1986:
Habe eben erstmal Deine Datei herunter geladen, werde es morgen aber mal selbst mit Dev-C++ machen, einfach um damit auch mal wieder etwas zu tun zu haben.
Das hat wenig Erfolgsaussicht. Wie schon geschrieben ist der Code in C++/CLI und nutzt die .NET-Runtime. Der einzige mir bekannte Compiler dafür ist der Microsoft-eigene VC.Habe eben erstmal Deine Datei herunter geladen, werde es morgen aber mal selbst mit Dev-C++ machen, einfach um damit auch mal wieder etwas zu tun zu haben.
Zitat von @Muckel1986:
P.S.: Wenn man hier auch "gelöst" klickt, kann man dann trotzdem noch schreiben?
Ja. Solange Biber oder ein anderer Moderator den Thread nicht schließt, ist das möglich.P.S.: Wenn man hier auch "gelöst" klickt, kann man dann trotzdem noch schreiben?
Grüße
rubberman