論壇上經常有網友發貼問怎麼實現設置桌面牆紙,並且使用的是jpg文件。雖然在下知道可以用API函數SystemParametersInfo可以設置bmp文件為牆紙,也知道可以用IActiveDesktop來設置其他格式的圖片文件作為牆紙,但是工作中一直沒有使用到該功能,所以也就一直沒實現。
1.用SystemParametersInfo設置牆紙
很簡單,一句話搞定:
SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, "C:\xxx.bmp", SPIF_SENDWININICHANGE| SPIF_UPDATEINIFILE);
but, 這玩意兒只能用bmp文件,不能用其他文件,MS也不把函數功能擴展一下,BS一下MS。
再but,這玩意兒也不能設置牆紙的樣式,比如平鋪,拉伸什麼的,雖然可通過修改注冊表修改,但是據那位網友說,需要重啟才能生效什麼的,我沒有試,因為這篇文章的主要目的是討論用IActiveDesktop設置牆紙。
2.用IActiveDesktop設置牆紙
習慣上用任何不太熟悉的函數或接口前,查msdn。
通過msdn,了解到:
IActiveDesktop是個Windows shell interface
Header shlobj.h
Minimum Operating systems Windows 2000, Windows NT 4.0 with Internet Explorer 4.0, Windows 98, Windows 95 with Internet Explorer 4.0
同時,在msdn還有一篇文章
Using the Active Desktop Object
其實,看了這篇文章你就應該學會如何使用Active Desktop Object了。
(1)使用IActiveDesktop需要包含的一些頭文件,以及進行初始化
在stdafx.h中
#include <afxwin.h>
#include <wininet.h> //添加這個。注意順序,順序亂了也編譯不過
#include <afxext.h>
...
用了com的東西,要進行初始化,不用說了吧。
在CXXXApp::Initinstance中添加AfxOleInit();
使用IActiveDesktop的cpp中
#include <shlobj.h>
(2) 現在開始寫實現函數了
還是我的老的測試工程CTest6Dlg..呵呵
BOOL CTest6Dlg::SetWallPaper(CString strPath)
{
HRESULT hr;
IActiveDesktop* pIAD;
hr = CoCreateInstance( CLSID_ActiveDesktop, NULL, CLSCTX_INPROC_SERVER,IID_IActiveDesktop, (void**)&pIAD);
if ( !SUCCEEDED(hr) )
return FALSE;
// 設置牆紙前先打開活動桌面開關
COMPONENTSOPT co = {0};
co.dwSize = sizeof(COMPONENTSOPT);
co.fEnableComponents = TRUE;
co.fActiveDesktop = TRUE;
hr = pIAD->SetDesktopItemOptions(&co, 0);
if ( !SUCCEEDED(hr) )
return FALSE;
//做以下寬字符的轉換是因為SetWallpaper的參數是用的LPCWSTR
WCHAR wszPath[MAX_PATH];
LPTSTR lpStr = strPath.GetBuffer(strPath.GetLength());
MultiByteToWideChar(CP_ACP, 0, lpStr, -1, wszPath, MAX_PATH);
strPath.ReleaseBuffer();
// 設置牆紙
hr = pIAD->SetWallpaper(wszPath, 0);
if ( !SUCCEEDED(hr) )
return FALSE;
// 設置牆紙風格
WALLPAPEROPT wp = {0};
wp.dwSize = sizeof(WALLPAPEROPT);
wp.dwStyle |= WPSTYLE_CENTER;
hr = pIAD->SetWallpaperOptions(&wp, 0);
if ( !SUCCEEDED(hr) )
return FALSE;
// 應用改變
hr = pIAD->ApplyChanges(AD_APPLY_ALL);
if ( !SUCCEEDED(hr) )
return FALSE;
// 最後釋放接口,不要忘了
pIAD->Release();
}
很簡單吧。我的測試只做了一個jpg,其他的圖片格式沒有試,有興趣的朋友可以幫試試。。。