プログラム上からの壁紙設定はIActiveDesktopを利用する。
設定変更後にApplyChanges(AD_APPLY_ALL);を実行しなければいけないことに注意。また、IActiveDesktopはインクルードファイルとしてwininet.hを必要とする。
#include "atlstr.h"
#include "wininet.h"
#include "shlobj.h"
//
// 壁紙の設定
//
//dwTypeは以下の値を設定
// #define WPSTYLE_CENTER 0
// #define WPSTYLE_TILE 1
// #define WPSTYLE_STRETCH 2
//
bool SetWallpaper(LPCTSTR pszFile,DWORD dwStyle)
{
HRESULT hr;
IActiveDesktop* pIActiveDesktop;
pIActiveDesktop = NULL;
hr = ::CoCreateInstance(CLSID_ActiveDesktop,NULL,CLSCTX_INPROC_SERVER,IID_IActiveDesktop,(void**)&pIActiveDesktop);
if(FAILED(hr) || pIActiveDesktop == NULL)
return false;
hr = pIActiveDesktop->SetWallpaper((CAtlStringW)pszFile,0);
if(SUCCEEDED(hr))
{
WALLPAPEROPT sInfo;
sInfo.dwSize = sizeof(WALLPAPEROPT);
sInfo.dwStyle = dwStyle;
hr = pIActiveDesktop->SetWallpaperOptions(&sInfo,0);
}
if(SUCCEEDED(hr))
hr = pIActiveDesktop->ApplyChanges(AD_APPLY_ALL);
pIActiveDesktop->Release();
return SUCCEEDED(hr) ? true : false;
}
void Test(void)
{
::CoInitialize(NULL);
SetWallpaper(_T("test.jpg"),WPSTYLE_CENTER);
::CoUninitialize();
}
