Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] Утилита для перехода в заданный раздел реестра

Ответить
Настройки темы
[решено] Утилита для перехода в заданный раздел реестра

(*.*)


Сообщения: 36491
Благодарности: 6675


Конфигурация

Профиль | Сайт | Отправить PM | Цитировать




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

Текущий скрипт для компиляции утилиты
Текущий скрипт для тех, кто желает выбрать способ перехода в реестр
Текущий английский языковой файл (образец для перевода)

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



Промежуточные решения
Оболочка для regjump
Без сторонних утилит
Без сторонних утилит (с запоминанием ввода путей)

С чего все начиналось
Я сделал простенькую оболочку для утилиты regjump, поскольку так и не смог найти корректно работающий аналог под 7.




Код: Выделить весь код
; 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. Скрипт нужно запускать с полными правами.

-------
Канал Windows 11, etc | Чат @winsiders

Это сообщение посчитали полезным следующие участники:

Отправлено: 16:09, 19-12-2010

 

(*.*)


Сообщения: 36491
Благодарности: 6675

Профиль | Сайт | Отправить PM | Цитировать


Цитата madmasles:
Может быть так в 7? »
Может быть. Потому что стоит мне нажать Enter в форме ответа на форуме, всплывает msgbox. Ну и переход в реестр тоже срабатывает, если раскомментировать.

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

-------
Канал Windows 11, etc | Чат @winsiders


Отправлено: 18:29, 19-12-2010 | #11



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для SyDr

Старожил


Сообщения: 215
Благодарности: 62

Профиль | Отправить PM | Цитировать


Код: Выделить весь код
; 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
;

-------

"Что мы думаем, знаем или во что верим в конце концов не так уж и важно.
Важно лишь то, что мы делаем."
Джон Раскин


Последний раз редактировалось Vadikan, 19-12-2010 в 19:19. Причина: блок когда глючит, не отображал последнюю строку

Это сообщение посчитали полезным следующие участники:

Отправлено: 18:42, 19-12-2010 | #12


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Добавить стиль кнопки «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)
что редактор реестра тоже запускается в скрытом окне.

Отправлено: 19:01, 19-12-2010 | #13


Аватара для Yashied

Старожил


Сообщения: 206
Благодарности: 88

Профиль | Отправить PM | Цитировать


Здесь вообще 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
Это сообщение посчитали полезным следующие участники:

Отправлено: 19:02, 19-12-2010 | #14


(*.*)


Сообщения: 36491
Благодарности: 6675

Профиль | Сайт | Отправить PM | Цитировать


SyDr, большое спасибо, так работает, только функцию закрыть осталось в конце. За повышение отдельное спасибо

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

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

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

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

-------
Канал Windows 11, etc | Чат @winsiders


Отправлено: 19:10, 19-12-2010 | #15


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Vadikan, Вы не могли бы проверить, вот эта утилита работает под «Windows 7»?

Отправлено: 19:18, 19-12-2010 | #16


(*.*)


Сообщения: 36491
Благодарности: 6675

Профиль | Сайт | Отправить PM | Цитировать


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

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

-------
Канал Windows 11, etc | Чат @winsiders


Отправлено: 19:23, 19-12-2010 | #17


Аватара для Yashied

Старожил


Сообщения: 206
Благодарности: 88

Профиль | Отправить PM | Цитировать


Цитата Vadikan:
Можно ли как-то записывать введенные пути (историю) текущей сессии и выводить ее? »
Из такого маленького скрипта мы сейчас сотворим целую утилиту...



Код: Выделить весь код
#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. Но если не интересует сохранение в реестре последних открываемых разделов для последующей их загрузки в список, то WinAPIEx UDF не нужен. Так же нужно будет удалить из кода две функции: _LoadMRUList() и _SaveMRUList().

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

P.S

При жедании можно еще добавить Autocomplete.
Это сообщение посчитали полезным следующие участники:

Отправлено: 20:05, 19-12-2010 | #18


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Цитата Vadikan:
Iska, проверял, работает... но…»
Спасибо, ясно.

Отправлено: 20:07, 19-12-2010 | #19


(*.*)


Сообщения: 36491
Благодарности: 6675

Профиль | Сайт | Отправить PM | Цитировать


Yashied, супер, спасибо! Только сохранение путей я перевел в JumpReg вместо Vadikan.

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

-------
Канал Windows 11, etc | Чат @winsiders


Отправлено: 20:21, 19-12-2010 | #20



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] Утилита для перехода в заданный раздел реестра

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Доступ - [решено] Почему параметры реестра импортируются в раздел WOW6432Node loveaboveall Microsoft Windows 7 17 17-01-2011 12:13
CMD/BAT - [решено] Смена прав на раздел реестра и его удаление primewar Скриптовые языки администрирования Windows 20 30-11-2010 22:17
Утилиты - [addon] ERUNT - утилита для бэкапа реестра. Boa Soft Наборы обновлений для Windows XP/2003/Windows 7 18 03-10-2010 18:24
Интерфейс - [решено] Ярлык для перехода в режимы сна в Vista x64 SP2 BBeard Microsoft Windows Vista 5 29-06-2009 11:42
[решено] Невозможно удалить раздел реестра alexandri Microsoft Windows 2000/XP 5 18-01-2007 09:09




 
Переход