C 實現檔案關聯

2021-06-26 19:41:43 字數 1794 閱讀 6333

和其他語言一樣,c#實現檔案關聯同樣需要直接操作登錄檔,即按規則分別設定副檔名,文件型別說明,友好名稱,圖示,呼叫方法等鍵值即可,網上隨便查查就可以寫出以下的**。

using microsoft.win32;

key = registry.classesroot.createsubkey("jeebook.reader.jb");

key.setvalue("", "jeebook document");

相對來說,c#實現比較麻煩的是圖示路徑,一般檔案型別註冊的都是執行檔案的資源,格式如下:

格式:《執行程式exe路徑》,《資源id>   // 資源id為正數,表示資源的索引號,否則為資源id

在c++中很容易獲取資源id,但c#中還沒搞清楚如何取道資源的id,所以索性在程式執行目錄下附帶乙個圖示檔案用於註冊,這樣倒也方便隨時修改:)

此外,就是如何驗證圖示是否設定正確。現在的系統超愛快取,除非log off級別的操作,否則手工修改登錄檔很難馬上響應,當然通過程式呼叫應該重新整理系統狀態,這個下次有時間再研究吧

如果只是用於xp以下的程式,以上的**就已經足夠了。可惜的是,vista以後引入了uac,上面的**在uac下會彈出異常,這肯定不是我們希望的。

一種解決方法是通過建立乙個mainifest檔案,新增以下指令碼:

這樣程式圖示上會出現乙個小盾牌,表示該程式需要在管理員模式下執行,每次執行都會自動彈出uac的驗證視窗。但這個對某些只是需要書寫一次登錄檔的程式來說,每次都彈出提示是無法忍受的,那麼如何能夠通過**彈出uac驗證視窗呢?

google的結果,貌似沒有在執行中觸發提示並將程序改變為管理員模式的辦法,不過只要在執行程序時將verb設定為runas就可以自動觸發uac驗證,使被呼叫的程式在管理員模式下執行。那麼,只要在程式中重新啟動自己就可以達到觸發uac驗證視窗的目的,**如下:

當然,如果你將上面的**直接放入你的formload中,那將是場災難,因為你的程式會不斷的啟動自己直到把你的機器資源耗光為止。所以我們還需要有能夠判斷是否已經進入管理員模式的**,如下:

windowsidentity wi = windowsidentity.getcurrent();

windowsprincipal wp = new windowsprincipal(wi);

if (!wp.isinrole(windowsbuiltinrole.administrator))

wi代表的是當前使用者,windowsbuiltinrole.administrator是管理員的識別符號(比較奇怪的是vb好像有自己特殊的名字空間來實現以上的功能,不知為什麼,當然我們用標準的方法判斷也沒什麼不好)

由此將以上所有的**整合起來,得到以下的結果:

if ( null != registry.classesroot.opensubkey(".jb") )

return;

windowsidentity wi = windowsidentity.getcurrent();

windowsprincipal wp = new windowsprincipal(wi);

key = registry.classesroot.createsubkey("jeebook.reader.jb");

key.setvalue("", "jeebook document");

檔案關聯是個很常用很簡單的功能,但真要做的好,還得費點功夫啊:)

檔案關聯 C 和Inno指令碼實現

因為我之前是關聯的.apk檔案,就一關聯.apk檔案說事兒了。檔案關聯操作主要的幾個地方 1.刪除操作 刪除根目錄currentuser下面的software microsoft windows currentversion explorer fileexts apk下面的所有子節點,這一點很重要,...

vc 實現檔案關聯

include include int main int argc,char argv 上面的函式是把字串中所有的 變為 char str 1 regsetvalue hkey classes root,exefile shell open command reg sz,lpctstr str,st...

vc 實現檔案關聯

include include int main int argc,char argv 上面的函式是把字串中所有的 變為 char str 1 regsetvalue hkey classes root,exefile shell open command reg sz,lpctstr str,st...