개요
회사에서 언리얼 프로젝트를 진행하던 중 프로그램이 최소화 상태이거나 사용중이 아닐때 프로그램에 이벤트 발생시 아이콘을 깜빡여야하는 기능을 추가하게 되었다.
TaskbarFlash
윈도우 작업표시줄의 아이콘을 깜빡여 알림을 주는 효과
C++
Windows.h는 unreal에 포함되어있지 않다. Windows.h 기능을 사용하기 위해서는 모듈 WindowsHRapper.h를 사용해야한다.
TaskbarFlash 기능을 개발하기 위해 StartTaskFlaShing 함수를 만들었다.
.h
UFUNCTION(BlueprintCallable, Category = "Windows")
static void StartTaskbarFlashing();
.cpp
void UTaskFlash::StartTaskbarFlashing()
{
FLASHWINFO fi;
fi.cbSize = sizeof(FLASHWINFO);
fi.hwnd = GetForegroundWindow();
fi.dwFlags = FLASHW_TRAY;
fi.uCount = 3;
fi.dwTimeout = 0;
FlashWindowEx(&fi);
}
설명
- FLASHWINFO fi: 구조체 인스턴스 생성
- fi.cbSize = sizeof(FLASHWINFO): 구조체 크기 할당
- fi.hwnd = GetActiveWindow(): 현재 활성창의 핸들러를 hwnd에 할당
- fi.dwFlags = FLASHW_TRAY: 깜빡임이 발생할 위치를 작업표시줄로 지정
- fi.uCount = 3: 깜빡임 숫자 지정
- fi.dwTimeout = 0; 깜빡임 시간 지정 (0으로 지정시활성 창으로 변경될 때까지 유지)
- FlashWindowEx(&fi): 깜빡임 동작 실행
GetForegroundWindow(): 현재 활성창 중 최상단 윈도우 핸들러
위 코드를 작성하여 솔루션 빌드를 진행한 후 블루프린트에 함수를 등록해준다.
이벤트 발생 위치에 해당 블루프린트를 연결해준다.
위 코드처럼 실행하면 프로그램을 사용중이면 Taskbar Flash 기능이 정상 작동하지만 최소화 상태이거나 사용중이지 않을때 기능이 작동하지 않는 문제가 생겼다.
이에 코드를 아래처럼 수정하였다.
.h
UFUNCTION(BlueprintCallable, Category = "Windows")
static void SetHandler();
UFUNCTION(BlueprintCallable, Category = "Windows")
static void StartTaskbarFlashing();
.cpp
HWND this_Handler = nullptr;
void UTaskFlash::SetHandler()
{
this_Handler = GetForegroundWindow();
}
void UTaskFlash::StartTaskbarFlashing()
{
if (this_Handler != GetForegroundWindow())
{
FLASHWINFO fi;
fi.cbSize = sizeof(FLASHWINFO);
fi.hwnd = this_Handler;
fi.dwFlags = FLASHW_TRAY;
fi.uCount = 3;
fi.dwTimeout = 0;
FlashWindowEx(&fi);
}
}
SetHander() 함수를 만들어 핸들러를 전역변수에 저장한 뒤 이벤트 발생시 저장한 핸들러가 최상단이 아니면 기능을 작동한다.