홈으로 돌아가기

C++ Windows 바탕화면 변경: WinAPI 및 COM

C++ 프로그램이 Windows 데스크톱 바탕화면과 단색을 순환 변경. 링커를 사용한 콘솔 숨기기, TEST/Release 구성, SystemParametersInfo를 통한 현재 배경 확인 및 WinAPI/COM을 통한 설정 설명.

Windows에서 C++로 바탕화면 및 색상 프로그램적으로 변경
Advertisement 728x90

Windows에서 C++로 데스크톱 배경화면과 색상 전환하기

이 Windows용 C++ 프로그램은 데스크톱 배경을 이미지와 단색 사이에서 전환합니다. 콘솔 창 없이 백그라운드에서 실행되며, 디버그 모드에서는 문제 해결을 위해 창이 표시되고 릴리스 및 테스트 빌드에서는 숨겨집니다.

콘솔 숨기는 두 가지 방법:

  • 프로그래밍 방식 숨기기 GetConsoleWindow()ShowWindow(hWnd, SW_HIDE) 사용. 숨기기 전에 창이 잠깐 깜빡입니다.
  • 링커 지시어 (권장 방법):
#ifndef _DEBUG
#pragma comment(linker, "/subsystem:windows")
#pragma comment(linker, "/SUBSYSTEM:windows /ENTRY:mainCRTStartup")
#endif

첫 번째 지시어는 WinMain() 진입점으로 GUI 앱으로 빌드합니다. 두 번째는 main()을 유지하면서 콘솔 생성을 건너뜁니다. 깜빡임 없음.

Google AdInline article slot

빌드 구성

Visual Studio의 세 가지 구성: Debug, Release, TEST (Release 상속).

TEST는 프로젝트 속성(C/C++ → 전처리기)에서 _TEST 전처리기 정의 추가.

  • TEST: exe 폴더에 0.jpg...4.jpg 이미지. 실행: ChangeDesktopColor.exe X (X=0-4).
  • Release: exe 위치 상관없이 전체 파일 경로 사용.

TEST 디버깅 시 Debug에서 #define _TEST 주석 해제.

Google AdInline article slot

exe 경로 구하기 (TEST 핵심):

wchar_t pathTmp[MAX_PATH] = { L'\0' };
GetModuleFileName(NULL, pathTmp, MAX_PATH);
std::filesystem::path dir = ((std::filesystem::path)pathTmp).parent_path();

Explorer에서 실행 시 argv[0]이 비어 있으므로 GetModuleFileName 사용.

인수로 파일 선택:

Google AdInline article slot
#ifdef _TEST
    switch (*argv[1]) {
    case '0': filePath = dir.wstring() + L"\\0.jpg"; fileName = L"0.jpg"; break;
    // ... 1-4에 대해 유사
    default: filePath = dir.wstring() + L"\\4.jpg"; fileName = L"4.jpg";
    }
#else
    switch (*argv[1]) {
    case '0': filePath = L"C:\\folder\\subfolder\\filename0.jpg"; fileName = L"filename0.jpg"; break;
    // ...
    }
#endif

현재 배경화면 확인

현재 배경 가져오기:

wchar_t wallFile[MAX_PATH] = { L'\0' };
SystemParametersInfo(SPI_GETDESKWALLPAPER, MAX_PATH, wallFile, 0);
wchar_t* ptr = wcsstr(wallFile, fileName.c_str());
  • ptr == NULL: 단색 또는 다른 파일.
  • wallFile은 파일명 또는 단색 시 비어 있음.

배경화면 또는 색상 설정

전환 로직:

if (!ptr && std::filesystem::exists(filePath)) {
    BOOL result = SystemParametersInfoW(SPI_SETDESKWALLPAPER, 0, (void*)filePath.c_str(), 
                                        SPIF_UPDATEINIFILE | SPIF_SENDWININICHANGE);
} else {
    COLORREF blackColor = RGB(0, 0, 0);
#ifdef MyCOM
    HRESULT hr = ChangeDesktopBackgroundColor(blackColor);
    if (SUCCEEDED(hr)) {
        SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, NULL, SPIF_SENDWININICHANGE);
    }
#else
    if (SetDesktopSolidColor(blackColor)) {
        SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, NULL, SPIF_SENDWININICHANGE);
    }
#endif
}

#define MyCOM으로 API 선택:

  • WinAPI (SetDesktopSolidColor): 기본 방법.
  • COM (ChangeDesktopBackgroundColor): 대안.

SPIF_SENDWININICHANGE는 모든 창에 업데이트 브로드캐스트.

TEST 실행 예:

  • ChangeDesktopColor.exe 00.jpg
  • ChangeDesktopColor.exe 9994.jpg (기본)
  • ChangeDesktopColor.exe 1 20.jpg (첫 번째 인수)

실전 활용

배경 순환에 유용: 이미지 → 검정 → 이미지 → ...

월페이퍼를 치트시트로: 0.jpg에 Razer NAGA X(12+12 버튼+수정자) 키 조합 표시. 포커스 잃지 않고 빠른 매크로 접근.

핵심 요약:

  • 링커 숨김 > 프로그래밍 방식—깜빡임 없음.
  • _TEST로 로컬 0.jpg-4.jpg 개발 간편.
  • wcsstr로 파일과 단색 구분.
  • SPIF_UPDATEINIFILE 레지스트리에 저장.
  • 명령줄 인수로 배경 선택 (0-4).

— Editorial Team

Advertisement 728x90

다음 읽기