Windows の最新の IME が原因で一部のアプリケーションがフリーズする問題

Audacity という録音ツールを使っていたのですが、この1~2週間の間に頻繁にフリーズするようになりました。特定の操作、特にキーボードで操作しようとするとフリーズします。とはいってもアプリケーション自体はフリーズはしていなくてテキストのカーソルの点滅は常に動いている状態だけど、なんの操作も受け付けなくなるような現象です。

例えば以下は保存ダイアログなのですが、マウス操作している間はなんともないのですがファイル名をキーボードで入力しようとするとそれ以降何の操作も受け付けなくなります。

image

固まるのは上記のような形式のダイアログで、例えばメモ帳の保存ダイアログ形式では固まることはありません。

固まる原因が分からなくてこれについて Twitter でつぶやいたところ以下のリプライがありました。

OD−10Zさん 「@onodera_sf なんか、IME側の挙動が変わった影響とかなんとかで、日本語表示にしてるとキーボード入力した瞬間に固まるみたいです。私のほうは英語表示に切り替えたら解決しました。」

どうも IME に原因があるらしく、ネットで調べて試しに IME の互換性をオンにしてみたところ問題なく動作するようになりました。設定場所は以下の場所にあります。

  • 設定 → 時刻と言語 → 言語 → 日本語 (オプション) → Micorsoft IME (オプション) → 全般

image

ただ、古いバージョンを使用して対処しているので最終的には最新の IME で直ってくれるのがうれしいのですが、場合によっては古いアプリケーションは切り捨てられる可能性もあるかもしれませんね。互換性 IME もいつまで残ってくれるかもわかりませんし。

[ASP.NET] IE の互換表示で ReportViewer コントロールのサイズを小さくすると IE がフリーズする現象を回避する方法

ReportViewer+SSRS のレポートを IE で互換表示すると高確率でフリーズする」で質問させていただいたのですが、回避方法が見つかったのでこちらにも書いておきます。

【環境】(現象確認環境であるため、似たような環境でも発生すると思います)

❏サーバー

  • Windows Server 2008 R2 Standard (SPなし)
  • IIS 7.5
  • ASP.NET MVC 3
  • ReportViewer コントロール バージョン 10.0.0.0 (.NET Runtime 2.0.50727)
  • SQL Server 2008 R2 (SPなし)
  • 見出しマップを表示されたレポート (.rdl)

 

❏クライアント

  • OS : Windows XP, Vista, Windows Server 2008 R2
  • ブラウザ:IE8, 9

 

【現象】

ReportViewer コントロールに見出しマップがあるレポートをバインドさせ、その Web ページを IE 8, または 9 の「互換表示」で開き、ReportViewer コントロールのサイズを小さく表示させると IE がフリーズする。(ReportViewer コントロールのサイズがウインドウサイズに追従する場合は、IE のウインドウサイズを小さくしていけば現象は確認できる)

おそらくではあるが、IE の内部処理でレイアウトを計算する際に無限ループ、またはそれに近い再起処理が行われているためだと思われる。

 

【対処法】

IE のレイアウトの解析処理を変更させることでフリーズを回避させることができる。具体的には HTML の解析は DOCTYPE で変えられるため、この宣言の内容を変更することによって可能。

・修正前

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

↓↓↓↓

・修正後

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

 

しかし、HTML 4.01 Transitional を指定すると今度は逆に互換表示していない IE での表示が崩れてしまうという現象に見舞われる。そのため、HTML で互換表示かそうでないか (正確には IE のレンダリングバージョン)で条件分けをして現象を回避します。

下記では「IE 8 以降であるか」「IE 8 未満であるか」「それ以外のブラウザであるか」で分岐しています。

<!--[if gte IE 8]>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<![endif]-->
<!--[if lt IE 8]>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<![endif]-->
<![if !IE]>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<![endif]>

 

別案としてサーバーから「<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" />」のようなメタ情報を返してクライアントで互換モードを指定するという方法もあるが、最終的な互換モードの決定権はクライアントにあるため、必ずしも有効であるとは限らない。(でも何もしないよりはいいと思います。)

]]>