锁屏背景替换(3)-xp篇

来源:互联网 发布:u盘格式化数据还有 编辑:程序博客网 时间:2024/05/18 02:13
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         else14         {15             DWORD dwError = GetLastError();16         }17 18         RegCloseKey(hKey); 19     }

2、定时器

同win7的。

3、恢复

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


附完整的源代码:

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

 

原创粉丝点击