さて。やたら前置きが長かったですが。また Mac OS X の濁点ファイルにハマって時間をとられるのは嫌なので、NFD 形式のファイルが一目でわかるよう、エクスプローラ上でオーバーレイアイコンを表示できるプログラムを作ってみました。
作ったといっても、
のサンプルを少しいじっただけなんですけど、とりあえずそれに関していろいろと。後半に行くほど蛇足です。
動作環境
github には Visual C++ 2010 を使ってコンパイルした .dll をあげていますので、これを使うには以下の再頒布可能パッケージがインストールされている必要があります。
また、確認はしていませんが、おそらく 32bit 環境でしか動作しません。
使い方
- 上記 github ページ右上の「Downloads」から「NfdHighlighter.dll」をダウンロードする
- .dll を適当なパス(C:\Windows\System32 でもいいし、C:\Program Files\NfdHighlighter のように適当なディレクトリでも OK)にコピーする
- 管理者で cmd.exe を実行し、以下のコマンドを実行する
regsvr32 NfdHighlighter.dll
課題
今のところ、以下の 2 文字が含まれるファイルにオーバーレイアイコンを表示しているだけです。
- 「゙ 」(U+3099)…Combining Katakana-Hiragana Voiced Sound Mark(濁点)
- 「゚ 」(U+309A)…Combining Katakana-Hiragana Semi-Voiced Sound Mark(半濁点)
本当は表示対象とする文字(結合文字)はもっと多いはずですが、ファイル表示のたびに呼ばれる処理なのであまり重い判定にもしたくなくて、必要最低限に留めてあります。
また、上記の方法で判定しているだけなので、「あ」+「゙ 」のように結合できない文字の直後に濁点がきているようなケース(=NFC であり NFD でもあるので、Windows 上で不正な動作をしにくいと思われる)でもアイコンが表示されてしまいます。
さらに言うと
- 新規ファイル作成やリネームを監視して、NFD のファイルができたらバルーンで警告を出すような常駐ソフト
- NFD のファイル名を NFC に変換するソフト
なんてのも作って一つのパッケージにしたら綺麗なんだろうなと思うんですけど、そこまでの余裕はないのでやってません。github に上げているので、気が向いた方はいろいろ手を入れていただけると。
コンパイル方法
Visual C++ 2008/2010 Express Edition でコンパイルできることを確認しています。
WDK のインストール(Express Edition の場合)
Express Edition には ATL 等のインクルードファイルやライブラリファイルがありませんので、WDK をインストールしておく必要があります。
以降の説明は WDK が C:\WinDDK\7600.16385.1 にインストールされた前提で記載しています。
Visual C++ 2008 Express での設定
以下の設定を追加します。
共通
Vista や Windows7 で UAC が有効な環境では、コンパイル後
Project : error PRJ0019: ツールはエラー コードを返しました : "Performing registration"
のようなエラーになってしまいます。(VC++ 2008 の場合)これは管理者以外のユーザで regsvr32 しようとして失敗しているのが原因です。
なお、VC++ 2010 では
C:\Program Files\MSBuild\Microsoft.Cpp\v4.0\Microsoft.CppCommon.targets(113,5): error MSB3075: :VCEnd" はコード 5 で終了しました。このコマンドを実行するための十分な権限があるか確認してください。
のようなメッセージになっておりわかりやすいです。
cmd.exe を管理者として実行して、
regsvr32 "C:\Users\****\OverlayIcon.dll"
のように実行すれば問題ありません。
アイコンについて
デザイン
以前から「自分が作るツールのアイコンくらいは作れるようになっておきたい」という目標があったので、がんばって Inkscape で作ってみたんですが。Mac OS X の
あたりをパクって濁点っぽく引き伸ばした&NFD の「D」っぽく見えなくもないように配置したものです。
でもこれだとオーバーレイ時に目立たないのでコントラストを強くして、こんな感じに落ち着きました。
配置
アイコンのサイズや表示位置について、
でいろいろ調べていたわけですが。濁点だから右上にあるのが自然だし、Tortoise 系と一緒に表示してもアイコンが被らないようにしたかったので右上に表示されるイメージで作りました。表示を大きくすると変な位置に表示されるけど気にしない。
小さいサイズで表示された場合はオーバーレイが目立たないので、一回り大きなサイズでエクスポートしたものをアイコンに使っています。(完全に自分用のメモです・・・)
アイコンサイズ | 作り方 |
---|---|
256x256 | 256x256 でエクスポートしたものをそのまま使用 |
48x48 | 48x48 でエクスポートしたものをそのまま使用 |
32x32 | 48x48 でエクスポートしたものをうまく配置 |
24x24 | 32x32 でエクスポートしたものをうまく配置 |
16x16 | 24x24 でエクスポートしたものをうまく配置 |
ハマったところ
- なんだかプロジェクトの変換がうまくいかないと思ったら、.sln ファイルが Visual C++ Express Edition じゃなくて Visual Studio 2010 Shell に紐づいてて、こちらで変換をかけていたのが原因でした・・・。
- これが原因だとわからなくて、Visual C++ 2008 Express Edition 2008 を試したり、無駄に遠回りしてました。
- 今回やったのって、実質的にはサンプルを一行変更しただけ(このコミット)で。手元で動かすのはすぐだったんですけど、アイコンの表示位置を調べたり、GUID を書き換えたり、github の挙動を調べたり・・・周辺のところですごく手間がかかってしまいました。もっとさくっと公開まで持っていけるようになりたいものです。