最近,項目中經常碰到需要先打開軟件,然後再加載相應的工程文件這樣的繁瑣操作,爲了更好的客戶體驗(主要是自己想偷懶),遂決定添加文件關聯,
文件關聯:是將一種類型的文件與一個可以打開它的程序建立起一種依存關係。舉個栗子來說,位圖文件(BMP文件)在Windows中的默認關聯程序是“圖片”,如果將其默認關聯改爲用ACDSee程序來打開,那麼ACDSee就成了它的默認關聯程序。(轉自 百度百科)
有了這個想法之後,立馬付諸行動,首先想到的當然是百度相關代碼並xx之,正所謂前人栽樹後人乘涼嘛,然而可能是我使用的方法不對,抄來的代碼總是達不到理想的效果,然後只能自己造了唄,仔細拜讀前人代碼,將主要的操作定位到註冊表[]HKEY_CURRENT_USER\\Software\\Classes]這個位置處,打開註冊表編輯器,找到對應的位置處:
如圖:
隨便下拉瀏覽了下內容,突然看到了熟悉的QtProject.QtCreator.xx之類的東西,看名字也大概能看出來,這不就是QtCreator相關文件的關聯設置嗎,於是隨便點開查看,以UI文件爲例,如下圖
看起來也沒什麼啊,好像挺簡單的,顧名思義,DefaultIcon就是默認圖標,shell就是打開文件時的命令(源於之前的經驗),好像很簡單啊,
於是就先照貓畫虎,通過以下代碼創建類別以及其子類相關數據:
待續...
這是最終代碼:
/*******************************************************************
* 註冊文件關聯
*
* className // 自定義的類別
* appPath // 關聯的程序目錄
* ext // 關聯的文件類型
* extDes // 該文件類型描述
*
*******************************************************************/
void registerFileRelation(const QString& className,const QString& appPath,const QString& ext,const QString& extDes)
{
QString baseUrl("HKEY_CURRENT_USER\\Software\\Classes"); // 要添加的頂層目錄
QSettings settingClasses(baseUrl,QSettings::NativeFormat);
// 在...Classes\類別下創建一個新的類別,並設置該類別打開文件時的調用參數
settingClasses.setValue("/" + className + "/Shell/Open/Command/.","\"" + appPath + "\" \"%1\"");
// 文件類型描述
settingClasses.setValue("/" + className + "/.",extDes);
// 設置該類別的默認圖標默認圖標
settingClasses.setValue("/" + className + "/DefaultIcon/.",appPath + ",0");
// 關聯ext 和 類別
settingClasses.setValue("/" + ext + "/OpenWithProgIds/" + className,"");
// 立即保存該修改
settingClasses.sync();
}
QString className("xxx.yyy.com"); // 自定義的類別
QString appPath("D:\\Program Files\\MyProgram.exe"); // 關聯的程序目錄
QString ext(".proj"); // 關聯的文件類型
QString extDes("xx 工程文件"); // 該文件類型描述
registerFileRelation(className,appPath,ext,extDes)