锁屏背景替换(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

 

posted @ 2016-06-24 22:57  jeffrey.chu  阅读(860)  评论(0编辑  收藏  举报

99code棋牌网