Windows Terminal 背景圖片切換工具


Windows Terminal 背景圖片切換工具


說在前面

使用 Windows Terminal 有一段時間了,但是安裝之后一直沒有動過配置,做了點兒簡單的修改,希望有一個比較舒服的終端背景。實現了一個終端背景圖片變化的功能,每一次開機都會隨機幾張圖片,作為不同終端的背景,也可以通過調用命令實時更換背景。也支持對於不同背景的打分功能,對於喜歡的圖片增加它出現的機率,不喜歡的圖片可以讓它不再出現。是在做畢設之余完成的,非常簡單的一個工具,但是我挺喜歡的,就拿來更一下(好久沒更了呀,詐屍一波。。。)

思路說明

  • 首先,我們需要一個背景圖庫,我們叫他 WhiteAlbum 🐶🐶🐶
    里面包含了一些平時收的圖。這里我的圖挺多的就用本地的圖了,后面有空考慮做個爬壁紙的工具,再搞一個評價壁紙質量的工具,有緣再說。

  • 接下來就是修改終端的背景,這個很容易通過修改settings.json對應的參數做到,我們簡單實現個代碼完成。changeWindowsTerminalBackground.cpp 實現圖片的隨機抽取,並修改對應的json文件參數。為了方便后面的步驟,准備一個文件candidatesList.txt存下所有候選的圖片的路徑,隨機抽取時,直接在候選的列表里隨機出來。

  • 再之后就是評價機制,用一個最簡單的思路:用一個圖片在候選列表里出現的次數越多,就表示用戶越喜歡這張圖,如果用戶不喜歡某一張圖,直接將這張圖從列表里刪除。由於,一般來說常用的終端就是powershell,cmd 和 wsl,需要具體指向特定的窗口。這部分在like.cpp和dislike.cpp中實現。

  • 開機自啟和方便調用很容易就可以在系統里設置。

背景圖片修改

打開Windows Terminal后,'Ctrl + ,'打開settings.json文件。其中"profiles"中的"list"部分,每一個大括號中添加:

"acrylicOpacity": 0.85,
"useAcrylic": true,
"backgroundImage": "Background Image Path", // D://A.jpg
"backgroundImageOpacity": 0.25,
"backgroundImageStretchMode": "fill"

我本地的 settings.json 路徑為:

C:\Users\Username\AppData\Local\Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\LocalState\settings.json

只需要通過,修改settings.json中"backgroundImage"的路徑即可實現修改背景。

candidatesList初始化

為了方便, candidatesList.txt 的格式如下:

 "backgroundImage": "C:\\WhiteAlbum\\1.jpg",
 "backgroundImage": "C:\\WhiteAlbum\\2.jpg",
 "backgroundImage": "C:\\WhiteAlbum\\3.jpg",
  ...
 "backgroundImage": "C:\\WhiteAlbum\\223.jpg",

每一行是對應的圖片文件路徑,可以不編號為數字。可以手動添加,也可使用一些方法遍歷目錄下的所有文件,來初始化 candidatesList.txt,這里不多贅述。

背景圖片更新實現

實現 changeWindowsTerminalBackground.cpp

#include <bits/stdc++.h>

using namespace std;

#define MAX_VSTR 223
string vstr[MAX_VSTR];
string randBackgroundImage() { // 隨機一張圖片
    // candidatesList.txt 絕對路徑
    ifstream fin("D:\\changeWindowsTerminalBackground\\candidatesList.txt");
    string str;
    int cnt = 0, sum = -1;
    while(getline(fin,str)) {
        vstr[cnt++] = str;
        if(cnt >= MAX_VSTR) cnt = 0, sum = MAX_VSTR;
    }
    fin.close();
    if(sum == -1) sum = cnt;
    return vstr[rand()%sum];
}

int main(int argv, char * argc[]) {
    srand(time(0));
    if(argv == 1) {
        // settings.json 絕對路徑
        ifstream fin("C:\\Users\\Username\\AppData\\Local\\Packages\\Microsoft.WindowsTerminal_8wekyb3d8bbwe\\LocalState\\settings.json");
        string str, res;
        while(getline(fin,str)) {
            if( str.find("\"backgroundImage\": ") != str.npos ) {
                str = randBackgroundImage();
            }
            res += str;
            res += "\n";
        }
        fin.close();
        ofstream fout("C:\\Users\\Username\\AppData\\Local\\Packages\\Microsoft.WindowsTerminal_8wekyb3d8bbwe\\LocalState\\settings.json");
        fout << res;
        fout.close();
    }
    else {
        for(int i = 1; i < argv; ++ i) {
            string block = argc[i];
            ifstream fin("C:\\Users\\Username\\AppData\\Local\\Packages\\Microsoft.WindowsTerminal_8wekyb3d8bbwe\\LocalState\\settings.json");
            string str, res;
            int inBlock = 0, isChanged = 0;
            while(getline(fin,str)) {
                if( str.find(block) != str.npos ) inBlock = 1;
                if( !isChanged && inBlock && str.find("\"backgroundImage\": ") != str.npos ) {
                    str = randBackgroundImage();
                    isChanged = 1;
                }
                res += str;
                res += "\n";
            }
            fin.close();
            ofstream fout("C:\\Users\\Username\\AppData\\Local\\Packages\\Microsoft.WindowsTerminal_8wekyb3d8bbwe\\LocalState\\settings.json");
            fout << res;
            fout.close();
        }
    }
}

編譯及使用方法為:

g++ -o changeWTBK .\changeWindowsTerminalBackground.cpp -std=c++11
changeWTBK // 更新3個終端的圖片
changeWTBK cmd // 更新cmd終端的圖片
changeWTBK cmd powershell // 更新cmd和powershell終端的圖片
changeWTBK cmd powershell wsl // 更新wsl,cmd和powershell終端的圖片

其余組合方法類似

評價機制實現

like.cpp 實現將對應終端中當前的圖片加入candidateList.txt

#include <bits/stdc++.h>
using namespace std;
int main(int argv, char * argc[]) {
    if(argv == 1) {
        ifstream fin("C:\\Users\\Username\\AppData\\Local\\Packages\\Microsoft.WindowsTerminal_8wekyb3d8bbwe\\LocalState\\settings.json");
        ofstream fout("D:\\changeWindowsTerminalBackground\\candidatesList.txt",ios::app);    
        string str, res;
        while(getline(fin,str)) {
            if( str.find("\"backgroundImage\": ") != str.npos ) {
                fout << str << endl;
            }
        }
        fin.close();
        fout.close();
    }
    else {
        for(int i = 1; i < argv; ++ i) {
            string block = argc[i];
            ifstream fin("C:\\Users\\Username\\AppData\\Local\\Packages\\Microsoft.WindowsTerminal_8wekyb3d8bbwe\\LocalState\\settings.json");
            ofstream fout("D:\\changeWindowsTerminalBackground\\candidatesList.txt",ios::app);
            string str;
            int inBlock = 0, isChanged = 0;
            while(getline(fin,str)) {
                if( str.find(block) != str.npos ) inBlock = 1;
                if( !isChanged && inBlock && str.find("\"backgroundImage\": ") != str.npos ) {
                    fout << str << endl;
                    isChanged = 1;
                }
            }
            fin.close();
            fout.close();
        }
    }
}

編譯及使用方法為:

g++ -o LIKE .\like.cpp -std=c++11
LIKE // 3個終端的圖片都加入candidateList.txt
LIKE cmd // cmd終端的圖片加入candidateList.txt
LIKE cmd powershell // cmd和powershell終端的圖片加入candidateList.txt
LIKE cmd powershell wsl // wsl,cmd和powershell終端的圖片加入candidateList.txt

其余組合方法類似

dislike.cpp 實現將對應終端中當前的圖片從candidateList.txt中刪除

#include <bits/stdc++.h>
using namespace std;
vector<string> del;
int main(int argv, char * argc[]) {
    if(argv == 1) {
        ifstream fin("C:\\Users\\Username\\AppData\\Local\\Packages\\Microsoft.WindowsTerminal_8wekyb3d8bbwe\\LocalState\\settings.json");
        string str, res;
        while(getline(fin,str)) {
            if( str.find("\"backgroundImage\": ") != str.npos ) {
                del.push_back(str);
            }
        }
        fin.close();
    }
    else {
        for(int i = 1; i < argv; ++ i) {
            string block = argc[i];
            ifstream fin("C:\\Users\\Username\\AppData\\Local\\Packages\\Microsoft.WindowsTerminal_8wekyb3d8bbwe\\LocalState\\settings.json");
            string str;
            int inBlock = 0, isChanged = 0;
            while(getline(fin,str)) {
                if( str.find(block) != str.npos ) inBlock = 1;
                if( !isChanged && inBlock && str.find("\"backgroundImage\": ") != str.npos ) {
                    del.push_back(str);
                    isChanged = 1;
                }
            }
            fin.close();
        }
    }

    ifstream fin("D:\\changeWindowsTerminalBackground\\candidatesList.txt",ios::app);
    string str,res;
    while(getline(fin,str)) {
        int flag = 0;
        for(auto A: del) if(str.find(A) != str.npos) flag = 1;
        if(!flag) res += str, res += "\n";
    }
    fin.close();
    ofstream fout("D:\\changeWindowsTerminalBackground\\candidatesList.txt");
    fout << res;
    fout.close();
}

編譯及使用方法為:

g++ -o DISLIKE .\dislike.cpp -std=c++11
DISLIKE // 3個終端的圖片都從candidateList.txt刪去
DISLIKE cmd // cmd終端的圖片從candidateList.txt刪去
DISLIKE cmd powershell // cmd和powershell終端的圖片從candidateList.txt刪去
DISLIKE cmd powershell wsl // wsl,cmd和powershell終端的圖片從candidateList.txt刪去

其余組合方法類似

其他設置

我們希望每次開機,都會有不同的背景。因此將changeWTBK設為開機啟動項,具體方法是:
將 changeWTBK的快捷方式移到 USERPROFILE%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup 中。

同時我們希望調用更加方便,因此可以將changeWTBK,LIKE,DISLIKE所在的目錄加入環境變量。

效果實現

以powershell為例,當前界面如下:

AA

運行changeWTBK后,界面更新為:

BB

改進思路

如果有下一版的話,一方面,考慮實現爬取圖片,進一步擴大圖片的規模,不用本地提供Album;另一方面,針對用戶的喜好的圖片的推薦功能,更加智能一些。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM