有没有人写过一些delphi代码来执行REGJUMP的工作?

时间:2017-01-13 08:43:18

标签: delphi path regedit

有没有人编写过一些执行REGJUMP所做的delphi代码?

具体来说,REGJUMP是一个MS应用程序,它允许您打开regedit到指定的值/键路径(准备在regedit中查看或编辑)。例如:regjump HKLM \ Software \ Microsoft \ Windows将在路径HKLM \ Software \ Microsoft \ Windows中打开regedit。

我试过了:

ShellExecute(handle,'Open','C:\WINDOWS\regedit.exe', nil, nil, SW_SHOW);

当然只会打开注册到您正在查看的最后一条路径。

我试过了:

ShellExecute(handle,'Open','C:\WINDOWS\regedit.exe', '[HKLM\Software\Microsoft\Windows]', nil, SW_SHOW);

但是试图将值导入到路径中 - 由于各种原因而失败 - 并且不是我想要做的事情。

2 个答案:

答案 0 :(得分:10)

我认为您会发现在Regedit中访问的最后一个注册表项保存在注册表中的LastKey值下

HKCU\Software\Microsoft\Windows\CurrentVersion\Applets\RegEdit
至少在Windows10中

所以,我会尝试在调用ShellExecute之前写下我想要访问的值。

示例代码:

program RegJumpTest;

{$APPTYPE CONSOLE}

uses
  SysUtils, Registry;
var
  Reg : TRegistry;
  LastKey,
  KeyToFind,
  ValueToWrite : String;
begin
  ValueToWrite := ParamStr(1);
  KeyToFind := 'SOFTWARE\Microsoft\Windows\CurrentVersion\Applets\Regedit';
  Reg := TRegistry.Create;
  if Reg.KeyExists(KeyToFind) then
    writeln('found ', KeyToFind)
  else
    writeln('not found ', KeyToFind);

  if Reg.OpenKey(KeyToFind, False) then
    writeln(KeyToFind, ' opened ok')
  else begin
    writeln('failed to open key: ', KeyToFind);
    Halt(1);
  end;
  LastKey := Reg.ReadString('LastKey');
  writeln('Last key: >', LastKey, '<');

  Reg.WriteString('LastKey', ValueToWrite);
  readln;
end.

答案 1 :(得分:0)

这是执行您想要的代码。我很久以前就用它了,它坐在我的帮手单位里。我不记得我是写它还是从其他地方重复使用它。

搜索Regedit的窗口,如果它没有运行则启动它,并通过发送消息来模拟按键以导航所需的键来自动执行它。不是传递命令行参数的本机解决方案,但工作得很好。

// Open Registry editor and go to the specified key
procedure JumpToRegKey(const aKey: string);
var
   I, J: Integer;
   hWin: HWND;
   ExecInfo: TShellExecuteInfo;
begin
   // Check if regedit is running and launch it if not
   // All the code below depends on specific window titles and classes, so it will fail if MS changes the Regedit app
   hWin := FindWindow(PChar('RegEdit_RegEdit'), nil);
   if hWin = 0 then
   begin
     ZeroMemory(@ExecInfo, sizeof(ExecInfo));
     with ExecInfo do
     begin
       cbSize := SizeOf(TShellExecuteInfo);
       fMask  := SEE_MASK_NOCLOSEPROCESS;
       Wnd := Application.Handle;
       lpVerb := PChar('open');
       lpFile := PChar('regedit.exe');
       nShow  := SW_SHOWMAXIMIZED;
     end;
     ShellExecuteEx(@ExecInfo);
     WaitForInputIdle(ExecInfo.hProcess, 200);
     hWin := FindWindow(PChar('RegEdit_RegEdit'), nil);
   end;

   if hWin <> 0 then
   begin
     ShowWindow(hWin, SW_SHOWMAXIMIZED);
     hWin := FindWindowEx(hWin, 0, PChar('SysTreeView32'), nil);
     SetForegroundWindow(hWin);
     // Collapse the tree first by sending a large number of Left arrow keys
     I := 30;
     repeat
       SendMessage(hWin, WM_KEYDOWN, VK_LEFT, 0);
       Dec(I);
     until I = 0;
     Sleep(100);
     SendMessage(hWin, WM_KEYDOWN, VK_RIGHT, 0);
     Sleep(100);
     I := 1;
     J := Length(aKey);
     repeat
       if aKey[I] = '\' then
       begin
         SendMessage(hWin, WM_KEYDOWN, VK_RIGHT, 0);
         Sleep(50);
       end
       else
         SendMessage(hWin, WM_CHAR, Integer(aKey[I]), 0);
       I := I + 1;
     until I = J;
   end;
end;

这个代码的使用存在限制,正如kobik提醒的那样。非提升的应用无法向提升的应用发送消息。 Regedit已升级,因此如果您的应用具有提升的权限,或者UAC已关闭,则可以使用代码。
否则它将启动进程(将要求批准)并找到它的窗口,但PostMessage将无法工作。