メッセージ フィルターを使用しているユーザー定義のアプリケーションが 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 互換性設定を使用することをお勧めします。