2011-12-08 103 views
3

您好,我想要寫一個小程序,在Windows中更改壁紙7如何更改活動桌面壁紙在C++

我想用下面的代碼:

#include "windows.h" 
#include "wininet.h" 
#include "shlobj.h" 
#include "wchar.h" 
#include <iostream> 

void SetWallpaper(LPCWSTR file){ 
    CoInitializeEx(0,COINIT_APARTMENTTHREADED); 
    IActiveDesktop* desktop; 
    HRESULT status =  CoCreateInstance(CLSID_ActiveDesktop,NULL,CLSCTX_INPROC_SERVER,IID_IActiveDesktop,(void**)&desktop); 
    WALLPAPEROPT wOption; 
    ZeroMemory(&wOption, sizeof(WALLPAPEROPT)); 
    wOption.dwSize=sizeof(WALLPAPEROPT); 
    wOption.dwStyle = WPSTYLE_CENTER; 
    status = desktop->SetWallpaper(file,0); 
    wcout << status << endl; 
    status = desktop->SetWallpaperOptions(&wOption,0); 
    wcout << status << endl; 
    status = desktop->ApplyChanges(AD_APPLY_ALL); 
    wcout << status << endl; 
    desktop->Release(); 
    CoUninitialize(); 
} 
int wmain(int argc, wchar* argv[]){ 
    if(argc<=1){ 
     wcout << "use: " << argv[0] <<" path_to_pic.bmp" <<endl; 
    }else{ 
     wchar_t* file = argv[1]; 
     SetWallpaper(file); 
    } 
    getchar(); 
    return 0; 
} 

但是這個代碼不更改壁紙,它只會在調用ApplyChanges後給我的hresult錯誤代碼80070002。

我在做什麼錯了,請幫忙

+0

0x80070002的'HRESULT'代碼意味着系統找不到指定的文件。嘗試硬編碼文件的完整絕對路徑,看看是否有效。 –

+0

我知道,幾個谷歌結果頁後,但我不能確定如果該錯誤代碼始終站在相同的。不要緊,我怎麼給路徑 –

+0

將'char *'輸入到'wchar_t *'中並不奇怪地將它變成一個寬字符的字符串。這使得它無稽之談。 –

回答

1

請從

int main(int argc, char* argv[]) 

改變你的主入口函數

int wmain(int argc, wchar_t* argv[]) 

沒有鑄造是必要像wchar_t* file = (wchar_t*)argv[1];,系統將僅作爲您wmain arguments are already in wchar_t*

我可以用你的代碼和我的修改和改變我的電腦牆紙

+0

非常有幫助,但沒有解決我的問題 –

+0

我很驚訝於..我能夠改變我的牆紙使用您的代碼改爲wmain –

+0

也許問題不是代碼,但我的系統?我試着在明天的另一臺機器上工作 –

0

這裏是一個有前途的前瞻性的代碼 http://answers.google.com/answers/threadview/id/512662.html 雖然我沒有測試它自己:

#include <windows.h> 
#include <stdio.h> 

const SPI_GETDESKWALLPAPER=115; 

void printusage(char *program) 

{ 

    fprintf(stderr, "Usage: %s background-file.bmp\n", program); 
    fprintf(stderr, " Changes desktop background to background-file\n"); 
    return; 

} 

int main(int argc, char *argp[]) 

{ 

    DWORD dResult; 
    BOOL result; 
    char oldWallPaper[255]; 

    if (argc != 2) { 
     printusage(argp[0]); 
     return 1; 
    } 

    result = SystemParametersInfo(
     SPI_GETDESKWALLPAPER, 
     sizeof(oldWallPaper)-1, 
     oldWallPaper, 
     0); 

    fprintf(stderr, "Current desktop background is %s\n", oldWallPaper); 

    result = SystemParametersInfo(
     SPI_SETDESKWALLPAPER, 
     0, 
     argp[1], 
     0); 

    if (!result) { 
     dResult = GetLastError(); 
     fprintf(stderr, "Attempt to set new desktop background failed; code 
%d\n", dResult); 
     fprintf(stderr, "Will restore prior setting (%s)\n", oldWallPaper); 

     result = SystemParametersInfo(
      SPI_SETDESKWALLPAPER, 
      0, 
      oldWallPaper, 
      0); 

     return 2; 
    } 

    fprintf(stderr, "Desktop background changed to %s\n", argp[1]); 
    return 0; 

} 
+1

如果我Runthis代碼出我的視覺工作室: main.exe中0x00df1500第一次機會異常:0xC0000005:訪問衝突讀取位置0x00000004。 main.exe中0x76f915ee處未處理的異常:0xC0000005:訪問衝突。 程序'[8604] main.exe:Native'已退出,代碼爲-1073741819(0xc0000005)。 –

0

代碼用兩個(或多個,添加更多條件)圖像來改變你的壁紙。

#include <windows.h> 
int main() 
{ 
int i; 
for(i=0;;i++) 
{ 
    Sleep(1600); 
    if(i%2==0) 
    { 
    const wchar_t *filenm = L"C:\\Pictures\\image1.jpg"; //ADDRESS of first image 
    bool isWallSet=SystemParametersInfoW(SPI_SETDESKWALLPAPER, 0,(void*)filenm,SPIF_UPDATEINIFILE); 
    } 
    else 
    { 
    const wchar_t *filenm = L"C:\\Pictures\\image2.jpg"; //ADDRESS of second image 
    bool isWallSet=SystemParametersInfoW(SPI_SETDESKWALLPAPER, 0,(void*)filenm,SPIF_UPDATEINIFILE); 
    } 
} 
    return 0; 
}