PuTTYのウィンドウを半透明にする方法

SSHクライアントのPuTTYですが、MacやLinuxの人がやってるみたいに、ウィンドウを半透明にして表示すると、ブラウザで参考になるサイトを見ながらプログラミングできたり、あるいは動画を見ながら作業をしたりなんかもできて、いろいろ捗りますよね。

それで、何年か前からPuTTY 0.59 ごった煮版に背景半透明化機能を付けた次のバージョンを使っていました。

ところが最近になって、Vimでマウスが使えることを知り、PuTTYを通してマウス操作をしようと思うと、PuTTY 0.59ではうまく動かないということが分かりました。
例えば、マウスホイールでスクロールすることができません。

いろいろ試した結果、この問題は、PuTTYのバージョンを上げれば解決することが分かりました。
そこで、ごった煮のパッチが当たったPuTTYで、背景を半透明にできるものが無いかと探していたら、次のバージョンを見つけました。

こちらはPuTTY 0.60を元にして描画処理をかなりいじったもののようですが、問題がひとつ。ちょっと重いのです。
あと、Aeroの機能で透過すると、ぼやけてしまって後ろの文字が見えません。雰囲気はいいんですけどね。

ということで、自分でPuTTYのソースを読んで改良するか?とも思ったのですが、それは難しそう。
そこで思いついたのが、Windows2000からOS標準の機能としてウィンドウを半透明にする機能が付いていて、それを利用して任意のウィンドウを透過表示にするアプリケーションが、結構昔からちらほら見かけるぞということでした。

透過処理を当てるPuTTYにはこれを選びました。

通常のごった煮版です。Vimでのマウス処理も、特別な設定をすること無く使えました。
これが半透明で使えたら問題なしですね。

半透明にするアプリを探してみると、タイトルバーをShft+クリックとかホイールクリックで、そのウィンドウを半透明にするというタイプのアプリがいくつか。
それから、タスクトレイのアイコンを右クリックすると、現在開いているウィンドウの一覧が表示され、その中から任意のウィンドウを選ぶと、そのウィンドウが半透明になるという次のアプリがありました。

このアプリは、ウィンドウの透過設定を保存してくれて、次にウィンドウを開いたときに、何もしなくてもまた半透明にしてくれるので便利です。

しかし、Windows7には対応していませんでした。
Windows7で起動すると、タスクバーのスタートボタンの表示がおかしくなってしまうのです。
副作用は他にもありました。もともと透過機能を使っているWindows7のガジェットや、Adobe Air製のアプリの背景を浮き出させてしまうのです。

ウィンドウを半透明にするアプリは、昔作られたものが多くて、透過処理が当たり前になった最近のアプリへの影響や、Windows7での動作までを考えられたものは見つけられませんでした。
だったら作ればいいじゃん。

ウィンドウを半透明にするのは意外と簡単です。
Win32APIを使うのですが、目的のウィンドウのウィンドウハンドル (hWnd) に対して、SetWindowLong() 関数で GWL_EXSTYLE という透過できるようにするための属性をセットした後、SetLayeredWindowAttributes() 関数で、透過度合いをセットします。

早速作ってみました。
ソースコードは例によって修正BSDライセンスにして、SourceForge.JPに公開しました。

まだ基本的な機能を実装してみただけの状態ですが、一応使い方を説明しておきます。

このプログラムは、ウィンドウを半透明にするためのもので、起動するとタスクトレイに常駐します。
タスクトレイアイコンをダブルクリックすると、開いてる全てのPuTTYのウィンドウが、半透明になります。
もう一度ダブルクリックすると、元に戻ります。

また、タスクトレイアイコンを右クリックすると、現在開いているウィンドウのプロセス名一覧を見ることができます。
ここで、任意のプロセス名をクリックすると、そのウィンドウの半透明/無透明が切り替わります。
この辺りは、「半透明ウインドウマネージャ」のUIを参考にしています。

副作用を最低限に抑えるようプログラムしたので、メニューから選ばなければ、PuTTY以外のウィンドウには何もしません。
ガジェットとかは右クリックメニューから選ばないようにすれば、特に悪さはしないと思います。

透過具合は、メニューの設定から変更できます。
初期値は僕の好みで 210 となっていますが、値を小さくすればより透明になります。
値を変更したら OKボタン を押して、再度透明にし直して下さい。自動的に透過具合が切り替わるような機能はありません。

ウィンドウの起動を検知する機能を付けたわけでも無いので、新規にPuTTYを開いたときは、タスクトレイアイコンを2回ダブルクリックして下さい。
って、それじゃあタイトルバーをクリックして半透明を切り替えるアプリとなんら手間は変わりませんね……

といった具合です。

今後の課題としては、設定した透過具合の値をプログラム終了時に保存すること。
ガジェットやAdobe Airのアプリなど、初めから副作用が出るとわかっているアプリを、右クリックメニューに出さないようにすること。これはNGリストみたいなのを作ってもらう形で対応するかもしれません。
それから、新しくウィンドウが開いたことを検知して、PuTTYを初めから半透明にするようにすること。
ウィンドウ一覧をプロセス名ではなくウィンドウタイトルで表示し、ウィンドウのアイコンも表示できるようにすること。
ちゃんとしたプログラムのアイコンを作ること。
あと、既知の問題点として、タスクトレイアイコンを右クリックしたとき、起動して一度目の右クリックが反応しません。もう一度右クリックすればメニューが出ます。

気が向いたらぼちぼち直していきます。

■ 追記

早速バージョンアップしました。

  • 新規に起動したPuTTYに対しても透過処理を行うようにした
  • 設定値を保存するようにした
  • メニューで透過済みの項目がチェック状態になるようにした
  • NGリストを実装(仮)

PuTTYに限っては、ダブルクリックで透過する状態にしていた場合に、新規ウィンドウを開くと、そのウィンドウも透過させます。
起動の検知にはタイマーを使っていて、500msごとにプロセスを監視しているので、若干の遅れを感じるかもしれません。

NGリストは仮実装です。
一度起動してから終了すると、TraPtty.xmlというファイルに設定が書き込まれますので、それを書き換えるとNGリストが編集できます。
NGリストに書いた文字列と、プロセス名が一致した場合に、右クリックメニューにそのプロセスを表示しないようにします。

PuTTYのウィンドウを半透明にする方法」への2件のフィードバック

  1. ピンバック: Solarizedでターミナルを美しく | yuuAn's Note

  2. fix

    PuTTYを長年愛用しているのですが、非半透明が当たり前で使っていたので、
    特に気にしていなかったのですが、ふと思いついて検索したところ此方のサイトを見つけました。
    半透明化した方が、やや使いやすくなり重宝しそうです。
    また、他のソフトも半透明化できるのも便利です。
    良いソフトをありがとうございます。

コメントを残す