Alt+Tab 반복 입력 시 Alt의 Press 상태가 고정되는 현상에 대해 문의드립니다.

안녕하세요.

UE5.3을 기반으로 게임이 제작되어 있습니다.

간헐적으로 Alt가 눌린 상태로 유지되는 현상이 제보 되어 원인을 확인하였고, ​현재 100% 재현이 확인된 사항은 아래와 같습니다.

  • Alt+Tab으로 윈도우 비활성화
  • 동일 프레임에 Alt+Tab 또는 클라이언트 화면 클릭으로 윈도우 활성화

의도적으로 큰 히치를 주거나 t.maxFps로 프레임을 낮췄을 때 ​확인이 되었습니다.

위와 같은 상황에서 Alt에 대한 키입력은 KeyDown만 발생하는데, 이는 일반적인 Alt+Tab 상황에서도 동일했습니다. 다만, 일반적인 경우는 WM_ACTIVATE를 통해 GameViewportClient에 LostFocus가 발생하면서 FlushPressedKeys()가 발생하여 PlayerInput의 키 눌림 상태가 Flush되는 것으로 확인했습니다. 위 경우에는 WM_ACTIVATE가 발생하지 않아 PlayerInput의 Alt 키 눌림 상태가 계속 유지되었습니다.

위 현상은 5.6.1 순정 엔진에서도 확인했습니다.

5.3과 5.6.1 순정 엔진에서의 차이점도 하나 있었는데, 5.3에서는 위와 같은 상황에서 WindowsApplication의 ModifierKeys 상태도 어그러지는 것으로 확인했습니다. ​WM_ACTIVATE, WM_ACTIVATEAPP에서 UpdateAllModifierKeyStates()으로 상태를 갱신하는데, 두 이벤트 모두 발생하지 않았기 때문으로 보입니다. 이 때문에 Enter 입력 시 Alt+Enter와 같이 인식되어 전체화면 전환 처리가 발생합니다.

5.6.1 순정 엔진에서 테스트 했을 때에는 PlayerInput의 Alt는 눌린 상태로 유지되었지만, IsAltDown은 false를 반환하였습니다. 깃에서 WindowsApplication.cpp 수정 히스토리를 봤을 때 직접적으로 연관이 있는 사항을 찾지 못했는데, 혹시 해당 이슈가 수정된 내역이 있다면 공유 부탁 드립니다.

[Attachment Removed]

안녕하세요.

질문해주신 부분에 대해 확인 ​후, 답변 드리도록 하겠습니다.

감사합니다.​

[Attachment Removed]

안녕하세요.

Alt+Tab 입력 시점에는 클라이언트가 포커스를 상실하면서, 해당 과정에서 KeyUp 이벤트가 엔진까지 정상적으로 전달되지 않는 것으로 보입니다.

이를 처리하기 위해, 비활성화 메시지가 전달되면서 UGameViewportClient::LostFocus()가 호출되며,

이 과정에서 APlayerController::FlushPressedKeys()가 수행되어 Pressed 상태가 강제 정리되어 입력 상태가 초기화됩니다.

다만 큰 히치가 발생하는 상황에서 한 프레임 안에 Alt+Tab을 매우 빠르게 왕복하거나, 즉시 클릭으로 복귀하는 등의 타이밍에서는

비활성/활성 전환 메시지가 엔진 측에 정상적으로 전달되지 않아 LostFocus → FlushPressedKeys라는 안전장치가 동작하지 않게 되며,

최종적으로 Alt는 KeyDown만 처리된 상태로 남고, flush가 수행되지 않아 pressed 상태가 유지되면서 문의주신 현상이 나타나게 됩니다.

해당 동작은 플랫폼 메시지 전달/처리 타이밍과 엔진의 포커스 전환 처리에 걸친 경계 조건에 해당하는 것으로 보이며,

근본적으로 완전히 차단하기는 현실적으로 제약이 있어 보입니다.

감사합니다.

[Attachment Removed]

답변 감사드립니다.

자체적으로는 문제 상황에서 GetAsyncKeyState()로 검사되는 것과 WindowsApplication의 Modifier KeyState를 캐싱해 두는 것이 어긋나는 상황을 이용하여, 특정 타이밍에 이 차이를 검사하여 KeyState도 갱신하고(따로 API가 없어서 임의로 추가함) PlayerInput의 FlushPressedKeys도 호출해 주는 방향으로 처리했습니다. 다만, 윈도우 전용이 아닌 코드에 윈도우 전용 API를 호출하도록 작업된 터라 좀 더 일반적인 해결책이 있었으면 좋겠다 싶긴 합니다.

특정 타이밍은 동일 타이밍에 포커스가 나갔다 들어왔을 때 WM_ACTIVATE는 안 오지만, WM_NCACTIVATE나 WM_WINDOWPOSCHANGING, WM_WINDOWPOSCHANGED는 오는 것을 확인하여 해당 타이밍을 이용하였습니다.

[Attachment Removed]

안녕하세요.

문의해주신 현상과 관련하여, 해당 내용에 대한 이슈가 인지될 수 있도록 엔진 팀에 내용을 전달하였습니다.

다만 본 건은 내부 프로세스에 따라 공개 Issue Tracker 링크가 별도로 생성되지는 않는 점 양해 부탁드립니다.

추가로 공유드릴 수 있는 내용이 확인되는 대로 전달드리겠습니다.

감사합니다.

[Attachment Removed]