用户名:  密码:   
您当前的位置:首页 > 程序设计 >  Delphi > 

delphi中注册表的写入与读取操作

上次修改时间: 2024-10-10 15:43:12      来源:网络总结      作者:钢铁长陈
上一页      路径:DSD\Learn\Delphi语言\Delphi语法函数软件使用相关\      下一页

delphi中注册表的写入与读取操作

注:一般软件的信息应保存在HKEY_CURRENT_USER\下的Software\中,+公司名(公司有多个软件的情况)+软件名,
注2:该过程在注册表路径下如找不到公司名和软件名会自动创建,需引入System.Win.Registry单元
注3:
写入字符串用Reg.WriteString,还有WriteFloat,WriteDate,WriteInteger,WriteBinaryData,WriteBool,
读取也有相应的ReadFloat,ReadDate,ReadInteger,ReadBinaryData等

//创建并写入注册表键值的过程,注册表项不存在会自动创建
procedure SaveKeyToRegistry(KeyName, KeyVal: string);   //参1键名,参2为键值
var
  Reg: TRegistry;
begin
  Reg := TRegistry.Create;
  try
    // 打开HKEY_CURRENT_USER\Software\MyCompany\MySoftName键 ,MyCompany改为自己的公司名,MySoft改为自己的软件名
    Reg.RootKey := HKEY_CURRENT_USER;   //要打开的根键
    if Reg.OpenKey('Software\ctsoft\ctzhibansoft', True) then  //要打开的子键
    begin
      Reg.WriteString(KeyName, KeyVal);   //KeyName与KeyVal分别为要写入的键名与键值
      // 关闭注册表键
      Reg.CloseKey;
    end;
  finally
    Reg.Free;
  end;
end;

//调用
SaveKeyToRegistry('remindtime', TimeToStr(DateTimePicker1.DateTime)); //添加或修改Remindtime键的值为DateTimePicker1.DateTime,没有就添加,有就修改

//在注册表指定路径读取指定键的值
function ReadRegistryValue(keyName: string): string;  //KeyName为要读取的键名
var
  Reg: TRegistry;
begin
  Result := '';
  Reg := TRegistry.Create;
  try
    // 打开HKEY_CURRENT_USER\Software\MyCompany\MySoftName键
    Reg.RootKey := HKEY_CURRENT_USER;
    if Reg.OpenKeyReadOnly('Software\ctsoft\ctzhibansoft') then
    begin
      // 读取名为"keyName"的字符串值
      Result := Reg.ReadString(keyName);     
      // 关闭注册表键
      Reg.CloseKey;
    end;
  finally
    Reg.Free;
  end;
end;
//读取
ReadRegistryValue('remindtime');

==========================================================下面两函数主要是调用注册表打开指定键路径
uses  System.Win.Registry,Winapi.ShellAPI, System.StrUtils;
//调用注册表打开指定键位置
procedure JumpToKey(Key: string);
var
    i, n: Integer;
    hWin: HWND;
    ExecInfo: ShellExecuteInfoA;
begin
    hWin := FindWindowA(PAnsiChar('RegEdit_RegEdit'), nil);
    if hWin = 0 then
    {if Regedit doesn’t run then we launch it}
    begin
       FillChar(ExecInfo, 60, #0);
       with ExecInfo do
       begin
           cbSize := 60;
           fMask := SEE_MASK_NOCLOSEPROCESS;
           lpVerb := PAnsiChar('open');
           lpFile := PAnsiChar('regedit.exe');
           nShow := 1;
       end;
       ShellExecuteExA(@ExecInfo);
       WaitForInputIdle(ExecInfo.hProcess, 200);
       hWin := FindWindowA(PAnsiChar('RegEdit_RegEdit'), nil);
    end;
   ShowWindow(hWin, SW_SHOWNORMAL);
    hWin := FindWindowExA(hWin, 0, PAnsiChar('SysTreeView32'), nil);
   SetForegroundWindow(hWin);
    i := 30;
    repeat
       SendMessageA(hWin, WM_KEYDOWN, VK_LEFT, 0);
       Dec(i);
    until i = 0;
   SendMessageA(hWin, WM_KEYDOWN, VK_RIGHT, 0);
    i := 1;
    n := Length(Key);
    repeat
       if Key[i] = '\' then
       begin
           SendMessageA(hWin, WM_KEYDOWN, VK_RIGHT, 0);
       end
       else
           SendMessageA(hWin, WM_CHAR, Integer(Key[i]), 0);
       i := i + 1;
    until i = n;
end;

//判断一个注册表键路径是否合法,调用注册表打开指定键位置
procedure OpenOneKey(KeyPath: string);
var
    i: Integer;
    Reg: TRegistry;
    keyRoot, keyChild: string;
    hk: hkey;
    q1: Integer;
begin
    KeyPath := trim(KeyPath);
    if KeyPath = '' then
    begin
       Application.MessageBox('数据不能为空,请重新输入!', '出错', MB_OK);
       exit;
    end;
    if Length(KeyPath) < 10 then
    begin
       Application.MessageBox('非法数据,请重新输入!', '出错', MB_OK);
       exit;
    end;

  //检验数据路径是否存在
    q1 := pos('\', KeyPath);
    if q1 = 0 then
    begin
       Application.MessageBox('非法数据,请重新输入!', '出错', MB_OK);
       exit;
    end;

    keyRoot := leftstr(KeyPath, q1 - 1); //根键
    keyChild := rightstr(KeyPath, Length(KeyPath) - q1); //后键

    Reg := TRegistry.Create;
  //reg.RootKey:=HKEY(qqs2);
    Reg.RootKey := hk;
    if lowercase(keyRoot) = lowercase('HKEY_CLASSES_ROOT') then
       Reg.RootKey := HKEY_CLASSES_ROOT
    else if lowercase(keyRoot) = lowercase('HKEY_CURRENT_USER') then
       Reg.RootKey := HKEY_CURRENT_USER
    else if lowercase(keyRoot) = lowercase('HKEY_LOCAL_MACHINE') then
       Reg.RootKey := HKEY_LOCAL_MACHINE

    else if lowercase(keyRoot) = lowercase('HKEY_USERS') then
       Reg.RootKey := HKEY_USERS
    else if lowercase(keyRoot) = lowercase('HKEY_PERFORMANCE_DATA') then
       Reg.RootKey := HKEY_PERFORMANCE_DATA
    else if lowercase(keyRoot) = lowercase('HKEY_CURRENT_CONFIG') then
       Reg.RootKey := HKEY_CURRENT_CONFIG
    else if lowercase(keyRoot) = lowercase('HKEY_DYN_DATA') then
       Reg.RootKey := HKEY_DYN_DATA;

    if Reg.KeyExists(keyChild) = false then
    begin
       Application.MessageBox('该注册表项路径不存在!', '出错', MB_OK);
       Reg.Free;
       exit;
    end;
   Reg.Free;
   JumpToKey(KeyPath); //’HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer’);
end;

//调用
OpenOneKey('HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer');