本帖最后由 syl_gg 于 2011-08-23 22:12:44 编辑

解决方案 »

  1.   

    是这样写的:
    1.首先添加ShellAPI;
    2.实现代码:
    procedure OpenWithSpecifiedKey(Key: string);
    var
      i, n: Integer;
      hWin: HWND;
      ExecInfo: ShellExecuteInfoA;
    begin
      hWin := FindWindowA(PAnsiChar('RegEdit_RegEdit'), nil);
      if hWin = 0 then
      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 := FindWindowEx(hWin, 0, PChar('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;
    3.调用示例:OpenWithSpecifiedKey('HKEY_LOCAL_MACHINE\Software\Microsoft\');希望能帮到你。:-D
      

  2.   


    Combobox 和 button 组成的注册表定位
      

  3.   

    都是模拟人工快捷键的。
    你看看我的代码
    function GotoReg2(const cRegKey: string; const cRegVaule: string) : Boolean;
    const
      cRegFormClassName     = 'RegEdit_RegEdit';  //注册表编辑器窗口类名
      cRegTreeViewClassName = 'SysTreeView32';    //注册表编辑器子窗口(树形编辑框)类名
      cRegListViewClassName = 'SysListView32';    //注册表编辑器子窗口(列表编辑框)类名
      cRegFileName          = 'regedit.exe';      //注册表文件名
    var
      vRegHandle         : THandle;       //注册表句柄
      vRegTreeViewHandle : THandle;       //注册表树形编辑框句柄
      vRegListViewHandle : THandle;       //注册表列表编辑框句柄
      vTI                : DWORD;         //
    begin
      IF cRegKey = '' THEN Exit;
      vRegHandle :=  FindWindowA(cRegFormClassName, nil);//查询注册表编辑器句柄
      if vRegHandle = 0 then
        begin    //还没运行注册表编辑器则...
          WinExec(cRegFileName, SW_SHOWNORMAL) ;  //运行它
          vRegHandle :=  FindWindowA(cRegFormClassName, nil);//查询注册表编辑器句柄
        end
      else
        ShowWindow(vRegHandle, SW_SHOWNORMAL);//以防窗口给最小化
      Result := vRegHandle <> 0;
      if not Result then Exit;
      vRegTreeViewHandle := FindWindowExA(vRegHandle, 0, cRegTreeViewClassName, nil);  //得到树形编辑框句柄
      SetForegroundWindow(vRegHandle);//设置窗口焦点到注册表编辑器
      SetForegroundWindow(vRegTreeViewHandle);  //焦点再移到树形编辑框
      SetFocus(vRegTreeViewHandle) ;            //设置焦点到树形编辑框
      for vTI := 0 to 10 do //循环十次发送消息使之模拟按下"←" 按键,目的是为了然注册表的所有节点都合起来,设置 多次点保险些!
        SendMessage(vRegTreeViewHandle, WM_KEYDOWN, VK_RIGHT, 0);//发送消息模拟按下"←"键
      for vTI := 1 to Length(cRegKey) do  //展开主要过程
        if cRegKey[vTI] <> '\' then
          SendMessage(vRegTreeViewHandle, WM_CHAR, ord(cRegKey[vTI]), 0) //模拟输入
        else
          SendMessage(vRegTreeViewHandle, WM_KEYDOWN, VK_RIGHT, 0) ;//表示可以展开节点了,则输入“→”
      if cRegVaule <> '' then
      begin    //还需要定位注册表值
        Sleep(100);
        vRegListViewHandle := FindWindowExA(vRegHandle, 0, cRegListViewClassName, nil);  //得到树形编辑框句柄
        SetForegroundWindow(vRegListViewHandle);  //焦点再移到列表编辑框
        SetFocus(vRegListViewHandle) ;            //设置焦点到列表编辑框
        SendMessage(vRegListViewHandle, WM_KEYDOWN, VK_HOME, 0) ;//利用HOME按键使之选中首个
        for vTI := 1 to Length(cRegVaule) do  //展开主要过程
            SendMessage(vRegListViewHandle, WM_CHAR, ord(cRegVaule[vTI]), 0) //模拟输入
      end;
    end;//假如要跳到'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon'里面的并且选中Userinit数值,调用方法如下
      GotoReg2('HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon', 'Userinit');