锁屏背景替换(3)-xp篇
1、背景界面替换原理
xp不同win7,设置比较复杂,没有现成的接口可以调用。大家可以尝试一下,XP是桌面是什么图片,那么锁屏的时候就是什么背景。因此,设置xp锁屏背景,只需要在锁屏时,动态替换桌面背景即可(这里背景的替换会有点延时的),然后解锁时,恢复之前的桌面背景即可,这里你必须小心处理各种事件,否则,之前的桌面可能不能恢复成功。
1 BOOL CXPDesktopUtil::SetWallpaper(LPTSTR lpPicFile, DWORD dwStyle) 2 { 3 HRESULT hr; 4 IActiveDesktop* pIAD; //创建接口的实例 5 CoInitialize(NULL); 6 hr = CoCreateInstance(CLSID_ActiveDesktop,NULL,CLSCTX_INPROC_SERVER,IID_IActiveDesktop,(void**)&pIAD); 7 if(!SUCCEEDED(hr)) 8 { 9 return FALSE; 10 } 11 12 //将文件名改为宽字符串,这是IActiveDesktop::SetWallpaper的要求 13 WCHAR wszWallpaper[MAX_PATH]; 14 MultiByteToWideChar(CP_ACP,0,lpPicFile,-1,wszWallpaper,MAX_PATH); 15 //设置墙纸 16 17 hr = pIAD-> SetWallpaper(wszWallpaper, 0); 18 if(!SUCCEEDED(hr)) 19 { 20 return TRUE; 21 } 22 23 //设置墙纸的样式 24 WALLPAPEROPT wpo; 25 wpo.dwSize = sizeof(wpo); 26 wpo.dwStyle = dwStyle; 27 hr = pIAD->SetWallpaperOptions(&wpo,0); 28 if(!SUCCEEDED(hr)) 29 { 30 return FALSE; 31 } 32 33 //应用墙纸的设置 34 hr = pIAD-> ApplyChanges(AD_APPLY_ALL); 35 if(!SUCCEEDED(hr)) 36 { 37 return FALSE; 38 } 39 40 //释放接口的实例 41 pIAD-> Release(); 42 CoUninitialize(); 43 44 return TRUE; 45 }
备份之前桌面的背景图片
1 CString CXPDesktopUtil::backupWallPaper(LPTSTR lpPicFile) 2 { 3 TCHAR szPath[MAX_PATH] = { 0 }; 4 5 CString strBackup = CAppUtil::getApplicationDirectory() + "backup"; 6 7 if (FALSE == PathFileExists(strBackup.GetBuffer())) { 8 if(FALSE == CreateDirectory(strBackup.GetBuffer(), NULL)){ 9 return _T(""); 10 } 11 } 12 13 strBackup += _T("\\backgroundDefault.jpg"); 14 15 ::CopyFile(lpPicFile, strBackup.GetBuffer(), FALSE); 16 17 return strBackup; 18 }
这里你可能需要关闭用户快速切换
1 //关闭快速用户切换 2 HKEY hKey; 3 4 LPCTSTR lpRun = _T("SOFTWARE\\Microsoft\\\Windows NT\\CurrentVersion\\Winlogon"); 5 long lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, lpRun, 0, KEY_WRITE, &hKey); 6 if(lRet== ERROR_SUCCESS) 7 { 8 DWORD dwValue = 0; 9 lRet = RegSetValueEx(hKey, _T("AllowMultipleTSSessions"), 0, REG_DWORD, (LPBYTE)&dwValue, sizeof(dwValue)); 10 if (ERROR_SUCCESS == lRet) 11 { 12 } 13 else 14 { 15 DWORD dwError = GetLastError(); 16 } 17 18 RegCloseKey(hKey); 19 }
2、定时器
同win7的。
3、恢复
替换之前备份的桌面背景即可。
附完整的源代码:
http://git.oschina.net/zhujf21st/LockApp