要註冊 自定義檔案型別,包括檔案關聯圖示,檔案關聯應用程式等,這些操作都是通過修改登錄檔來完成.
1.為便程式碼清晰,首先將註冊需要的資訊封裝到filetypereginfo類中.
public
class
filetypereginfo
public
filetypereginfo(
string
extendname)}
2.編寫註冊檔案型別的類.
//////
filetyperegister 用於註冊自定義的檔案型別。
///
public
class
filetyperegister
string
relationname
=reginfo.extendname.substring(
1, reginfo.extendname.length -1
).toupper() +"
_filetype";
registrykey filetypekey
=registry.classesroot.createsubkey(reginfo.extendname);
filetypekey.setvalue(
"", relationname);
filetypekey.close();
registrykey relationkey
=registry.classesroot.createsubkey(relationname);
relationkey.setvalue(
"", reginfo.description);
registrykey iconkey
=relationkey.createsubkey(
"defaulticon");
iconkey.setvalue(
"", reginfo.icopath);
registrykey shellkey
=relationkey.createsubkey(
"shell");
registrykey openkey
=shellkey.createsubkey(
"open");
registrykey commandkey
=openkey.createsubkey(
"command");
commandkey.setvalue(
"", reginfo.exepath +"
%1");relationkey.close();
}///
///getfiletypereginfo 得到指定檔案型別關聯資訊
///
public
static
filetypereginfo getfiletypereginfo(
string
extendname)
filetypereginfo reginfo
=new
filetypereginfo(extendname);
string
relationname
=extendname.substring(
1, extendname.length -1
).toupper() +"
_filetype";
registrykey relationkey
=registry.classesroot.opensubkey(relationname);
reginfo.description
=relationkey.getvalue(
"").tostring();
registrykey iconkey
=relationkey.opensubkey(
"defaulticon");
reginfo.icopath
=iconkey.getvalue(
"").tostring();
registrykey shellkey
=relationkey.opensubkey(
"shell");
registrykey openkey
=shellkey.opensubkey(
"open");
registrykey commandkey
=openkey.opensubkey(
"command");
string
temp
=commandkey.getvalue(
"").tostring();
reginfo.exepath
=temp.substring(
0, temp.length -3
);return
reginfo;
}///
///updatefiletypereginfo 更新指定檔案型別關聯資訊
///
public
static
bool
updatefiletypereginfo(filetypereginfo reginfo)
string
extendname
=reginfo.extendname;
string
relationname
=extendname.substring(
1, extendname.length -1
).toupper() +"
_filetype";
registrykey relationkey
=registry.classesroot.opensubkey(relationname,
true
);relationkey.setvalue(
"", reginfo.description);
registrykey iconkey
=relationkey.opensubkey(
"defaulticon",
true
);iconkey.setvalue(
"", reginfo.icopath);
registrykey shellkey
=relationkey.opensubkey(
"shell");
registrykey openkey
=shellkey.opensubkey(
"open");
registrykey commandkey
=openkey.opensubkey(
"command",
true
);commandkey.setvalue(
"", reginfo.exepath +"
%1");relationkey.close();
return
true;}
//////
filetyperegistered 指定檔案型別是否已經註冊
///
public
static
bool
filetyperegistered(
string
extendname)
return
false;}
#endregion}
3.注意上段程式碼中commandkey.setvalue("" ,reginfo.exepath + " %1") ;其中" %1"表示將被雙擊的檔案的路徑傳給目標應用程式,這樣在雙擊a.xcf檔案時,xcodefactory才知道要開啟哪個檔案,所以應用程式的main方法要被改寫為帶有引數的形式,如下所示:
[stathread]
static
void
main(
string
args)
mainform.xcffilepath
=new
mainform());
}
4.通過檔案的副檔名取得 與副檔名相對應的檔案型別的圖示
[dllimport(
"shell32.dll")]
static
extern
intshgetfileinfo(
string
pszpath,
uint
dwfileattributes,
refshfileinfo psfi,
uint
cbfileinfo,
uint
uflags);
//////
要用到的乙個結構
///
struct
shfileinfo
//////
從副檔名得到小圖示
///
///檔名或副檔名
///圖示
static
public
icon seticon(
string
filename)
return
ic;}
5.總結
由於擔心破壞登錄檔,所以以上程式碼我並沒有做測試,但我仍然檢視了一下我的登錄檔中的內容,我用的是win2k,從登錄檔看到,並沒有看到本文所寫的shell,open,command等鍵,具體是什麼結構我也沒看出來,估計檔案關聯與作業系統的不同也有關係,這篇文章暫且寄存在此,等以後需要時再做詳細研究.
參考文章: http://www.gissky.com/develop/showarticle.asp?sid=21&id=1523 及http://topic.csdn.net/t/20060921/22/5039676.html
測試篇 c 檔案型別關聯啟動程式
我的應用場景是windows服務掛載了我的程式之後,按啟動,它就修改登錄檔.但是,原本就是一件很簡單的事情,貌似出現了不可思議的事情.我的許可權已經是系統級別的,因為是服務程式嘛 我在修改登錄檔上面cad的.vlx字尾名時,想在 預設 的新增 關聯的程式 結果死都新增不上.最後手動刪除一次,就可以了...
註冊檔案型別,關聯檔案
bool function registerfiletype lpctstr houzhui,lpctstr fmiaoshu,lpctstr wmiaoshu,lpctstr filepath hkey hkey null dword dwdip 0 lptstr newreg new tchar...
註冊檔案型別,並關聯程式(三)
雙擊乙個txt檔案,就能用記事本開啟,因為txt檔案關聯了記事本程式。想讓你自定義的檔案型別也通過雙擊就能直接呼叫你的程式並開啟?ok,首先我們找到第一期,看到其中的這行 registry.setvalue hkey classes root myguo shell open command d b...