狠狠爱成人网_日韩一级在线_国产综合自拍_亚洲精品韩国_亚洲视频导航_麻豆成人在线播放_欧美jjzz_一区在线视频观看_美脚丝袜一区二区三区在线观看_欧美91视频

當前位置:系統之家 > 技術開發教程 > 詳細頁面

C++ Builder注冊表編程

C++ Builder注冊表編程

更新時間:2019-10-08 文章作者:未知 信息來源:網絡 閱讀次數:

  一、注冊表編程詳解

  Windows 注冊表中包含了系統配置、機器硬件配置、 Win32 應用程序和用戶的其他配置信息。許多高級一些的功能都要通過對注冊表的操作來實現。在 WinAPI 中提供了 RegCgreateKey() 、 RegOpenKey() 、 RegQueryValue() 等函數操作注冊表,但是用這些函數來操作注冊表使用起來非常麻煩。而利用 C ++ Builder 的 TREGISTRY 類,我們則可以輕松實現對注冊表的操作。下面我先介紹一下 TRegistry 類使用方法。

  1. 使用前的準備工作:

  首先必須在程序開始處包含定義類模塊的頭文件:

#include -registry.hpp-

  其次在全程變量(即所有函數之前)創建類的一個實例(對象):

TRegistry * 實例名 =new TRegistry();

  注意:我們不能用直接聲明的方法生成 TREGISTRY 的實例,這與 VC ++中用 HKEY 直接生成實例的方法不同。必須采用 new 關鍵字生成 TREGISTRY 類的實例,然后將指針傳遞給聲名的變量。采用這個方式聲明后,實例的 RootKey 屬性指向 HKEY_CURRENT_USER 根鍵,即默認操作是針對 HKEY_CURRENT_USER 進行的。

  2. 常用屬性和方法介紹:

  (1) 當前根鍵屬性( RootKey ):

  RootKey 屬性定義了注冊表類實例當前根鍵,默認的是 HKEY_LOCAL_USER , 如果我們需要在其它根鍵下對注冊表進行操作,可以修改 RootKey 屬性:

MyReg-〉RootKey= 根鍵名 ;

  BCB 中對注冊表根鍵共有以下幾個定義: HKEY_CURRENT_USER 、 HKEY_CLASSES_ROOT 、 HKEY_LOCAL_MACHINE 、 HKEY_USERS 、 HKEY_CURRENT_CONFIG 、 HKEY_DYN_DATA 、 HKEY_USERS 。分別對應注冊表中相應的主鍵。(該屬性為 int 型)

  (2)當前鍵值的文本描述屬性( CurrentPath ):

CurrentPath 屬性定義了注冊表當前鍵值的文本描述,如 HKEY_CURRENT_USERSoftwareBorland 的 CurrentPath=-SoftwareBorland- ,而 RootKey=HKEY_CURRENT_USER (該屬性為 AnsiString 型)。

  (3)是否使修改后的值立即反映到注冊表中( LazyWrite ):

  這個屬性的作用是決定是否在執行寫操作之后立即將所做的改動反映到實際的注冊表中。這個屬性的值在注冊表對象構造時初始化為 true ,即不立即將所做的改動反映到實際的注冊表中,而是在執行 CloseKey() 函數之后重寫注冊表,這樣可以提高系統性能。但是,如果我們需要將修改立即反映到注冊表(這在許多場合是必要的),則應當首先將 LazyWrite 屬性設置為 false ,然后執行修改操作。

  (4) 建立主鍵函數:

  bool __fastcall CreateKey( 主鍵名 );

  如果主鍵已經存在,就覆蓋原主鍵。如在當前主鍵下建立“ MyReg ”主鍵,可用“ CreateKey(-MyReg-) ”,而“ CreateKey(-MyReg-) ” 則在當前根鍵下建立主鍵 MyKey 。
  (5) 刪除主鍵函數:

  bool __fastcall DeleteKey( 主鍵名 );

  如果參數為空字符串,則刪除當前鍵值 。

  (6) 打開主鍵函數 :

  bool __fastcall OpenKey( 主鍵名,參數 );

  此函數將定位到一個具體的主鍵位置,隨后的操作(建立鍵值、刪除鍵值以及在當前位置建立主鍵、刪除主鍵)將以此主鍵為當前主鍵。參數為 True 則當主鍵不存在將建立這個主鍵,如果為 false 則不建立主鍵。

  (7) 讀取當前主鍵下 String 型的鍵值函數:

AnsiString __fastcall ReadString( 鍵值名 );

  如: Edit1-〉Text=MyReg-〉ReadString(-MyString-);

  將讀取鍵值 MyString 的內容到文本框 Edit1 中。 同此函數類似的還有 ReadBool() 、 ReadInteger() 、 ReadFloat() 、 ReadDateTome() 、 ReadBinaryData() 等,用來讀出不同類型的鍵值。

  (8) 在當前主鍵中寫入 String 型鍵值函數:

void __fastcall WriteString( 鍵值名,數據 );

  如果是一個新鍵值名,那么相當于新建一個鍵值;如果是已有的鍵值,那么就是修改鍵值的數據。
如: WriteString(- 我的串 -,- 內容 -); 其它類型的鍵值(二進制值、 Dword 值)的讀取和寫入函數如 WriteInteger 、 WriteBool() 、 WriteFloat() 、 WriteDateTome() 、 WriteBinaryData() 等用法與上述類似。

  (9) 判斷鍵值或主鍵是否存在的函數:

  bool __fastcall ValueExists( 鍵值名 );

  這個方法判斷當前鍵下是否存在指定的數據項,如果存在返回 true ,否則返回 false 。

  bool __fastcall KeyExists( 主鍵名 );

  這個方法判斷一個鍵是否存在,如果存在返回 true ,否則返回 false 。

  (10)從文件讀入鍵值函數:

  LoadKey( 鍵值名 , 文件名 ) ;

  (11)一個鍵值保存到文件函數:

  SaveKey( 鍵值名 , 文件名 ) ;

  (12) 關閉鍵值函數:

  void __fastcall CloseKey(void);

  在注冊表使用完畢后,應當及時調用 CloseKey() 成員函數關閉注冊表,并調用 delete 方法將用 new 申請的內存空間釋放。

  (13)當前主鍵下子鍵值的獲取函數:

void __fastcall GetKeyNames(Classes::TStrings * Strings) ;

  我們可以用該成員函數得到當前主鍵下所有子鍵的名稱,用 GetKeyInfo 得到更加詳細的信息。必須指出,雖然 GetKeyNames() 的說明成 void __fastcall GetKeyNames(Classes::TStrings * Strings) ,也就是說,它的參數類型是 TString ,但是我們并不能首先聲明一個 TString 類的實例,然后將它作為參數用于 GetKeyNames() 。這主要是由于 TStrings 類含有抽象成分。我們的解決方法是采用 TStrings 類的派生類 TStringList 來代替 TStrings 聲明一個實例,并作為參數用于 GetKeyNames() 函數。

  在獲得子鍵的名稱后,我們就可以利用有關函數進一步確定詳細信息。如用我們可以用 GetValueNames() 結合 Read() 和 Write() 獲得主鍵的值的詳細信息。請看下面實例,這個例子的功能是將“ SoftwareMyInfo ”主鍵下的所有子鍵名稱顯示在 ComboBox1 中:

    # include
    …………
    Tregistry * curReg=new TRegistry () ;
    curReg - 〉OpenKey( “ SoftwareMyInfo-,true);
    KeyNames=new TStringList();// 注意 TstirngList 類的聲明方法!
    curReg - 〉GetKeyNames(KeyNames); for(int i=0;iCount;i ++ ) ComboBox1 - 〉Items - 〉Add(KeyNames - 〉Strings[i]);
    curReg - 〉CloseKey();
    delete KeyNames;

  3 使用 TRegistry 的一般步驟

  一般來說,有以下四步操作:

  1) 建立 TRegistry 類。 2) 利用 OpenKey() 方法打開一個鍵值。 3) 用 ReadType() 和 WriteType() 讀寫鍵值。 4) 調用 CloseKey ()關閉一個鍵值,最后調用 delete 方法將用 new 申請的內存空間釋放。

  二、應用實例1

  下面我們通過一個示例程序演示了對注冊表的常見操作,包括打開主鍵、讀取不同類型的鍵值、刪除鍵值或主鍵等。“每次啟動電腦自動運行”復選框則實現的作用類似 Win 95 的 Welcome.exe 程序的功能。
首先在窗體添加 Edit1 、 Label1 、 label 2 (用于顯示運行次數)、 Button1 、 CheckBox1 ( Caption= “每次啟動電腦自動運行”)等幾個控件,然后添加以下源代碼。生成可執行文件后,改名為 MyReg.EXE 拷貝到 C: 盤根目錄下執行即可。

  源代碼:

   

    //-------------------------------------------- 
    #include 〈vcl.h〉 
    #pragma hdrstop 
    #include -registry.hpp- // 包含頭文件 
    #include -Unit1.h- 
    //-------------------------------------------- 
    #pragma package(smart_init) 
    #pragma resource -*.dfm- 
    TForm1 *Form1; 
    TRegistry *MyReg=new TRegistry();// 建立實例 
    //-------------------------------------------- 
    __fastcall TForm1::TForm1(TComponent* Owner) 
    : TForm(Owner) 
    {} 
    //-------------------------------------------- 
    void __fastcall TForm1::FormCreate(TObject *Sender) 
    {MyReg-〉RootKey=HKEY_CURRENT_USER; 
    if((MyReg-〉OpenKey(-softwareMyReg-,false))==false) 
    {MessageBox(NULL,- 感謝第一次使用本軟件 !.-,- 歡迎 !-,IDOK); 
    MyReg-〉CreateKey(-softwareMyReg-); 
    MyReg-〉OpenKey(-softwareMyReg-,true); 
    MyReg-〉WriteInteger(-Number-,0); 
    MyReg-〉WriteString(-The String-,Edit1-〉Text); 
    }// 檢測有無注冊表項 , 沒有則建立 
    int num=MyReg-〉ReadInteger(-Number-); 
    num++; 
    MyReg-〉WriteInteger(-Number-,num);// 使用次數 +1 并寫入注冊表 
    Label2-〉Caption=IntToStr(num); 
    Edit1-〉Text=MyReg-〉ReadString(-The String-); 
    MyReg-〉CloseKey(); 
    MyReg-〉RootKey=HKEY_LOCAL_MACHINE; 
    MyReg-〉OpenKey(-softwareMicrosoftwindowsCurrentVersionRun-,false); 
    CheckBox1-〉Checked=MyReg-〉ValueExists(-AutoShow-); 
    MyReg-〉CloseKey();// 根據是否自動運行設定 CheckBox 狀態 
    } 
    //-------------------------------------------- 
    void __fastcall TForm1::Edit1Change(TObject *Sender) 
    {MyReg-〉RootKey=HKEY_CURRENT_USER; 
    MyReg-〉OpenKey(-softwareMyReg-,false); 
    MyReg-〉WriteString(-The String-,Edit1-〉Text); 
    MyReg-〉CloseKey();//Edit1 改變寫入注冊表 
    } 
    //-------------------------------------------- 
    void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action) 
    {MyReg-〉RootKey=HKEY_LOCAL_MACHINE; 
    MyReg-〉OpenKey(-softwareMicrosoftwindowsCurrentVersionRun-,false); 
    if(CheckBox1-〉Checked) 
    MyReg-〉WriteString(-AutoShow-,-c:MyReg.EXE-); 
    else MyReg-〉DeleteValue(-AutoShow-); 
    MyReg-〉CloseKey();// 如果 CheckBox 選中則自動運行 , 否則刪除自動運行鍵值 
    delete MyReg; 
    } 
    //-------------------------------------------- 
    void __fastcall TForm1::Button1Click(TObject *Sender)// 單擊 Button1 刪除注冊表項 
    {MyReg-〉RootKey=HKEY_LOCAL_MACHINE; 
    MyReg-〉OpenKey(-softwareMicrosoftwindowsCurrentVersionRun-,false); 
    MyReg-〉DeleteValue(-AutoShow-); 
    MyReg-〉CloseKey();//* 刪除自動運行鍵值 
    MyReg-〉RootKey=HKEY_CURRENT_USER; 
    MyReg-〉DeleteKey(-softwareMyReg-);// 刪除注冊表項 
    }

  三、注冊表編程實例2—— 編寫輸入法調序器

  通常我們使用輸入法時,要按下Ctrl+空格鍵多次才能找到自己所熟悉的輸入法,那么我們能不能把自己最常用的輸入法調到英文輸入法后面呢?(即只按一下Ctrl+空格即可調出自己使用的輸入法)筆者經過研究,終于設計出了一個輸入法調序器。它可以把當前系統中的所有輸入法全部列出來,并可自由調整輸入法順序。下面筆者就把實現方法介紹給大家。

  程序實現原理:

  我們知道在注冊表HKEY_CURRENT_USERkeyboard layoutpreload下有子鍵1、2、3、4、5(這就是輸入法的順序),每個子鍵的缺省鍵值即為標識該輸入法的串值,如串值00000409對應的是英文輸入法,串值E0040804對應的是智能ABC輸入法。如果想知道每一個串值對應什么輸入法,我們可以在HKEY_lOCAL_MACHINESystemCurrentControlSetControlKeyboard Layouts之下找到。知道了輸入法的存放位置及順序關系后,我們可以利用程序操作注冊表把代表輸入法順序的串值進行相應移動,即可實現我們的目的了。

  具體實現步驟:

  1、新建一工程文件,在窗體上放入一個ListBox組件、三個BitBtn組件和一個Label組件。

  2、在窗體的單元文件中定義全局變量如下:

    AnsiString *imeStr,temStr;
    TRegistry *Reg1,*Reg2;//注冊表對象
    TRegKeyInfo keyInfo;//主鍵信息變量

  并在單元文件前部增加包含#include 〈Registry.hpp〉

  3、在窗體的OnCreate事件過程中輸入如下代碼

    void __fastcall TForm1::FormCreate(TObject *Sender)
    {
    Reg1=new TRegistry;//創建注冊表對象
    Reg2=new TRegistry;
    Reg1-〉RootKey=HKEY_CURRENT_USER;//定位注冊表根鍵
    Reg2-〉RootKey=HKEY_LOCAL_MACHINE;
    if(Reg1-〉OpenKey("\keyboard layout\preload\",false)==true)
    Reg1-〉GetKeyInfo(keyInfo);//取得指定主鍵信息
    ListBox1-〉Items-〉Clear();
    imeStr=new AnsiString[keyInfo.NumSubKeys];//動態創建數組
    for(int i=0;i〈keyInfo.NumSubKeys;i++)
    {
    if(Reg1-〉OpenKey("\keyboard layout\preload\"+IntToStr(i+1),false)==true)
    imeStr[i]=Reg1-〉ReadString("");//取得輸入法串值
    if(Reg2-〉OpenKey("\System\CurrentControlSet\Control\Keyboard Layouts\"+imeStr[i]+"\",false)==true)
    ListBox1-〉Items-〉Add(Reg2-〉ReadString("layout text"));//顯示輸入法名稱
    }
    Reg1-〉CloseKey();
    Reg2-〉CloseKey();
    delete Reg2;
    }

  4、在BitBtr1(上移按鈕)的OnClick事件中加入如下代碼

    void __fastcall TForm1::BitBtn1Click(TObject *Sender)
    {
    int i=ListBox1-〉ItemIndex;//當前選擇的行號
    if (i〉0)
    {
    ListBox1-〉Items-〉Exchange(i,i-1);//交換列表框中內兩行的內容
    temStr=imeStr[i];//對應串值也交換
    imeStr[i]=imeStr[i-1];
    imeStr[i-1]=temStr;
    } 
    }

  5、類似地,在BitBun2(下移)的OnClick事件中加入如下代碼

    void __fastcall TForm1::BitBtn2Click(TObject *Sender)
    {
    int i=ListBox1-〉ItemIndex;//當前選擇的行號
    if (i〈ListBox1-〉Items-〉Count-1)
    {
    ListBox1-〉Items-〉Exchange(i,i+1);
    temStr=imeStr[i];//對應串值也交換
    imeStr[i]=imeStr[i+1];
    imeStr[i+1]=temStr;
    }
    }

  6、在BitBtn3(確認按鈕)的OnClick事件中加入如下代碼

    void __fastcall TForm1::BitBtn3Click(TObject *Sender)
    {
    if((Application-〉MessageBox("確認更改輸入法順序嗎?","請確認",MB_OKCANCEL|MB_ICONWARNING))==ID_OK)
    {
    for(int i=0;i〈keyInfo.NumSubKeys;i++)
    {
    Reg1-〉OpenKey("\keyboard layout\preload\"+IntToStr(i+1),false);
    Reg1-〉WriteString("",imeStr[i]);
    }//給輸入法重新排序
    Reg1-〉CloseKey();
    delete Reg1;
    delete imeStr;
    if((Application-〉MessageBox("馬上要重新啟動計算機","重啟計算機",MB_OKCANCEL|MB_ICONWARNING))==ID_OK)
    ExitWindowsEx(EWX_REBOOT,0);
    }
    Close();
    }

  以上程序在Windows 98、C++ builder6.0下調試通過。 

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統下載排行

狠狠爱成人网_日韩一级在线_国产综合自拍_亚洲精品韩国_亚洲视频导航_麻豆成人在线播放_欧美jjzz_一区在线视频观看_美脚丝袜一区二区三区在线观看_欧美91视频
一本一道波多野结衣一区二区| 久久精品一区二区三区不卡| 中文在线一区二区| 国产精品中文字幕日韩精品| 国产亚洲毛片在线| 久久一区二区三区四区| 精品动漫av| 欧美国产先锋| 亚洲一区精品视频| 欧美一二三区精品| 麻豆精品视频在线观看免费| 免费在线看成人av| 99精品视频一区二区三区| 在线看日本不卡| 一区二区三区影院| 在线日韩欧美| 亚洲另类一区二区| av成人毛片| 亚洲另类春色国产| 亚洲精品资源| 亚洲精品国产a| 国产欧美日韩综合精品二区| 亚洲三级在线免费| 在线亚洲伦理| 性感美女久久精品| 久久久久网址| 日韩国产高清影视| 欧美亚洲国产bt| 久久精品国产99| 欧美二区三区的天堂| 精品一区精品二区高清| 欧美福利一区二区| 成人手机在线视频| 久久久精品天堂| 欧美先锋影音| 一区二区三区四区乱视频| 国产精品亚洲综合久久| 三级在线观看一区二区| 欧美色网一区二区| 丁香婷婷综合五月| 国产蜜臀av在线一区二区三区| 韩日精品视频| 亚洲午夜久久久久久久久电影院 | 精品1区2区| 一区二区三区91| 欧美成人欧美edvon| 日韩精品五月天| 国产一级一区二区| 国产精品久久久久天堂| 91色porny| 精品嫩草影院久久| 国产成a人亚洲| 56国语精品自产拍在线观看| 久久成人免费电影| 在线观看中文字幕不卡| 亚洲18女电影在线观看| 国产精品久久久久久久久久直播 | 蜜臀久久久久久久| 日韩亚洲欧美在线| 国产精品v日韩精品v欧美精品网站 | 欧美日韩一区高清| 91麻豆自制传媒国产之光| 一区二区在线观看视频 | 亚洲一区二区三区欧美| 国产一区视频在线看| 亚洲国产精品99久久久久久久久| 亚洲综合欧美日韩| 成人国产免费视频| 一区二区三区av电影| 日韩欧美一二三四区| 亚洲久久视频| 韩日精品视频一区| 国产欧美一区在线| 久久精品亚洲一区二区| 国产成人aaaa| 国产精品久久久久桃色tv| 91精品国产综合久久久久久| 污片在线观看一区二区| 国产精品一区二区三区免费观看| 综合av第一页| 日韩视频精品| 亚洲国产va精品久久久不卡综合| 一本色道久久综合亚洲精品高清| 亚洲精品视频在线观看免费| 国产一区白浆| 日日骚欧美日韩| 在线亚洲+欧美+日本专区| 日本在线不卡视频| 欧美色男人天堂| 国产伦精品一区二区三区免费| 91成人在线免费观看| 久久er99热精品一区二区| 91.xcao| bt欧美亚洲午夜电影天堂| 久久久久久亚洲综合| 午夜欧美精品| 亚洲人成伊人成综合网小说| 99精品久久99久久久久| 亚洲你懂的在线视频| 亚洲一区二区伦理| 丝瓜av网站精品一区二区| 欧美主播一区二区三区| 国产精品亚洲第一区在线暖暖韩国| 国产成人午夜精品影院观看视频 | 欧美色倩网站大全免费| 激情久久综合| 国产精品88av| 亚洲一区视频在线观看视频| 久久亚洲精华国产精华液| 国产精品嫩草99av在线| 麻豆成人在线观看| 精品国产乱码久久久久久浪潮 | 欧美日韩一区二区欧美激情| 国产成人在线网站| 中文文精品字幕一区二区| 亚洲高清在线观看一区| 午夜影视日本亚洲欧洲精品| 7777精品伊人久久久大香线蕉完整版| 豆国产96在线|亚洲| 成人欧美一区二区三区小说| k8久久久一区二区三区| 五月天激情综合| 日韩欧美精品在线视频| 黑丝一区二区| 另类综合日韩欧美亚洲| 久久久91精品国产一区二区精品| 99国产精品99久久久久久粉嫩| 毛片一区二区三区| 26uuu国产日韩综合| 国产人成精品一区二区三| 国产精选一区二区三区| 亚洲欧美成aⅴ人在线观看| 欧美日韩精品三区| 午夜精品视频| 精品一区中文字幕| 国产精品污污网站在线观看| 日本久久精品电影| 欧美日一区二区三区在线观看国产免 | 91精品国产综合久久福利| 欧美精品一卡| 韩国欧美一区二区| 亚洲色图丝袜美腿| 欧美一区二区三区色| 亚洲成人在线| 国产91精品精华液一区二区三区| 亚洲欧美aⅴ...| 国产农村妇女精品| 欧美精品一二三| 亚洲精品日韩在线观看| 成人国产精品视频| 日本在线播放一区二区三区| 国产精品久久久久国产精品日日| 久久亚洲午夜电影| 国精品一区二区三区| 国产精品一二三区在线| 午夜精品一区二区三区电影天堂 | 粉嫩欧美一区二区三区高清影视| 一区二区三区小说| 久久久99免费| 久久精品女人天堂| 免费日韩视频| 亚洲欧洲精品一区二区| 91啪亚洲精品| 丁香啪啪综合成人亚洲小说 | 亚洲综合成人在线| 国产精品私人影院| 日韩精品一区二区在线观看| 亚洲视频碰碰| 极品日韩av| 欧美区亚洲区| 91一区二区三区在线观看| 精品一区精品二区高清| 日韩黄色小视频| 亚洲一区在线视频| 中文字幕+乱码+中文字幕一区| 精品国产一区二区三区久久久蜜月| 欧美亚洲禁片免费| 一本大道av一区二区在线播放| 亚洲麻豆av| 亚洲精品女人| 欧美一区二区三区四区在线观看地址| 91免费国产在线| 91在线精品一区二区| 成人网在线播放| 国产成人久久精品77777最新版本 国产成人鲁色资源国产91色综 | 丁香婷婷综合激情五月色| 精品一区免费av| 理论电影国产精品| 看电影不卡的网站| 久久国产精品区| 久久se这里有精品| 久久国产精品99精品国产| 蜜臀av性久久久久av蜜臀妖精| 亚洲成人av福利| 视频在线在亚洲| 蜜臀av性久久久久av蜜臀妖精 | 久久精品五月| 欧美在线你懂得| 欧美一卡二卡三卡四卡| 日韩一区二区视频|