Войти

Показать полную графическую версию : [решено] Утилита для перехода в заданный раздел реестра


Страниц : [1] 2 3 4 5 6 7 8 9

Vadikan
19-12-2010, 16:09
http://tools.oszone.net/Vadikan/img/jumpreg02.jpg

Скачать JumpReg 0.6 (х86 и х64) (http://soft.oszone.net/program/11662/JumpReg/)


Исходники версии 0.6 входят в комплект с программой.

Текущий скрипт для компиляции утилиты (http://forum.oszone.net/post-1574304-38.html)
Текущий скрипт для тех, кто желает выбрать способ перехода в реестр (http://forum.oszone.net/post-1573691-31.html)
Текущий английский языковой файл (образец для перевода) (http://forum.oszone.net/post-1584593.html#post1584593)

Разработка: AZJIO

[hr]
Промежуточные решения
Оболочка для regjump (http://forum.oszone.net/post-1569746-12.html)
Без сторонних утилит (http://forum.oszone.net/post-1569762-14.html)
Без сторонних утилит (с запоминанием ввода путей) (http://forum.oszone.net/post-1569794-18.html)

Я сделал простенькую оболочку для утилиты regjump (http://technet.microsoft.com/en-us/sysinternals/bb963880), поскольку так и не смог найти корректно работающий аналог под 7.

http://tools.oszone.net/Vadikan/img/jumpreg01.jpg


; Simple GUI wrapper for regjump http://technet.microsoft.com/en-us/sysinternals/bb963880
; regjump must reside in %path%
; Run the script elevated when UAC is on

#include <GUIConstantsEx.au3>

Opt("GUIOnEventMode", 1) ; Change to OnEvent mode
$mainwindow = GUICreate("JumpReg", 400, 100)
GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEClicked")
GUICtrlCreateLabel ("Путь к разделу реестра:", 20, 10)
$path = GUICtrlCreateInput("", 20, 30, 360, 20)
$jumpbtn = GUICtrlCreateButton("Jump", 170, 60, 60) ;Registry path input field
GUICtrlSetOnEvent($jumpbtn, "OKButton")
GUISetState(@SW_SHOW)
$exe = "regjump.exe "

While 1
Sleep(1000) ; Idle around
WEnd

Func OKButton()
$jump = $exe & GUICtrlRead($path)
Run(@ComSpec & " /c " & $jump, "", @SW_HIDE)
;Run("regjump.exe" & " " & GUICtrlRead($path), "", @SW_SHOW) ;works, but shows cmd window

EndFunc

Func CLOSEClicked()
Exit
EndFunc


На большее моих знаний AutoIt и программирования в целом не хватает :) Но все-таки хотелось бы сделать так, чтобы после ввода раздела реестра в поле активной становилась кнопка. Это позволит просто нажимать Enter, вместо TAB+Enter.

Подскажете, как это сделать?

Спасибо.

P.S. Скрипт нужно запускать с полными правами.

LexaSF
19-12-2010, 16:16
До ввода раздела реестра кнопка неактивна?

Vadikan
19-12-2010, 16:21
LexaSF, сначала фокус на поле ведь - туда вводится путь.

В принципе, мне все равно, будет переводиться фокус или нет. Главное - выполнение команды при нажатии Enter.

madmasles
19-12-2010, 16:23
Vadikan,
Может так?HotKeySet (http://www.autoitscript.com/autoit3/docs/functions/HotKeySet.htm)('{ENTER}', 'OKButton')Только, наверное, надо еще проверку сделать на существование введенного раздела.

Еще здесь посмотрите: Открытие редактора реестра в заданной ветке (http://autoit-script.ru/index.php/topic,2378.0.html). По-моему, не хуже, чем у M.Russinovich.:)

Vadikan
19-12-2010, 16:53
madmasles, так если у меня другие окна открыты и в них нажимаю Enter, хоткей перехватывается и скрипт отрабатывает. Как ограничить его действие только активным окном скрипта?

Проверка необязательна, в принципе... regjump пойдет по пути вплоть до последнего существующего подраздела.

madmasles
19-12-2010, 16:57
Как ограничить его действие только активным окном скрипта? »Посмотрите здесь: HotKey - Установка горячих клавиш (http://autoit-script.ru/index.php/topic,296.0.html).

Vadikan
19-12-2010, 17:05
madmasles, а собственными средствами AutoIt нельзя это сделать? Потому что регистрироваться на форуме, качать какие-то файлы, разбираться в навороченных функциях... время нужно :) А программка-то совсем простая.

madmasles
19-12-2010, 17:18
Vadikan,
Проверил у себя, правда на Windows XP, из 10 раз - 10 правильных срабатываний при куче открытых окон:;...
HotKeySet (http://www.autoitscript.com/autoit3/docs/functions/HotKeySet.htm)('{ENTER}', 'OKButton')
;...
Func (http://www.autoitscript.com/autoit3/docs/keywords.htm#Func) OKButton()
$jump = $exe & GUICtrlRead (http://www.autoitscript.com/autoit3/docs/functions/GUICtrlRead.htm)($path)
MsgBox (http://www.autoitscript.com/autoit3/docs/functions/MsgBox.htm)(0, '', $jump)
;Run(@ComSpec & " /c " & $jump, "", @SW_HIDE)
EndFunc (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndFunc) ;==>OKButton

Vadikan
19-12-2010, 17:40
madmasles, а куда конкретно вы помещаете HotKeySet('{ENTER}', 'OKButton')
Если непосредственно над Func OKButton() или внутри, нажатие Enter ничего не дает. А если над while, то работает так, как я описал выше - перехват всех нажатий.

madmasles
19-12-2010, 17:53
Vadikan,
В Windows XP так у меня работает:
#include (http://www.autoitscript.com/autoit3/docs/keywords.htm##include) <GUIConstantsEx.au3>

Opt (http://www.autoitscript.com/autoit3/docs/functions/Opt.htm)("GUIOnEventMode", 1)

$exe = "regjump.exe "

HotKeySet (http://www.autoitscript.com/autoit3/docs/functions/HotKeySet.htm)('{ENTER}', 'OKButton')

$mainwindow = GUICreate (http://www.autoitscript.com/autoit3/docs/functions/GUICreate.htm)("JumpReg", 400, 100)
GUISetOnEvent (http://www.autoitscript.com/autoit3/docs/functions/GUISetOnEvent.htm)($GUI_EVENT_CLOSE, "CLOSEClicked")
GUICtrlCreateLabel (http://www.autoitscript.com/autoit3/docs/functions/GUICtrlCreateLabel.htm)("Путь к разделу реестра:", 20, 10)
$path = GUICtrlCreateInput (http://www.autoitscript.com/autoit3/docs/functions/GUICtrlCreateInput.htm)("", 20, 30, 360, 20)
$jumpbtn = GUICtrlCreateButton (http://www.autoitscript.com/autoit3/docs/functions/GUICtrlCreateButton.htm)("Jump", 170, 60, 60)
GUICtrlSetOnEvent (http://www.autoitscript.com/autoit3/docs/functions/GUICtrlSetOnEvent.htm)($jumpbtn, "OKButton")
GUISetState (http://www.autoitscript.com/autoit3/docs/functions/GUISetState.htm)(@SW_SHOW (http://www.autoitscript.com/autoit3/docs/macros.htm#@sw_show))

While (http://www.autoitscript.com/autoit3/docs/keywords.htm#While) 1
Sleep (http://www.autoitscript.com/autoit3/docs/functions/Sleep.htm)(20)
WEnd (http://www.autoitscript.com/autoit3/docs/keywords.htm#WEnd)

Func (http://www.autoitscript.com/autoit3/docs/keywords.htm#Func) CLOSEClicked()
Exit (http://www.autoitscript.com/autoit3/docs/keywords.htm#Exit)
EndFunc (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndFunc) ;==>CLOSEClicked

Func (http://www.autoitscript.com/autoit3/docs/keywords.htm#Func) OKButton()
$jump = $exe & GUICtrlRead (http://www.autoitscript.com/autoit3/docs/functions/GUICtrlRead.htm)($path)
MsgBox (http://www.autoitscript.com/autoit3/docs/functions/MsgBox.htm)(0, '', $jump)
;Run(@ComSpec & " /c " & $jump, "", @SW_HIDE)
EndFunc (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndFunc) ;==>OKButton
то работает так, как я описал выше - перехват всех нажатий. »Может быть так в 7?

Vadikan
19-12-2010, 18:29
Может быть так в 7? »
Может быть. Потому что стоит мне нажать Enter в форме ответа на форуме, всплывает msgbox. Ну и переход в реестр тоже срабатывает, если раскомментировать.

Видимо, нужно более тонкое решение.

SyDr
19-12-2010, 18:42
; Simple GUI wrapper for regjump http://technet.microsoft.com/en-us/sysinternals/bb963880
; regjump must reside in %path%
; Run the script elevated when UAC is on
#RequireAdmin
#include <GUIConstantsEx.au3>

Opt("GUIOnEventMode", 1) ; Change to OnEvent mode
Global $hGUI, $hInput, $nButton, $sExePath = "regjump.exe"

$hGUI = GUICreate("JumpReg", 400, 100)
GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")

GUICtrlCreateLabel("Путь к разделу реестра:", 20, 10)
$hInput = GUICtrlCreateInput("", 20, 30, 360, 20)
$nButton = GUICtrlCreateButton("Jump", 170, 60, 60) ;Registry path input field
GUICtrlSetOnEvent($nButton, "OKButton")

Dim $AccelKeys[1][2]=[["{ENTER}", $nButton]]
GUISetAccelerators($AccelKeys)

GUISetState(@SW_SHOW)

While 1
Sleep(1000) ; Idle around
WEnd

Func OKButton()
Local $sPath = GUICtrlRead($hInput) ;)
If $sPath = "" Then Return 0
Run(@ComSpec & " /c " & $sExePath & " " & $sPath, "", @SW_HIDE)
;Run("regjump.exe" & " " & GUICtrlRead($path), "", @SW_SHOW) ;works, but shows cmd window
EndFunc

Func _Exit()
Exit
EndFunc
;

Iska
19-12-2010, 19:01
Добавить стиль кнопки «Default» ($BS_DEFPUSHBUTTON):
; Simple GUI wrapper for regjump http://technet.microsoft.com/en-us/sysinternals/bb963880
; regjump must reside in %path%
; Run the script elevated when UAC is on

#include <GUIConstantsEx.au3>
#include <ButtonConstants.au3>
#include <WindowsConstants.au3>

AutoItSetOption("MustDeclareVars", 1)
AutoItSetOption("GUIOnEventMode", 1) ; Change to OnEvent mode

Local $mainwindow = GUICreate("JumpReg", 400, 100)
GUICtrlCreateLabel("Путь к разделу реестра:", 10, 10)
Local $path = GUICtrlCreateInput("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer", 10, 30, 400 - 10 * 2, 20)
Local $btnJump = GUICtrlCreateButton("Jump", (400 - 120) / 2, 60, 120, 30, $BS_DEFPUSHBUTTON) ;Registry path input field

GUICtrlSetOnEvent($btnJump, "fnOKButton")
GUISetOnEvent($GUI_EVENT_CLOSE, "fnGUIClose")

GUISetState(@SW_SHOW)

While 1
Sleep(100) ; Idle around
WEnd

Func fnOKButton()
Run("regjump.exe """ & GUICtrlRead($path) & """", "");, @SW_HIDE)
EndFunc

Func fnGUIClose()
Exit
EndFunc

К сожалению, у меня получается при «…, @SW_HIDE»:
Run("regjump.exe """ & GUICtrlRead($path) & """", "", @SW_HIDE)

что редактор реестра тоже запускается в скрытом окне.

Yashied
19-12-2010, 19:02
Здесь вообще regjump.exe не нужен. За все отвечает параметр Lastkey в разделе HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Applets\Regedit.

#Include <GUIConstantsEx.au3>

Dim $Accel[1][2]=[['{ENTER}', 0]]

$hForm = GUICreate('JumpReg', 400, 95)
GUICtrlCreateLabel ('Путь к разделу реестра:', 20, 10)
$Input = GUICtrlCreateInput('', 20, 30, 360, 20)
$Button = GUICtrlCreateButton("Jump", 170, 60, 60)
$Accel[0][1] = GUICtrlCreateDummy()
GUISetAccelerators($Accel)
GUISetState()

While 1
$Msg = GUIGetMsg()
Switch $Msg
Case $GUI_EVENT_CLOSE
Exit
Case $Accel[0][1]
GUICtrlSetState($Button, $GUI_FOCUS)
ContinueCase
Case $Button
If Not _RegJump(GUICtrlRead($Input)) Then
MsgBox(16, 'Ошибка', 'Неверный путь.')
GUICtrlSetState($Input, $GUI_FOCUS)
EndIf
EndSwitch
WEnd

Func _RegJump($sKey)

Local $Root, $Text = StringSplit($sKey, '\', 2)

If IsArray($Text) Then
$Text = $Text[0]
Else
$Text = $sKey
EndIf
Switch $Text
Case 'HKEY_CLASSES_ROOT', 'HKEY_CURRENT_USER', 'HKEY_LOCAL_MACHINE', 'HKEY_USERS', 'HKEY_CURRENT_CONFIG'
$Root = $Text
Case 'HKCR'
$Root = 'HKEY_CLASSES_ROOT'
Case 'HKCU'
$Root = 'HKEY_CURRENT_USER'
Case 'HKLM'
$Root = 'HKEY_LOCAL_MACHINE'
Case 'HKU'
$Root = 'HKEY_USERS'
Case 'HKCC'
$Root = 'HKEY_CURRENT_CONFIG'
Case Else
Return 0
EndSwitch

Local $Class = '[CLASS:RegEdit_RegEdit]', $Delay = Opt('WinWaitDelay', 0)
Local $Prev, $Result = 1

If WinExists($Class) Then
WinClose($Class)
If Not WinWaitClose($Class, '', 5) Then
$Result = 0
EndIf
EndIf
If $Result Then
$Prev = RegRead('HKCU\Software\Microsoft\Windows\CurrentVersion\Applets\Regedit', 'Lastkey')
If @error Then
$Prev = 0
EndIf
If Not RegWrite('HKCU\Software\Microsoft\Windows\CurrentVersion\Applets\Regedit', 'Lastkey', 'REG_SZ', StringReplace($sKey, $Text, $Root, 1)) Then
$Result = 0
Else
If Not Run('regedit.exe') Then
$Result = 0
If IsString($Prev) Then
RegWrite('HKCU\Software\Microsoft\Windows\CurrentVersion\Applets\Regedit', 'Lastkey', 'REG_SZ', $Prev)
EndIf
EndIf
EndIf
EndIf
Opt('WinWaitDelay', $Delay)
Return $Result
EndFunc ;==>_RegJump

Vadikan
19-12-2010, 19:10
SyDr, большое спасибо, так работает, только функцию закрыть осталось в конце. За повышение отдельное спасибо :)

По ходу возникла такая мысль еще... Можно ли как-то записывать введенные пути (историю) текущей сессии и выводить ее? Например, вместо inputbox использовать combo со списком введенных путей. Чувствую, нужен массив :)

P.S. Тему переименую.

Iska, да, нужно @SW_SHOW, но тогда видна консоль...

Yashied, спасибо, так тоже работает. Но как видите, я пошел по самому простому пути, поскольку не владею вопросом в нужной степени :)

Iska
19-12-2010, 19:18
Vadikan, Вы не могли бы проверить, вот эта утилита (http://forum.script-coding.info/viewtopic.php?pid=2709#p2709) работает под «Windows 7»?

Vadikan
19-12-2010, 19:23
Iska, проверял, работает... но только пару запусков, после чего запускается свернутой и не хочет вылезать из панели задач :) Пробовал в режимах совместимости на двух разных машинах, потратил время и забил. Собственно после этого и возникла мысль сделать самому и с помощью коллег.

В принципе, избранное - удобная вещь, но оно и в редакторе есть в конце концов. А вот во время текущей сессии часто бывают переходы в одни и те же разделы реестра, когда ковыряешься.

Yashied
19-12-2010, 20:05
Можно ли как-то записывать введенные пути (историю) текущей сессии и выводить ее? »

Из такого маленького скрипта мы сейчас сотворим целую утилиту...

:)

#Include <GUIComboBox.au3>
#Include <GUIConstantsEx.au3>
#Include <WinAPIEx.au3>

Global Const $MRU_MAX_SIZE = 26

Dim $Accel[1][2] = [['{ENTER}', 0]]

$hForm = GUICreate('JumpReg', 400, 93)
GUICtrlCreateLabel('Путь к разделу реестра:', 20, 10)
$Combo = GUICtrlCreateCombo('', 20, 30, 360, 21)
_LoadMRUList()
$Button = GUICtrlCreateButton("Jump", 170, 60, 60, 23)
$Accel[0][1] = GUICtrlCreateDummy()
GUISetAccelerators($Accel)
GUISetState()

While 1
$Msg = GUIGetMsg()
Switch $Msg
Case $GUI_EVENT_CLOSE
_SaveMRUList()
Exit
Case $Accel[0][1]
GUICtrlSetState($Button, $GUI_FOCUS)
ContinueCase
Case $Button
$Path = _GUICtrlComboBox_GetEditText($Combo)
If Not _RegJump($Path) Then
MsgBox(16, 'Ошибка', 'Неверный путь или еще что-нибудь.')
GUICtrlSetState($Combo, $GUI_FOCUS)
Else
_AddPath($Path)
EndIf
EndSwitch
WEnd

Func _AddPath($sPath)

Local $Count = _GUICtrlComboBox_GetCount($Combo)
Local $Item, $Lenght

For $i = 0 To $Count - 1
_GUICtrlComboBox_GetLBText($Combo, $i, $Item)
If $Item = $sPath Then
_GUICtrlComboBox_SetCurSel($Combo, $i)
Return
EndIf
If $i = $MRU_MAX_SIZE - 1 Then
_GUICtrlComboBox_DeleteString($Combo, $i)
ExitLoop
EndIf
Next
_GUICtrlComboBox_InsertString($Combo, $sPath, 0)
_GUICtrlComboBox_SetCurSel($Combo, 0)
EndFunc ;==>_AddPath

Func _LoadMRUList()

Local $hMRU = _WinAPI_CreateMRUList($HKEY_CURRENT_USER, 'Software\Vadikan\MRU', $MRU_MAX_SIZE)
Local $Count = _WinAPI_EnumMRUList($hMRU, -1)

For $i = $Count - 1 To 0 Step -1
_AddPath(_WinAPI_EnumMRUList($hMRU, $i))
Next
_WinAPI_FreeMRUList($hMRU)
EndFunc ;==>_LoadMRUList

Func _RegJump($sKey)

Local $Root, $Text = StringSplit($sKey, '\', 2)

If IsArray($Text) Then
$Text = $Text[0]
Else
$Text = $sKey
EndIf
Switch $Text
Case 'HKEY_CLASSES_ROOT', 'HKEY_CURRENT_USER', 'HKEY_LOCAL_MACHINE', 'HKEY_USERS', 'HKEY_CURRENT_CONFIG'
$Root = $Text
Case 'HKCR'
$Root = 'HKEY_CLASSES_ROOT'
Case 'HKCU'
$Root = 'HKEY_CURRENT_USER'
Case 'HKLM'
$Root = 'HKEY_LOCAL_MACHINE'
Case 'HKU'
$Root = 'HKEY_USERS'
Case 'HKCC'
$Root = 'HKEY_CURRENT_CONFIG'
Case Else
Return 0
EndSwitch

Local $Class = '[CLASS:RegEdit_RegEdit]', $Delay = Opt('WinWaitDelay', 0)
Local $Prev, $Result = 1

If WinExists($Class) Then
WinClose($Class)
If Not WinWaitClose($Class, '', 5) Then
$Result = 0
EndIf
EndIf
If $Result Then
$Prev = RegRead('HKCU\Software\Microsoft\Windows\CurrentVersion\Applets\Regedit', 'Lastkey')
If @error Then
$Prev = 0
EndIf
If Not RegWrite('HKCU\Software\Microsoft\Windows\CurrentVersion\Applets\Regedit', 'Lastkey', 'REG_SZ', StringReplace($sKey, $Text, $Root, 1)) Then
$Result = 0
Else
If Not Run('regedit.exe') Then
$Result = 0
If IsString($Prev) Then
RegWrite('HKCU\Software\Microsoft\Windows\CurrentVersion\Applets\Regedit', 'Lastkey', 'REG_SZ', $Prev)
EndIf
EndIf
EndIf
EndIf
Opt('WinWaitDelay', $Delay)
Return $Result
EndFunc ;==>_RegJump

Func _SaveMRUList()

Local $hMRU = _WinAPI_CreateMRUList($HKEY_CURRENT_USER, 'Software\Vadikan\MRU', $MRU_MAX_SIZE)
Local $Count = _GUICtrlComboBox_GetCount($Combo)
Local $Path

For $i = $Count - 1 To 0 Step -1
_GUICtrlComboBox_GetLBText($Combo, $i, $Path)
_WinAPI_AddMRUString($hMRU, $Path)
Next
_GUICtrlComboBox_GetLBText($Combo, _GUICtrlComboBox_GetCurSel($Combo), $Path)
_WinAPI_AddMRUString($hMRU, $Path)
_WinAPI_FreeMRUList($hMRU)
EndFunc ;==>_SaveMRUList

История сохраняется в HKEY_CURRENT_USER\Software\Vadikan\MRU

Правда для запуска этого скрипта понадобится библиотека WinAPIEx UDF (http://yashied.narod2.ru/ProjectFiles/UDFs/WinAPIEx_3.1.zip). Но если не интересует сохранение в реестре последних открываемых разделов для последующей их загрузки в список, то WinAPIEx UDF не нужен. Так же нужно будет удалить из кода две функции: _LoadMRUList() и _SaveMRUList().

Константа $MRU_MAX_SIZE в самом начале кода задает максимальное количество записей в списке (по умолчанию 26).

P.S

При жедании можно еще добавить Autocomplete.

Iska
19-12-2010, 20:07
Iska, проверял, работает... но…»
Спасибо, ясно.

Vadikan
19-12-2010, 20:21
Yashied, супер, спасибо! Только сохранение путей я перевел в JumpReg вместо Vadikan.

Я уверен, что утилита сэкономит немало времени тем, кто лучшие годы своей жизни проводит в реестре :) На самом деле, во время написания статей про кнопки на панели проводника я вдруг осознал, что помню наизусть начальные символы некоторых GUID'ов О_о




© OSzone.net 2001-2012