次の方法で共有


メッセージ フィルターを使用しているユーザー定義のアプリケーションが Windows 10 Version 2004/20H2/21H1/21H2 で応答しなくなる場合がある

この記事は、独自のメッセージ フィルターを使用しているアプリケーションが Windows 10 で応答を停止した場合の問題を解決するのに役立ちます。

適用対象: Windows 10 Version 2004、Windows 10 Version 20H2、Windows 10 Version 21H1、Windows 10 Version 21H2

現象

Windows 10 Version 2004/20H2/21H1/21H2 でアプリケーションを実行し、アプリケーションがメッセージ フィルターを使用しているシナリオを考えてみます。 このシナリオでは、アプリケーションが応答しなくなる場合があります。

注:

この問題は、Windows 11 では確認されていません。

原因

Windows 10 は、テキスト入力システムまたはテキスト サービス フレームワーク (TSF) で使用される Windows メッセージを追加します。

注:

Windows 10 Version 2004 では、新しいバージョンの TSF が導入されました。

アプリケーションのメッセージ フィルターが PeekMessage または GetMessage を使用してウィンドウ メッセージを削除し、メッセージを 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 (入力方式エディター) の互換モードを有効にします。

以前のバージョンの Microsoft IME の使用方法の詳細については、「以前のバージョンの IME (入力方式エディター) に戻す」を参照してください。

注:

一時的な回避策として、IME 互換性設定を使用することをお勧めします。