2020-01-18 的更新

此工具發佈了 3.0.1 版本,更新內容如下:

  • 完全使用 Batch 重寫
  • 添加了卸載工具

2019-04-07 的更新

此工具迎來了 2.0 版本,更新內容如下:

  • 自解壓的輸出路徑由原來的 當前目錄 更改至 Windows\Temp 目錄
  • 修復重啟系統後壁紙設置無效的問題
    • 其實是添加了一個自啟項,每次開機後自動設置壁紙
    • 如果想去掉自啟項,刪除 %AppData%\Microsoft\Windows\Start Menu\Programs\Startup 目錄下的 add-on_set_wallpaper.exe 即可
  • 使用新的壓縮選項,打包後體積更小

除非不能使用,就不會再更新了。

寫在前面

前幾日,寫了一篇博文 (寫段 Bash Script 獲取 Bing 的每日美圖)。

有網友反饋,在 Windows 上使用還是太麻煩了。 那能怎麼辦?滿足他唄。

於是就有了這個小工具。

下載與使用

下載

點擊這裡 下載已打包好的版本 (打包工具為 WinRAR)。

我可以保證引入的外部工具都是安全的。如果你使用的反病毒軟件報毒的話, 建議將本工具添加至白名單,或者停止使用並刪除本工具 (目前已知 Windows Defender 會誤報)。

使用

下載完成後,雙擊運行即可。

運行中會彈出一個黑底白字的窗口,只需稍等片刻, 就能下載今日的 Bing 美圖並設為壁紙。

  • 程序運行中,可能會彈出 UAC 窗口 (因為需要輸出臨時文件和下載圖片到系統盤),點擊 “是” 即可

  • 你可以設定一個定時任務,每 24 小時運行一次本工具

  • 下載的圖片都會保留一份複本 (不含重複的圖片), 複本存放在系統盤的用戶目錄下的 Pictures 文件夾中。

波濤洶湧又波瀾不驚

最開始準備使用純 Batch Script 實現的, 結果發現這腳本語言寫起來比吃屎還難受。

就引入了幾個外部工具 (cURL, gawk, cut) 想簡化一下, 結果 gawk 在 Batch 中使用又會出現各種問題 (特殊字符,參數會有問題)。

那就把 上篇博文 中的 Bash Script 拿來用吧,這樣還可以降低維護成本,然後引入了 BusyBoxcURL 這兩個外部工具。


總算是可以解析並下載圖片了。 誰知剛爬出一個坑,又掉進另一個坑。

遇到了在 Windows 7 系統上設置壁紙會玄學無效 (偶爾又有效) 的問題 (因為儘管 Windows 7 支持使用 .jpg 格式的圖片作為壁紙,但需要圖片的 DPI 信息完備)。

那就轉化成 .bmp 唄。

使用 PowerShell 實現了 jpg2bmp 的功能,結果在 Windows 10 上卻不能正確執行。

不想再折騰了,就再引入 jpg2bmpcmd 這個外部工具來實現吧。


這就完事了?我也想呀。

結果設置壁紙也是個麻煩事。

網上介紹的幾個方法都有各種的瑕疵, 無奈只能自己用 AutoHotkey 實現設置壁紙的功能了。


這樣的後果就是, 程序裡面充斥著各種語言間的相互調用 (至少有 5 種語言)。

簡直是混亂不堪,不堪入目。 就好像自己把幾種屎攪在了一起。

要是一開始就用 Python 或者 AutoHotkey 實現, 應該就不會這麼折騰了。

具體實現

直接上代碼 (點擊 此處 查閱代碼)。

程序入口腳本 (使用 Batch 實現)

@ECHO OFF

::
:: 獲取 Bing 的每日美圖並設置成壁紙
::
:: @Author: 文正
:: @E-Mail: ivlioioilvi@outlook.com
:: @項目主頁: https://github.com/Cool-Pan/wz-bing


:: 設置窗口標題
TITLE=WZ-Bing
:: 設置窗口背景和字體顏色
COLOR 0F
:: 設置窗口大小
MODE CON COLS=50 LINES=10


:: 輸出作者信息
ECHO "+ Author: WZ"
ECHO "+ E-Mail: ivlioioilvi@outlook.com"
ECHO "---------------------------------"
ECHO "The program is in progress."
ECHO "Please wait ..."


:: 使腳本獲得管理員權限
::
:: 方案一 (推薦)
%1 START mshta VBScript:CreateObject("Shell.Application").ShellExecute("cmd.exe","/C %~s0 :: %CD%","","runas",1)(window.close)&&exit
:: 方案二 (不推薦。因為如果腳本放在 C 盤中,可能會因沒有寫入權限而執行失敗)
::%1 ECHO Set objShell = CreateObject("Shell.Application") > Admin.vbs
::%1 ECHO objShell.ShellExecute "cmd.exe", "/C %~s0 :: %CD%", "", "runas", 1 >> Admin.vbs
::%1 ECHO WScript.Quit >> Admin.vbs
::%1 CALL Admin.vbs && del /f /q Admin.vbs
::%1 EXIT

:: 定義變量
::
:: 獲取傳入的參數 2 (腳本自身所在的路徑)
SET SELF_PATH=%2
:: 設置臨時 PATH 變量
SET PATH=%SELF_PATH%\bin;%PATH%
::
:: 定義圖片基本 URL
SET SET_URL_BASE=https://bing.com
:: 定義 API 地址
SET SET_API="https://bing.com/HPImageArchive.aspx?format=js&idx=0&n=1"
::
:: 存放壁紙的文件夾
SET BW_DIR=%HOMEDRIVE%\Users\%USERNAME%\Pictures\Bing-Wallpaper
SET BW_DIR_BACKUPS=%HOMEDRIVE%\Users\%USERNAME%\Pictures\Bing-Wallpaper\Backups


:: 準備工作
:Preparation_Action
    :: 判斷存放壁紙的目錄是否存在,不存在就創建
    IF EXIST "%BW_DIR_BACKUPS%" (
        ECHO "---------------------------------"
    ) ELSE (
        MKDIR "%BW_DIR_BACKUPS%"
    )

    :: 執行 Get_API 函數
    CALL:Get_Picture
GOTO:EOF


:: 設置壁紙
:Set_Wallpaper
    :: 轉化 .jpg 格式的圖片到 .bmp 格式
    :: + Windows XP:壁紙只能使用 .bmp 格式
    :: + Windows 7 :壁紙儘管能支持 .jpg 格式,但需要 .jpg 圖片的 DPI 信息完備
    ::
    :: 方案一 (推薦)
    jpg2bmpcmd.exe -i "%BW_DIR%\Current.%GET_TYPE%" -o "%BW_DIR%" -q
    DEL /F /Q "%BW_DIR%\Current.%GET_TYPE%"
    ::
    :: 方案二 (不推薦。因為在 Windows 10 上可能會由於未知原因導致失敗,且轉換速度很慢)
    ::CALL Plugin-jpg2bmp.bat
    ::MOVE /Y "%SELF_PATH%\Current.bmp" "%BW_DIR%\Current.bmp"
    ::DEL /F /Q "%BW_DIR%\Current.%GET_TYPE%"

    :: 設置壁紙
    :: 如果你想使用其它的壁紙設置工具,請註釋掉下面的行
    ::
    :: 方案一 (推薦)
    Plugin-Set_Wallpaper.exe
    ::
    :: 方案二 (不推薦。因為可能會由於缺少 .net 運行庫而失敗)
    ::CALL Plugin-Set_Wallpaper.bat
    ::
    :: 方案三 (不推薦。因為可能會由於未知的原因導致失敗)
    ::REG ADD "HKEY_CURRENT_USER\Control Panel\Desktop" /v Wallpaper /d "%BW_DIR%\Current.bmp" /f
    ::GPUPDATE /Force
    ::RunDll32.exe USER32.DLL,UpdatePerUserSystemParameters
    ::TASKKILL /IM explorer.exe /F && START explorer.exe

    :: 設置在開機時自動修改壁紙為關鍵前的狀態
    COPY /Y "%SELF_PATH%\bin\Plugin-Set_Wallpaper.exe" "%AppData%\Microsoft\Windows\Start Menu\Programs\Startup"

    :: 刪除自解壓出的文件 (讓程序行為看起更整潔有序)
    RD /S /Q "%SystemRoot%\Temp\bin"
    DEL /F /Q "%SystemRoot%\Temp\License"
    DEL /F /Q "%SystemRoot%\Temp\Version"
    DEL /F /Q "%SystemRoot%\Temp\Main.bat"
GOTO:EOF


:: 獲取圖片的鏈接地址
:Get_Picture
    :: 獲取圖片具體 URL
    FOR /F DELIMS^=^"^ TOKENS^=18 %%i IN ('curl.exe -sL %SET_API%') DO (
        SET GET_URL="%SET_URL_BASE%%%i"
    )

    :: 獲取圖片名
    FOR /F DELIMS^=^.^ TOKENS^=3 %%i IN ('ECHO %GET_URL%') DO (
        FOR /F DELIMS^=^_^ TOKENS^=1 %%j IN ('ECHO %%i') DO (
            SET GET_NAME=%%j
        )
    )

    :: 獲取圖片格式
    FOR /F DELIMS^=^.^ TOKENS^=4 %%i IN ('ECHO %GET_URL%') DO (
        FOR /F DELIMS^=^&^ TOKENS^=1 %%j IN ('ECHO %%i') DO (
            set GET_TYPE=%%j
        )
    )

    :: 下載圖片
    curl.exe -sL %GET_URL% -o "%BW_DIR_BACKUPS%\%GET_NAME%.%GET_TYPE%"
    COPY /Y "%BW_DIR_BACKUPS%\%GET_NAME%.%GET_TYPE%" "%BW_DIR%\Current.%GET_TYPE%"

    :: 執行 Set_Wallpaper 函數
    CALL:Set_Wallpaper
GOTO:EOF


:: 執行 Preparation_Action 函數
CALL:Preparation_Action

設置壁紙的功能 (使用的是 AutoHotkey 實現)

; Plugin-Set_Wallpaper.ahk

;
; 設置系統壁紙
;
; @Author: 文正
; @E-Mail: ivlioioilvi@outlook.com
; @項目主頁: https://github.com/Cool-Pan/wz-bing

; 獲取系統的環境變量
EnvGet, SYS_HOME_DRIVE, HOMEDRIVE
EnvGet, SYS_USER_NAME, USERNAME

; 定義變量
BMP_PATH=%SYS_HOME_DRIVE%\Users\%SYS_USER_NAME%\Pictures\Bing-Wallpaper\Current.bmp

; 開始設置壁紙
DllCall("SystemParametersInfo", UInt, 0x14, UInt, 0, Str, BMP_PATH, UInt, 2)