Предположение, что Qt ожидает событий WM_CHAR, неверно.При обработке события WM_KEYDOWN Qt ищет сообщение WM_DEADCHAR в очереди сообщений.Если есть такое сообщение, Qt обходит обычную обработку WM_KEYDOWN.Если Вы хотите получить QKeyEvent для мертвых ключей, Вам следует очистить очередь сообщений от сообщений WM_DEADCHAR.Напишите немного кода, как это:
bool TEventFilter::nativeEventFilter(const QByteArray &eventType, void *message, long *result)
{
if(eventType=="windows_generic_MSG")
{
MSG *msg=static_cast<MSG*>(message);
MSG peekedMsg;
switch(msg->message)
{
case WM_KEYDOWN:
case WM_SYSKEYDOWN:
PeekMessage(&peekedMsg, msg->hwnd, WM_DEADCHAR, WM_DEADCHAR, PM_REMOVE);
case WM_CHAR:
case WM_DEADCHAR:
if(msg->lParam&0x40000000) //message is repeated via the key holding down
return 1;
}
}
return 0;
}