Всё оказалось просто
Но в гугле решение не ищется на первых страницах
1. WM_CHAR может присылать как ANSI так и UNICODE коды символов
Это зависит от того является ли окно unicode'ным
Проверить это можно так:
if (IsWindowUnicode(hwnd)) Show(L"Yes");
else Show(L"No");
2. Чтобы сделать окно unicode'ным нужно регистрировать его класс с помощью RegisterClassExW, а не RegisterClassEx
Что самое смешное, в документации на WM_CHAR про это ни слова
Всё написано в доке на IsWindowUnicode и RegisterClassEx