2017-01-13 4 views
3

REGJUMP은 델파이 코드를 작성한 사람이 있습니까?REGJUMP가하는 일을하는 델파이 코드를 작성한 사람이 있습니까?

특히 REGJUMP는 regedit를 값/키의 지정된 경로 (regedit에서 보거나 편집 할 준비가 됨)로 열 수있는 MS 응용 프로그램입니다. 예 : regjump HKLM \ Software \ Microsoft \ Windows는 HKLM \ Software \ Microsoft \ Windows 경로에서 regedit를 엽니 다.

내가 시도 : 물론 단지 당신이보고 된 마지막 경로에 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

이렇게하는 명령 줄 옵션이없는 것처럼 보입니다. 이 sysinternals 도구가 UI를 자동화하는 것처럼 보입니다. 의심 할 여지없이 똑같이 할 수 있습니다. 그러나이 질문은 권장 질문이기 때문에 주제와 관련이 없습니다. –

+1

Windows Sysinternals 도구를 사용하여 문제를 해결 한 경우 : * 창 메시지를 사용하여 마우스 또는 키보드 활동을 시뮬레이션 할 수 있습니다. 프로세스 모니터 및 자동 실행의 점프 기능과 Regedit는 Regedit의 키로 이동하기 위해 정확히 수행합니다. * –

답변

10

난 당신이 적어도 윈도우 10에서

HKCU\Software\Microsoft\Windows\CurrentVersion\Applets\RegEdit 

아래 LastKey 값이 레지스트리에 저장됩니다 Regedit를 마지막으로 방문한 레지스트리 키를 찾을 것이라 생각합니다.

그래서, 내가 뭘하려고하면 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. 
+0

그건 간결한 트릭입니다. ! –

+0

이제 상자 밖에서 생각하겠습니다! – MikeD

+1

이것은 Win7에서도 작동합니다. REGEDIT가 현재 실행 중이 아닌 경우 처음으로 만 실행됩니다. REGEDIT는 단일 인스턴스를 실행하기 때문입니다. 어쩌면 가까이에 있어야합니다. +1 – kobik

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는 작동하지 않습니다.

+1

RegEdit와 같은 승격 된 프로세스로 메시지를 보낼 수 없습니다. Win7에서 테스트 해 보셨습니까? – kobik

+0

예, 이것은 제한 사항입니다. 코드를 작동 시키려면 호출자를 올리거나 UAC를 꺼야합니다. 비가 상승 앱에서 호출 한 경우 작동하지 않아야합니다. 답변에 메모를 추가합니다. 감사합니다. – VGeorgiev