(AutoHotKey)(「imgctl.dll」を利用して 簡易的な 壁紙チェンジャーを作ってみる 編)

 この スクリプトを利用するためには .ahkファイルアイコンへの ファイルドロップ(コマンドライン引数でファイル名を渡す場合も)を 受け付けるようにする必要があります
新規インストール時に 「Enable drag & drop onto scripts」 にチェックを入れておく必要があります
もし ただ解凍して使っている場合や チェックをせずにインストールしてしまった場合は
チェックをつけて 現在あるところに 上書き再インストールしてください

 このスクリプトは ルーチェさんの 「imgctl.dll」 ( http://www.ruche-home.net/ からダウンロードできます) が 必要です
「imgctl.dll」 を 「スクリプトと同じフォルダ」 か 「パスの通ったフォルダ」 に入れておく必要があります

 使い方は
デスクトップに 「ショートカットアイコン」を作って そこにドロップしてください
または Leeyesのような 標準で 壁紙化が出来ない 画像ビューアに 外部アプリケーションとして 登録する事で
壁紙化の機能を持たせる事が可能になります

 他にも 使い方として ドロップ や コマンドライン引数 で ファイル名を渡さずに 本スクリプトを起動させれば GUIを表示します
その GUIに 画像をドロップすれば 壁紙を変更する事が出来ます

 対応している画像フォーマットは jpg と png と gif と bmp です、 もしも 対応フォーマットを増やしたい場合は
SusiePlugInとの連携で何とかなるかもです 笑)

 リサイズ処理などはしてないので 必要なら 書き足してください 笑) < ヒトマカセ
AutoHotkeyの組み込みコマンドの SysGet と、 「imgctl.dll」 の HeadDIB と ResizeDIB あたりを組み合わせればうまく行くかな? 笑)
ヒマがあれば 一枚絵で表示させる時には 縦(or横)いっぱいまで 拡大(or縮小) して表示するようにするのを作ってみようかな? 笑)

[]スクリプトファイル名:[][]簡易壁紙チェンジャー.ahk[] []などと付けてください[]


[]Gosub, CheckOption[] []Gosub, InitGUI[] []Return[] []CheckOption:[] []{[] [] If ( %0% )[] [] {[] [] buf = %1%[] [] ChangeWallPaper(buf)[] [] ; ここで 壁紙変更処理をしたら そのままスクリプトを終わらせます[] [] ExitApp[] [] }[] [] Return[] []}[] []InitGUI:[] []{[] [] Gui, -0x00020000[] [] Gui, Add, Button, X3 Y3 W94 H94, ここにドロップ[] [] Gui, Show, W100 H100[] [] hAutoHotkeyGUI := WinExist("ahk_class AutoHotkeyGUI")[] [] WinSet, AlwaysOnTop, On, ahk_id %hAutoHotkeyGUI%[] [] Return[] []}[] []GuiDropFiles:[] []{[] [] Loop, Parse, A_GuiEvent, `n[] [] {[] [] ChangeWallPaper(A_LoopField)[] [] ; 最初の一枚だけで 強制的にループを抜けます[] [] Break[] [] }[] [] Return[] []}[] []GuiClose:[] []{[] [] ExitApp[] []}[] []ChangeWallPaper(FileName)[] []{[] [] VarSetCapacity(FullPathName, 2048)[] [] DllCall("kernel32.dll\GetLongPathName", "Str", FileName, "Str", FullPathName, "UInt", 2048)[] [] SplitPath, FullPathName, , , Ext[] [] If ( RegExMatch(Ext, "[jJ][pP][gG]|[jJ][pP][eE][gG]|[bB][mM][pP]|[pP][nN][gG]|[gG][iI][fF]") )[] [] {[] [] ; imgctl.dllをロード と 画像ファイルからDIBを生成[] [] hLib := DllCall("kernel32.dll\LoadLibrary", "Str", "imgctl.dll")[] [] hDIB := DllCall("imgctl.dll\ToDIB", "Str", FullPathName)[] [] ; BMPの書き出し先は スクリプトと同じ場所です[] [] DllCall("imgctl.dll\DIBtoBMP", "Str", A_ScriptDir . "\AHK_WallPaper.bmp", "UInt", hDIB)[] [] ; DIB と imgctl.dll を開放[] [] DllCall("imgctl.dll\DeleteDIB", "UInt", hDIB)[] [] DllCall("kernel32.dll\FreeLibrary", "UInt", hLib)[] [] ; TileWallpaper = 0 中央に表示[] [] ; TileWallpaper = 1 並べて表示[] [] RegWrite, REG_SZ, HKEY_CURRENT_USER, Control Panel\Desktop, TileWallpaper, 0[] [] ; WallpaperStyle = 0 拡大無し[] [] ; WallpaperStyle = 2 拡大して表示[] [] RegWrite, REG_SZ, HKEY_CURRENT_USER, Control Panel\Desktop, WallpaperStyle, 0[] [] ; SPI_SETDESKWALLPAPER = 0x0014[] [] ; SPIF_SENDWININICHANGE = 0x0002[] [] ; SPIF_UPDATEINIFILE = 0x0001[] [] ; SPIF_SENDWININICHANGE | SPIF_UPDATEINIFILE = 0x0003[] [] Return DllCall("user32.dll\SystemParametersInfoA", "UInt", 0x00014, "UInt", 0x0000, "Str", A_ScriptDir . "\AHK_WallPaper.bmp", "UInt", 0x0003)[] [] }[] [] Return 0[] []}[]