2007-03-11(日) [長年日記]
■ Vista時代の壁紙術
タイトルは「○○時代の××術」って書いてみたかっただけですすみませんすみません。Vistaなんて、ヨドバシのPC売り場でちょこっと触ったことがあるだけです。IT業界にいてそれもどうかと思うけど。
で、(ワイド液晶ディスプレイを持っているわけでもないのに)Yahoo! Widgetsを使っている関係で、画面の右端をちょっと空けているのである。残りの部分はPoderosaをほとんど全画面化して使っているので、この下の画面は目にすることがない。つまり、せっかく壁紙を設定していても、目に入るのは右端のほんの100ピクセル程度ということになる。
これはもったいない。
そこで、この領域を「サイドペーパー」を名づけ、この大きさにフィットする壁紙を設定してはどうかという話。
まず思いついた縦長の絵は、『ぴっぴら帳』を読んでいて気づいた「四コママンガのタイトル」。これをスキャナで取り込んでトリミング、設定してみた。『ぴっぴら帳』は7年も続いたから、季節感あふれる図柄には事欠かないし。
もっとも幅100ピクセルにすると縦がぜんぜん足らないので、ちょっとマヌケか。……というか、やってみたものの一気にオタクくさくなったのでこの案は却下。
次のアイデアは風車。ブレードをカットしてよければ、縦長の領域によく合う。これはいいですな。
しかし、やはり縦長といえばロケット。これはいいかもしんない(←アリアン好き)。どっちがオタクやねん、と言えばこっちかも知れないが。
■ 「サイドペーパー」設定スクリプト: sitepaper.vbs
こないだ書いたディスプレイの解像度を知りたいという話は、この「サイドペーパー」を楽に設定するためのスクリプトが欲しかったからなのだ。
で、できたのはコレなんだけど:
' ' sidepaper.vbs: set wallpaper on right-bottom side. ' Copyright (C) 2007 by TADA Tadashi <sho@spc.gr.jp>. ' Distributed under GPL. ' Function HiMetric2Pixel( himetric, logPixel ) HiMetric2Pixel = CInt( (himetric * 567 * logPixel) / (1440 * 1000) ) End Function Dim args Dim picture Dim shell Dim wmi Dim disps Set shell = CreateObject( "Wscript.Shell" ) Set args = Wscript.Arguments If args.Length < 1 Then shell.RegWrite "HKCU\Control Panel\Desktop\WallpaperOriginX", "0", "REG_SZ" shell.RegWrite "HKCU\Control Panel\Desktop\WallpaperOriginY", "0", "REG_SZ" Wscript.Echo( "Setting wallpaper offset to zero." ) Wscript.Quit End If Set picture = LoadPicture( args( 0 ) ) shell.RegWrite "HKCU\Control Panel\Desktop\WallpaperStyle", "0", "REG_SZ" shell.RegWrite "HKCU\Control Panel\Desktop\TileWallpaper", "0", "REG_SZ" shell.RegWrite "HKCU\Control Panel\Desktop\Wallpaper", args( 0 ), "REG_SZ" Set wmi = GetObject( "winmgmts:\\.\root\cimv2" ) Set disps = wmi.ExecQuery( "Select * from Win32_DisplayConfiguration", , 48 ) For Each disp in disps width = HiMetric2Pixel( picture.Width, disp.LogPixels ) height = HiMetric2Pixel( picture.Height, disp.LogPixels ) offx = CStr( disp.PelsWidth - width ) offy = CStr( disp.PelsHeight - height ) shell.RegWrite "HKCU\Control Panel\Desktop\WallpaperOriginX", offx, "REG_SZ" shell.RegWrite "HKCU\Control Panel\Desktop\WallpaperOriginY", offy, "REG_SZ" shell.Run "RUNDLL32.EXE user32.dll,UpdatePerUserSystemParameters",0,True Wscript.Quit Next
これを「sidepaper.vbs」というファイルに保存し、その上に好きな画像ファイルをドラッグ&ドロップすればデスクトップの右下にフィットするように壁紙を設定してくれる……はずなんだけど、実は動かない。
レジストリ上の値はちゃんと設定されているはずで、何かの拍子に期待通りの表示になったりもするんだが、少なくともおれの環境では実行直後には壁紙が切り替わらない。
最近のWindowsではWallpaperOriginXが使えなくなったんだろうか(おれの知識はWindows 3.1時代のものである)と思ったが、XPで使っている記事もあるから間違ってはいなさそうである。うーん……。
ターミナルを透過させればサイドに拘らなくてもいいのでは……という気がしてしまうのですが、どうでしょう。いや、 Poderosa に(というか Windows のアプリケーションで)そういうことが簡単に出来るのかは知らないのですが、それこそ Vista 時代には可能になっててもおかしくなさそうにも思えます。
それは、ターミナルの背景が透けていても良い、という前提の話ですね。私は嫌いです、邪魔くさいし。昔GnomeだかKDEでやってみたけど、馴染めなかったな。
ちなみにPoderosaは背景画像を指定できます。4.xではもっと機能拡張しているかもしれない。あとWindowsには、任意のウィンドウを透けさせるソフトもありますね。
bmpしか即時反映はできないらしいですよ。
http://www.msfn.org/board/index.php?showtopic=52720
(このフォーラムだとコンバートするのが解決方法となってます)
理屈がわかったので一応。
次のURLを、ConvertedWallpaper Last WriteTime かConvertedWallpaperをキーにして検索すると理由がわかります。結局、壁紙のプロパティ設定がbmp変換もしているということです。で、たださんのスクリプトは変換していないので、古いbmpがそのまま利用されているということではないかと。
http://www.virtualplastic.net/fresh/html/ui_registry.html
あぁ〜、ConvertedWallpaperというキーは実装中に発見していて、そんな気がしていたんですが、やはりそうですか。
でも、そう予想してbmpファイルを使ってもダメだったんですよねぇ。WallpaperOriginXも反映されないし。うちの環境だけ?
XPSP2で試しましたが、BMPはWindowsの下にあるのは一応全部OKでした(色数とかに依存するのかなぁ?)。Vista時代って、もしかしてVistaですか?
Windowsの下は試してないけど、自作のフルカラーおよび256色BMPはダメですねぇ。オフセットどころか、中央にも表示されない……なんでだろう。
>もしかしてVistaですか?
めめめめ、めっそうもない!
亀ツッコミですがVistaで試したら,絵がすぐには切り替わりませんでした.レジストリには確かに値がセットされていて,何かの拍子あるいは再ログインするとそれが反映されました.最後のUpdatePer...がくさそうですが…….