キッカケは「壁紙を変更するツールを作りたい」でした。"壁紙チェンジャ"とか"壁紙セレクタ"のようなオンラインソフトは、Vectorなどを探せばたくさん登録されています。私自身、数年前に「指定した間隔で壁紙を変更する」ツールを作ったりもしました。その後いつの間にか使わなくなってしまいましたが、何となく思い出して、もう少し改良してみようかなと思い立ったわけです。
壁紙を設定するには、レジストリに情報を書き込んで、レジストリの変更を反映させるためにSystemParametersInfoをコールしてやります。
Declare Function SystemParametersInfo Lib "user32" Alias _ "SystemParametersInfoA" (ByVal uAction As Long, _ ByVal uParam As Long, _ ByVal lpvParam As Any, _ ByVal fuWinIni As Long) As Long Public Const SPI_SETDESKWALLPAPER = 20 Public Const SPIF_SENDWININICHANGE = &H2 Public Const SPIF_UPDATEINIFILE = &H1 Sub Sample() Dim WSH, WPaper As String, re WPaper = "C:\Sample.bmp" ''レジストリに書き込み Set WSH = CreateObject("WScript.Shell") WSH.RegWrite "HKEY_CURRENT_USER\Control Panel\Desktop\Wallpaper", WPaper, "REG_SZ" Set WSH = Nothing ''更新 re = SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, ByVal WPaper, _ SPIF_UPDATEINIFILE Or SPIF_SENDWININICHANGE) End Sub
本当は壁紙の"表示方法"なども指定しなければならないんですが、そのへんは割愛します。このように壁紙を設定すること自体は難しくないのですが、設定できる画像はBMP形式でなければならないという問題があります。デスクトップを右クリックして[プロパティ]ダイアログボックスで指定するときは、[参照]ボタンからJPG画像を指定することもできます。それなのに、どうしてBMP画像でなければならないのでしょう。
実は[プロパティ]ダイアログボックスでJPG画像を指定した場合、Windowsが自動的にBMP形式へと変換してくれているのです。Windowsが変換したファイルは「C:\Documents and Settings\<ユーザー名>\Local Settings\Application Data\Microsoft\Wallpaper1.bmp」として保存され、そのBMPファイルが壁紙に設定されます。
ところが、ネットなどから入手した画像はJPG形式も多く、壁紙に設定するためだけにBMP形式へと変換しておくのは、何となく無駄な気がしますし、"もったいないオバケ"が出そうで恐いです。まぁ、とにかく、私が作ろうとしているツールではディスク内のJPG画像を壁紙に設定したいのです。であれば、何とかしてJPG形式をBMP形式に変換しなければなりません。
ネットを検索してみたのですが、これが意外に難しいとわかりました。APIなどで一発…と期待していたのですが、どうやらそんな便利なAPIはないそうです。ちなみに、Visual Studio 2005なら、かなり便利にできそうなことも書いてありました。そのうち試してみましょう。そんな中で見つけたのがKBC.DLLというオンラインソフトです。解説によると
KBC.DLLは明熊さん開発の「明熊JPEG保存DLL V.2.00」DLLを呼び出すことにより、BMP<->JPEG形式の相互変換するActiveX.DLLです。 一時ファイルに展開し、それを読み込むことでメモリ上に展開するようなメソッドも ついています。 当然のことながら、明熊さんのDLLが必要になります。 明熊JPEG保存DLLのVer.2.00に対応しています。Ver.1.00には対応していませんのでご注意ください。
とのこと。で、明熊JPEG保存DLLは、
ローカルに保存されたBMPファイルをJPGファイルに変換する機能、デバイスコンテキストのハンドルから直接JPEGファイルを生成する機能、そして、VBA用にクリップボード経由でJPEGファイルを生成する機能を追加しました。
だそうです。何とも素晴らしいソフトを公開していただき、心より感謝します。
KBC.DLLのページはこちら→http://homepage3.nifty.com/hippo2000/prm.htm
明熊JPG保存DLLのページはこちら→http://www.akikuma.net/download.html
それぞれの使い方は、それぞれのreadme.txtなどをご覧ください。
さっそく組み込んで、次のように変換が可能になりました。
Dim re, oKbc Set oKbc = CreateObject("KBC.Convert") re = oKbc.JPGtoBMP(Filename, App.Path & "\WPS_Saved.bmp")
コード全体は量が多いので書きませんが、実に簡単でした。