2010-07-26 68 views
6

我一直在嘗試編寫一個應用程序,使用Qt和mingw32來下載圖像並將它們設置爲背景牆紙。我已經在網上閱讀了幾篇關於如何在VB和C#中實現這個目標的文章,並且在某種程度上如何在C++中實現它。我目前正在調用SystemParametersInfo似乎是所有正確的參數(沒有編譯器錯誤),它失敗了。沒有很大的鐃crash碰撞,只是一個0返回。 GetLastError()返回同樣啓發0用C++和windows api編程改變壁紙

下面是我正在使用的代碼(在稍作修改的形式,所以你不必查看對象的內部)。

#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

你有沒有用位圖文件試過,而不是png/jpg? – 2010-07-26 01:07:02

+0

嘗試與PNG,JPEG,BMP。 – 2010-07-26 01:11:57

回答

10

這可能是SystemParametersInfo期待一個LPWSTR(指針wchar_t)。

試試這個:

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

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

,如果這個工程(與幾個不同的文件,嘗試只是爲了確保),你需要轉換你的char *LPWSTR。我不確定Qt是否提供這些服務,但可能有幫助的一個功能是MultiByteToWideChar

+1

是的,一個工程 - 我只是試圖... – sukru 2010-07-26 01:21:49

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

不是這應該是:

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

哦,真的。但那不是錯誤。在實際的程序中,QString被一個不同的函數適當地填充:)但是發現我的錯誤的榮譽:) – 2010-07-26 01:10:01

0

您cn使用SetTimer觸發更改。

#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; 
}