锁屏背景替换-xp篇

来源:互联网 发布:ringdivas 淘宝 编辑:程序博客网 时间:2024/04/30 20:13

1、背景界面替换原理

xp不同win7,设置比较复杂,没有现成的接口可以调用。大家可以尝试一下,XP是桌面是什么图片,那么锁屏的时候就是什么背景。因此,设置xp锁屏背景,只需要在锁屏时,动态替换桌面背景即可(这里背景的替换会有点延时的),然后解锁时,恢复之前的桌面背景即可,这里你必须小心处理各种事件,否则,之前的桌面可能不能恢复成功。

BOOL CXPDesktopUtil::SetWallpaper(LPTSTR lpPicFile, DWORD dwStyle){HRESULT hr; IActiveDesktop* pIAD;   //创建接口的实例  CoInitialize(NULL);  hr = CoCreateInstance(CLSID_ActiveDesktop,NULL,CLSCTX_INPROC_SERVER,IID_IActiveDesktop,(void**)&pIAD); if(!SUCCEEDED(hr)){return FALSE; }//将文件名改为宽字符串,这是IActiveDesktop::SetWallpaper的要求 WCHAR wszWallpaper[MAX_PATH]; MultiByteToWideChar(CP_ACP,0,lpPicFile,-1,wszWallpaper,MAX_PATH); //设置墙纸 hr = pIAD-> SetWallpaper(wszWallpaper, 0); if(!SUCCEEDED(hr))   {return TRUE; }//设置墙纸的样式 WALLPAPEROPT wpo; wpo.dwSize = sizeof(wpo); wpo.dwStyle = dwStyle; hr = pIAD->SetWallpaperOptions(&wpo,0); if(!SUCCEEDED(hr))   {return FALSE; }//应用墙纸的设置 hr = pIAD-> ApplyChanges(AD_APPLY_ALL); if(!SUCCEEDED(hr)) {return FALSE;}//释放接口的实例 pIAD-> Release(); CoUninitialize(); return   TRUE;}

备份之前桌面的背景图片

CString CXPDesktopUtil::backupWallPaper(LPTSTR lpPicFile){TCHAR szPath[MAX_PATH] = { 0 };CString strBackup = CAppUtil::getApplicationDirectory() + "backup";if (FALSE == PathFileExists(strBackup.GetBuffer())) {if(FALSE == CreateDirectory(strBackup.GetBuffer(), NULL)){return _T("");}}strBackup += _T("\\backgroundDefault.jpg");::CopyFile(lpPicFile, strBackup.GetBuffer(), FALSE);return strBackup;}

这里你可能需要关闭用户快速切换

        //关闭快速用户切换HKEY hKey; LPCTSTR lpRun = _T("SOFTWARE\\Microsoft\\\Windows NT\\CurrentVersion\\Winlogon");long lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, lpRun, 0, KEY_WRITE, &hKey); if(lRet== ERROR_SUCCESS){DWORD dwValue = 0;lRet = RegSetValueEx(hKey, _T("AllowMultipleTSSessions"), 0, REG_DWORD, (LPBYTE)&dwValue, sizeof(dwValue));if (ERROR_SUCCESS == lRet){}else{DWORD dwError = GetLastError();}RegCloseKey(hKey); }


2、定时器

同win7的。

3、恢复

替换之前备份的桌面背景即可。


附完整的源代码:

http://git.oschina.net/zhujf21st/LockApp

0 0