天天看點

C# 系統應用之系統資料庫使用詳解

        在平時做項目時,我們有時會遇到系統資料庫的操作,例如前面我們需要擷取ie浏覽器位址欄的資訊、擷取"我的電腦"位址欄輸入的檔案夾資訊、usb最近使用資訊等.系統資料庫項是系統資料庫的基本組織機關,它包含子表項和值條目.簡言之,系統資料庫項相當于系統資料庫裡的檔案夾.它們存儲計算機安裝程式的資訊,如顔色設定、螢幕大小、曆史記錄等.

        舉個以前使用系統資料庫最多的例子:當我們玩魔獸或dota時,總需要打開"運作"->輸入"regedit"打開系統資料庫,在hkey_current_user->software->blizzard entertainment->warcraft iii->video中修改reswidth(螢幕寬)和resheight(螢幕高).使其螢幕分辯率與遊戲一緻全屏顯示.

        下面就詳細講解系統資料庫的使用.

一.系統資料庫的結構

        系統資料庫(registry)是windows系統中一個重要的資料庫,它用于存儲有關應用程式、使用者和系統資訊.系統資料庫的結構就像一顆樹.樹的頂級節點(hive)不能添加、修改和删除.

        如下圖所示是windows系統資料庫的頂級節點:

C# 系統應用之系統資料庫使用詳解

        在c#中對系統資料庫進行操作,需要引用命名空間:using microsoft.win32.

registry屬性

系統資料庫頂級節點

說明

classessroot

hkey_classes_root

定義文檔的類型\類以及與類型關聯的資訊以及com元件的配置資料

currentconfig

hkey_current_config

包含有關非使用者特定的硬體的配置資訊

currentuser

hkey_current_user

包含目前登入到windows的使用者的配置資訊

localmachine

hkey_local_machine

包含與計算機相關的配置資訊,不管使用者是否登入

users

hkey_users

包含有關預設使用者配置的資訊

        系統資料庫中常用的資料類型有:

        reg_sz字元串資料的主要類型,用于存儲固定長度的字元串或其他短文本值.我們在實際程式中通常隻用這種資料類型,如果要儲存布爾值時,将它表示成0或1.

        reg_binary用于存儲二進制資料.

        reg_expand_sz可擴充的字元串值,可以儲存在運作時才解析的系統變量.

        reg_multi_sz以數組的格式儲存多個文本字元串,每個字元串"元素"都以null字元結束.

二.系統資料庫常用方法

          1.建立系統資料庫鍵

        首先先确定在哪個頂級結點下建立鍵,然後調用createsubkey()方法建立.

        例如在hkey_current_user下建立鍵eastmount和hkey_current_user\software\eastmount\test2.其中我們最常用的是在\software這個鍵下建立程式産品鍵,儲存一些程式的配置在系統資料庫中.如果software中沒有eastmount鍵,則會先建立這個鍵及其子鍵.如果存在就不會重寫.

        注意:c#字元串中反斜杠是轉義字元,前面加字首@時,告訴字元串按字面值處理而不進行轉義.@"software\eastmount\test2"="software\\eastmount\\test2".

        運作結果如下:

C# 系統應用之系統資料庫使用詳解
C# 系統應用之系統資料庫使用詳解

        2.打開子鍵

        3.删除系統資料庫的鍵

      删除系統資料庫的鍵有兩個方法: deletesubkey()和deletesubkeytree().deletesubkey()删除不包括子鍵的鍵及其所有值,deletesubkeytree()不僅删除鍵及其值,還删除鍵下所有子鍵(慎用該方法).

        如果鍵不存在,會有異常錯誤提示,最好使用try..catch..異常處理.它僅僅删除software\eastmount中子項test2而保留eastmount項.結果如下圖所示:

C# 系統應用之系統資料庫使用詳解

注意:如果使用registry.currentuser.deletesubkey(@"software\eastmount");它會提示錯誤"系統資料庫具有子項,并且此方法不支援遞歸移除".如果使用registry.currentuser.deletesubkeytree(@"software\eastmount")則會删除eastmount和子項test2.

        4.擷取鍵值

        registry.getvalue()檢索與指定的系統資料庫項中的指定名稱關聯的值.如果keyname指定的子項不存在,則傳回null;否則傳回與valuename關聯的值;如果未找到valuename則傳回defaultvalue.

        例如擷取hkey_current_user\environment中的path鍵值.

C# 系統應用之系統資料庫使用詳解

        registrykey.getvalue方法可以檢索與指定名稱關聯的值.函數原型public object getvalue(string name).其中參數name表示鍵的名稱.如程式中我擷取計算機位址欄輸入的資訊.

        運作結果如下圖所示.其實還可以擷取很多東西,usb使用資訊、浏覽器使用資訊、軟體路徑等等.

C# 系統應用之系統資料庫使用詳解

        5.建立和設定鍵值

        registry.setvalue()方法設定指定的系統資料庫項的指定名稱/值對,如果指定的項不存在,則建立該項.

        注意:每次調用setvalue方法時,它都打開一個系統資料庫項,設定其值,然後關閉該項.如果需要大批量修改建議使用registrykey.setvalue方法.public object setvalue(string name,object value).

        ps:舉個簡單的例子通過設定我的電腦-{20d04fe0-3aea-1069-a2d8-08002b30309d}為1,即可隐藏桌面我的電腦圖示.修改為0又可以顯示,你知不知道把檔案夾添加".{20d04fe0-3aea-1069-a2d8-08002b30309d}"後就變成了"我的電腦",可以用來隐藏檔案.

最後希望文章對大家有所幫助,文章主要是自己這段時間對c#調用系統資料庫資訊的總結,一方面講述了系統資料庫相關的基礎知識,另一方面通過代碼結合圖檔格式講述簡單運用系統資料庫.同時如果文章中有什麼啰嗦或不足之處,還請海涵.

繼續閱讀