2010-07-26 7 views
6

Ich habe versucht, eine Anwendung mit Qt und Mingw32 zu schreiben, um Bilder herunterzuladen und sie als Hintergrundbild festlegen. Ich habe mehrere Artikel online darüber gelesen, wie man das macht, in VB und C#, und bis zu einem gewissen Grad, wie man es in C++ macht. Ich rufe derzeit die mit, was scheint, die richtigen Argumente (keine Compilerfehler) und es schlägt fehl. Kein großer Crash von Cymbals, nur ein 0 zurück. GetLastError() liefert eine ebenso aufschlussreiche 0.Ändern Sie Hintergrundbild programmgesteuert mit C++ und Windows-API

Unten ist der Code, den ich benutze (in einer leicht modifizierten Form, so dass Sie die Objekt-Interna nicht sehen müssen).

#include <windows.h> 
#include <iostream> 
#include <QString> 

void setWall() 
{ 
    QString filepath = "C:\\Documents and Settings\\Owner\\My Documents\\Wallpapers\\wallpaper.png"; 
    char path[150]; 
    strcpy(path, currentFilePath.toStdString().c_str()); 
    char *pathp; 
    pathp = path; 

    cout << path; 

    int result; 
    result = SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, pathp, SPIF_UPDATEINIFILE); 

    if (result) 
    { 
     cout << "Wallpaper set"; 
    } 
    else 
    { 
     cout << "Wallpaper not set"; 
     cout << "SPI returned" << result; 
    } 
} 
+0

haben Sie es mit einer Bitmap-Datei versucht und nicht png/jpg? –

+0

Versucht mit Png, JPEG, BMP. –

Antwort

10

Es könnte sein, dass SystemParametersInfo erwartet einen LPWSTR (einen Zeiger auf wchar_t).

Versuchen Sie folgendes:

LPWSTR test = L"C:\\Documents and Settings\\Owner\\My Documents\\Wallpapers\\wallpaper.png"; 

result = SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, test, SPIF_UPDATEINIFILE); 

Wenn dies funktioniert (versuchen Sie es mit ein paar verschiedenen Dateien nur um sicher zu machen), müssen Sie Ihre char * zu einem LPWSTR konvertieren. Ich bin nicht sicher, ob Qt diese Dienste anbietet, aber eine Funktion, die helfen kann, ist MultiByteToWideChar.

+1

Ja das funktioniert - ich habe es gerade versucht ... – sukru

2
"C:\Documents and Settings\Owner\My Documents\Wallpapers\wallpaper.png"; 

sollte dies nicht sein:

"C:\\Documents and Settings\\Owner\\My Documents\\Wallpapers\\wallpaper.png"; 
+0

Oh wahr. Aber das ist nicht der Fehler. Im eigentlichen Programm ist der QString richtig von einer anderen Funktion bevölkert :) Aber Achtung für meinen Fehler zu sehen :) –

0

Sie können SetTimer verwenden, um eine Änderung auszulösen.

#define STRICT 1 
#include <windows.h> 
#include <iostream.h> 

VOID CALLBACK TimerProc(HWND hWnd, UINT nMsg, UINT nIDEvent, DWORD dwTime) 
{ 

    LPWSTR wallpaper_file = L"C:\\Wallpapers\\wallpaper.png"; 
    int return_value = SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, wallpaper_file, SPIF_UPDATEINIFILE); 


    cout << "Programmatically change the desktop wallpaper periodically: " << dwTime << '\n'; 
    cout.flush(); 
} 

int main(int argc, char *argv[], char *envp[]) 
{ 
    int Counter=0; 
    MSG Msg; 

    UINT TimerId = SetTimer(NULL, 0, 2000, &TimerProc); //2000 milliseconds 

    cout << "TimerId: " << TimerId << '\n'; 
    if (!TimerId) 
    return 16; 

    while (GetMessage(&Msg, NULL, 0, 0)) 
    { 
     ++Counter; 
     if (Msg.message == WM_TIMER) 
     cout << "Counter: " << Counter << "; timer message\n"; 
     else 
     cout << "Counter: " << Counter << "; message: " << Msg.message << '\n'; 
     DispatchMessage(&Msg); 
    } 

    KillTimer(NULL, TimerId); 
return 0; 
}