«前の日記(2005-09-06 [火]) 最新 次の日記(2005-09-12 [月])» 編集
RSS: href="http://endoh-namazu.tierra.ne.jp/diary/index.rdf"


半期 四半期 全カテゴリ

新・なまず日記


2005-09-10 [土]

_ [ソフト][デスクトップ][カスタマイズ][AHK]ウインドウの影

MacOS Xのデスクトップは本当に美しい。Windowsを使っていると、嫉妬さえ感じる、という話は、以前書きました。その時はフォントの美しさについて触れましたが、今回は、ウインドウにつく影の話です。

MacOS Xでは、すべてのウインドウに美しい影がついて、まるでウインドウが浮き上がっているかのように見えます。基調の透明感のある白と相まって、未来的でとてもカッコいいです。

なまずのWindows2000でも、あんな影が付かないかな、と思って、探してみたら、ありました。コモノ堂さんの、その名も「影」というアプリです。

以下、インストール手順を説明します。

  1. このページの、"kg041111.zip(197KB)"のリンクをクリックして、ファイルをダウンロードします。
  2. 上記ファイルを展開し、適当なフォルダに置きます。
  3. 「影」を動かすには、C++のランタイムライブラリ"msvcp71.dll"が必要なのですが、上記ファイルには入っていないので、どっかでとってきます。こことか。とってきた"msvcp71.dll"を、2.のフォルダに置きます。
  4. あとは"kage.exe"を実行するだけ。

"kage.exe"を起動しておくと、以下のような美しい影がウインドウにつきます。
影
一番上(アクティブ)のウインドウにつく影が濃くなっているのがおわかりになるでしょうか。このおかげで、視認性もあがります。なにより、とてもカッコいいです。

このように、「影」は素晴らしいアプリなのですが、残念ながら、以下の問題があります。

  1. 付けたくないウインドウにも影がついてしまう。例えば、周囲を透明にして、丸い時計を表現しているようなウインドウに、余計な影が付く。
  2. ウインドウが異常終了したり、タスクマネージャで殺したりした時、親ウインドウは消えるのに、影だけ残る(勝手にゾンビ影と呼んでいます)。

付けたくない影(右)と、ゾンビ影(左)

コモノ堂さんが、上記の課題を解決してくれないかな...と待ってはみたのですが、なかなか解決されそうにないので、AutoHotkeyのスクリプトを書いて、課題を解決しました(こんなデスクトップの問題を解決するのに、AHKほど素晴らしいツールはありません!)。

以下、スクリプトの実行方法を説明します。なお、本スクリプトの実行には、Ver1.0.38.01か、それより新しいAutoHotkeyが必要です。

  1. 右のファイルをダウンロードします。close_kage_window_v10.zip
  2. 上記ファイルを展開し、その中の"close_kage_window.ahk"というファイルを、"AutoHotkey.ini"があるフォルダに置きます。
  3. AutoHotkey.iniの先頭に、以下のような記述をします。
  4. #Persistent
      CKW_WindowList = ahk_class RainmeterMeterWindow,ahk_class Rainlendar
      CKW_ZombieConfirmTime = 5000
      SetTimer,CloseKageWnd,1000
    return
    
    #Include, close_kage_window.ahk
    CloseKageWnd: CloseKageWindow() return
  5. "CKW_WindowList"に、影を付けたくないウインドウを指定します。","(カンマ)で区切って、いくらでも指定できます。ウインドウタイトルに含まれる文字列か、ウインドウのクラスIDで指定します。クラスIDの場合は、先頭に、"ahk_class "という文字列をいれてください。クラスIDは、AutoHotkeyに同梱のツール"Window Spy"で読み取ることができます。
  6. 本スクリプトは、ゾンビ影を判定するのに、親ウインドウがなくて、影だけが孤立していることを見分けて判定します。しかし、ウインドウの移動中に、親ウインドウに影がついてくるのがちょっと遅れたときに、「孤立している」とゾンビ判断してしまう恐れがあります。そこで、一定時間たっても、孤立し続けていることを確認した後に、ゾンビ影として消去するようにしています。そのゾンビ判断のための時間を、"CKW_ZombieConfirmTime"で指定します(ミリ秒単位)。この時間を短くすると反応がよくなりますが、誤検出も増えます。長くすると誤検出は減りますが、反応が鈍くなります。上記例は5秒で、だいたいこのくらいなら適当と思いますが、お好みで変えてください。
  7. "SetTimer,CloseKageWnd,1000"で、本スクリプトの起動タイミングを決めます。"1000"とは1秒のことで、1秒に一回、本スクリプトが起動して、付けたくない影が付いていないか、ゾンビ影はないか、を監視します。これは反応と負荷のトレードオフですが、だいたい1秒くらいなら適当かと思います。
  8. あとはAutoHotkey.iniをリロードするか、AutoHotkey.exeを再起動すれば、動作します。

影が付くと付かないでは、デスクトップの雰囲気は大分変わります。特にポップアップメニューなどは、本当に浮き出したように見えるので、気分が良いです。ぜひ一度、お試しください。









※本スクリプト(CloseKageWindow)の詳細(細かいことがお好きな方へ)

「影」(kage.exe)が表示する影は、影の絵が書かれた半透明のウインドウです。このウインドウを、親ウインドウの周りに配置することで、ウインドウに影が付いているように見せているわけです。CloseKageWindowでは、この影ウインドウの表示座標と、並び順(重なり順)を見て、付けたくない影か、ゾンビ影かを判断しています。

影ウインドウの表示座標と並び順は、以下のような特徴を持ちます。

  1. 親ウインドウの四辺に、ぴったり張り付くような表示座標を持つ。しかし、ウインドウの形や大きさによっては、微妙に座標値が異なる。
  2. 親ウインドウの上に、右、左、下、上の順番で並べられる。しかし、状況によっては、この限りではない。

上記の例外がどのような状況で起きるのかを解析するのはかなり難しく、あきらめました。そこで、状況を総合的に判断して、影の判定をすることにしました。CloseKageWindowは、大枠では、以下のアルゴリズムで動作します。

  1. まず、影が付いて欲しい親ウインドウに付いている影ウインドウを判定します。
  2. 次に、1.の判定に漏れた影ウインドウについて、影が付いて欲しくない親ウインドウに付いている影ウインドウを判定し、これを消去します。
  3. 1.にも2.にも判定に漏れた影ウインドウをゾンビ候補として記録しておき、"CKW_ZombieConfirmTime"の時間が経過した後も、やっぱりゾンビだった影ウインドウだけを、ゾンビ影として消去します。

さらに、親ウインドウにくっついている影ウインドウを判定するのに、以下のアルゴリズムを使っています。

  1. まず、表示座標位置により、影ウインドウの候補をリストアップします。表示座標位置は、「親ウインドウの右近辺」といったように、幅のある判定をします。
  2. 次に、1.の候補ウインドウの並び順(重なり順)を調べ、典型的な並び順であったら、その候補を、本物の影ウインドウと判定します。例えば、右側の影候補だったら、親ウインドウから-4の並び順の影ウインドウがあったら、それを本物と判定します。
  3. 2.で判定できなかったら、親ウインドウとの並び順の差の絶対値がもっとも小さい影候補を、本物の影ウインドウと判定します。

なまずのデスクトップでは、上記のアルゴリズムで問題なく動作していますが、論理的に100%はあり得ません。もし、あなたのデスクトップで、消したくない影が消えてしまう等の問題が発生したら、ぜひアルゴリズムの見直しを行ってください。上記アルゴリズムの1.は、CloseKageWindow_SelectCandidate()に、上記アルゴリズムの2.と3.は、CloseKageWindow_Decide()という関数に集約されています。

アルゴリズムの見直しをするときには、KageTest()という関数へのコールのコメントアウとをはずすと良いと思います。この関数は、CloseKageWindowが影を消すときに、その時点の全ウインドウの座標と重なり順をあらわすテキストを、クリップボードに格納し、さらに、これからどの座標位置の影ウインドウを消そうとしているかを表示するダイアログを出します。アルゴリズムの検討に役に立つでしょう。

本日のツッコミ(全2件) [ツッコミを入れる]
_ やまやす (2005-09-12 [月] 01:30)

ウィンドウに陰が作ってそんなに大切かなぁ... その為だ<br>けにリソース喰われるのなんかいや...<br><br>現在端末はXPproだけど、クラッシク(Windows98とか同じ)<br>に変えてるし。twmライクなWindows用WMあれば最高とか<br>思ったりしてるし。(笑)

_ なまず (2005-09-12 [月] 08:46)

さっそくのコメントありがとう!<br>おっしゃる通り、所詮は見た目の問題なので、別にウインドウに影が付いたからと言って、どうということはありません。しかし、だからこそ、「そんなクダラないことにこんなにガンバッちゃってバカみたい」と「誉められたい」という気持ちが半分。<br>あとの半分は、結構世の中には、デスクトップをカッコよくしたいと思っている方はいるのですよ。もちろんなまずもその一人で、そういう人達とノウハウを共有したい、という気持ちが半分です。<br>そのうちに、WindowBlindsやCursorXPの話も書こうと思います。やまやすさんは呆れちゃうかな...

[]