使用消息筛选器的用户定义应用程序在 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 兼容性设置作为临时解决方法。
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈