有没有人编写过一些执行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);
但是试图将值导入到路径中 - 由于各种原因而失败 - 并且不是我想要做的事情。
答案 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将无法工作。