Показать полную графическую версию : [решено] Утилита для перехода в заданный раздел реестра
Страниц :
[
1]
2
3
4
5
6
7
8
9
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, сначала фокус на поле ведь - туда вводится путь.
В принципе, мне все равно, будет переводиться фокус или нет. Главное - выполнение команды при нажатии 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.:)
madmasles, так если у меня другие окна открыты и в них нажимаю Enter, хоткей перехватывается и скрипт отрабатывает. Как ограничить его действие только активным окном скрипта?
Проверка необязательна, в принципе... regjump пойдет по пути вплоть до последнего существующего подраздела.
madmasles
19-12-2010, 16:57
Как ограничить его действие только активным окном скрипта? »Посмотрите здесь: HotKey - Установка горячих клавиш (http://autoit-script.ru/index.php/topic,296.0.html).
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
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?
Может быть так в 7? »
Может быть. Потому что стоит мне нажать Enter в форме ответа на форуме, всплывает msgbox. Ну и переход в реестр тоже срабатывает, если раскомментировать.
Видимо, нужно более тонкое решение.
; 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
;
Добавить стиль кнопки «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)
что редактор реестра тоже запускается в скрытом окне.
Здесь вообще 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
SyDr, большое спасибо, так работает, только функцию закрыть осталось в конце. За повышение отдельное спасибо :)
По ходу возникла такая мысль еще... Можно ли как-то записывать введенные пути (историю) текущей сессии и выводить ее? Например, вместо inputbox использовать combo со списком введенных путей. Чувствую, нужен массив :)
P.S. Тему переименую.
Iska, да, нужно @SW_SHOW, но тогда видна консоль...
Yashied, спасибо, так тоже работает. Но как видите, я пошел по самому простому пути, поскольку не владею вопросом в нужной степени :)
Vadikan, Вы не могли бы проверить, вот эта утилита (http://forum.script-coding.info/viewtopic.php?pid=2709#p2709) работает под «Windows 7»?
Iska, проверял, работает... но только пару запусков, после чего запускается свернутой и не хочет вылезать из панели задач :) Пробовал в режимах совместимости на двух разных машинах, потратил время и забил. Собственно после этого и возникла мысль сделать самому и с помощью коллег.
В принципе, избранное - удобная вещь, но оно и в редакторе есть в конце концов. А вот во время текущей сессии часто бывают переходы в одни и те же разделы реестра, когда ковыряешься.
Можно ли как-то записывать введенные пути (историю) текущей сессии и выводить ее? »
Из такого маленького скрипта мы сейчас сотворим целую утилиту...
:)
#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, проверял, работает... но…»
Спасибо, ясно.
Yashied, супер, спасибо! Только сохранение путей я перевел в JumpReg вместо Vadikan.
Я уверен, что утилита сэкономит немало времени тем, кто лучшие годы своей жизни проводит в реестре :) На самом деле, во время написания статей про кнопки на панели проводника я вдруг осознал, что помню наизусть начальные символы некоторых GUID'ов О_о
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.