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)