雑記帳

電子計算機の"明後日"から、他愛もない話まで。

Windows 10を「本物の」クラシック表示で使う

また暫く時間が空いてしまいました。

この間、7月末に駆け込みでWindows7→10への無償アップグレードを済ませたのですが、Windows 95 日本語β版以来あの操作環境に慣れ切ってきた身としては、ビジュアル面が大きく変わったせいかあんまり表示が頭に入ってこない感じになってしまって、ちょっと使いづらくなってしまいました。

無理やり以前の環境に近づけようとする場合、例えばExplorerの使い勝手については「秀丸ファイラーClassic」を使えばほぼXP相当にできますし、アイコンデザイン変更に伴う違和感(というか認知の遅れ)は、昔のデザインのものをWin95のインストールディスク等から回収してレジストリ上で差し替えてやることで解消できます(この2つをやるだけでも結構効果的です)。しかし、7まではあったUIのクラシック表示がWindows 8以降は廃止になってしまったため、そのままではこれ以上以前の使い勝手に戻すことができなくなってしまいました。

どうにかならんものか…と色々調べてみたところ、英語圏のフォーラムではWindows 8登場時からそいういった模索が行われていたようで、少々ダーティですがクラシック表示を可能にする方法が確立されていました。しかし、どうもまだ日本語圏ではそういった情報が見られませんので、自分自身のメモがてら、まとめを書いてみたいと思います。

尚、日本でもテーマを無理やり繕って「クラシック風」のデザインにする「クリーン」な話はちらほら見かけるのですが、そういったレベルの話ではありませんのでご安心を;-)

 

操作手順の参照元は以下になります。

http://www.msfn.org/board/topic/173367-simple-hack-enables-classic-theme-in-windows-10-and-8-too/

動作原理については、以下の2つのページが参考になります。

http://forum.thinkpads.com/viewtopic.php?p=745259#p745259
https://thisissecurity.net/2014/04/08/how-to-run-userland-code-from-the-kernel-on-windows/

ざっくり要約すると、テーマが有効になっている環境(Win10では必ず有効になります)では、GUIを持つアプリの起動時にwin32k.sysによってUxTheme.dllがユーザモードへ突っ込まれるのですが、この際にWinLogon.exeが作成した"ThemeSection"なる名前を持つハンドルを使って使用するテーマの情報を得るようです。その後、これを元にUxTheme.dllがUIの描画を担います。
ここで、このハンドルを外部から無理やりクローズすることでテーマの参照ができないようにしてしまうと、UxTheme.dllによる描画を諦め、これまでと同じWin32k.sys内のクラシック表示用ルーチンを動作させることができます(というか、こっちのコードは残っていたんですねぇ…。もしかしたらフェイルセーフ用かもしれませんが)。これを利用することで、無理やりクラシック側のコードしか走らないようにしてしまうのが今回の主旨です。これなら今までと同等のビジュアルになるだけでなく、描画そのものをカーネルモードで行わせることになるので若干のパフォーマンス改善にも繋がるかもしれません。

 

では実際にハンドルのクローズを行う方法ですが、コマンドラインからハンドル操作を行うソフトとしてSysInternalsのHandleがありますので、あとはこれを使って上記ハンドルを閉じるバッチファイルでも作ればOKです。

参照元のページにはCamTron氏が投稿したバッチファイルが貼ってあるのですが、ログインしないと読めないようですので、他の方が転載したと思われる代物(ここ)を元に、正しく動くよう修正したものを以下に置いておきます。

@echo off
FOR /F "delims=^T" %%G IN ('Handle ThemeSection') do set output=%%G
FOR /F "tokens=6" %%G IN ('echo %output%') DO set handleid=%%G
FOR /F "tokens=3" %%G IN ('echo %output%') DO set pid=%%G
echo %handleid%
echo %pid%
Handle -c %handleid% -p %pid% -y

このバッチファイルをHandle.exeへパスを通した環境で管理者として実行すると、これ以降に起動したアプリは全てクラシック表示となります。
ここで行っている操作はサインアウトすれば元に戻りますので、恒久的にクラシック表示にしてしまいたいのであれば、タスクスケジューラを使ってこのバッチファイルをログイン時に実行するよう登録しておくと良いです。尚、「最上位の特権で実行する」のチェックと、バッチファイルのカレントディレクトリは忘れず登録して下さい。

 

ちなみに、無理やり動かしているだけあっていくつか不具合がありまして、

  • なぜかメニュー表示がフラットスタイルになります。
  • 前述の方法では、起動タイミングの都合上、Explorerに対してクラシックスタイルを適用することができません。
  • だからといってExplorerを一旦落として再起動させると、クラシックスタイルにはなりますが、タスクバーや右クリックメニュー等の表示が崩壊します(使い物になりません)。
  • コントロールパネルからテーマに関連する設定を開くことができなくなります。例えば「個人設定」や「コンピューターの簡単操作センター」など。
  • なぜかタスクマネージャが即死するようになります。但し、これについては、タスクマネージャをSysInternalsの「Process Explorer」に置き換えるなどしていれば影響を受けません。
  • ストアアプリが上手く動かなくなります(例えば、「設定」であれば、歯車が表示されてから先に進まなくなる)。
    Windows8以降は電卓もストアアプリになってしまったので致命的なのですが、電卓だけなら、MS謹製の「Calculator Plus」を入れれば使い勝手が大きく変わることもなく回避可能です。
  • Win7であればAeroGlassが効いていたであろう領域が半透明になります(Presto時代のOpera(v12.18)のタイトルバー等)。

これらの現象が問題となる場合は、タスクスケジューラからバッチのログイン時実行を一時的に消し、一旦サインアウトしてしまえば良いでしょう。

 

本当は、別のところで公開されている"ClassicTheme"というソフトを使った方が、上記クラシック表示に伴うトラブルを解決する為の処理を一部やってくれる為便利なのですが、困ったことにWindowsDefenderがマルウェア扱いしてくるので、ソースを読んで何をやっているか理解できる方以外にはおすすめしません。

 

一応これでクラシック表示は実現できたのですが、Win10のデフォルトではタイトルバーの幅などがWindows 95以来のデフォルト値より大きく設定されています(テーマ適用時と共通の値が使われますので、そちらに合わせたサイズになっています)。こちらは以下のレジストリキー以下を弄ることで変更可能です。

HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics

座標系の単位はいずれもTwip(.netになる前のVB使いだった方にとっては鼻水が出る程懐かしいのでは…)のようでして、96dpiの環境では15で1ピクセルです。参考までに、こちらで設定した値を以下に載せておきます。

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics]
"BorderWidth"="-15"
"CaptionHeight"="-270"
"CaptionWidth"="-270"
"MenuHeight"="-270"
"MenuWidth"="-270"
"ScrollHeight"="-240"
"ScrollWidth"="-240"
"SmCaptionHeight"="-210"
"SmCaptionWidth"="-210"
"PaddedBorderWidth"="0"

デフォルトへ戻したい場合は以下に設定して下さい。

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics]
"BorderWidth"="-15"
"CaptionHeight"="-330"
"CaptionWidth"="-330"
"MenuHeight"="-285"
"MenuWidth"="-285"
"ScrollHeight"="-255"
"ScrollWidth"="-255"
"SmCaptionHeight"="-330"
"SmCaptionWidth"="-330"
"PaddedBorderWidth"="-60"

 

フォントについては同じキー配下にあるCaptionFont、IconFont等を弄れば変更できます。バイナリなので一瞬面食らいますが、GDIで使われるLOGFONT型(Unicode版)のメモリイメージのようです。詳しくはMSDN等を参照下さい。

色についても、昔と同じレジストリキーから設定できます。お好みのカラーリングを設定してみて下さい。

HKEY_CURRENT_USER\Control Panel\Colors

 

ここまでやると、こんな表示に持っていくことができました。

イメージ 1

 

前述のような不具合もありますので100%実用的かと言えば微妙ですが、上手く切替ながら使えば、違和感を抑えつつ作業効率を上げることが可能ではないかと思います。尚、ここに記載の内容を使った結果、未知の不具合やトラブルに見舞われる可能性もありますので、くれぐれも自己責任の上、参考にして頂ければと思います。