I've identified the root cause: the ITfMessagePump
interface is blocked. Previously, my message loop implementation was referenced from the Windows-classic-samples/winui/tsfpad
codebase. Through extensive debugging, I've confirmed this issue stems from an implementation flaw in the TSF ITfMessagePump
component.
Currently, my message loop:
bool done = false;
while (!done)
{
BOOL fResult = 0;
if (pMessagePump->PeekMessageW(&msg, nullptr, 0, 0, PM_REMOVE, &fResult) != S_OK)
{
done = true;
}
if (fResult != FALSE)
{
continue;
}
if (::GetMessageW(&msg, nullptr, 0, 0) <= 0)
{
break;
}
if (IsImeWantMessage(msg, pKeystrokeMgr)) // use ITfKeystrokeMgr test message is consumed by IME
{
continue;
}
TranslateMessage(&msg);
DispatchMessage(&msg);
if (msg.message == WM_QUIT)
{
done = true;
}
if (done)
{
break;
}
}