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()을 유지하면서 콘솔 생성을 건너뜁니다. 깜빡임 없음.
빌드 구성
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 주석 해제.
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 사용.
인수로 파일 선택:
#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 0→0.jpgChangeDesktopColor.exe 999→4.jpg(기본)ChangeDesktopColor.exe 1 2→0.jpg(첫 번째 인수)
실전 활용
배경 순환에 유용: 이미지 → 검정 → 이미지 → ...
월페이퍼를 치트시트로: 0.jpg에 Razer NAGA X(12+12 버튼+수정자) 키 조합 표시. 포커스 잃지 않고 빠른 매크로 접근.
핵심 요약:
- 링커 숨김 > 프로그래밍 방식—깜빡임 없음.
_TEST로 로컬0.jpg-4.jpg개발 간편.wcsstr로 파일과 단색 구분.SPIF_UPDATEINIFILE레지스트리에 저장.- 명령줄 인수로 배경 선택 (0-4).
— Editorial Team
아직 댓글이 없습니다.