|
如何在程序中动态设置墙纸(1)
大家都知道设置WINDOWS桌面墙纸的WIN32 API是SystemParametersInfo, 使用SPI_SETDESKWALLPAPER参数便能设置墙纸: ::SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, "C:\\ABitmap.bmp", SPIF_SENDWININICHANGE SPIF_UPDATEINIFILE);
但问题并没有解决,因为这个WIN32 API有很大的局限性 1. 无法把jpeg, gif等其他非位图格式的图片设为墙纸。 2. 无法调整墙纸的式样,即无法设置墙纸为居中,平铺或拉伸。(当然我们可以通过编程改变注册表HKEY_CURRENT_USER\Control Panel\Desktop的值来做到这一点) 由于在显示属性系统对话框内很容易手动设置这些选项,我们有理由相信,Windows Shell API一定提供了相应的比较高层的函数,接口或类来完成墙纸的设置。事实上,Windows Shell API中确实存在完成这个任务的接口:IActiveDesktop。 以下是我所完成的设置墙纸的函数 //strPicFile是图像文件名,支持BMP JPEG GIF等格式 //dwStyle是墙纸的样式 //WPSTYLE_CENTER 居中 0 //WPSTYLE_TILE 平铺 1 //WPSTYLE_STRETCH 拉伸 2 //WPSTYLE_MAX 3 //返回值是TRUE时墙纸设置成功,返回FALSE时失败 BOOL SetWallpaper(CString &strPicFile, DWord dwStyle) { HRESULT hr; IActiveDesktop* pIAD; //创建接口的实例 hr = CoCreateInstance ( CLSID_ActiveDesktop, NULL, CLSCTX_INPROC_SERVER, IID_IActiveDesktop, (void**) &pIAD ); if(!SUCCEEDED(hr)) return FALSE; //将文件名改为宽字符串,这是IActiveDesktop::SetWallpaper的要求 WCHAR wszWallpaper [MAX_PATH]; LPTSTR lpStr = strPicFile.GetBuffer(strPicFile.GetLength() ); MultiByteToWideChar(CP_ACP, 0, lpStr, -1, wszWallpaper, MAX_PATH); strPicFile.ReleaseBuffer(); //设置墙纸 hr = pIAD->SetWallpaper(wszWallpaper, 0); if(!SUCCEEDED(hr)) return FALSE;
|