读书人

网络上的注册表随意跳是怎么编写的

发布时间: 2012-02-25 10:01:48 作者: rapoo

网络上的注册表随意跳是如何编写的?
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楼所贴的方法不可靠,因为在你使用键盘的时候,那个方法就会失效。

楼主你问题没有描述清楚。注册表定位是指给出一个注册表路径,程序将打开注册表并展开到该路径。
[解决办法]
都是模拟人工快捷键的。
你看看我的代码

Delphi(Pascal) code
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'); 

读书人网 >.NET

热点推荐