Programming/Win32&MFC&COM
IDesktopWallpaper를 활용한 윈도우 배경화면 변경하기
psychoria
2015. 8. 25. 22:00
반응형
윈도우8에 IDesktopWallpaper 인터페이스가 추가되었습니다.
이 인터페이스를 활용하면 바탕화면의 배경화면을 변경할 수 있습니다.
MSDN에서 다음과 같이 확인할 수 있습니다.
https://msdn.microsoft.com/en-us/library/windows/desktop/hh706946(v=vs.85).aspx
메소드의 이름이 직관적이기 때문에 기능을 쉽게 알 수 있습니다.
배경화면의 색을 지정하거나 이미지, 슬라이드쇼의 설정이 가능합니다.
또한 화면의 해상도를 가져올 수도 있습니다.
#include <iostream>
#include <atlbase.h>
#include <ShObjIdl.h>
#include <Shlobj.h>
int main()
{
::CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED);
CComPtr<IDesktopWallpaper> pWallPaper;
HRESULT hr = pWallPaper.CoCreateInstance(CLSID_DesktopWallpaper);
if (FAILED(hr))
{
return 0;
}
hr = pWallPaper->Enable(FALSE);
COLORREF color = 0xFFFFFF;
hr = pWallPaper->SetBackgroundColor(color);
hr = pWallPaper->GetBackgroundColor(&color);
hr = pWallPaper->Enable(TRUE);
UINT nCount = 0;
hr = pWallPaper->GetMonitorDevicePathCount(&nCount);
LPWSTR szPathAt = nullptr;
pWallPaper->GetMonitorDevicePathAt(0, &szPathAt);
LPWSTR szWallpaper = nullptr;
pWallPaper->GetWallpaper(szPathAt, &szWallpaper);
DESKTOP_WALLPAPER_POSITION dwp;
hr = pWallPaper->GetPosition(&dwp);
RECT rc;
pWallPaper->GetMonitorRECT(szPathAt, &rc);
::CoTaskMemFree(szPathAt);
::CoTaskMemFree(szWallpaper);
pWallPaper.Release();
::CoUninitialize();
return 0;
}
사용 방법은 슬라이드쇼를 제외하고는 간단합니다.
메모리를 할당해서 리턴하는 GetMonitorDevicePathAt()과 GetWallpaper() 등은 메모리를 해제해야 합니다.
슬라이드쇼를 설정하기 위해서는 IShellItemArray를 전달해야 합니다.
IDesktopWallpaper를 이용하면 듀얼 모니터 이상일 경우에 각각의 모니터에 다른 슬라이드쇼를 설정할 수 있습니다.
사용법도 간단하기 때문에 쉽게 사용이 가능합니다.
반응형