使用消息筛选器的用户定义应用程序在 Windows 10 版本 2004/20H2/21H1/21H2 中可能会无响应

本文可帮助你解决使用其自己的消息筛选器的应用程序在Windows 10中停止响应时出现的问题。

适用于:Windows 10版本 2004、Windows 10、版本 20H2、Windows 10、版本 21H1、Windows 10、版本 21H2

症状

请考虑在 Windows 10 版本 2004/20H2/21H1/21H2 上运行应用程序且应用程序使用消息筛选器的情况。 在这种情况下,应用程序可能会无响应。

注意

Windows 11中未观察到此问题。

原因

Windows 10添加文本输入系统或文本服务框架 (TSF) 使用的 Windows 消息。

注意

Windows 10,版本 2004 引入了新版本的 TSF。

如果应用程序的消息筛选器使用 PeekMessage API 或 GetMessage API 删除窗口消息,并且未将消息传递给 DispatchMessage API,则 TSF 无法完成消息处理,并且应用程序可能会停止响应。

如果应用程序具有类似于以下示例的消息筛选器,该筛选器仅调度 WM_LBUTTONUP 消息并删除其他消息,则可能会出现此问题。


while(::PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
    ::TranslateMessage(&msg);
    
    // Dispatch only specific messages.
    if (msg.message == WM_LBUTTONUP) {
        ::DispatchMessage(&msg);
    }
}

解决办法 1

修改消息筛选器以仅筛选所需的消息,并通过 API 调度其他消息 DispatchMessage


while(::PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
    ::TranslateMessage(&msg);
    
    if (msg.message == WM_LBUTTONDOWN) {
    
    }
    else {
        // Dispatches all non-filtered messages
        ::DispatchMessage(&msg);
    }
}

解决办法 2

如果在 Windows 10 中使用新的 Microsoft IME,请启用 Microsoft IME (输入法编辑器) 的兼容模式。

有关如何使用早期版本的 Microsoft IME 的详细信息,请参阅还原为以前版本的 IME (输入法编辑器)

注意

建议使用 IME 兼容性设置作为临时解决方法。