본문 바로가기

Programming/Win32&MFC&COM

IDesktopWallpaper를 활용한 윈도우 배경화면 변경하기

반응형

윈도우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를 이용하면 듀얼 모니터 이상일 경우에 각각의 모니터에 다른 슬라이드쇼를 설정할 수 있습니다.

사용법도 간단하기 때문에 쉽게 사용이 가능합니다.

반응형