views:

91

answers:

2

Hi,

I've been trying to write an application, using Qt and mingw32, to download images and set them as the background Wallpaper. I have read several articles online about how to do this, in VB and C#, and to some extent how to do it in c++. I am currently calling the SystemParametersInfo with what seems to be all the correct arguments (no compiler errors) and it fails. No great crash of cymbals, just a 0 returned. GetLastError() returns an equally enlightening 0.

Below is the code I am using (In a slightly modified form, so you do not have to view the object internals).

#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;
    }
}
+1  A: 
"C:\Documents and Settings\Owner\My Documents\Wallpapers\wallpaper.png";

shouldn't this be:

"C:\\Documents and Settings\\Owner\\My Documents\\Wallpapers\\wallpaper.png";
sukru
Oh true. But that is not the error. In the actual program, the QString is properly populated by a different function :) But kudos for spotting my mistake :)
Blue Peppers
+3  A: 

It could be that SystemParametersInfo is expecting an LPWSTR (a pointer to wchar_t).

Try this:

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

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

If this works (try it with a few different files just to make sure), you'll need to convert your char * to a LPWSTR. I'm not sure if Qt offers these services, but one function that may help is MultiByteToWideChar.

dreamlax
Yes that one works - I just tried...
sukru
+1 wchar_t's are a pain. why can't everyone just speak English!!? ;-) j/k
Byron Whitlock