网络上的注册表随意跳是如何编写的?
RT
[解决办法]
是这样写的:
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
[解决办法]
楼主你是指注册表定位吗?有两种方法。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');