|
A tutti è capitato di usare il
RegMon e a molti sarà sicuramente
capitato di far doppio click su una delle voci elencate e vedere come venga
aperto Regedit e ci si posizioni per magia sulla chiave di registro in
questione. E' proprio questo quello che voglio fare: una procedura semplice
semplice che prenda in input una stringa che mi definisce una chiave di registro
e vada ad aprire Regedit posizionandosi alla fine sulla chiave di registro in
questione. Il trucco sta tutto nell'utilizzo dei tasti della tastiera e nella
simulazione a livello di programmazione della loro pressione.
procedure RegeditJump(RegPath: string);
var
regeditHwnd, regeditMainHwnd: Cardinal;
vk: Cardinal;
i: Cardinal;
begin
//vediamo se regedit è già aperto
regeditMainHwnd := FindWindow('RegEdit_RegEdit', nil);
if regeditMainHwnd = 0 then //se regedit non è aperto
begin
//lancio regedit.exe ed aspetto che sia disponibile per l'invio di input
if ExecuteProcess('regedit.exe', False, True) <> 0 then
Exit;
end;
regeditMainHwnd := FindWindow('RegEdit_RegEdit', nil);
ShowWindow(regeditMainHwnd, SW_SHOW);
SetForegroundWindow(regeditMainHwnd); //metto in primo piano regedit
// Get treeview
regeditHwnd := FindWindowEx(regeditMainHwnd, 0, 'SysTreeView32', nil);
SetForegroundWindow(regeditHwnd);
SetFocus(regeditHwnd);
//Collasso il tutto con una raffica di 30 frecce sinistre;
//ogni freccia sinistra collassa la chiave padre della chiave
//attualmente col focus
for i := 0 to 30 do
begin
vk := VK_LEFT;
SendMessage(regeditHwnd, WM_KEYDOWN, vk, 0);
end;
//ora che ho collassato tutto (vedo solo il nodo "Risorse del Computer"),
//premo la freccia destra per aprire l'elenco iniziale (HKEY_CLASSES_ROOT, ...)
vk := VK_RIGHT;
SendMessage(regeditHwnd, WM_KEYDOWN, vk, 0);
//ora esamino il percorso completo su cui devo andare
for i := 1 to Length(RegPath) do
begin
if RegPath[i] = '\' then
begin
//devo aprire la chiave corrente per ottenere le sottochiavi;
//per fare questo premo la freccia destra; la freccia destra
//espande la chiave attualmente col focus
vk := VK_RIGHT;
SendMessage(regeditHwnd, WM_KEYDOWN, vk, 0);
//mi fermo un attimo: utile nel caso di chiave con molte sottochiavi
Sleep(750);
end
else
begin
//premo in sequenza i caratteri che costituiscono il nome della chiave
//su cui posizionarsi
vk := Ord(RegPath[i]);
SendMessage(regeditHwnd, WM_CHAR, vk, 0);
end;
end;
end;
Esempio
| |
| |
|