線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:3538
推到 Plurk!
推到 Facebook!

以其他用戶身份讀寫當前登錄的用戶的註冊表項

答題得分者是:pcboy2
w45
一般會員


發表:25
回覆:29
積分:15
註冊:2006-07-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-01-21 08:40:46 IP:222.135.xxx.xxx 訂閱
以其他用戶身份讀寫當前登錄的用戶的註冊表項
各位大大,我用超級用戶身份運行一個程式,在程式中讀寫當前用戶的註冊表項,要如何讀寫?
pcboy
版主


發表:177
回覆:1838
積分:1463
註冊:2004-01-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-01-21 10:03:51 IP:203.204.xxx.xxx 未訂閱
提供一個 登錄 相關範例
// Delphi 7 Enterprise
// 監控 HKEY_Local_Machine\Software\Microsoft\Windows\CurrentVersion\Run
// 如果有變化會顯示

unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, Registry, IniFiles, StdCtrls;

type
TForm1 = class(TForm)
Timer1: TTimer;
Memo1: TMemo;
Label1: TLabel;
procedure FormCreate(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
Reg: TRegistry; //用於註冊表的訪問
IniFile: TiniFile; //用於保存原始註冊表數據
Log: TStringList;//用於記錄變化
LogMsg : TStringList;//用於記錄變化
RegKeys: TStringList; //用於存放Run分支下的主鍵名
SendMsg :TStringList;
i: Integer;
value : String;
implementation

{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
Memo1.Clear;
Reg :=TRegistry.Create;
with Reg do
begin
RootKey:=HKEY_Local_Machine;
If OpenKey('Software\Microsoft\Windows\CurrentVersion\Run',false) then
begin
RegKeys:=TStringList.Create;
GetValueNames(RegKeys); //取得Run下面的所有主鍵名
iniFile := TIniFile.Create(ChangeFileExt(Application.ExeName,'.ini'));
if not IniFile.SectionExists('RunList') then //如果沒有保存過數據
begin
for i:=0 to Regkeys.Count-1 do //保存原始數據
begin
if ( Reg.GetDataType(RegKeys.Strings[i]) = rdString )
or ( Reg.GetDataType(RegKeys.Strings[i])=rdExpandString ) then
begin
value:=Reg.ReadString(RegKeys.Strings[i]);
IniFile.WriteString('RunList',RegKeys.Strings[i], value);
end;
end;
end;
end;
end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
i:integer;
RegVal,IniVal:string;
begin
Timer1.Enabled:=False;
Reg.GetValueNames(RegKeys);
for i:=0 to RegKeys.Count-1 do //檢查新加的和已修改了的鍵值
if (Reg.GetDataType(RegKeys.Strings[i])=rdString)
or (Reg.GetDataType(RegKeys.Strings[i])=rdExpandString) then
begin
RegVal:=Reg.ReadString(RegKeys.Strings[i]);
IniVal:=IniFile.ReadString('RunList',RegKeys.Strings[i],'');
if (RegVal<>IniVal) and (RegVal<>'"' IniVal '"') then
begin
IniFile.WriteString('RunList',RegKeys.Strings[i],RegVal);
Memo1.Lines.Add('新增 ' RegKeys.Strings[i] ' = ' RegVal );
end;
end;

IniFile.ReadSection('RunList',RegKeys);
for i:=0 to RegKeys.Count-1 do //檢查已被刪除的鍵值
begin
IniVal:=IniFile.ReadString('RunList',RegKeys.Strings[i],'');
if Reg.ValueExists(RegKeys.Strings[i]) and
((Reg.GetDataType(RegKeys.Strings[i])=rdString)
or (Reg.GetDataType(RegKeys.Strings[i])=rdExpandString) ) then
RegVal:=Reg.ReadString(RegKeys.Strings[i])
else
RegVal:='';

if (IniVal<>'') and (RegVal='') then
begin
IniFile.DeleteKey('RunList',RegKeys.Strings[i]);
Memo1.Lines.Add('刪除 ' RegKeys.Strings[i] ' = ' IniVal);
end;
end;
IniFile.UpdateFile;
Timer1.Enabled:=True;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if Assigned(Reg) then Reg.Free;
if Assigned(IniFile) then IniFile.Free;
if Assigned(RegKeys) then RegKeys.Free;
end;

end.

------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案!

子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!
pcboy
版主


發表:177
回覆:1838
積分:1463
註冊:2004-01-13

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-01-21 10:07:56 IP:203.204.xxx.xxx 未訂閱
1、 原理
Delphi提供了TRegistry類,它直接繼承自TObject類,主要屬性有:RootKey等,主要方法有:Create,CreateKey(Key),OpenKey(Key,CanCreate),WriteString(Name,Value),ReadString(Name),CloseKey,Free等,下面對它們進行簡單介紹。
1、1、RootKey屬性
指定當前操作的註冊表主鍵,共有HKEY_CLASSES_ROOT、HKEY_CURRENT_USER、HKEY_LOCAL_MACHINE、HKEY_USERS、HKEY_CURRENT_CONFIG五種取值,預設值為HKEY_CURRENT_USER。
1、2、CreateKey方法
函數聲明為function CreateKey(const Key: String):Boolean;,用於在註冊表中新建項,項的名稱為參數Key的值。
1、3、OpenKey方法
函數聲明為function OpenKey(const Key: String; CanCreate: Boolean):Boolean;,其中參數Key指定要打開的註冊表的項,參數CanCreate指明當要打開的項不存在時是否創建,預設值為False;函數返回值為布林類型,如果打開成功返回True,否則返回False。
1、4、WriteString方法
過程聲明為procedure WriteString(const Name, Value: String);,其中參數Name指明要寫入的註冊表的字串的名稱,參數Value為要寫入的字串的值。如果該字串不存在則寫入,否則覆蓋原來的取值。
1、5、ReadString方法
函數聲明為function ReadString(const Name: String):String;,其中參數Name為要讀取的字串的名稱,函數返回值為要讀取的字串的值,是字串類型。如果該字串在註冊表中不存在,返回值為空字串。

2、實例
下面分別為將資訊寫入註冊表和從註冊表中讀取資訊的例子。
2、1、將資訊寫入註冊表
相應代碼如下:
var
reg:TRegistry;//聲明一個TRegistry類變數
...
begin
reg:=TRegistry.Create;//創建實例
reg.RootKey:=HKEY_CURRENT_USER;//指定需要操作的註冊表的主鍵
if reg.OpenKey('\Software\Delphi使用技巧',true) then//如果打開成功則進行以下操作
begin
reg.WriteString('文章名稱','在Delphi中輕鬆操作註冊表');//將需要保存的資訊寫入註冊表
reg.CloseKey;//關閉註冊表
end;
reg.Free;//釋放變數所占記憶體
...
end;

2、2、從註冊表中讀取資訊
相應代碼如下:
var
reg:TRegistry;//聲明一個TRegistry類變數
s:String;//聲明一個字串變數用來存放要讀取的資訊
...
begin
reg:=TRegistry.Create;//創建實例
reg.RootKey:=HKEY_CURRENT_USER;//指定需要操作的註冊表的主鍵
if reg.OpenKey('\Software\Delphi使用技巧',true) then//如果打開成功則進行以下操作
begin
s:=reg.ReadString('文章名稱');//從註冊表中讀取對應字串的值
//如果該字串不存在則返回值為空字串
reg.CloseKey;//關閉註冊表
end;
reg.Free;//釋放變數所占記憶體
...
end;
http://book.hackbase.com/data/web5304/20050228/20050228__3444020.html

------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案!

子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!
pcboy
版主


發表:177
回覆:1838
積分:1463
註冊:2004-01-13

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-01-21 10:08:56 IP:203.204.xxx.xxx 未訂閱
32位元Delphi程式中可利用TRegistry物件來存取註冊表檔中的資訊。
一、創建和釋放TRegistry對象
1.創建TRegistry對象。為了操作註冊表,要創建一個TRegistry物件:ARegistry := TRegistry.Create;
2.釋放TRegistry對象。對註冊表操作結束後,應釋放TRegistry物件所占記憶體:ARegistry.Destroy。
二、指定要操作的鍵
操作註冊表時,首先應指定操作的主鍵:先給屬性RootKey賦值以指定根鍵,然後用方法OpenKey來指定要操作的主鍵名。
1.指定根鍵(RootKey)。
根鍵是註冊表的入口,也註冊表資訊的分類,其值可為:
HKEY—CLASSES—ROOT:存儲整個系統物件類資訊,如ActiveX物件註冊、檔關聯等資訊。
HKEY—CURRENT—USER:存儲當前用戶的配置資訊。為屬性RootKey的預設值。
HKEY—LOCAL—MACHINE:存儲當前系統的軟硬體配置資訊。應用程式自己的資訊可以存儲在該根鍵下。
HKEY—USERS:存儲所有用戶通用的配置資訊。
還可以是HKEY—CURRENT—CONFIG、HKEY—DYN—DATA。
2.指定要操作的主鍵。
Function OpenKey(const Key: string; CanCreate: Boolean): Boolean;
Key:主鍵名,是鍵名全名中除去根鍵的部分,如Software\Borland\Delphi。
CanCreate:在指定的主鍵名不存在時,是否允許創建該主鍵,True表示允許。
返回值True表示操作成功。
3.關閉當前主鍵。
在讀取或存儲資訊之後,應及時將關閉當前主鍵:procedure CloseKey。
三、從註冊表中讀取資訊
Read系列方法從註冊表讀取指定的資訊(字串、二進位和十六進位),並轉換為指定的類型。
1.Read系列方法。
function ReadString(const Name: string): string;
讀取一個字串值,Name為字串名稱。
function ReadInteger(const Name: string): Integer;
讀取一個整數值,Name為整數名稱。
function ReadBinaryData(const Name: string; var Buffer; BufSize: Integer):Integer;
讀取二進位值,Name為二進位值名稱,Buffer為接收緩衝區,BufSize為緩衝區大小,返回為實際讀取的位元組數。
其他方法還有:ReadBool、ReadCurrency、ReadDate、ReadDateTime、ReadFloat、ReadTime。
2.讀取資訊一例(顯示Windows的版本)。
在HKEY—LOCAL—MACHINE\Software\Microsoft\Windows\CurrentVersion下,有三個字串值Version、VersionNumber和SubVersionNumber,用於記錄當前Windows的版本號。
{請在Uses中包含Registry單元}
procedure TForm1.Button1Click(Sender:TObject);
var
ARegistry : TRegistry;
begin
ARegistry := TRegistry.Create;
//建立一個TRegistry實例
with ARegistry do
begin
RootKey := HKEY—LOCAL—MACHINE;//指定根鍵為HKEY—LOCAL—MACHINE
//打開主鍵Software\Microsoft\Windows\CurrentVersion
if OpenKey( ′Software\Microsoft\Windows\CurrentVersion′,false ) then
begin
memo1.lines.add('Windows版本:′+ ReadString(′Version′));
memo1.lines.add('Windows版本號:′ + ReadString(′VersionNumber′));
memo1.lines.add(′Windows子版本號:′ + ReadString(′SubVersionNumber′));
end;
CloseKey;//關閉主鍵
Destroy;//釋放記憶體
end;
end;
四、向註冊表中寫入資訊
Write系列方法將資訊轉化為指定的類型,並寫入註冊表。
1.Write系列方法。
procedure WriteString(const Name, Value: string);
寫入一個字串值,Name為字串的名稱,Value為字串值。
procedure WriteInteger(const Name: string; Value: Integer);
寫入一個整數值。
procedure WriteBinaryData(const Name: string; var Buffer; BufSize: Integer);
寫入二進位值,Name為二進位值的名稱,Buffer為包含二進位值的緩衝區,BufSize為緩衝區大小。
其他方法還有:WriteBool、WriteCurrency、WriteDate、WriteDateTime、WriteFloat、WriteTime。
2.寫入資訊一例。
下麵程式使Delphi隨Windows啟動而自動運行。
var
ARegistry : TRegistry;
begin
ARegistry := TRegistry.Create;
//建立一個TRegistry實例
with ARegistry do
begin
RootKey:=HKEY—LOCAL—MACHINE;
if OpenKey(′Software\Microsoft\Windows\CurrentVersion\Run′,True) then
WriteString(′delphi′,′C:\Program Files\borland\delphi3\bin\delphi32.exe′);
CloseKey;
Destroy;
end;
end;
五、鍵值維護
除了在註冊表中讀取、存儲外,程式可能還需要增加主鍵、刪除主鍵、主鍵改名、資料值改名等。
1.創建新主鍵:function CreateKey(const Key: string): Boolean。
Key即為主鍵名,返回值True表示操作成功。
2.刪除主鍵:function DeleteKey(const Key: string): Boolean。
Key即為主鍵名,返回值True表示操作成功。
3.複製或移動主鍵:procedure MoveKey(const OldName, NewName: string; Delete: Boolean)。
OldName、NewName分別表示源主鍵名和目標主鍵名;Delete表示是否刪除源主鍵,True表示刪除,False表示保留。
複製或移動一個主鍵將複製或移動該子鍵下的所有資料值和子鍵內容。
4.判斷指定主鍵是否存在,其下是否有主鍵,並獲取主鍵名稱。
KeyExists用於判斷指定主鍵是否存在:
function KeyExists(const Key: string): Boolean;//返回值為True表示主鍵存在。
HasSubKeys用於判斷指定主鍵下是否有子鍵:function HasSubKeys: Boolean;
返回值為True表示主鍵下有子鍵。
GetKeyNames用於獲取子鍵名稱:procedure GetKeyNames(Strings: TStrings);
Strings用於返回當前主鍵下各子鍵的名稱。
5.獲取主鍵下的資料值名稱:procedure GetValueNames(Strings: TStrings)。
Strings用於返回當前主鍵下各數值名稱。
如要獲取當前系統中的撥號連接名稱,可利用獲取主鍵HKEY—USERS
\.DEFAULT\RemoteAccess\Addresses下的數值名稱的方法來進行。
6.判斷數值名稱存在、數值名稱改名。
ValueExists用於判斷數值名稱是否存在:
function ValueExists(const Name: string): Boolean;
返回值為True表示數值名稱存在。
RenameValue用於數值名稱改名:
procedure RenameValue(const OldName, NewName: string);
以上是註冊表常用操作所對應的TRegistry的方法和屬性,其他方法和屬性請參見Delphi聯機幫助檔。

------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案!

子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!
pcboy
版主


發表:177
回覆:1838
積分:1463
註冊:2004-01-13

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-01-21 10:14:10 IP:203.204.xxx.xxx 未訂閱
SORRY ! 你要的是 BCB 的, 換這篇
http://www.it.com.cn/f/edu/0410/14/35074.htm

C Builder註冊表編程
一、註冊表編程詳解
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下調試通過。

------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案!

子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!
w45
一般會員


發表:25
回覆:29
積分:15
註冊:2006-07-13

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-01-24 07:55:30 IP:222.135.xxx.xxx 訂閱
啊,感謝pcboy2大大的回復,雖然這不是我要的,但是還是結案,非常感謝pcboy2大大的回復,如果有時間請大大看看我的這個問題,先謝了:
主要是為方便管理,我公司的系統都有兩個帳戶,一個是系統管理員Adminstrator,一個是Power Users組的帳戶,我掌握Adminstrator帳戶,用戶掌握Power Users組的帳戶,Power Users組的帳戶用戶可以隨意修改密碼等
現在我要寫一個軟體,用我掌握的Adminstrator帳戶運行,然後讀寫註冊表中的HKEY_CURRENT_USER項下的軟體設置資訊,但是我發現,用Adminstrator帳戶運行的程式,讀取的是Adminstrator自己的註冊表資訊,而不是我要操作的Power Users組的帳戶如capms95用戶的註冊表資訊:
裏面有個例子代碼,要把它改寫成BCB的,請大大不吝賜教
現在結案,如有回復請到:
謝謝!
申明一下,我並不知道capms95用戶的密碼,之所以用超級用戶身份運行程式,只要是放置程式被用戶結束
系統時間:2024-04-27 5:03:21
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!