共用方式為


在 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 新增文字輸入系統或文字服務架構所使用的 Windows 訊息 (TSF) 。

注意事項

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

修改訊息篩選器,只篩選必要的訊息,並透過 DispatchMessage API 分派其他訊息。


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 (Input Method 編輯器) 的相容性模式。

如需如何使用舊版 Microsoft IME 的詳細資訊,請參閱還原為舊版的 IME (輸入法 編輯器)

注意事項

建議您使用 IME 相容性設定做為暫時的因應措施。