작년 즈음인가 Windows 11에서 VOXEL HORIZON을 Windows 11에서 실행했을때 한국어를 입력하면 글자가 2개식 입력되는 문제가 있음을 발견했다.

처음에는 Windows 11의 문제라고 생각했고 조만간 해결되겠지..라고 대수롭지 않게 생각했다. 한참 테스트 방송을 진행할 무렵에는 Windows 10을 사용하고 있었고 문제가 없었다. 그러다가 어느 시점부터 테스트 방송도 더 이상 하지 않게 됐다. 그리고 Windows 11로 업그레이드 했다.
최근에 VOXEL HORIZON 클라이언트를 iOS/macOS로 포팅하면서 중간 과정으로 DLL없는 win32/POSIX 하이브리드빌드를 하나 만들었다. 물론 이 빌드에서도 채팅 메시지를 입력할 일은 없었다.
그러다가 이제 iOS/macOS빌드에 네트워크 코드를 붙였고 채팅 기능을 테스트하게 됐다. win32/POSIX빌드를 먼저 작업하고 iOS/macOS빌드도 이에 맞춰서 작업하다보니 win32/POSIX빌드에서도 채팅 입력을 하게 됐고 한국어 입력 문제를 발견했다.
Windows 11에서 발생하던 그 글자가 2개씩 입력되는 현상이 발생하는 것이다. 물론 한국어를 입력할 때만 발생한다. 어라 이상하네?
처음에는 DLL없는 win32빌드에서만 발생하는줄 알았다. 혹시 몰라서 메인 브랜치의 win32빌드에서 한국어를 입력해보니 얘도 글자가 2개씩 출력된다.
IME코드는 수정한 적이 없고 OS만 업그레이드 했으니 Windows 11로 업그레이드 한것이 일단 직접적인 원인일 것이다.
Windows 10 장비에서 한국어를 입력해보니 정상적으로 출력된다. win32/POSIX빌드야 아무래도 좋지만 정식 win32빌드에서 한국어 입력 문제가 있어서는 안된다. 그래서 Windows 10과 Windows 11에서의 IME composition 상황을 비교해봤다. 그리고 코드를 뜯어보니 이상한 점이 보였다.
IME Composition이 완료되거나 문자 하나가 완성될때 한국어와 일본어를 따로 구분해서 처리하고 있는 코드가 있었다. 이상하네? 이걸 왜 갈라놨지?
이게 뭐냐면…
IME로 비영어권 언어 입력을 하면 대충 순서가 이렇다.
- WM_IME_STARTCOMPOSITION -> 다국어 문자 입력 시작
- WM_IME_COMPOSITION – (lParam & GCS_COMPSTR) -> 다국어 문자 조립중(초성 중성 종성을 합쳐서 문자 하나가 만들어지는 중)
- WM_IME_COMPOSITION – (lParam & GCS_RESULTSTR) -> 다국어 문자 하나가 완성.
- WM_IME_ENDCOMPOSITION -> 다국어 문자 입력 끝.
이게 기본적인 순서이고 일반적으로 생각해도 이게 맞다.
Windows 11에서는 한국어/일본어 상관없이 이 순서로 메시지가 발생한다. 아마 최초에 이 코드를 작성했을때(Windows 10 사용할 때 )도 이 시나리오에 맞춰서 코드를 짰을텐데 뭔가 문제가 발생해서 언어별로 따로 처리했을 것이다.
Windows 10에서 한국어 입력을 처리해보면 순서가 다르다.
- WM_IME_STARTCOMPOSITION -> 다국어 문자 입력 시작
- WM_IME_COMPOSITION – (lParam & GCS_COMPSTR) -> 다국어 문자 조합중(초성 중성 종성을 합쳐서 문자 하나가 만들어지는 중)
- WM_IME_ENDCOMPOSITION -> 다국어 문자 입력 끝.
- WM_IME_COMPOSITION – (lParam & GCS_RESULTSTR) -> 다국어 문자 하나가 완성.
Windows 10에서는 Windows 11과 달리 3과 4의 순서가 바뀌어있다. 그런데 일본어 입력을 해보면 Windows 11과 똑같은 순서로 메시지가 날라온다. 한국어 입력/일본어 입력에 따라 순서가 다르게 날라오네. 그래서 그 당시에 언어별로 따로 처리했었구나.
그랬었는데 Windows 11에선 언어에 상관없이 IME Composition메시지 순서가 일관되게 날라오고 있는 것이다.

당시에는 win32 IME와 UWP의 IME처리를 일관되게 맞추느라 꽤 애먹고 있었기 때문에 이 문제에 대해서 더 이상 고민하지 않았고 예외코드로 처리했던것 같다. 어쨌든 이제는 순서 문제인걸 알았으므로 예외코드를 제거하고 일관된 방법으로 처리하도록 코드를 수정했다.
해결책은 간단하다. IME Composition 완료 메시지가 날라오거나, 한 문자가 완료되거나 둘 중 하나만 날라와도 문자열 조합을 완료시키면 된다.
버그 하나 잡아서 시원하다. 요새 Windows 에서 IME처리할 사람이 있을까 모르겠지만 까먹지 않게 정리해둔다.