Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] Утилита для перехода в заданный раздел реестра (http://forum.oszone.net/showthread.php?t=194417)

Vadikan 19-12-2010 16:09 1569618

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


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

LexaSF 19-12-2010 16:16 1569624

До ввода раздела реестра кнопка неактивна?

Vadikan 19-12-2010 16:21 1569629

LexaSF, сначала фокус на поле ведь - туда вводится путь.

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

madmasles 19-12-2010 16:23 1569634

Vadikan,
Может так?
Код:

HotKeySet('{ENTER}', 'OKButton')
Только, наверное, надо еще проверку сделать на существование введенного раздела.

Еще здесь посмотрите: Открытие редактора реестра в заданной ветке. По-моему, не хуже, чем у M.Russinovich.:)

Vadikan 19-12-2010 16:53 1569655

madmasles, так если у меня другие окна открыты и в них нажимаю Enter, хоткей перехватывается и скрипт отрабатывает. Как ограничить его действие только активным окном скрипта?

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

madmasles 19-12-2010 16:57 1569657

Цитата:

Цитата Vadikan
Как ограничить его действие только активным окном скрипта? »

Посмотрите здесь: HotKey - Установка горячих клавиш.

Vadikan 19-12-2010 17:05 1569660

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

madmasles 19-12-2010 17:18 1569668

Vadikan,
Проверил у себя, правда на Windows XP, из 10 раз - 10 правильных срабатываний при куче открытых окон:
Код:

;...
HotKeySet('{ENTER}', 'OKButton')
;...
Func OKButton()
    $jump = $exe & GUICtrlRead($path)
    MsgBox(0, '', $jump)
    ;Run(@ComSpec & " /c " & $jump, "", @SW_HIDE)
EndFunc  ;==>OKButton


Vadikan 19-12-2010 17:40 1569687

madmasles, а куда конкретно вы помещаете
Код:

HotKeySet('{ENTER}', 'OKButton')
Если непосредственно над Func OKButton() или внутри, нажатие Enter ничего не дает. А если над while, то работает так, как я описал выше - перехват всех нажатий.

madmasles 19-12-2010 17:53 1569698

Vadikan,
В Windows XP так у меня работает:
Код:

#include <GUIConstantsEx.au3>

Opt("GUIOnEventMode", 1)

$exe = "regjump.exe "

HotKeySet('{ENTER}', 'OKButton')

$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)
GUICtrlSetOnEvent($jumpbtn, "OKButton")
GUISetState(@SW_SHOW)

While 1
    Sleep(20)
WEnd

Func CLOSEClicked()
    Exit
EndFunc  ;==>CLOSEClicked

Func OKButton()
    $jump = $exe & GUICtrlRead($path)
    MsgBox(0, '', $jump)
    ;Run(@ComSpec & " /c " & $jump, "", @SW_HIDE)
EndFunc  ;==>OKButton

Цитата:

Цитата Vadikan
то работает так, как я описал выше - перехват всех нажатий. »

Может быть так в 7?

Vadikan 19-12-2010 18:29 1569730

Цитата:

Цитата madmasles
Может быть так в 7? »

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

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

SyDr 19-12-2010 18:42 1569746

Код:

; 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 1569761

Добавить стиль кнопки «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 1569762

Здесь вообще 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 1569765

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

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

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

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

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

Iska 19-12-2010 19:18 1569771

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

Vadikan 19-12-2010 19:23 1569774

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

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

Yashied 19-12-2010 20:05 1569794

Цитата:

Цитата 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.

Iska 19-12-2010 20:07 1569796

Цитата:

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

Спасибо, ясно.

Vadikan 19-12-2010 20:21 1569809

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

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

AZJIO 22-12-2010 12:43 1572021

Vadikan, для себя когда то делал jumpreg, сегодня обновил немного. Кнопкам можно назначить хоткей функцией GUISetAccelerators, которая назначает выполнение хоткея только в текущем окне и только для элементов текущего окна. Разделы реестра (ветки) хранятся в ini, так мне проще пользоваться в чужой системе или в LiveCD. Или импортировать ini в избранное regedit.
+ активность инпута после прыжка.
+ переход уровнем выше, если раздела не существует (проверка до корневого).
+ Избранное
+ Старт вверху экрана в виде компактной панели

без заголовка, с перетаскиванием за окно, не редактируемый комбобокс
читать дальше »
Код:

#AutoIt3Wrapper_Outfile=JumpReg.exe
#AutoIt3Wrapper_Icon=JumpReg.ico
#AutoIt3Wrapper_Compression=4
#AutoIt3Wrapper_UseAnsi=y
#AutoIt3Wrapper_Res_Comment=
#AutoIt3Wrapper_Res_Description=JumpReg.exe
#AutoIt3Wrapper_Res_Fileversion=0.3.0.0
#AutoIt3Wrapper_Res_FileVersion_AutoIncrement=n
#AutoIt3Wrapper_Res_LegalCopyright=AZJIO
#AutoIt3Wrapper_Res_Language=1049
#AutoIt3Wrapper_Run_Au3check=n

;  @AZJIO 24.12.2010 (AutoIt3_v3.3.6.1)
$kol_item=26 ; количество пунктов в комбобоксе
$Xsz=81
Switch @OSVersion
    Case 'WIN_VISTA', 'WIN_7'
        $Xsz=89
EndSwitch
#RequireAdmin
#NoTrayIcon
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
#include <WinAPI.au3>
#include <MenuConstants.au3>
Opt("GUIResizeMode", 0x0322)
GUIRegisterMsg(0x0024, "WM_GETMINMAXINFO")
; HotKeySet("!{ESC}", "_restart") ; для теста утилиты

Global $aRecords
Global $Ini = @ScriptDir & '\JumpRegFav.ini'
$FileTmp=''

If Not FileExists($Ini) And MsgBox(4, "Выгодное предложение", "Хотите создать необходимый JumpRegFav.ini" & @CRLF & "для сохранения вводимых параметров?")=6 Then
$file = FileOpen($Ini,2)
FileWrite($file, '[Favorites]' & @CRLF & _
'; отсчёт Favorites со второй строки. После разделителя | можно указать имя, иначе имя последнее после \.' & @CRLF & _
'HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders|Папки пользователя' & @CRLF & _
'HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders|Папки пользователя 2' & @CRLF & _
'HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager\Environment|Переменные среды' & @CRLF & _
'HKEY_CURRENT_USER\Environment|Переменные среды текущего' & @CRLF & _
'HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices' & @CRLF & _
'HKEY_CLASSES_ROOT\Folder' & @CRLF & _
'HKEY_CLASSES_ROOT\Directory' & @CRLF & _
'HKEY_CLASSES_ROOT\Drive' & @CRLF & _
'HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced')
FileClose($file)
EndIf

If Not _FileReadToArray($Ini, $aRecords) Then
        Dim $aRecords[4]=['3', '', '', 'HKEY_CURRENT_USER\Software']
Else
        $file = FileOpen($Ini, 0)
        $FileTmp = FileRead($file)
        FileClose($file)
EndIf

$GUI=GUICreate("Прыжок в указанный раздел реестра", 548, 75, -1, 0, BitOR($WS_POPUP, $WS_THICKFRAME, $WS_SIZEBOX, $WS_SYSMENU))
GUISetBkColor(0x3f3f3f)


$ActM=GUICtrlCreateMenu('&Меню')
; $Restart=GUICtrlCreateMenuitem('Перезапуск', $ActM) ; для теста утилиты
$runfav=GUICtrlCreateMenuitem('Открыть JumpRegFav.ini', $ActM)
$help=GUICtrlCreateMenuitem('Справка', $ActM)
$Quit=GUICtrlCreateMenuitem('Выход', $ActM)

$RegM=GUICtrlCreateMenu('&Regedit')
$favorites=GUICtrlCreateMenuitem('Добавить в Избранное', $RegM)
$Clean=GUICtrlCreateMenuitem('Очистить Избранное', $RegM)
$Save=GUICtrlCreateMenuitem('Экспорт истории', $RegM)
$ReHis=GUICtrlCreateMenuitem('Восстановить историю', $RegM)

$FavM=GUICtrlCreateMenu('&Избранное')


$list=''
For $i = 3 To $aRecords[0]
        If StringInStr($aRecords[$i], '|') Then
                $list&=StringRegExpReplace($aRecords[$i], '(.*?\|).*', '\1')
        Else
                $list&=$aRecords[$i]&'|'
        EndIf
Next

$list=StringTrimRight($list, 1)
$tmp=StringSplit($list, '|')
Dim $aList2[$tmp[0]+1][3]
$aList2[0][0]=$tmp[0]

For $i = 1 To $aList2[0][0]
        $aList2[$i][1]=$tmp[$i]
        $aList2[$i][0]=GUICtrlCreateMenuitem($aList2[$i][1], $FavM)
Next
$tmp=''
$list=RegRead('HKCU\Software\JumpRegAzjio', 'History')

; $HistM=GUICtrlCreateMenu('И&стория')
; $favorites=GUICtrlCreateMenuitem('HKCU\Software\Microsoft\Windows\CurrentVersion\Applets\Regedit', $HistM)

$inpreg = GUICtrlCreateInput('', 7, 5, 512, 21)
GUICtrlSetResizing(-1, 2 + 4 +32 + 512 + 256)

$Jump = GUICtrlCreateButton("П", 519, 5, 21, 21, 0x0040)
GUICtrlSetTip(-1, "Открыть regedit с переходом" & @CRLF & "в указанный раздел реестра." & @CRLF & "Enter")
GUICtrlSetResizing(-1, 512 + 256 +32+ 4)
GUICtrlSetImage(-1, @SystemDir & '\shell32.dll', -138, 0)
; GUISetIcon('shell32.dll', -138)

$comboreg = GUICtrlCreateCombo("", 7, 26, 512+21, 18, 0x3)
GUICtrlSetResizing(-1, 2 + 4 +32)
If $list<>'' Then GUICtrlSetData(-1, $list, StringRegExpReplace($list, '(.*?)\|.*', '\1'))

$Editor=_EXE_Path('txt')
If @error Then $Editor=@SystemDir&'\notepad.exe'

Dim $AccelKeys[4][2] = [["{Enter}", $Jump],["^{UP}", $favorites],["^{DEL}", $Clean],["^{DOWN}", $Save]]
GUISetAccelerators($AccelKeys)

GUICtrlSetState($inpreg, 256)
GUISetState()

While 1
        $msg = GUIGetMsg()
        _SendMessage($Gui, $WM_SYSCOMMAND, BitOR($SC_MOVE, $HTCAPTION), 0) ; для перемещения окна за само окно
       
        For $i = 1 To $aList2[0][0]
                If $msg = $aList2[$i][0] Then GUICtrlSetData($inpreg, $aList2[$i][1])
        Next
       
        Select
                Case $msg = $comboreg
                        $comboreg0 = GUICtrlRead($comboreg)
                        GUICtrlSetData($inpreg, $comboreg0)
                Case $msg = $Clean
                        If MsgBox(4, "Сообщение", "Вы точно хотите полностью очистить" & @CRLF & "Избранное в Regedit?")=7 Then ContinueLoop
                        RegDelete("HKCU\Software\Microsoft\Windows\CurrentVersion\Applets\Regedit\Favorites")
                        GUICtrlSetState($inpreg, 256)

                Case $msg = $favorites
                        If MsgBox(4, "Сообщение", "Вы точно хотите добавить разделы" & @CRLF & "из JumpRegFav.ini в Избранное Regedit?")=7 Then ContinueLoop
                        For $i = 3 To $aRecords[0]
                                If StringInStr($aRecords[$i], '|') Then
                                        $aReg = StringSplit($aRecords[$i], "|")
                                Else
                                        Dim $aReg[3]
                                        $aReg[2] = StringRegExpReplace('t\\'&$aRecords[$i], "(^.*)\\(.*)$", '\2')
                                        $aReg[1] = $aRecords[$i]
                                EndIf
                                If StringLeft($aReg[1], 2)<>'HK' Then ContinueLoop
                                RegWrite("HKCU\Software\Microsoft\Windows\CurrentVersion\Applets\Regedit\Favorites", $aReg[2], "REG_SZ", 'Мой компьютер\' & $aReg[1])
                        Next
                        If ProcessExists("regedit.exe") <> 0 Then
                                ContinueLoop
                        Else
                                Run('regedit.exe')
                        EndIf
                        GUICtrlSetState($inpreg, 256)

                Case $msg = $Jump
                        If ProcessExists("regedit.exe") <> 0 Then
                                ProcessClose("regedit.exe")
                                ProcessWaitClose("regedit.exe")
                        EndIf
                        $comboreg0 = GUICtrlRead($inpreg)
                        If StringRight($comboreg0, 1)='\' Then $comboreg0=StringTrimRight($comboreg0, 1)

                        If StringInStr(';HKLM;HKU;HKCU;HKCR;HKCC;', ';' & StringRegExpReplace($comboreg0, '(.*?)\\.*', '\1') & ';') Then
                                $aSmlNm = StringRegExp($comboreg0, '(^.*?)(\\.*)$', 3)
                                If @error Then Dim $aSmlNm[2]=[$comboreg0, '']

                                Switch $aSmlNm[0]
                                        Case 'HKLM'
                                                $aSmlNm[0] = 'HKEY_LOCAL_MACHINE'
                                        Case 'HKU'
                                                $aSmlNm[0] = 'HKEY_USERS'
                                        Case 'HKCU'
                                                $aSmlNm[0] = 'HKEY_CURRENT_USER'
                                        Case 'HKCR'
                                                $aSmlNm[0] = 'HKEY_CLASSES_ROOT'
                                        Case 'HKCC'
                                                $aSmlNm[0] = 'HKEY_CURRENT_CONFIG'
                                EndSwitch
                                $comboreg0 = $aSmlNm[0] & $aSmlNm[1]
                        EndIf
                       
                        ;проверяем существование раздела реестра
                        If Not _Reg_Exists($comboreg0) Then
                                While Not _Reg_Exists($comboreg0)
                                        $comboreg0=StringRegExpReplace($comboreg0, '(.*)\\.*', '\1')
                                        If @Extended=0 Then
                                                MsgBox(0, 'Ошибка', 'Ошибка имени корневого раздела')
                                                ContinueLoop 2
                                        EndIf
                                WEnd
                                If MsgBox(4, 'Ошибка', 'Раздел не существует.'&@CRLF&'Ближайший доступный раздел: '& _
                                @CRLF&$comboreg0 &@CRLF&@CRLF& 'Перейти в него?')=7 Then ContinueLoop
                        EndIf

                        RegWrite("HKCU\Software\Microsoft\Windows\CurrentVersion\Applets\Regedit","LastKey","REG_SZ",$comboreg0)
                        Run('regedit.exe')
                        ; Run('regjump.exe '&$comboreg0)
                        ; Run('regjump.exe '&$comboreg0, '', @SW_HIDE)

                        GUICtrlSendMsg($comboreg, 0x14B, 0, 0)
                        If StringInStr('|'&$list&'|', '|'&$comboreg0&'|') Then
                                $list=StringReplace('|'&$list&'|', '|'&$comboreg0&'|', '|')
                                $list=StringRegExpReplace($list, '^\|?(.*?)\|?$', '\1')
                        EndIf
                        If $list='' Then
                                $list=$comboreg0
                        Else
                                $list=$comboreg0&'|'&$list
                        EndIf
                        StringReplace($list, '|', '|')
                        If @extended>$kol_item Then $list=StringRegExpReplace($list, '(^.*)\|.*$', '\1')
                        GUICtrlSetData($comboreg, $list, $comboreg0)
                        GUICtrlSetState($inpreg, 256)
                        RegWrite('HKCU\Software\JumpRegAzjio','History','REG_SZ',$list)

                Case $msg = $Save
                        ; RunWait('reg.exe export HKCU\Software\JumpRegAzjio "'&@ScriptDir & '\JumpRegSet.reg"', '', @SW_HIDE )
                        If FileExists(@ScriptDir & '\JumpRegSet.reg') Then FileDelete(@ScriptDir & '\JumpRegSet.reg')
                        RunWait(@SystemDir&'\reg.exe export HKCU\Software\JumpRegAzjio "'&@ScriptDir & '\JumpRegSet.reg"', '', @SW_HIDE )

                Case $msg = $ReHis
                        If FileExists(@ScriptDir & '\JumpRegSet.reg') Then
                                ShellExecuteWait(@ScriptDir&'\JumpRegSet.reg')
                                GUICtrlSendMsg($comboreg, 0x14B, 0, 0)
                                $list=RegRead('HKCU\Software\JumpRegAzjio', 'History')
                                If $list<>'' Then GUICtrlSetData(-1, $list, StringRegExpReplace($list, '(.*?)\|.*', '\1'))
                        EndIf
                       
                Case $msg = $help
                        MsgBox(0, 'Сообщение', 'Избранное хранится в JumpRegFav.ini (генерируется при отсутствии файла).'&@CRLF& _
                        'Скрипт использовать при отсутствии удобного менеджера реестра.'&@CRLF&@CRLF&'                http://azjio.ucoz.ru/load'&@CRLF&'                AZJIO 24.12.2010')
               
                Case $msg = $runfav
                        Run($Editor&' '&@ScriptDir & '\JumpRegFav.ini')
                        ; Run(@SystemDir&'\notepad.exe '&@ScriptDir & '\JumpRegFav.ini')
                ; Case $msg = $Restart
                        ; _restart()
                Case $msg = $Quit
                        ExitLoop
        EndSelect
WEnd
                       
Func _Reg_Exists($key)
        Local $Err=2
        RegEnumKey($key, 1)
        If @error Then $Err-=1
        RegEnumVal($key, 1)
        If @error Then $Err-=1
        If $Err=0 Then
                Return 0
        Else
                Return 1
        EndIf
EndFunc

Func WM_GETMINMAXINFO($hWnd, $iMsg, $wParam, $lParam)
        #forceref $iMsg, $wParam
        If $hWnd = $GUI Then
                Local $tMINMAXINFO = DllStructCreate("int;int;" & _
                                "int MaxSizeX; int MaxSizeY;" & _
                                "int MaxPositionX;int MaxPositionY;" & _
                                "int MinTrackSizeX; int MinTrackSizeY;" & _
                                "int MaxTrackSizeX; int MaxTrackSizeY", _
                                $lParam)
                DllStructSetData($tMINMAXINFO, "MaxTrackSizeX", 1280) ; максимальные размеры окна
                DllStructSetData($tMINMAXINFO, "MaxTrackSizeY", $Xsz)
                DllStructSetData($tMINMAXINFO, "MinTrackSizeX", 270) ; минимальные размеры окна
                DllStructSetData($tMINMAXINFO, "MinTrackSizeY", $Xsz)
        EndIf
EndFunc

Func _EXE_Path($type)
        $astype = RegRead('HKEY_CLASSES_ROOT\.'&$type, "")
        If @error = 1 Then Return SetError(1)
        $astype = RegRead('HKEY_CLASSES_ROOT\' & $astype & '\shell\open\command', "")
        If @error = 1 Then Return SetError(1)
        $aPathexe=StringRegExpReplace($astype, '(^.*)(exe|EXE)(.*)$', '\1')
        If @error = 1 Then Return SetError(1)
        $aPathexe = StringReplace($aPathexe, '"', '') & 'exe'
        Opt('ExpandEnvStrings', 1)
        If FileExists($aPathexe) Then
                $aPathexe=$aPathexe
                Opt('ExpandEnvStrings', 0)
                Return $aPathexe
        EndIf
        Opt('ExpandEnvStrings', 0)
        If FileExists(@SystemDir&'\'&$aPathexe) Then
                $aPathexe=@SystemDir&'\'&$aPathexe
                Return $aPathexe
        EndIf
EndFunc

;#include <File.au3>
Func _FileReadToArray($sFilePath, ByRef $aArray)
        Local $hFile = FileOpen($sFilePath, 0)
        If $hFile = -1 Then Return SetError(1, 0, 0)
        Local $aFile = FileRead($hFile, FileGetSize($sFilePath))
        If StringRight($aFile, 1) = @LF Then $aFile = StringTrimRight($aFile, 1)
        If StringRight($aFile, 1) = @CR Then $aFile = StringTrimRight($aFile, 1)
        FileClose($hFile)
        If StringInStr($aFile, @LF) Then
                $aArray = StringSplit(StringStripCR($aFile), @LF)
        ElseIf StringInStr($aFile, @CR) Then
                $aArray = StringSplit($aFile, @CR)
        Else
                If StringLen($aFile) Then
                        Dim $aArray[2] = [1, $aFile]
                Else
                        Return SetError(2, 0, 0)
                EndIf
        EndIf
        Return 1
EndFunc

Func _restart()
        Local $sAutoIt_File = @TempDir & "\~Au3_ScriptRestart_TempFile.au3"
        Local $sRunLine, $sScript_Content, $hFile

        $sRunLine = @ScriptFullPath
        If Not @Compiled Then $sRunLine = @AutoItExe & ' /AutoIt3ExecuteScript ""' & $sRunLine & '""'
        If $CmdLine[0] > 0 Then $sRunLine &= ' ' & $CmdLineRaw

        $sScript_Content &= '#NoTrayIcon' & @CRLF & _
                        'While ProcessExists(' & @AutoItPID & ')' & @CRLF & _
                        '  Sleep(10)' & @CRLF & _
                        'WEnd' & @CRLF & _
                        'Run("' & $sRunLine & '")' & @CRLF & _
                        'FileDelete(@ScriptFullPath)' & @CRLF

        $hFile = FileOpen($sAutoIt_File, 2)
        FileWrite($hFile, $sScript_Content)
        FileClose($hFile)

        Run(@AutoItExe & ' /AutoIt3ExecuteScript "' & $sAutoIt_File & '"', @ScriptDir, @SW_HIDE)
        Sleep(1000)
        Exit
EndFunc


Vadikan 22-12-2010 23:46 1572442

AZJIO, да, потребность в утилите есть :) Идея с избранным, интересна, конечно, если на флэшке таскать.

Но у меня не работает этот скрипт в 7. Он просто открывает редактор реестра, полностью разворачивая окно (что не гуд). И при этом никуда не переходит. Запуск от имени админа ничего не меняет.

AZJIO 23-12-2010 02:38 1572527

Vadikan, проверил в Win7, поправил скрипт в предыдущем моём посте. Всего лишь имя компа убрал в сохраняемой ветке последнего доступа. Ну и ещё поправки незначительные, убрал вкладки, добавил ресайз по ширине.

Цитата:

Цитата Vadikan
полностью разворачивая окно

состояние окна сохраняется в том положении, в котором оно закрыто. Я смещаю утилиту вверх, окно regedit чуть ниже, и в таком положении открывается regedit в следующие разы.

Vadikan 23-12-2010 13:21 1572820

AZJIO, Так работает скрипт, конечно. Но есть несколько замечаний/пожеланий, если есть желание довести до ума и выпустить "в люди".
  • Нбх запуск от имени админа (#RequireAdmin)
  • Терминология неверная - ветка. Нужно использовать слово "раздел" везде.
  • Перезапуск regedit ни к чему - лишнее моргание окон. Почему нельзя просто переходить в раздел в уже открытом редакторе?
  • Мой компьютер - работает только в локализованных ОС, нужно универсальное решение.
  • Запрос с предложением создать INI лишний. Его можно создавать и без запроса, закомментировав объяснение, как править руками. Далее...
  • История... Вообще, я не уверен, что нужно хранить неограниченное кол-во записей - 26 было достаточно, как в скрипте Yashied. И без всяких дополнительных файлов обходилось. А можно с Autoit сделать комбо-кнопку История? http://msdn.microsoft.com/en-us/maga...163384.aspx#S1 Под нее можно загнать Просмотр и Очистка (удаление всех записей). Заодно не нужна будет непонятная кнопка INI. Возможно, стоит сразу открывать в Блокноте, т.к. неопытный юзер не поймет, какой программой открывать файл (по умолчанию INI ни с чем не ассоциирован).
  • Управление избранным не очень удачное.
    а) При добавлении нужно подтверждающий диалог - Раздел добавлен в избранное редактора реестра (ОК)
    б) Очистка избранного затирает все записи, даже если у юзера были свои. Это неправильно.

По поводу последних двух пунктов. Вообще, добавление избранного реализовано в regedit, незачем дублировать функции. Вместо этого лучше реализовать избранное утилиты в INI файле! А историю хранить в реестре, методом Yashied. Если честно, я сначала подумал, что Избранное - это избранное утилиты... И я уверен, что не я один такой буду :)

Конечно, нужно будет продумать запись в избранное (собственное имя для раздела реестра) и выбор из Избранного (какой-то список, комбо-кнопка и т.д).

Что думаете?

AZJIO 23-12-2010 18:20 1573008

Vadikan,
Первые два пункта выполнил.

Прыжок сейчас осуществляется за счёт того, что при закрытии реестра он сохраняет последний открытый раздел и открывает в том же месте. То есть приходится закрывать regedit, вставить полный путь раздела реестра и снова открыть уже в эом месте. Посмотрел старую утилиту regjump.exe, она открывает без перезапуска regedit, можно ей передать путь в ком-строке. Как в Win7 не смотрел, но в WinXP вроде не видел команд перехода в ком-строке без сторонних утилит.

Цитата:

Цитата Vadikan
Запрос с предложением создать INI лишний »

Я утилитку в LiveCD использовал, а там некоторые программы вылетали при попытке создать свой ini, поэтому я сделал возможность не создавать, хотя можно проверить доступность записи, но ещё этот диалог как бы предупреждает при первом старте что настройки будут храниться в ini, а потом об этом уже не напоминается. Поэтому вроде не критично.

На счёт истории: хотелось бы избранное иметь и отдельно историю. То есть сделать нередактируемый комбобокс, при выборе в котором происходит вставка раздела в инпут и открытие по Enter. А для истории второй такой же комбобокс. Получается и раздельное наполнение. На счёт хранения в реестре истории - можно галочку сделать "Хранить в реестре (иначе в ini)". Нередактируемый комбобокс не такой красивый как кнопка, но те же свойства, раскрывается по клику в поле, а не только на стрелке.
Неассоциированность ini уже есть функция... откроется в том редакторе, в котором ассоциирован txt (хотя можно и блокнот жёстко указать).
Для Избранного диалог сделаю. Может сделать главное меню, чтоб туда кнопки убрать, кроме "прыжок".
Мне приходится настраивать компы, и там обычно меню "Избранное" со 100% гарантией отсутствует, поэтому я добавляю утилитой, чтоб потом без перезапуска смотреть некоторые необходимые мне ветки. А в утилите первый раздел ini как бы и есть избранное. Только я не вижу разницы, что в утилите делать кнопочки добавления в избранное ( по сути редактирование ini), что открыть в блокноте и редактировать, там же как то наглядней.

Обновил скрипт, ограничение на 26 пунктов комбобокса добавил.

Vadikan 23-12-2010 21:43 1573167

Цитата:

Цитата AZJIO
Прыжок сейчас осуществляется за счёт того, что при закрытии реестра он сохраняет последний открытый раздел и открывает в том же месте. »

Понятно, я не обратил внимания, что Yashied сделал так же - я-то использовал regjump. Ну это не критично тогда.
Цитата:

Цитата AZJIO
хотелось бы избранное иметь и отдельно историю »

Да, но у вас сейчас в INI файл есть возможность сохранить только всю историю, а не выборочно. Я предлагаю разграничить и вообще не хранить ее в INI, оставив его только для избранного. И галочка отдельная не нужна. Тем более, что
Цитата:

Цитата AZJIO
А в утилите первый раздел ini как бы и есть избранное. »

Избранное, которое вы открываете, все равно будет попадать в историю, т.е. доступно в раскрывающемся списке. Ну а невозможность записи INI можно проверять, и просто выводить ошибку в случае отлупа.

Цитата:

Цитата AZJIO
То есть сделать нередактируемый комбобокс, при выборе в котором происходит вставка раздела в инпут и открытие по Enter. А для истории второй такой же комбобокс. »

Для истории вполне работает раскрывающийся список, как сейчас. А для отображения избранного, можно не комбобокс, а меню, как в regedit. Туда можно добавить пункт "Скопировать избранное в редактор реестра" в конце концов, раз вам эта фича нужна (и другим пригодится).

Цитата:

Цитата AZJIO
Неассоциированность ini уже есть функция... откроется в том редакторе, в котором ассоциирован txt »

У меня предложило выбрать приложение...

AZJIO 24-12-2010 01:27 1573296

Vadikan, переделал, обновил предыдущий пост... Утилита при старте вверху экрана, инпут для ввода и история-комбобокс. А избранное в "главном меню". Кнопка прыжок мелкая слева справа от инпута, дабы оставить высоту утилиты максимально узкой как и должна быть панель. Стиль теперь "без заголовка окна" с перемещением за окно.

С regjump.exe не вышло, он тоже моргает дос окном, а скрыть не получается, только вместе с regedit. Можно попытаться управлять деревом regedit'а.

Vadikan 24-12-2010 02:11 1573304

Цитата:

Цитата AZJIO
. Кнопка прыжок будет мелкая слева от инпута »

Лучше уж справа, как когда-то в адресных строках у браузеров... Тем более, если будут выбирать из списка истории, стрелка-то справа будет - ближе тянуться :)

Заголовок окна лучше оставить, так будет больше похоже на обычную программу :)

Ждем-с :)

AZJIO 24-12-2010 05:29 1573328

После проверки в Win7 обновил ещё раз.
Всё-таки как лучше, текущий вариант без заголовка, но перемещать можно за само окно (сворачивание не работает, не критично) или вернуть заголовок с учётом увеличения ширина на 20-30 пикселей.

Удобство дополнительного комбобокса только в том что можно кликать по всей его площади. Либо сделать один комбобок и постоянно метится в стрелку раскрытия.

Vadikan 24-12-2010 11:47 1573466

AZJIO,

Уже ближе к финалу :)

1. Я бы все-таки вернул заголовок окна со всеми атрибутами - это понятнее, и не нужно будет делать "Выход" в "Меню" (см. #5 ниже). Не вижу особого смысла прикреплять окно вверху экрана, лучше по центру, как обычно.
2. Непонятно, почему нельзя было совместить поле ввода с раскрывающимся списком истории. Лишний элемент сейчас.
3. При установке курсора в поле он начинает дрожать, превращаясь то в стрелку, то в I.
4. Фон окна неудачно смотрится, особенно с учетом белого квадрата вокруг зеленой кнопки на черном фоне :) Лучше нейтральный фон.
5. "Меню" можно упразднить. Открыть JumpRegFav.ini - непонятный пункт. Его надо переместить в Избранное, над всем избранным, и отделить визуально разделителем. Справка - можно заменить на отдельный пункт "?". Порядок меню тогда такой: Избранное, Regedit, ?

Что касается JumpRegFav.ini, то не очень понятно, для чего нужно имя после разделителя. Видимо, это работает только при добавлении в избранное реестра, что неочевидно.

AZJIO 24-12-2010 16:58 1573691

Vadikan, вот сделал поправки, это уже было не сложно. Предыдущий вариант тоже оставил в предыдущем посте, чтоб выбор был. Смысл прекреплять сверху в том, что regedit откроется чуть ниже, ведь при каждом старте сдвигать утилиту приходится вверх.
3. У меня не моргал курсор, хотя подозреваю срабатывание функции из WinAPI.au3 - _SendMessage, которая предназначена для перетаскивания окна за само окно, но теперь это убрал. Видимо изменялся курсор для перетаскивания.
Цитата:

Цитата Vadikan
Что касается JumpRegFav.ini, то не очень понятно, для чего нужно имя после разделителя »

Да, имя нужно только для избранного в Regedit, хотя не обязательно, без него в качестве имени используется имя раздела реестра, но как пример оставил в конфиге. Может кому то захочется иметь осмысленные имена.

* Убрал сообщение создания JumpRegFav.ini при первом старте.
+ опция установки размера истории. У меня история укладывается в 600 пиксель (высота экрана нетбука), т.е. в 2 раза можно увеличить для моего монитора.
+ при клике на заголовке развёртывание в ширину на 800 пиксель и перемещение к верху экрана.
+ Выбор метода, требуются указанные утилиты regjump.exe, regscanner.exe, nircmd.exe.

С выбором утилиты.
читать дальше »
Код:

#AutoIt3Wrapper_Outfile=JumpReg.exe
#AutoIt3Wrapper_Icon=JumpReg.ico
#AutoIt3Wrapper_Compression=4
#AutoIt3Wrapper_UseAnsi=y
#AutoIt3Wrapper_Res_Comment=
#AutoIt3Wrapper_Res_Description=JumpReg.exe
#AutoIt3Wrapper_Res_Fileversion=0.6.0.0
#AutoIt3Wrapper_Res_FileVersion_AutoIncrement=n
#AutoIt3Wrapper_Res_LegalCopyright=AZJIO
#AutoIt3Wrapper_Res_Language=1049
#AutoIt3Wrapper_Run_Au3check=n

;  @AZJIO 9.01.2011 (AutoIt3_v3.3.6.1)
#RequireAdmin
#NoTrayIcon
; FileInstall('RegScanner.exe', '*')
; FileInstall('RegScanner_lng.ini', '*') ;???
; FileInstall('RegScanner.chm', '*')

; En
$LngTitle='JumpReg'
$LngAbout='About'
$LngVer='Version'
$LngSite='Site'
$LngFIT='Define Favorites starting from the next line. After a separator | you can specify a name that has meaning only when importing favorites to Regedit; otherwise, the name is the last subkey.'
$LngFIT1='Folders user'
$LngFIT2='Environment Variables'
$LngFIT3='Environment variables, current'
$LngFav='&Favorites'
$LngEdF='Edit Favorites'
$LngHis='History'
$LngExp='Export        Ctrl+Down'
$LngImp='Import'
$LngSzH='Size'
$LngAdF='Import Favorites to Regedit        Ctrl+Up'
$LngClF='Clear Favorites        Ctrl+Del'
$LngTpE="Jump to the registry key in Regedit." & @CRLF & "Enter"
$LngSWR='Search with RegScanner        Alt+\'
$LngTop='Always on top'
$LngHsIB1='History'
$LngHsIB2='The number of records in the history:'
$LngMs1='Message'
$LngMs2='Clear Favorites in Regedit?'
$LngMs3='Add JumpRegFav.ini entries'&@CRLF&'to Regedit Favorites?'
$LngMs4='Exported successfully to JumpRegSet.reg'&@CRLF&'in the program folder.'
$LngMs5='Error'
$LngMs6='JumpRegSet.reg file not found.'&@CRLF&'You can create it with the Export command.'
$LngMs7='Error: invalid name for the root registry key'
$LngMs8='The key does not exist. The nearest key is:'
$LngMs9='Do you want to jump to it?'
$LngSLng='Language'
$LngMd='Mode'
$LngUse='Using'
$LngNoU='No utilities'

$Lang_dll = DllOpen("kernel32.dll")
$UserIntLang=DllCall ( $Lang_dll, "int", "GetUserDefaultUILanguage" )
If Not @error Then $UserIntLang=Hex($UserIntLang[0],4)
DllClose($Lang_dll)

; Ru
; если русская локализация, то русский язык
If $UserIntLang = 0419 Then
        $LngTitle='Прыжок в указанный раздел реестра'
        $LngAbout='О программе'
        $LngVer='Версия'
        $LngSite='Сайт'
        $LngFIT='Указывайте Избранное, начиная с третьей строки. После разделителя | можно указать имя (имеет значение только при импорте избранного в Regedit), иначе именем становится последний подраздел.'
        $LngFIT1='Папки пользователя'
        $LngFIT2='Переменные среды'
        $LngFIT3='Переменные среды текущего'
        $LngFav='&Избранное'
        $LngEdF='Редактировать избранное'
        $LngHis='И&стория'
        $LngExp='Экспорт        Ctrl+Down'
        $LngImp='Импорт'
        $LngSzH='Размер'
        $LngAdF='Добавить в Избранное        Ctrl+Up'
        $LngClF='Очистить Избранное        Ctrl+Del'
        $LngTpE="Перейти в regedit" & @CRLF & "в указанный раздел реестра." & @CRLF & "Enter"
        $LngSWR='Поиск в RegScanner        Alt+\'
        $LngTop='Поверх всех окон'
        $LngHsIB1='История'
        $LngHsIB2='Количество записей в истории:'
        $LngMs1='Сообщение'
        $LngMs2='Очистить Избранное в Regedit?'
        $LngMs3='Добавить разделы из JumpRegFav.ini' & @CRLF & 'в Избранное Regedit?'
        $LngMs4='Экспорт выполнен в файл JumpRegSet.reg'&@CRLF&'в папку программы.'
        $LngMs5='Ошибка'
        $LngMs6='Файл JumpRegSet.reg не найден.'&@CRLF&'Его можно создать командой Экспорт.'
        $LngMs7='Ошибка имени корневого раздела'
        $LngMs8='Раздела не существует.'&@CRLF&'Ближайший доступный раздел:'
        $LngMs9='Перейти в него?'
        $LngSLng='Язык интерфейса'
        $LngMd='Метод'
        $LngUse='Используя'
        $LngNoU='Без сторонних утилит'
EndIf

Switch @OSArch
    Case 'X64'
        $HKCU='HKCU64'
        $HKCR='HKCR64'
    Case Else;'X86'
        $HKCU='HKCU'
        $HKCR='HKCR'
EndSwitch

$LangPath=RegRead($HKCU&'\Software\JumpRegAzjio', 'Lang')
If Not @error Then
        If FileExists(@ScriptDir&'\Lang\'&$LangPath) Then
                $aLng = IniReadSection(@ScriptDir&'\Lang\'&$LangPath, 'lng')
                If Not @error Then
                        For $i = 1 To $aLng[0][0]
                                If StringInStr($aLng[$i][1], '\r\n') Then $aLng[$i][1]=StringReplace($aLng[$i][1],'\r\n',@CRLF)
                                If IsDeclared('Lng'&$aLng[$i][0]) Then Assign('Lng'&$aLng[$i][0],$aLng[$i][1])
                        Next
                EndIf
        Else
                RegDelete($HKCU&'\Software\JumpRegAzjio', 'Lang')
        EndIf
EndIf


GUIRegisterMsg(0x0024, "WM_GETMINMAXINFO")
Global $aRecords, $kol_item, $list='', $aPos, $TrTop=0
Global $Ini = @ScriptDir & '\JumpRegFav.ini'
$FileTmp=''

$mode=RegRead($HKCU&'\Software\JumpRegAzjio', 'mode')
If @error Then $mode=0

$kol_item=RegRead($HKCU&'\Software\JumpRegAzjio', 'HistorySize')
If @error Or StringIsDigit($kol_item)=0 Or $kol_item = '' Or $kol_item>50 Then $kol_item=26 ; количество пунктов в комбобоксе
$Xsz=90
Switch @OSVersion
    Case 'WIN_VISTA', 'WIN_7'
        $Xsz=98
EndSwitch

If Not FileExists($Ini) And DriveStatus(StringLeft(@ScriptDir, 1))<>'NOTREADY' Then
$file = FileOpen($Ini,2)
FileWrite($file, '[Favorites]' & @CRLF & _
'; '&$LngFIT & @CRLF & _
'HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders|'&$LngFIT1 & @CRLF & _
'HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders|'&$LngFIT1&' 2' & @CRLF & _
'HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager\Environment|'&$LngFIT2 & @CRLF & _
'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run|Run (all)' & @CRLF & _
'HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run' & @CRLF & _
'HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\MenuExt' & @CRLF & _
'HKEY_CURRENT_USER\Environment|'&$LngFIT3 & @CRLF & _
'HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices' & @CRLF & _
'HKEY_CLASSES_ROOT\Folder' & @CRLF & _
'HKEY_CLASSES_ROOT\Directory' & @CRLF & _
'HKEY_CLASSES_ROOT\Drive' & @CRLF & _
'HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced' & @CRLF & _
'HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts')
FileClose($file)
EndIf

If Not _FileReadToArray($Ini, $aRecords) Then
        Dim $aRecords[4]=['3', '', '', 'HKEY_CURRENT_USER\Software']
Else
        $file = FileOpen($Ini, 0)
        $FileTmp = FileRead($file)
        FileClose($file)
EndIf

$Pos=RegRead($HKCU&'\Software\JumpRegAzjio', 'Pos')
If @error Or Not StringInStr($Pos, '|') Then $Pos='-1|-1'
$aPos=StringSplit($Pos, '|')
If $aPos[1] > @DesktopWidth-548 Or $aPos[2]>@DesktopHeight-84 Then
        $aPos[1]=-1
        $aPos[2]=-1
EndIf

$GUI=GUICreate($LngTitle, 548, 84, $aPos[1], $aPos[2], 0x00040000+0x00020000+0x00010000)
If Not @compiled Then GUISetIcon('JumpReg.ico')

$FavM=GUICtrlCreateMenu($LngFav)
$runfav=GUICtrlCreateMenuitem($LngEdF, $FavM)
GUICtrlCreateMenuitem('', $FavM)

For $i = 3 To $aRecords[0]
        If StringInStr($aRecords[$i], '|') Then
                $list&=StringRegExpReplace($aRecords[$i], '(.*?\|).*', '\1')
        Else
                $list&=$aRecords[$i]&'|'
        EndIf
Next

$list=StringTrimRight($list, 1)
$tmp=StringSplit($list, '|')
Dim $aList2[$tmp[0]+1][3]
$aList2[0][0]=$tmp[0]

For $i = 1 To $aList2[0][0]
        $aList2[$i][1]=$tmp[$i]
        $aList2[$i][0]=GUICtrlCreateMenuitem($aList2[$i][1], $FavM)
Next
$tmp=''
$list=RegRead($HKCU&'\Software\JumpRegAzjio', 'History')

$HisM=GUICtrlCreateMenu($LngHis)
$Export=GUICtrlCreateMenuitem($LngExp, $HisM)
$Import=GUICtrlCreateMenuitem($LngImp, $HisM)
$HisSz=GUICtrlCreateMenuitem($LngSzH, $HisM)

$RegM=GUICtrlCreateMenu('&Regedit')
$favorites=GUICtrlCreateMenuitem($LngAdF, $RegM)
$Clean=GUICtrlCreateMenuitem($LngClF, $RegM)
GUICtrlCreateMenuitem('', $RegM)
$SearchWRS=GUICtrlCreateMenuitem($LngSWR, $RegM)

$ActM=GUICtrlCreateMenu('?')
$About=GUICtrlCreateMenuitem($LngAbout, $ActM)
$Mmode=GUICtrlCreateMenuitem($LngMd, $ActM)
$Topmost =GUICtrlCreateMenuitem($LngTop, $ActM)
$SelLng =GUICtrlCreateMenuitem($LngSLng, $ActM)

$Jump = GUICtrlCreateButton("E", 517, 5, 23, 23, 0x0040)
GUICtrlSetTip(-1, $LngTpE)
GUICtrlSetResizing(-1, 512 + 256 +32+ 4)
GUICtrlSetImage(-1, @SystemDir & '\shell32.dll', -138, 0)

$comboreg = GUICtrlCreateCombo("", 7, 5, 508)
GUICtrlSetResizing(-1, 2 + 4 +32)
If $list<>'' Then GUICtrlSetData(-1, '|'&$list, '')
_HisSz()

$Editor=_EXE_Path('txt')
If @error Then $Editor=@SystemDir&'\notepad.exe'

Dim $AccelKeys[5][2] = [ _
["{Enter}", $Jump], _
["^{UP}", $favorites], _
["^{DEL}", $Clean], _
["!{\}", $SearchWRS], _
["^{DOWN}", $Export]]
GUISetAccelerators($AccelKeys)

GUICtrlSetState($comboreg, 256)
GUISetState()
GUISetState(@SW_RESTORE)
Sleep(200)
WinSetOnTop($GUI, '', 1)
WinSetOnTop($GUI, '', 0)

$TrTop=RegRead('HKCU\Software\JumpRegAzjio', 'Topmost')
If Not @error And $TrTop=1 Then
        WinSetOnTop($GUI, '', 1)
        GUICtrlSetState($Topmost, 1)
EndIf

While 1
        $msg = GUIGetMsg()
        For $i = 1 To $aList2[0][0]
                If $msg = $aList2[$i][0] Then
                        _Jump($aList2[$i][1])
                EndIf
        Next
       
        Select
                Case $msg = $Mmode
                        _mode()

                Case $msg = $SelLng
                        $OpenFile = FileOpenDialog('Open', @ScriptDir&'\Lang' , "Language (*.ini)", 3, "", $Gui)
                        If @error Then ContinueLoop
                        RegWrite($HKCU&'\Software\JumpRegAzjio','Lang','REG_SZ', StringRegExpReplace($OpenFile,'(^.*)\\(.*)$','\2'))
                        _restart()
                       
                Case $msg = $SearchWRS
                        Run('RegScanner\RegScanner.exe')
       
                Case $msg = $HisSz
                        $tmp = InputBox($LngHsIB1, $LngHsIB2, $kol_item, '', 200, 135)
                        If Not StringIsDigit($tmp) Then ContinueLoop
                        $kol_item=Execute($tmp)
                        If $kol_item>50 Then $kol_item=50
                        RegWrite($HKCU&'\Software\JumpRegAzjio','HistorySize','REG_SZ', $kol_item)
                        _HisSz()
       
                Case $msg = $Clean
                        If MsgBox(4, $LngMs1, $LngMs2)=7 Then ContinueLoop
                        RegDelete($HKCU&'\Software\Microsoft\Windows\CurrentVersion\Applets\Regedit\Favorites')
                        GUICtrlSetState($comboreg, 256)

                Case $msg = $favorites
                        If MsgBox(4, $LngMs1, $LngMs3)=7 Then ContinueLoop
                        For $i = 3 To $aRecords[0]
                                If StringInStr($aRecords[$i], '|') Then
                                        $aReg = StringSplit($aRecords[$i], "|")
                                Else
                                        Dim $aReg[3]
                                        $aReg[2] = StringRegExpReplace('t\\'&$aRecords[$i], "(^.*)\\(.*)$", '\2')
                                        $aReg[1] = $aRecords[$i]
                                EndIf
                                If StringLeft($aReg[1], 2)<>'HK' Then ContinueLoop
                                RegWrite($HKCU&'\Software\Microsoft\Windows\CurrentVersion\Applets\Regedit\Favorites', $aReg[2], "REG_SZ", $aReg[1])
                        Next
                        If ProcessExists("regedit.exe") Then
                                ContinueLoop
                        Else
                                Run('regedit.exe')
                        EndIf
                        GUICtrlSetState($comboreg, 256)

                Case $msg = $Jump Or $msg = $comboreg
                        $comboreg0 = GUICtrlRead($comboreg)
                        $runyes=_Jump($comboreg0)
                        If $runyes Then ContinueLoop

                        GUICtrlSendMsg($comboreg, 0x14B, 0, 0)
                        If StringInStr('|'&$list&'|', '|'&$comboreg0&'|') Then
                                $list=StringReplace('|'&$list&'|', '|'&$comboreg0&'|', '|')
                                $list=StringRegExpReplace($list, '^\|?(.*?)\|?$', '\1')
                        EndIf
                        If $list='' Then
                                $list=$comboreg0
                        Else
                                $list=$comboreg0&'|'&$list
                        EndIf
                        StringReplace($list, '|', '|')
                        If @extended>$kol_item-1 Then $list=StringRegExpReplace($list, '(^.*)\|.*$', '\1')
                        GUICtrlSetData($comboreg, $list, $comboreg0)
                        GUICtrlSetState($comboreg, 256)
                        RegWrite($HKCU&'\Software\JumpRegAzjio','History','REG_SZ',$list)

                Case $msg = $Export
                        _Pos()
                        If FileExists(@ScriptDir & '\JumpRegSet.reg') Then FileDelete(@ScriptDir & '\JumpRegSet.reg')
                        RunWait(@SystemDir&'\reg.exe export HKCU\Software\JumpRegAzjio "'&@ScriptDir & '\JumpRegSet.reg"', '', @SW_HIDE )
                        MsgBox(0, $LngMs1, $LngMs4)

                Case $msg = $Import
                        If FileExists(@ScriptDir & '\JumpRegSet.reg') Then
                                ShellExecuteWait(@ScriptDir&'\JumpRegSet.reg')
                                GUICtrlSendMsg($comboreg, 0x14B, 0, 0)
                                $list=RegRead($HKCU&'\Software\JumpRegAzjio', 'History')
                                If $list<>'' Then GUICtrlSetData(-1, $list, StringRegExpReplace($list, '(.*?)\|.*', '\1'))
                                _HisSz()
                        Else
                                MsgBox(0, $LngMs5, $LngMs6)
                        EndIf
                       
      Case $msg = $Topmost
                        $TrTop=RegRead($HKCU&'\Software\JumpRegAzjio', 'Topmost')
                        If @error Then $TrTop=0
                        If $TrTop = 0 Then
                                WinSetOnTop($GUI, '', 1)
                                RegWrite($HKCU&'\Software\JumpRegAzjio','Topmost','REG_SZ', '1')
                                GUICtrlSetState($Topmost, 1)
                        Else
                                WinSetOnTop($GUI, '', 0)
                                RegWrite($HKCU&'\Software\JumpRegAzjio','Topmost','REG_SZ', '0')
                                GUICtrlSetState($Topmost, 4)
                        EndIf
                       
      Case $msg = $About
          _About()
               
                Case $msg = $runfav
                        Run($Editor&' '&@ScriptDir & '\JumpRegFav.ini')
                        ; Run(@SystemDir&'\notepad.exe '&@ScriptDir & '\JumpRegFav.ini')
                Case $msg = -3
                        _Pos()
                        Exit
        EndSelect
WEnd

Func _Pos()
        $GuiPos = WinGetPos($Gui)
        If $GuiPos[0] < 0 Or $GuiPos[1]< 0 Then
                $GuiPos[0]=$aPos[1]
                $GuiPos[1]=$aPos[2]
        EndIf
        RegWrite($HKCU&'\Software\JumpRegAzjio','Pos','REG_SZ',$GuiPos[0]&'|'&$GuiPos[1])
EndFunc

Func _Jump(ByRef $comboreg0)
        If $mode = 0 Then
                If ProcessExists("regedit.exe") <> 0 Then
                        ProcessClose("regedit.exe")
                        ProcessWaitClose("regedit.exe")
                EndIf
        EndIf
        If StringRight($comboreg0, 1)='\' Then $comboreg0=StringTrimRight($comboreg0, 1)

        If StringInStr(';HKLM;HKU;HKCU;HKCR;HKCC;', ';' & StringRegExpReplace($comboreg0, '(.*?)\\.*', '\1') & ';') Then
                $aSmlNm = StringRegExp($comboreg0, '(^.*?)(\\.*)$', 3)
                If @error Then Dim $aSmlNm[2]=[$comboreg0, '']

                Switch $aSmlNm[0]
                        Case 'HKLM'
                                $aSmlNm[0] = 'HKEY_LOCAL_MACHINE'
                        Case 'HKU'
                                $aSmlNm[0] = 'HKEY_USERS'
                        Case 'HKCU'
                                $aSmlNm[0] = 'HKEY_CURRENT_USER'
                        Case 'HKCR'
                                $aSmlNm[0] = 'HKEY_CLASSES_ROOT'
                        Case 'HKCC'
                                $aSmlNm[0] = 'HKEY_CURRENT_CONFIG'
                EndSwitch
                $comboreg0 = $aSmlNm[0] & $aSmlNm[1]
        EndIf
       
        ;проверяем существование раздела реестра
        If Not _Reg_Exists($comboreg0) Then
                While Not _Reg_Exists($comboreg0)
                        $comboreg0=StringRegExpReplace($comboreg0, '(.*)\\.*', '\1')
                        If @Extended=0 Then
                                MsgBox(0, $LngMs5, $LngMs7)
                                Return 1
                        EndIf
                WEnd
                If MsgBox(4, $LngMs5, $LngMs8&@CRLF&$comboreg0 &@CRLF&@CRLF&$LngMs9)=7 Then Return 1
        EndIf

        Switch $mode
                Case 0
                        RegWrite($HKCU&'\Software\Microsoft\Windows\CurrentVersion\Applets\Regedit',"LastKey","REG_SZ",$comboreg0)
                        Run('regedit.exe')
                Case 1
                        Run(@ComSpec & " /c " & 'regjump.exe '&$comboreg0, "", @SW_HIDE)
                Case 2
                        Run('RegScanner\RegScanner.exe /regedit "'&$comboreg0&'"', "", @SW_HIDE)
                Case 3
                        Run('nircmd.exe regedit  "'&$comboreg0&'"', "", @SW_HIDE)
                Case Else
                        RegWrite($HKCU&'\Software\Microsoft\Windows\CurrentVersion\Applets\Regedit',"LastKey","REG_SZ",$comboreg0)
                        Run('regedit.exe')
        EndSwitch
EndFunc

Func _HisSz()
        StringReplace($list, '|', '|')
        If @extended>$kol_item-1 Then
                $tmp=StringInStr($list, '|', 0, $kol_item)
                $list=StringMid($list, 1, $tmp-1)
                GUICtrlSendMsg($comboreg, 0x14B, 0, 0)
                GUICtrlSetData($comboreg, $list, StringRegExpReplace($list, '(.*?)\|.*', '\1'))
                RegWrite($HKCU&'\Software\JumpRegAzjio','History','REG_SZ',$list)
        EndIf
        GUICtrlSetState($comboreg, 256)
EndFunc

;  MerkurAlex (mod AZJIO)
; http://www.autoitscript.com/forum/topic/70203-regexists/page__view__findpost__p__514688
Func _Reg_Exists($key)
    Local $Err=RunWait('reg query "'&$key&'"','',@SW_HIDE)
    If $Err=0 Then
        Return 1
    Else
        Return 0
    Endif
EndFunc

Func WM_GETMINMAXINFO($hWnd, $iMsg, $wParam, $lParam)
        #forceref $iMsg, $wParam
        If $hWnd = $GUI Then
                Local $tMINMAXINFO = DllStructCreate("int;int;" & _
                                "int MaxSizeX; int MaxSizeY;" & _
                                "int MaxPositionX;int MaxPositionY;" & _
                                "int MinTrackSizeX; int MinTrackSizeY;" & _
                                "int MaxTrackSizeX; int MaxTrackSizeY", _
                                $lParam)
                DllStructSetData($tMINMAXINFO, "MaxTrackSizeX", 1280)
                DllStructSetData($tMINMAXINFO, "MaxTrackSizeY", $Xsz)
                DllStructSetData($tMINMAXINFO, "MinTrackSizeX", 300)
                DllStructSetData($tMINMAXINFO, "MinTrackSizeY", $Xsz)
                DllStructSetData($tMINMAXINFO, "MaxSizeX", 800)
                DllStructSetData($tMINMAXINFO, "MaxSizeY", $Xsz)
                DllStructSetData($tMINMAXINFO, "MaxPositionX", @DesktopWidth/2-400)
                DllStructSetData($tMINMAXINFO, "MaxPositionY", 0)
        EndIf
EndFunc

Func _EXE_Path($type)
        Local $typefile = RegRead($HKCR &'\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.'&$type, 'Progid')
        If @error Or  $typefile='' Then
                $typefile = RegRead('HKCR\.'&$type, '')
                If @error Then Return SetError(1)
        EndIf
        $typefile = RegRead($HKCR & '\' & $typefile & '\shell\open\command', '')
        If @error Then Return SetError(1)
        Local $aPath=StringRegExp($typefile, '(?i)(^.*)(\.exe.*)$', 3)
        If @error Then Return SetError(1)
        $aPath = StringReplace($aPath[0], '"', '') & '.exe'
        Opt('ExpandEnvStrings', 1)
        If FileExists($aPath) Then
                $aPath=$aPath
                Opt('ExpandEnvStrings', 0)
                Return $aPath
        EndIf
        Opt('ExpandEnvStrings', 0)
        If FileExists(@SystemDir&'\'&$aPath) Then Return @SystemDir&'\'&$aPath
EndFunc

;#include <File.au3>
Func _FileReadToArray($sFilePath, ByRef $aArray)
        Local $hFile = FileOpen($sFilePath, 0)
        If $hFile = -1 Then Return SetError(1, 0, 0)
        Local $aFile = FileRead($hFile, FileGetSize($sFilePath))
        If StringRight($aFile, 1) = @LF Then $aFile = StringTrimRight($aFile, 1)
        If StringRight($aFile, 1) = @CR Then $aFile = StringTrimRight($aFile, 1)
        FileClose($hFile)
        If StringInStr($aFile, @LF) Then
                $aArray = StringSplit(StringStripCR($aFile), @LF)
        ElseIf StringInStr($aFile, @CR) Then
                $aArray = StringSplit($aFile, @CR)
        Else
                If StringLen($aFile) Then
                        Dim $aArray[2] = [1, $aFile]
                Else
                        Return SetError(2, 0, 0)
                EndIf
        EndIf
        Return 1
EndFunc

Func _mode()
Local $GuiPos, $y, $M1, $M2, $M3, $M4, $Gui1, $OK, $font="Arial"
$GuiPos = WinGetPos($Gui)
GUISetState(@SW_DISABLE, $Gui)
$y=$GuiPos[1]+$GuiPos[3]/2-72
If $y < 0 Then $y= 0
    $Gui1 = GUICreate($LngMd, 210, 125,$GuiPos[0]+$GuiPos[2]/2-105, $y, -1, 0x00000080,$Gui)
       
        $url1=GUICtrlCreateLabel('home', 170, 30, 150, 15)
        GUICtrlSetCursor(-1, 0)
        GUICtrlSetColor(-1, 0x0000ff)
        GUICtrlSetFont (-1,-1, 600, 6, $font)
        $url2=GUICtrlCreateLabel('home', 170, 50, 150, 15)
        GUICtrlSetCursor(-1, 0)
        GUICtrlSetColor(-1, 0x0000ff)
        GUICtrlSetFont (-1,-1, 600, 6, $font)
        $url3=GUICtrlCreateLabel('home', 170, 70, 150, 15)
        GUICtrlSetCursor(-1, 0)
        GUICtrlSetColor(-1, 0x0000ff)
        GUICtrlSetFont (-1,-1, 600, 6, $font)
       
        $M1=GUICtrlCreateRadio($LngNoU, 10, 10, 150, 17)
        $M2=GUICtrlCreateRadio($LngUse&' regjump.exe', 10, 30, 150, 17)
        $M3=GUICtrlCreateRadio($LngUse&' regscanner.exe', 10, 50, 150, 17)
        $M4=GUICtrlCreateRadio($LngUse&' nircmd.exe', 10, 70, 150, 17)
        $OK = GUICtrlCreateButton("OK", 50, 95, 70, 23)
        Switch $mode
                Case 0
                        GUICtrlSetState($M1, 1)
                Case 1
                        GUICtrlSetState($M2, 1)
                Case 2
                        GUICtrlSetState($M3, 1)
                Case 3
                        GUICtrlSetState($M4, 1)
                Case Else
                        GUICtrlSetState($M1, 1)
        EndSwitch
       
        GUISetState(@SW_SHOW, $Gui1)
$msg = $Gui1
        While 1
          $msg = GUIGetMsg()
          Select
                Case $msg = $url1
                        ShellExecute ('http://technet.microsoft.com/en-us/sysinternals/bb963880')
                Case $msg = $url2
                        ShellExecute ('http://www.nirsoft.net/utils/regscanner.html')
                Case $msg = $url3
                        ShellExecute ('http://www.nirsoft.net/utils/nircmd.html')
                Case $msg = $OK
                        If GUICtrlRead($M1)=1 Then $mode=0
                        If GUICtrlRead($M2)=1 Then $mode=1
                        If GUICtrlRead($M3)=1 Then $mode=2
                        If GUICtrlRead($M4)=1 Then $mode=3
                        RegWrite($HKCU&'\Software\JumpRegAzjio','mode','REG_SZ', $mode)
                        If ProcessExists("regedit.exe") <> 0 Then
                                ProcessClose("regedit.exe")
                                ProcessWaitClose("regedit.exe")
                        EndIf
                        ContinueCase
                Case $msg = -3
                        $msg = $Gui
                        GUISetState(@SW_ENABLE, $Gui)
                        GUIDelete($Gui1)
                        ExitLoop
                EndSelect
    WEnd
EndFunc

Func _restart()
        Local $sAutoIt_File = @TempDir & "\~Au3_ScriptRestart_TempFile.au3"
        Local $sRunLine, $sScript_Content, $hFile

        $sRunLine = @ScriptFullPath
        If Not @Compiled Then $sRunLine = @AutoItExe & ' /AutoIt3ExecuteScript ""' & $sRunLine & '""'
        If $CmdLine[0] > 0 Then $sRunLine &= ' ' & $CmdLineRaw

        $sScript_Content &= '#NoTrayIcon' & @CRLF & _
                        'While ProcessExists(' & @AutoItPID & ')' & @CRLF & _
                        '  Sleep(10)' & @CRLF & _
                        'WEnd' & @CRLF & _
                        'Run("' & $sRunLine & '")' & @CRLF & _
                        'FileDelete(@ScriptFullPath)' & @CRLF

        $hFile = FileOpen($sAutoIt_File, 2)
        FileWrite($hFile, $sScript_Content)
        FileClose($hFile)

        Run(@AutoItExe & ' /AutoIt3ExecuteScript "' & $sAutoIt_File & '"', @ScriptDir, @SW_HIDE)
        Sleep(1000)
        Exit
EndFunc


Func _About()
Local $GuiPos, $y, $Gui1, $font, $url1, $url2
$GuiPos = WinGetPos($Gui)
GUISetState(@SW_DISABLE, $Gui)
$y=$GuiPos[1]+$GuiPos[3]/2-90
If $y < 0 Then $y= 0
$font="Arial"
    $Gui1 = GUICreate($LngAbout, 270, 180,$GuiPos[0]+$GuiPos[2]/2-135, $y, -1, 0x00000080,$Gui)
        GUISetBkColor (0xffca48)
        GUICtrlCreateLabel('JumpReg', 0, 0, 270, 63, 0x01+0x0200)
        GUICtrlSetFont (-1,15, 600, -1, $font)
        GUICtrlSetColor(-1,0xa13d00)
        GUICtrlSetBkColor (-1, 0xfbe13f)
        GUICtrlCreateLabel ("-", 2,64,268,1,0x10)
       
        GUISetFont (9, 600, -1, $font)
        GUICtrlCreateLabel($LngVer&' 0.6  9.01.2011', 55, 100, 210, 17)
        GUICtrlCreateLabel($LngSite&':', 55, 115, 40, 17)
        $url1=GUICtrlCreateLabel('azjio.ucoz.ru', 55, 115, 150, 15, 0x1)
        GUICtrlSetCursor(-1, 0)
        GUICtrlSetColor(-1, 0x0000ff)
        $url2=GUICtrlCreateLabel('oszone.net', 55, 130, 150, 15, 0x1)
        GUICtrlSetCursor(-1, 0)
        GUICtrlSetColor(-1, 0x0000ff)
        GUICtrlCreateLabel('Copyright AZJIO © 2009-2011', 55, 145, 210, 17)
        GUISetState(@SW_SHOW, $Gui1)
$msg = $Gui1
        While 1
          $msg = GUIGetMsg()
          Select
                Case $msg = $url1
                        ShellExecute ('http://azjio.ucoz.ru')
                Case $msg = $url2
                        ShellExecute ('http://forum.oszone.net')
                Case $msg = -3
                        $msg = $Gui
                        GUISetState(@SW_ENABLE, $Gui)
                        GUIDelete($Gui1)
                        ExitLoop
                EndSelect
    WEnd
EndFunc


Vadikan 24-12-2010 23:32 1573984

AZJIO, отличная работа! Мы почти у цели :) Есть несколько пожеланий.

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

2. Предлагаю снова перегруппировать меню: Избранное, История, Regedit, ?. История - Экспорт, Восстановить, Размер.

3. Восстановить историю должно выводить ошибку, если не найден файл: Файл JumpRegSet.reg не найден. Он создается командой 'Экспорт'.

4. Из справки, пожалуй, можно убрать упоминание про менеджер реестра. А вот ссылки можно сделать гипер. Я тут нашел скрипт, почему-то в справке не обнаружил. OSzone тоже можно указать, наверное :)
читать дальше »

Код:

;===============================================================================
;
; Function Name:    _GuiCtrlCreateHyperlink()
; Description:    Creates a label that acts as a hyperlink
;
; Parameter(s):  $s_Text      - Label text
;                  $i_Left        - Label left coord
;                  [$i_Top]  - Label top coord
;                  [$i_Width]    - Label width
;                  [$i_Height]    - Label height
;                  [$i_Color]    - Text Color
;                  [$s_ToolTip]  - Hyperlink ToolTip
;                  [$i_Style]    - Label style
;                  [$i_ExStyle]  - Label extended style
;
; Requirement(s):  None
; Return Value(s):  Control ID
;
; Author(s):        Saunders <krawlie@hotmail.com>
;
;===============================================================================

Func _GuiCtrlCreateHyperlink($s_Text, $i_Left, $i_Top, $i_Width = -1, $i_Height = -1, $i_Color = 0x0000ff, $s_ToolTip = '', $i_Style = -1, $i_ExStyle = -1)
    Local $i_CtrlID
    $i_CtrlID = GUICtrlCreateLabel($s_Text, $i_Left, $i_Top, $i_Width, $i_Height, $i_Style, $i_ExStyle)
    If $i_CtrlID <> 0 Then
        GUICtrlSetFont($i_CtrlID, -1, -1, 4)
        GUICtrlSetColor($i_CtrlID, $i_Color)
        GUICtrlSetCursor($i_CtrlID, 0)
        If $s_ToolTip <> '' Then
            GUICtrlSetTip($i_CtrlID, $s_ToolTip)
        EndIf
    EndIf
   
    Return $i_CtrlID
EndFunc  ;==>_GuiCtrlCreateHyperlink



Добавлю еще кое-что. Мы пообщались с Morpheus и консенсус таков, что мигание регедита напрягает :) Т.е. нужно встраивать консольный regjump.exe, чтобы этого избежать. Правильная строка запуска
Код:

Run(@ComSpec & " /c " & 'regjump.exe '&$comboreg0, "", @SW_HIDE)
Ну и надо закомментировать строки 151-154.

Мы также протестировали 64-разрядную версию (в обоих вариантах). В принципе, все работает, но история не отображается в списке (хотя в реестр пишется). Мне кажется, что имеет смысл использовать вариант с MRU, который предлагал Yashied тут. В итоге получится интересный вариант от всех инициативных лиц :)

AZJIO 25-12-2010 02:03 1574029

Vadikan, поправил по всем пунктам. Пункты из избранного в историю не попадают и открываются сразу. Справку (в кавычках) убрал, добавил "О программе" и ссылку на ресурс...

Цитата:

Цитата Vadikan
все работает, но история не отображается в списке

Переделал параметр истории в бинарный тип записи? Чтоб мозг меньше напрягать функцией MRU. Бинарная запись по любому не ограничена по размеру и каким нибудь критериям, а в скрипте всего лишь StringToBinary и BinaryToString. Попробуйте ещё раз.

И сделал при выборе пункта в истории автоматический переход без Enter. И regjump.exe конечно же...

Morpheus 25-12-2010 04:30 1574054

Vadikan, вместо тулы Марка, предлагаю использовать regscanner.exe /regedit, она есть 64. Кстати ключ /clipregedit тоже очень интересный :)
З.Ы. Скомпилил #31 в чистом виде в 64 - история работает.

AZJIO и все-все-все, спасибо! Отличная штука получается! Ещё бы её в regedit встроить :)

AZJIO 25-12-2010 11:19 1574163

Morpheus, попробовал в строке 241 изменил строку на
Код:

Run('regscanner.exe /regedit "'&$comboreg0&'"', "", @SW_HIDE)
всё работает, но не выделяет найденный раздел в дереве, как делает regjump.exe. Аналогично и с "nircmd.exe regedit"
Код:

Run('nircmd.exe regedit  "'&$comboreg0&'"', "", @SW_HIDE)
тоже работает и тоже без выделения найденного раздела.

Добавил опцию выбора метода:
а) без сторонних утилит
б) используя regjump.exe
в) используя regscanner.exe
г) используя nircmd.exe
Цитата:

Цитата Morpheus
в чистом виде в 64 - история работает. »

то есть когда был ещё без бинарной конвертации параметра History в реестре? Сейчас то я изменил это, но могу назад вернуть.

Morpheus 25-12-2010 12:49 1574214

Цитата:

Цитата AZJIO
но не выделяет найденный раздел в дереве »

На первый взгляд этого достаточно, но подумать ещё, не помешает :)
Цитата:

Цитата AZJIO
то есть когда был ещё без бинарной конвертации параметра History в реестре? »

Ага. В чистом - без регджампа и пр. модификаций.
Новый вариант тоже работает.
Цитата:

Цитата AZJIO
Добавил »

Уже? :) Этот ещё не пробовал :)

Vadikan 25-12-2010 13:34 1574241

Цитата:

Цитата AZJIO
всё работает, но не выделяет найденный раздел в дереве, как делает regjump.exe. Аналогично и с "nircmd.exe regedit" »

Угу, утилиты Nir'а переходят в раздел и ставят фокус на области с параметрами. У nircmd есть дополнительный ключ командной строки - это параметр реестра в разделе. Поскольку раздел не указан, фокус просто на области. У regscanner его нет, но поведение такое же. Вообще, это логично, поскольку при переходе в раздел человек собирается там что-то делать, наверное. Да хоть колесо мыши покрутить, если много параметров. Это позволяет избежать нажатия TAB для перехода в область параметров. Вернуть выделение можно с SHIFT+TAB.

Что касается выбора, это здорово, но есть два момента.

1. Выбор слишком велик. Сейчас разница фактически сводится к выделению раздела. Достаточно выбора между regscanner и "без утилит", потому что regjump не имеет 64-разрядной версии. Логичнее использовать regscanner, потому что он "ближе к теме".

2. Если выпускать утилиту в виде EXE, выбор вообще не нужен. Берем regscanner и усе :) Тем более, что выбор придется разъяснять как-то юзерам, лишняя морока. Т.е. можно финализировать скрипт на каком-то этапе и сделать вилку. Одна версия упрощенная для EXE, ее можно развивать дальше. Вторая - для трех-пяти энтузиастов, которым нужен мега-выбор. Они сами разберутся со скриптом, скорее всего. Кстати, диалог выбора лучше перенести в "?".

P.S. О программе - выдает ошибку и закрывает утилиту (последняя редакция скрипта).

AZJIO 25-12-2010 15:38 1574304

Vadikan, версию с выбором утилит оставляю, теперь вариант для компиляции.
1. Вернул параметр реестра не бинарный, лишняя конвертация никчему (нужно подчистить бинарный параметр в реестре).
2. Убрал выбор утилит, теперь только RegScanner.exe
3. Для компиляции нужны файлы RegScanner.exe и RegScanner_lng.ini
4. Добавил примагничивание regedit к нижнему краю утилиты. Удалил, не понравилось.
В Win7 проверил...
Цитата:

Цитата Vadikan
О программе - выдает ошибку »

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

читать дальше »
Код:

#AutoIt3Wrapper_Outfile=JumpReg.exe
#AutoIt3Wrapper_Icon=JumpReg.ico
#AutoIt3Wrapper_Compression=4
; #AutoIt3Wrapper_UseX64=y
#AutoIt3Wrapper_UseAnsi=y
#AutoIt3Wrapper_Res_Comment=
#AutoIt3Wrapper_Res_Description=JumpReg.exe
#AutoIt3Wrapper_Res_Fileversion=0.7.0.0
#AutoIt3Wrapper_Res_FileVersion_AutoIncrement=n
#AutoIt3Wrapper_Res_LegalCopyright=AZJIO
#AutoIt3Wrapper_Res_Language=1049
#AutoIt3Wrapper_Run_Au3check=n

;  @AZJIO 23.01.2011 (AutoIt3_v3.3.6.1)
#RequireAdmin
#NoTrayIcon
; FileInstall('RegScanner.exe', '*')
; FileInstall('RegScanner_lng.ini', '*') ;???
; FileInstall('RegScanner.chm', '*')

; En
$LngTitle='JumpReg'
$LngAbout='About'
$LngVer='Version'
$LngSite='Site'
$LngFIT='Define Favorites starting from the next line. After a separator | you can specify a name that has meaning only when importing favorites to Regedit; otherwise, the name is the last subkey.'
$LngFIT1='Folders user'
$LngFIT2='Environment Variables'
$LngFIT3='Environment variables, current'
$LngFav='&Favorites'
$LngEdF='Edit Favorites'
$LngHis='History'
$LngExp='Export        Ctrl+Down'
$LngImp='Import'
$LngSzH='Size'
$LngAdF='Import Favorites to Regedit        Ctrl+Up'
$LngClF='Clear Favorites        Ctrl+Del'
$LngTpE="Jump to the registry key in Regedit." & @CRLF & "Enter"
$LngSWR='Search with RegScanner        Alt+\'
$LngTop='Always on top'
$LngHsIB1='History'
$LngHsIB2='The number of records in the history:'
$LngMs1='Message'
$LngMs2='Clear Favorites in Regedit?'
$LngMs3='Add JumpRegFav.ini entries'&@CRLF&'to Regedit Favorites?'
$LngMs4='Exported successfully to JumpRegSet.reg'&@CRLF&'in the program folder.'
$LngMs5='Error'
$LngMs6='JumpRegSet.reg file not found.'&@CRLF&'You can create it with the Export command.'
$LngMs7='Error: invalid name for the root registry key'
$LngMs8='The key does not exist. The nearest key is:'
$LngMs9='Do you want to jump to it?'
$LngSLng='Language'
$LngNRE='Regedit in a new window        Ctrl+Enter'

$Lang_dll = DllOpen("kernel32.dll")
$UserIntLang=DllCall ( $Lang_dll, "int", "GetUserDefaultUILanguage" )
If Not @error Then $UserIntLang=Hex($UserIntLang[0],4)
DllClose($Lang_dll)

; Ru
; если русская локализация, то русский язык
If $UserIntLang = 0419 Then
        $LngTitle='Прыжок в указанный раздел реестра'
        $LngAbout='О программе'
        $LngVer='Версия'
        $LngSite='Сайт'
        $LngFIT='Указывайте Избранное, начиная с третьей строки. После разделителя | можно указать имя (имеет значение только при импорте избранного в Regedit), иначе именем становится последний подраздел.'
        $LngFIT1='Папки пользователя'
        $LngFIT2='Переменные среды'
        $LngFIT3='Переменные среды текущего'
        $LngFav='&Избранное'
        $LngEdF='Редактировать избранное'
        $LngHis='И&стория'
        $LngExp='Экспорт        Ctrl+Down'
        $LngImp='Импорт'
        $LngSzH='Размер'
        $LngAdF='Добавить в Избранное        Ctrl+Up'
        $LngClF='Очистить Избранное        Ctrl+Del'
        $LngTpE="Перейти в regedit" & @CRLF & "в указанный раздел реестра." & @CRLF & "Enter"
        $LngSWR='Поиск в RegScanner        Alt+\'
        $LngTop='Поверх всех окон'
        $LngHsIB1='История'
        $LngHsIB2='Количество записей в истории:'
        $LngMs1='Сообщение'
        $LngMs2='Очистить Избранное в Regedit?'
        $LngMs3='Добавить разделы из JumpRegFav.ini' & @CRLF & 'в Избранное Regedit?'
        $LngMs4='Экспорт выполнен в файл JumpRegSet.reg'&@CRLF&'в папку программы.'
        $LngMs5='Ошибка'
        $LngMs6='Файл JumpRegSet.reg не найден.'&@CRLF&'Его можно создать командой Экспорт.'
        $LngMs7='Ошибка имени корневого раздела'
        $LngMs8='Раздела не существует.'&@CRLF&'Ближайший доступный раздел:'
        $LngMs9='Перейти в него?'
        $LngSLng='Язык интерфейса'
        $LngNRE='Regedit в новом окне        Ctrl+Enter'
EndIf

Switch @OSArch
    Case 'X64'
        $HKCU='HKCU64'
        $HKCR='HKCR64'
    Case Else;'X86'
        $HKCU='HKCU'
        $HKCR='HKCR'
EndSwitch

$LangPath=RegRead($HKCU&'\Software\JumpRegAzjio', 'Lang')
If Not @error Then
        If FileExists(@ScriptDir&'\Lang\'&$LangPath) Then
                $aLng = IniReadSection(@ScriptDir&'\Lang\'&$LangPath, 'lng')
                If Not @error Then
                        For $i = 1 To $aLng[0][0]
                                If StringInStr($aLng[$i][1], '\r\n') Then $aLng[$i][1]=StringReplace($aLng[$i][1],'\r\n',@CRLF)
                                If IsDeclared('Lng'&$aLng[$i][0]) Then Assign('Lng'&$aLng[$i][0],$aLng[$i][1])
                        Next
                EndIf
        Else
                RegDelete($HKCU&'\Software\JumpRegAzjio', 'Lang')
        EndIf
EndIf


Global $aRecords, $kol_item, $list='', $aPos, $TrTop=0, $TrNRE=0
Global $Ini = @ScriptDir & '\JumpRegFav.ini'
$FileTmp=''

$kol_item=RegRead($HKCU&'\Software\JumpRegAzjio', 'HistorySize')
If @error Or StringIsDigit($kol_item)=0 Or $kol_item = '' Or $kol_item>50 Then $kol_item=26 ; количество пунктов в комбобоксе
$Xsz=90
$Xsz2=84
$Jx=5
$Js=23
Switch @OSVersion
    Case 'WIN_VISTA', 'WIN_7'
        $Xsz=91
                $Xsz2=77
                $Jx=4
                $Js=24
EndSwitch
GUIRegisterMsg(0x0024, "WM_GETMINMAXINFO")

If Not FileExists($Ini) And DriveStatus(StringLeft(@ScriptDir, 1))<>'NOTREADY' Then
$file = FileOpen($Ini,2)
FileWrite($file, '[Favorites]' & @CRLF & _
'; '&$LngFIT & @CRLF & _
'HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders|'&$LngFIT1 & @CRLF & _
'HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders|'&$LngFIT1&' 2' & @CRLF & _
'HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager\Environment|'&$LngFIT2 & @CRLF & _
'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run|Run (all)' & @CRLF & _
'HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run' & @CRLF & _
'HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\MenuExt' & @CRLF & _
'HKEY_CURRENT_USER\Environment|'&$LngFIT3 & @CRLF & _
'HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices' & @CRLF & _
'HKEY_CLASSES_ROOT\Folder' & @CRLF & _
'HKEY_CLASSES_ROOT\Directory' & @CRLF & _
'HKEY_CLASSES_ROOT\Drive' & @CRLF & _
'HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced' & @CRLF & _
'HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts')
FileClose($file)
EndIf

If Not _FileReadToArray($Ini, $aRecords) Then
        Dim $aRecords[4]=['3', '', '', 'HKEY_CURRENT_USER\Software']
Else
        $file = FileOpen($Ini, 0)
        $FileTmp = FileRead($file)
        FileClose($file)
EndIf

$Pos=RegRead($HKCU&'\Software\JumpRegAzjio', 'Pos')
If @error Or Not StringInStr($Pos, '|') Then $Pos='-1|-1'
$aPos=StringSplit($Pos, '|')
If $aPos[1] > @DesktopWidth-548 Or $aPos[2]>@DesktopHeight-$Xsz2 Then
        $aPos[1]=-1
        $aPos[2]=-1
EndIf

$GUI=GUICreate($LngTitle, 548, $Xsz2, $aPos[1], $aPos[2], 0x00040000+0x00020000+0x00010000)
If Not @compiled Then GUISetIcon('JumpReg.ico')

$FavM=GUICtrlCreateMenu($LngFav)
$runfav=GUICtrlCreateMenuitem($LngEdF, $FavM)
GUICtrlCreateMenuitem('', $FavM)

For $i = 3 To $aRecords[0]
        If StringInStr($aRecords[$i], '|') Then
                $list&=StringRegExpReplace($aRecords[$i], '(.*?\|).*', '\1')
        Else
                $list&=$aRecords[$i]&'|'
        EndIf
Next

$list=StringTrimRight($list, 1)
$tmp=StringSplit($list, '|')
Dim $aList2[$tmp[0]+1][3]
$aList2[0][0]=$tmp[0]

For $i = 1 To $aList2[0][0]
        $aList2[$i][1]=$tmp[$i]
        $aList2[$i][0]=GUICtrlCreateMenuitem($aList2[$i][1], $FavM)
Next
$tmp=''
$list=RegRead($HKCU&'\Software\JumpRegAzjio', 'History')

$HisM=GUICtrlCreateMenu($LngHis)
$Export=GUICtrlCreateMenuitem($LngExp, $HisM)
$Import=GUICtrlCreateMenuitem($LngImp, $HisM)
$HisSz=GUICtrlCreateMenuitem($LngSzH, $HisM)

$RegM=GUICtrlCreateMenu('&Regedit')
$favorites=GUICtrlCreateMenuitem($LngAdF, $RegM)
$Clean=GUICtrlCreateMenuitem($LngClF, $RegM)
GUICtrlCreateMenuitem('', $RegM)
$SearchWRS=GUICtrlCreateMenuitem($LngSWR, $RegM)
$NewREt=GUICtrlCreateMenuitem($LngNRE, $RegM)

$ActM=GUICtrlCreateMenu('?')
$About=GUICtrlCreateMenuitem($LngAbout, $ActM)
$Topmost =GUICtrlCreateMenuitem($LngTop, $ActM)
$SelLng =GUICtrlCreateMenuitem($LngSLng, $ActM)

$Jump = GUICtrlCreateButton("E", 517, $Jx, $Js, $Js, 0x0040)
GUICtrlSetTip(-1, $LngTpE)
GUICtrlSetResizing(-1, 512 + 256 +32+ 4)
GUICtrlSetImage(-1, @SystemDir & '\shell32.dll', -138, 0)

$comboreg = GUICtrlCreateCombo("", 6, 5, 509)
GUICtrlSetResizing(-1, 2 + 4 +32)
If $list<>'' Then GUICtrlSetData(-1, '|'&$list, '')
_HisSz()

$Editor=_EXE_Path('txt')
If @error Then $Editor=@SystemDir&'\notepad.exe'

Dim $AccelKeys[6][2] = [ _
["{Enter}", $Jump], _
["^{Enter}", $NewREt], _
["^{UP}", $favorites], _
["^{DEL}", $Clean], _
["!{\}", $SearchWRS], _
["^{DOWN}", $Export]]
GUISetAccelerators($AccelKeys)

GUICtrlSetState($comboreg, 256)
GUISetState()
GUISetState(@SW_RESTORE)
Sleep(200)
WinSetOnTop($GUI, '', 1)
WinSetOnTop($GUI, '', 0)

$TrTop=RegRead('HKCU\Software\JumpRegAzjio', 'Topmost')
If Not @error And $TrTop=1 Then
        WinSetOnTop($GUI, '', 1)
        GUICtrlSetState($Topmost, 1)
EndIf

While 1
        $msg = GUIGetMsg()
        For $i = 1 To $aList2[0][0]
                If $msg = $aList2[$i][0] Then
                        _Jump($aList2[$i][1])
                EndIf
        Next
       
        Select
                Case $msg = $SelLng
                        $OpenFile = FileOpenDialog('Open', @ScriptDir&'\Lang' , "Language (*.ini)", 3, "", $Gui)
                        If @error Then ContinueLoop
                        RegWrite($HKCU&'\Software\JumpRegAzjio','Lang','REG_SZ', StringRegExpReplace($OpenFile,'(^.*)\\(.*)$','\2'))
                        _restart()
                       
                Case $msg = $SearchWRS
                        Run('RegScanner\RegScanner.exe')
       
                Case $msg = $HisSz
                        $tmp = InputBox($LngHsIB1, $LngHsIB2, $kol_item, '', 200, 135)
                        If Not StringIsDigit($tmp) Then ContinueLoop
                        $kol_item=Execute($tmp)
                        If $kol_item>50 Then $kol_item=50
                        RegWrite($HKCU&'\Software\JumpRegAzjio','HistorySize','REG_SZ', $kol_item)
                        _HisSz()
       
                Case $msg = $Clean
                        If MsgBox(4, $LngMs1, $LngMs2)=7 Then ContinueLoop
                        RegDelete($HKCU&'\Software\Microsoft\Windows\CurrentVersion\Applets\Regedit\Favorites')
                        GUICtrlSetState($comboreg, 256)

                Case $msg = $favorites
                        If MsgBox(4, $LngMs1, $LngMs3)=7 Then ContinueLoop
                        For $i = 3 To $aRecords[0]
                                If StringInStr($aRecords[$i], '|') Then
                                        $aReg = StringSplit($aRecords[$i], "|")
                                Else
                                        Dim $aReg[3]
                                        $aReg[2] = StringRegExpReplace('t\\'&$aRecords[$i], "(^.*)\\(.*)$", '\2')
                                        $aReg[1] = $aRecords[$i]
                                EndIf
                                If StringLeft($aReg[1], 2)<>'HK' Then ContinueLoop
                                RegWrite($HKCU&'\Software\Microsoft\Windows\CurrentVersion\Applets\Regedit\Favorites', $aReg[2], "REG_SZ", $aReg[1])
                        Next
                        If ProcessExists("regedit.exe") Then
                                ContinueLoop
                        Else
                                Run('regedit.exe')
                        EndIf
                        GUICtrlSetState($comboreg, 256)
                       
                Case $msg = $NewREt
                        $TrNRE=1
                        ContinueCase

                Case $msg = $Jump Or $msg = $comboreg
                        $comboreg0 = GUICtrlRead($comboreg)
                        $runyes=_Jump($comboreg0)
                        If $runyes Then ContinueLoop

                        GUICtrlSendMsg($comboreg, 0x14B, 0, 0)
                        If StringInStr('|'&$list&'|', '|'&$comboreg0&'|') Then
                                $list=StringReplace('|'&$list&'|', '|'&$comboreg0&'|', '|')
                                $list=StringRegExpReplace($list, '^\|?(.*?)\|?$', '\1')
                        EndIf
                        If $list='' Then
                                $list=$comboreg0
                        Else
                                $list=$comboreg0&'|'&$list
                        EndIf
                        StringReplace($list, '|', '|')
                        If @extended>$kol_item-1 Then $list=StringRegExpReplace($list, '(^.*)\|.*$', '\1')
                        GUICtrlSetData($comboreg, $list, $comboreg0)
                        GUICtrlSetState($comboreg, 256)
                        RegWrite($HKCU&'\Software\JumpRegAzjio','History','REG_SZ',$list)

                Case $msg = $Export
                        _Pos()
                        If FileExists(@ScriptDir & '\JumpRegSet.reg') Then FileDelete(@ScriptDir & '\JumpRegSet.reg')
                        RunWait(@SystemDir&'\reg.exe export HKCU\Software\JumpRegAzjio "'&@ScriptDir & '\JumpRegSet.reg"', '', @SW_HIDE )
                        MsgBox(0, $LngMs1, $LngMs4)

                Case $msg = $Import
                        If FileExists(@ScriptDir & '\JumpRegSet.reg') Then
                                ShellExecuteWait(@ScriptDir&'\JumpRegSet.reg')
                                GUICtrlSendMsg($comboreg, 0x14B, 0, 0)
                                $list=RegRead($HKCU&'\Software\JumpRegAzjio', 'History')
                                If $list<>'' Then GUICtrlSetData(-1, $list, StringRegExpReplace($list, '(.*?)\|.*', '\1'))
                                _HisSz()
                        Else
                                MsgBox(0, $LngMs5, $LngMs6)
                        EndIf
                       
      Case $msg = $Topmost
                        $TrTop=RegRead($HKCU&'\Software\JumpRegAzjio', 'Topmost')
                        If @error Then $TrTop=0
                        If $TrTop = 0 Then
                                WinSetOnTop($GUI, '', 1)
                                RegWrite($HKCU&'\Software\JumpRegAzjio','Topmost','REG_SZ', '1')
                                GUICtrlSetState($Topmost, 1)
                        Else
                                WinSetOnTop($GUI, '', 0)
                                RegWrite($HKCU&'\Software\JumpRegAzjio','Topmost','REG_SZ', '0')
                                GUICtrlSetState($Topmost, 4)
                        EndIf
                       
      Case $msg = $About
          _About()
               
                Case $msg = $runfav
                        Run($Editor&' '&@ScriptDir & '\JumpRegFav.ini')
                        ; Run(@SystemDir&'\notepad.exe '&@ScriptDir & '\JumpRegFav.ini')
                Case $msg = -3
                        _Pos()
                        Exit
        EndSelect
WEnd

Func _Pos()
        $GuiPos = WinGetPos($Gui)
        If $GuiPos[0] < 0 Or $GuiPos[1]< 0 Then
                $GuiPos[0]=$aPos[1]
                $GuiPos[1]=$aPos[2]
        EndIf
        RegWrite($HKCU&'\Software\JumpRegAzjio','Pos','REG_SZ',$GuiPos[0]&'|'&$GuiPos[1])
EndFunc

Func _Jump(ByRef $comboreg0)
        If StringRight($comboreg0, 1)='\' Then $comboreg0=StringTrimRight($comboreg0, 1)

        If StringInStr(';HKLM;HKU;HKCU;HKCR;HKCC;', ';' & StringRegExpReplace($comboreg0, '(.*?)\\.*', '\1') & ';') Then
                $aSmlNm = StringRegExp($comboreg0, '(^.*?)(\\.*)$', 3)
                If @error Then Dim $aSmlNm[2]=[$comboreg0, '']

                Switch $aSmlNm[0]
                        Case 'HKLM'
                                $aSmlNm[0] = 'HKEY_LOCAL_MACHINE'
                        Case 'HKU'
                                $aSmlNm[0] = 'HKEY_USERS'
                        Case 'HKCU'
                                $aSmlNm[0] = 'HKEY_CURRENT_USER'
                        Case 'HKCR'
                                $aSmlNm[0] = 'HKEY_CLASSES_ROOT'
                        Case 'HKCC'
                                $aSmlNm[0] = 'HKEY_CURRENT_CONFIG'
                EndSwitch
                $comboreg0 = $aSmlNm[0] & $aSmlNm[1]
        EndIf
       
        ;проверяем существование раздела реестра
        If Not _Reg_Exists($comboreg0) Then
                While Not _Reg_Exists($comboreg0)
                        $comboreg0=StringRegExpReplace($comboreg0, '(.*)\\.*', '\1')
                        If @Extended=0 Then
                                MsgBox(0, $LngMs5, $LngMs7)
                                Return 1
                        EndIf
                WEnd
                If MsgBox(4, $LngMs5, $LngMs8&@CRLF&$comboreg0 &@CRLF&@CRLF&$LngMs9)=7 Then Return 1
        EndIf
       
        If $TrNRE=1 Then
                $TrNRE=0
                Run('regedit -m')
                WinWaitActive('[CLASS:RegEdit_RegEdit]')
        EndIf
        Run('RegScanner\RegScanner.exe /regedit "'&$comboreg0&'"', "", @SW_HIDE)
EndFunc

Func _HisSz()
        StringReplace($list, '|', '|')
        If @extended>$kol_item-1 Then
                $tmp=StringInStr($list, '|', 0, $kol_item)
                $list=StringMid($list, 1, $tmp-1)
                GUICtrlSendMsg($comboreg, 0x14B, 0, 0)
                GUICtrlSetData($comboreg, $list, StringRegExpReplace($list, '(.*?)\|.*', '\1'))
                RegWrite($HKCU&'\Software\JumpRegAzjio','History','REG_SZ',$list)
        EndIf
        GUICtrlSetState($comboreg, 256)
EndFunc

;  MerkurAlex (mod AZJIO)
; http://www.autoitscript.com/forum/topic/70203-regexists/page__view__findpost__p__514688
Func _Reg_Exists($key)
    Local $Err=RunWait('reg query "'&$key&'"','',@SW_HIDE)
    If $Err=0 Then
        Return 1
    Else
        Return 0
    Endif
EndFunc

Func WM_GETMINMAXINFO($hWnd, $iMsg, $wParam, $lParam)
        #forceref $iMsg, $wParam
        If $hWnd = $GUI Then
                Local $tMINMAXINFO = DllStructCreate("int;int;" & _
                                "int MaxSizeX; int MaxSizeY;" & _
                                "int MaxPositionX;int MaxPositionY;" & _
                                "int MinTrackSizeX; int MinTrackSizeY;" & _
                                "int MaxTrackSizeX; int MaxTrackSizeY", _
                                $lParam)
                DllStructSetData($tMINMAXINFO, "MaxTrackSizeX", 1280)
                DllStructSetData($tMINMAXINFO, "MaxTrackSizeY", $Xsz)
                DllStructSetData($tMINMAXINFO, "MinTrackSizeX", 300)
                DllStructSetData($tMINMAXINFO, "MinTrackSizeY", $Xsz)
                DllStructSetData($tMINMAXINFO, "MaxSizeX", 800)
                DllStructSetData($tMINMAXINFO, "MaxSizeY", $Xsz)
                DllStructSetData($tMINMAXINFO, "MaxPositionX", @DesktopWidth/2-400)
                DllStructSetData($tMINMAXINFO, "MaxPositionY", 0)
        EndIf
EndFunc

Func _EXE_Path($type)
        Local $typefile = RegRead($HKCR &'\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.'&$type, 'Progid')
        If @error Or  $typefile='' Then
                $typefile = RegRead('HKCR\.'&$type, '')
                If @error Then Return SetError(1)
        EndIf
        $typefile = RegRead($HKCR & '\' & $typefile & '\shell\open\command', '')
        If @error Then Return SetError(1)
        Local $aPath=StringRegExp($typefile, '(?i)(^.*)(\.exe.*)$', 3)
        If @error Then Return SetError(1)
        $aPath = StringReplace($aPath[0], '"', '') & '.exe'
        Opt('ExpandEnvStrings', 1)
        If FileExists($aPath) Then
                $aPath=$aPath
                Opt('ExpandEnvStrings', 0)
                Return $aPath
        EndIf
        Opt('ExpandEnvStrings', 0)
        If FileExists(@SystemDir&'\'&$aPath) Then Return @SystemDir&'\'&$aPath
EndFunc

;#include <File.au3>
Func _FileReadToArray($sFilePath, ByRef $aArray)
        Local $hFile = FileOpen($sFilePath, 0)
        If $hFile = -1 Then Return SetError(1, 0, 0)
        Local $aFile = FileRead($hFile, FileGetSize($sFilePath))
        If StringRight($aFile, 1) = @LF Then $aFile = StringTrimRight($aFile, 1)
        If StringRight($aFile, 1) = @CR Then $aFile = StringTrimRight($aFile, 1)
        FileClose($hFile)
        If StringInStr($aFile, @LF) Then
                $aArray = StringSplit(StringStripCR($aFile), @LF)
        ElseIf StringInStr($aFile, @CR) Then
                $aArray = StringSplit($aFile, @CR)
        Else
                If StringLen($aFile) Then
                        Dim $aArray[2] = [1, $aFile]
                Else
                        Return SetError(2, 0, 0)
                EndIf
        EndIf
        Return 1
EndFunc

Func _restart()
        Local $sAutoIt_File = @TempDir & "\~Au3_ScriptRestart_TempFile.au3"
        Local $sRunLine, $sScript_Content, $hFile

        $sRunLine = @ScriptFullPath
        If Not @Compiled Then $sRunLine = @AutoItExe & ' /AutoIt3ExecuteScript ""' & $sRunLine & '""'
        If $CmdLine[0] > 0 Then $sRunLine &= ' ' & $CmdLineRaw

        $sScript_Content &= '#NoTrayIcon' & @CRLF & _
                        'While ProcessExists(' & @AutoItPID & ')' & @CRLF & _
                        '  Sleep(10)' & @CRLF & _
                        'WEnd' & @CRLF & _
                        'Run("' & $sRunLine & '")' & @CRLF & _
                        'FileDelete(@ScriptFullPath)' & @CRLF

        $hFile = FileOpen($sAutoIt_File, 2)
        FileWrite($hFile, $sScript_Content)
        FileClose($hFile)

        Run(@AutoItExe & ' /AutoIt3ExecuteScript "' & $sAutoIt_File & '"', @ScriptDir, @SW_HIDE)
        Sleep(1000)
        Exit
EndFunc


Func _About()
Local $GuiPos, $y, $Gui1, $font, $url1, $url2
$GuiPos = WinGetPos($Gui)
GUISetState(@SW_DISABLE, $Gui)
$y=$GuiPos[1]+$GuiPos[3]/2-90
If $y < 0 Then $y= 0
$font="Arial"
    $Gui1 = GUICreate($LngAbout, 270, 180,$GuiPos[0]+$GuiPos[2]/2-135, $y, -1, 0x00000080,$Gui)
        GUISetBkColor (0xffca48)
        GUICtrlCreateLabel('JumpReg', 0, 0, 270, 63, 0x01+0x0200)
        GUICtrlSetFont (-1,15, 600, -1, $font)
        GUICtrlSetColor(-1,0xa13d00)
        GUICtrlSetBkColor (-1, 0xfbe13f)
        GUICtrlCreateLabel ("-", 2,64,268,1,0x10)
       
        GUISetFont (9, 600, -1, $font)
        GUICtrlCreateLabel($LngVer&' 0.7  23.01.2011', 55, 100, 210, 17)
        GUICtrlCreateLabel($LngSite&':', 55, 115, 40, 17)
        $url1=GUICtrlCreateLabel('azjio.ucoz.ru', 55, 115, 150, 15, 0x1)
        GUICtrlSetCursor(-1, 0)
        GUICtrlSetColor(-1, 0x0000ff)
        $url2=GUICtrlCreateLabel('oszone.net', 55, 130, 150, 15, 0x1)
        GUICtrlSetCursor(-1, 0)
        GUICtrlSetColor(-1, 0x0000ff)
        GUICtrlCreateLabel('Copyright AZJIO © 2009-2011', 55, 145, 210, 17)
        GUISetState(@SW_SHOW, $Gui1)
$msg = $Gui1
        While 1
          $msg = GUIGetMsg()
          Select
                Case $msg = $url1
                        ShellExecute ('http://azjio.ucoz.ru')
                Case $msg = $url2
                        ShellExecute ('http://forum.oszone.net')
                Case $msg = -3
                        $msg = $Gui
                        GUISetState(@SW_ENABLE, $Gui)
                        GUIDelete($Gui1)
                        ExitLoop
                EndSelect
    WEnd
EndFunc


Vadikan 25-12-2010 16:44 1574332

AZJIO, спасибо!

Прилепление к регедиту не работает, но оно далеко не всем понадобится.

Я поправил все сообщения в интерфейсе, чтобы они понятнее были (и короче). Код не трогал, разве что размер окна Истории. И убрал C:\ из путей к файлам regscanner, пусть они лежат в папке с программой :)

Morpheus, потестит х64 :)

Код
читать дальше »
Код:

#AutoIt3Wrapper_Outfile=JumpReg.exe
#AutoIt3Wrapper_Icon=JumpReg.ico
#AutoIt3Wrapper_Compression=4
#AutoIt3Wrapper_UseAnsi=y
#AutoIt3Wrapper_Res_Comment=
#AutoIt3Wrapper_Res_Description=JumpReg.exe
#AutoIt3Wrapper_Res_Fileversion=0.4.0.0
#AutoIt3Wrapper_Res_FileVersion_AutoIncrement=n
#AutoIt3Wrapper_Res_LegalCopyright=AZJIO
#AutoIt3Wrapper_Res_Language=1049
#AutoIt3Wrapper_Run_Au3check=n

;  @AZJIO 25.12.2010 (AutoIt3_v3.2.12.1+)
#RequireAdmin
#NoTrayIcon
FileInstall('RegScanner.exe', '*')
FileInstall('RegScanner_lng.ini', '*')
Opt("GUIResizeMode", 0x0322)
GUIRegisterMsg(0x0024, "WM_GETMINMAXINFO")
Global $aRecords, $kol_item, $list='', $GP=-11, $GPtmp=12
Global $Ini = @ScriptDir & '\JumpRegFav.ini'
$FileTmp=''

$kol_item=RegRead('HKCU\Software\JumpRegAzjio', 'HistorySize')
If @error Or StringIsDigit($kol_item)=0 Or $kol_item = '' Or $kol_item>50 Then $kol_item=26 ; количество пунктов в комбобоксе
$Xsz=90
Switch @OSVersion
    Case 'WIN_VISTA', 'WIN_7'
        $Xsz=98
EndSwitch
; HotKeySet("!{ESC}", "_restart") ; для теста утилиты

If Not FileExists($Ini) And DriveStatus(StringLeft(@ScriptDir, 1))<>'NOTREADY' Then
$file = FileOpen($Ini,2)
FileWrite($file, '[Favorites]' & @CRLF & _
'; Указывайте Избранное, начиная со следующей строки. После разделителя | можно указать имя (имеет значение только при импорте избранного в Regedit), иначе именем становится последний подраздел.' & @CRLF & _
'HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders|Папки пользователя' & @CRLF & _
'HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders|Папки пользователя 2' & @CRLF & _
'HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager\Environment|Переменные среды' & @CRLF & _
'HKEY_CURRENT_USER\Environment|Переменные среды текущего' & @CRLF & _
'HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices' & @CRLF & _
'HKEY_CLASSES_ROOT\Folder' & @CRLF & _
'HKEY_CLASSES_ROOT\Directory' & @CRLF & _
'HKEY_CLASSES_ROOT\Drive' & @CRLF & _
'HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced')
FileClose($file)
EndIf

If Not _FileReadToArray($Ini, $aRecords) Then
        Dim $aRecords[4]=['3', '', '', 'HKEY_CURRENT_USER\Software']
Else
        $file = FileOpen($Ini, 0)
        $FileTmp = FileRead($file)
        FileClose($file)
EndIf

$GUI=GUICreate("Прыжок в указанный раздел реестра", 548, 84, -1, -1, 0x00040000+0x00020000+0x00010000)

$FavM=GUICtrlCreateMenu('&Избранное')
$runfav=GUICtrlCreateMenuitem('Открыть JumpRegFav.ini', $FavM)
GUICtrlCreateMenuitem('', $FavM)

For $i = 3 To $aRecords[0]
        If StringInStr($aRecords[$i], '|') Then
                $list&=StringRegExpReplace($aRecords[$i], '(.*?\|).*', '\1')
        Else
                $list&=$aRecords[$i]&'|'
        EndIf
Next

$list=StringTrimRight($list, 1)
$tmp=StringSplit($list, '|')
Dim $aList2[$tmp[0]+1][3]
$aList2[0][0]=$tmp[0]

For $i = 1 To $aList2[0][0]
        $aList2[$i][1]=$tmp[$i]
        $aList2[$i][0]=GUICtrlCreateMenuitem($aList2[$i][1], $FavM)
Next
$tmp=''
$list=RegRead('HKCU\Software\JumpRegAzjio', 'History')

$HisM=GUICtrlCreateMenu('И&стория')
$Save=GUICtrlCreateMenuitem('Экспорт', $HisM)
$ReHis=GUICtrlCreateMenuitem('Импорт', $HisM)
$HisSz=GUICtrlCreateMenuitem('Размер', $HisM)

$RegM=GUICtrlCreateMenu('&Regedit')
$favorites=GUICtrlCreateMenuitem('Добавить в Избранное', $RegM)
$Clean=GUICtrlCreateMenuitem('Очистить Избранное', $RegM)

$ActM=GUICtrlCreateMenu('?')
$About=GUICtrlCreateMenuitem('О программе', $ActM)

$Jump = GUICtrlCreateButton("П", 517, 5, 23, 23, 0x0040)
GUICtrlSetTip(-1, "Перейти в regedit" & @CRLF & "в указанный раздел реестра." & @CRLF & "Enter")
GUICtrlSetResizing(-1, 512 + 256 +32+ 4)
GUICtrlSetImage(-1, @SystemDir & '\shell32.dll', -138, 0)

$comboreg = GUICtrlCreateCombo("", 7, 5, 508)
GUICtrlSetResizing(-1, 2 + 4 +32)
If $list<>'' Then GUICtrlSetData(-1, $list, StringRegExpReplace($list, '(.*?)\|.*', '\1'))
_HisSz()

$Editor=_EXE_Path('txt')
If @error Then $Editor=@SystemDir&'\notepad.exe'

Dim $AccelKeys[4][2] = [["{Enter}", $Jump],["^{UP}", $favorites],["^{DEL}", $Clean],["^{DOWN}", $Save]]
GUISetAccelerators($AccelKeys)

GUICtrlSetState($comboreg, 256)
GUISetState()

While 1
        $msg = GUIGetMsg()
        For $i = 1 To $aList2[0][0]
                If $msg = $aList2[$i][0] Then
                        _Jump($aList2[$i][1])
                EndIf
        Next
       
        Select
                Case $msg = $HisSz
                        $tmp = InputBox('История', 'Количество записей в истории:', $kol_item, '', 200, 135)
                        If Not StringIsDigit($tmp) Or Execute($tmp)>50 Then ContinueLoop
                        $kol_item=Execute($tmp)
                        RegWrite('HKCU\Software\JumpRegAzjio','HistorySize','REG_SZ', $kol_item)
                        _HisSz()
       
                Case $msg = $Clean
                        If MsgBox(4, "Сообщение", "Очистить Избранное в Regedit?")=7 Then ContinueLoop
                        RegDelete("HKCU\Software\Microsoft\Windows\CurrentVersion\Applets\Regedit\Favorites")
                        GUICtrlSetState($comboreg, 256)

                Case $msg = $favorites
                        If MsgBox(4, "Сообщение", "Добавить разделы из JumpRegFav.ini" & @CRLF & "в Избранное Regedit?")=7 Then ContinueLoop
                        For $i = 3 To $aRecords[0]
                                If StringInStr($aRecords[$i], '|') Then
                                        $aReg = StringSplit($aRecords[$i], "|")
                                Else
                                        Dim $aReg[3]
                                        $aReg[2] = StringRegExpReplace('t\\'&$aRecords[$i], "(^.*)\\(.*)$", '\2')
                                        $aReg[1] = $aRecords[$i]
                                EndIf
                                If StringLeft($aReg[1], 2)<>'HK' Then ContinueLoop
                                RegWrite("HKCU\Software\Microsoft\Windows\CurrentVersion\Applets\Regedit\Favorites", $aReg[2], "REG_SZ", $aReg[1])
                        Next
                        If ProcessExists("regedit.exe") Then
                                ContinueLoop
                        Else
                                Run('regedit.exe')
                        EndIf
                        GUICtrlSetState($comboreg, 256)

                Case $msg = $Jump Or $msg = $comboreg
                        $comboreg0 = GUICtrlRead($comboreg)
                        _Jump($comboreg0)

                        GUICtrlSendMsg($comboreg, 0x14B, 0, 0)
                        If StringInStr('|'&$list&'|', '|'&$comboreg0&'|') Then
                                $list=StringReplace('|'&$list&'|', '|'&$comboreg0&'|', '|')
                                $list=StringRegExpReplace($list, '^\|?(.*?)\|?$', '\1')
                        EndIf
                        If $list='' Then
                                $list=$comboreg0
                        Else
                                $list=$comboreg0&'|'&$list
                        EndIf
                        StringReplace($list, '|', '|')
                        If @extended>$kol_item-1 Then $list=StringRegExpReplace($list, '(^.*)\|.*$', '\1')
                        GUICtrlSetData($comboreg, $list, $comboreg0)
                        GUICtrlSetState($comboreg, 256)
                        RegWrite('HKCU\Software\JumpRegAzjio','History','REG_SZ',$list)

                Case $msg = $Save
                        If FileExists(@ScriptDir & '\JumpRegSet.reg') Then FileDelete(@ScriptDir & '\JumpRegSet.reg')
                        RunWait(@SystemDir&'\reg.exe export HKCU\Software\JumpRegAzjio "'&@ScriptDir & '\JumpRegSet.reg"', '', @SW_HIDE )
                        MsgBox(0, 'Сообщение', 'Экспорт выполнен в файл JumpRegSet.reg'&@CRLF&'в папку программы.')

                Case $msg = $ReHis
                        If FileExists(@ScriptDir & '\JumpRegSet.reg') Then
                                ShellExecuteWait(@ScriptDir&'\JumpRegSet.reg')
                                GUICtrlSendMsg($comboreg, 0x14B, 0, 0)
                                $list=RegRead('HKCU\Software\JumpRegAzjio', 'History')
                                If $list<>'' Then GUICtrlSetData(-1, $list, StringRegExpReplace($list, '(.*?)\|.*', '\1'))
                                _HisSz()
                        Else
                                MsgBox(0, 'Ошибка', 'Файл JumpRegSet.reg не найден.'&@CRLF&'Его можно создать командой Экспорт.')
                        EndIf
                       
      Case $msg = $About
          _About()
               
                Case $msg = $runfav
                        Run($Editor&' '&@ScriptDir & '\JumpRegFav.ini')
                        ; Run(@SystemDir&'\notepad.exe '&@ScriptDir & '\JumpRegFav.ini')
                Case $msg = -3
                        ExitLoop
        EndSelect
WEnd

Func _Jump(ByRef $comboreg0)
        If StringRight($comboreg0, 1)='\' Then $comboreg0=StringTrimRight($comboreg0, 1)

        If StringInStr(';HKLM;HKU;HKCU;HKCR;HKCC;', ';' & StringRegExpReplace($comboreg0, '(.*?)\\.*', '\1') & ';') Then
                $aSmlNm = StringRegExp($comboreg0, '(^.*?)(\\.*)$', 3)
                If @error Then Dim $aSmlNm[2]=[$comboreg0, '']

                Switch $aSmlNm[0]
                        Case 'HKLM'
                                $aSmlNm[0] = 'HKEY_LOCAL_MACHINE'
                        Case 'HKU'
                                $aSmlNm[0] = 'HKEY_USERS'
                        Case 'HKCU'
                                $aSmlNm[0] = 'HKEY_CURRENT_USER'
                        Case 'HKCR'
                                $aSmlNm[0] = 'HKEY_CLASSES_ROOT'
                        Case 'HKCC'
                                $aSmlNm[0] = 'HKEY_CURRENT_CONFIG'
                EndSwitch
                $comboreg0 = $aSmlNm[0] & $aSmlNm[1]
        EndIf
       
        ;проверяем существование раздела реестра
        If Not _Reg_Exists($comboreg0) Then
                While Not _Reg_Exists($comboreg0)
                        $comboreg0=StringRegExpReplace($comboreg0, '(.*)\\.*', '\1')
                        If @Extended=0 Then
                                MsgBox(0, 'Ошибка', 'Ошибка имени корневого раздела')
                                Return
                        EndIf
                WEnd
                If MsgBox(4, 'Ошибка', 'Раздела не существует.'&@CRLF&'Ближайший доступный раздел: '& _
                @CRLF&$comboreg0 &@CRLF&@CRLF& 'Перейти в него?')=7 Then Return
        EndIf

        Run('regscanner.exe /regedit "'&$comboreg0&'"', "", @SW_HIDE)

EndFunc

Func _HisSz()
        StringReplace($list, '|', '|')
        If @extended>$kol_item-1 Then
                $tmp=StringInStr($list, '|', 0, $kol_item)
                $list=StringMid($list, 1, $tmp-1)
                GUICtrlSendMsg($comboreg, 0x14B, 0, 0)
                GUICtrlSetData($comboreg, $list, StringRegExpReplace($list, '(.*?)\|.*', '\1'))
                RegWrite('HKCU\Software\JumpRegAzjio','History','REG_SZ',$list)
        EndIf
        GUICtrlSetState($comboreg, 256)
EndFunc       
                       
Func _Reg_Exists($key)
        Local $Err=2
        RegEnumKey($key, 1)
        If @error Then $Err-=1
        RegEnumVal($key, 1)
        If @error Then $Err-=1
        If $Err=0 Then
                Return 0
        Else
                Return 1
        EndIf
EndFunc

Func WM_GETMINMAXINFO($hWnd, $iMsg, $wParam, $lParam)
        #forceref $iMsg, $wParam
        If $hWnd = $GUI Then
                Local $tMINMAXINFO = DllStructCreate("int;int;" & _
                                "int MaxSizeX; int MaxSizeY;" & _
                                "int MaxPositionX;int MaxPositionY;" & _
                                "int MinTrackSizeX; int MinTrackSizeY;" & _
                                "int MaxTrackSizeX; int MaxTrackSizeY", _
                                $lParam)
                DllStructSetData($tMINMAXINFO, "MaxTrackSizeX", 1280) ; максимальные размеры окна
                DllStructSetData($tMINMAXINFO, "MaxTrackSizeY", $Xsz)
                DllStructSetData($tMINMAXINFO, "MinTrackSizeX", 300) ; минимальные размеры окна
                DllStructSetData($tMINMAXINFO, "MinTrackSizeY", $Xsz)
                DllStructSetData($tMINMAXINFO, "MaxSizeX", 800) ; размеры развёрнутого состояния ( просто удали строку, чтоб игнорировать критерий)
                DllStructSetData($tMINMAXINFO, "MaxSizeY", $Xsz)
                DllStructSetData($tMINMAXINFO, "MaxPositionX", @DesktopWidth/2-400) ; позиция в развёрнутом состоянии
                DllStructSetData($tMINMAXINFO, "MaxPositionY", 0)
        EndIf
EndFunc

Func _EXE_Path($type)
        Local $typefile = RegRead('HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.'&$type, 'Progid')
        If @error Or  $typefile='' Then
                $typefile = RegRead('HKCR\.'&$type, '')
                If @error Then Return SetError(1)
        EndIf
        $typefile = RegRead('HKCR\' & $typefile & '\shell\open\command', '')
        If @error Then Return SetError(1)
        Local $aPath=StringRegExp($typefile, '(?i)(^.*)(\.exe.*)$', 3)
        If @error Then Return SetError(1)
        $aPath = StringReplace($aPath[0], '"', '') & '.exe'
        Opt('ExpandEnvStrings', 1)
        If FileExists($aPath) Then
                $aPath=$aPath
                Opt('ExpandEnvStrings', 0)
                Return $aPath
        EndIf
        Opt('ExpandEnvStrings', 0)
        If FileExists(@SystemDir&'\'&$aPath) Then Return @SystemDir&'\'&$aPath
EndFunc

;#include <File.au3>
Func _FileReadToArray($sFilePath, ByRef $aArray)
        Local $hFile = FileOpen($sFilePath, 0)
        If $hFile = -1 Then Return SetError(1, 0, 0)
        Local $aFile = FileRead($hFile, FileGetSize($sFilePath))
        If StringRight($aFile, 1) = @LF Then $aFile = StringTrimRight($aFile, 1)
        If StringRight($aFile, 1) = @CR Then $aFile = StringTrimRight($aFile, 1)
        FileClose($hFile)
        If StringInStr($aFile, @LF) Then
                $aArray = StringSplit(StringStripCR($aFile), @LF)
        ElseIf StringInStr($aFile, @CR) Then
                $aArray = StringSplit($aFile, @CR)
        Else
                If StringLen($aFile) Then
                        Dim $aArray[2] = [1, $aFile]
                Else
                        Return SetError(2, 0, 0)
                EndIf
        EndIf
        Return 1
EndFunc

Func _restart()
        Local $sAutoIt_File = @TempDir & "\~Au3_ScriptRestart_TempFile.au3"
        Local $sRunLine, $sScript_Content, $hFile

        $sRunLine = @ScriptFullPath
        If Not @Compiled Then $sRunLine = @AutoItExe & ' /AutoIt3ExecuteScript ""' & $sRunLine & '""'
        If $CmdLine[0] > 0 Then $sRunLine &= ' ' & $CmdLineRaw

        $sScript_Content &= '#NoTrayIcon' & @CRLF & _
                        'While ProcessExists(' & @AutoItPID & ')' & @CRLF & _
                        '  Sleep(10)' & @CRLF & _
                        'WEnd' & @CRLF & _
                        'Run("' & $sRunLine & '")' & @CRLF & _
                        'FileDelete(@ScriptFullPath)' & @CRLF

        $hFile = FileOpen($sAutoIt_File, 2)
        FileWrite($hFile, $sScript_Content)
        FileClose($hFile)

        Run(@AutoItExe & ' /AutoIt3ExecuteScript "' & $sAutoIt_File & '"', @ScriptDir, @SW_HIDE)
        Sleep(1000)
        Exit
EndFunc

Func _About()
Local $GuiPos, $y, $LngTitle, $LngAbout, $LngVer, $LngSite, $Gui1, $font, $url1, $url2
$LngTitle='JumpReg'
$LngAbout='О программе'
$LngVer='Версия'
$LngSite='Сайт'
$GuiPos = WinGetPos($Gui)
GUISetState(@SW_DISABLE, $Gui)
$y=$GuiPos[1]+$GuiPos[3]/2-90
If $y < 0 Then $y= 0
$font="Arial"
    $Gui1 = GUICreate($LngAbout, 270, 180,$GuiPos[0]+$GuiPos[2]/2-135, $y, -1, 0x00000080,$Gui)
        GUISetBkColor (0xffca48)
        GUICtrlCreateLabel($LngTitle, 0, 0, 270, 63, 0x01+0x0200)
        GUICtrlSetFont (-1,15, 600, -1, $font)
        GUICtrlSetColor(-1,0xa13d00)
        GUICtrlSetBkColor (-1, 0xfbe13f)
        GUICtrlCreateLabel ("-", 2,64,268,1,0x10)
       
        GUISetFont (9, 600, -1, $font)
        GUICtrlCreateLabel($LngVer&' 0.4  25.12.2010', 55, 100, 210, 17)
        GUICtrlCreateLabel($LngSite&':', 55, 115, 40, 17)
        $url1=GUICtrlCreateLabel('azjio.ucoz.ru', 55, 115, 150, 15, 0x1)
        GUICtrlSetCursor(-1, 0)
        GUICtrlSetColor(-1, 0x0000ff)
        $url2=GUICtrlCreateLabel('oszone.net', 55, 130, 150, 15, 0x1)
        GUICtrlSetCursor(-1, 0)
        GUICtrlSetColor(-1, 0x0000ff)
        GUICtrlCreateLabel('Copyright AZJIO © 2010', 55, 145, 210, 17)
        GUISetState(@SW_SHOW, $Gui1)
$msg = $Gui1
        While 1
          $msg = GUIGetMsg()
          Select
                Case $msg = $url1
                        ShellExecute ('http://azjio.ucoz.ru')
                Case $msg = $url2
                        ShellExecute ('http://forum.oszone.net')
                Case $msg = -3
                        $msg = $Gui
                        GUISetState(@SW_ENABLE, $Gui)
                        GUIDelete($Gui1)
                        ExitLoop
                EndSelect
    WEnd
EndFunc


AZJIO 25-12-2010 17:08 1574337

Vadikan, ну и я тогда поправил тексты на ваш вариант. Ещё заменил "начиная со второй строки" на "начиная с третьей строки". И в вашем посте код с примагничиванием, в своём посте убрал. Вроде можно считать окончательным вариантом.

Vadikan 25-12-2010 17:25 1574345

AZJIO, сейчас главное не запутаться, где какой код :) Просто у меня в посте 39 интерфейс был уже вычищен и сокращен.

Цитата:

Цитата AZJIO
код с примагничиванием, в своём посте убрал.»

Это был
Код:

If $GP=-11 Then Sleep(300)
        If WinExists('[CLASS:RegEdit_RegEdit]') Then
                $GP=WinGetPos($Gui)
                $GP1=WinGetPos('[CLASS:RegEdit_RegEdit]')
                If $GPtmp<>$GP[1] Or $GP1[1]<>$GP[1]+90 Then
                        WinMove('[CLASS:RegEdit_RegEdit]', '', $GP1[0], $GP[1]+90)
                EndIf
                $GPtmp=$GP[1]
        EndIf

Если так, то я удалил из 39 этот блок и заменил в тексте про избранное "со следующей строки" :)

AZJIO 25-12-2010 17:43 1574350

Vadikan, извиняюсь, сохранить забыл в утилите сравнения и кинул частично подправленный текст.
Заменил в последнем посте (последний пост содержащий код утилиты) окончательную версию.
Да, этот блок убрать и в строке 20, где Global $aRecords, $kol_item, $list='' убрать лишние $GP=-11 и $GPtmp=12

Vadikan 25-12-2010 18:23 1574384

AZJIO, ок, все понял. Я обновил шапку: 31 пост с выбором метода, 38 пост - текущая утилита.

Morpheus, потести, плиз, на х64.

P.S. Я вот подумал, что по правилам распространения нужно с regscanner также распространять его CHM и readme, чтобы не обижать автора. Я при компиляции добавлю их.

Morpheus 25-12-2010 19:11 1574415

Из 38 в 64 работает.
Избранное и история сбивают, хто есть хто? Ответ нашел только в теме.
У меня браузером по умолчанию там оказалась опера, жмакнул ссылку и вот:

хотя страница открывается. Воспроизводится только при незапущенной опере. С ие проблем нет.

Цитата:

Цитата AZJIO
RegScanner_lng.ini »

Он нужен?

saavaage 25-12-2010 19:13 1574418

AZJIO, у меня код поста 38 при запуске выдает след - аттач

Morpheus 25-12-2010 19:16 1574420

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

Vadikan 25-12-2010 19:24 1574428

Цитата:

Цитата Morpheus
Избранное и история сбивают, хто есть хто? »

Ну я не знаю даже... истории адресной строки никогда не видел что-ли? :) Можно, кстати, заменить первый пункт в Избранном на "Управление избранным". А то какой-то файл открыть - непонятно что это.

Цитата:

Цитата Morpheus
Он нужен? »

Это языковой интерфейс русский. Люди же захотят открыть и посмотреть, плюс
Цитата:

Цитата Vadikan
по правилам распространения нужно с regscanner также распространять его CHM и readme, чтобы не обижать автора. Я при компиляции добавлю их. »

Цитата:

Цитата Morpheus
тоже такую ерунду выдал при первом запуске »

Подтверждаю, кстати.

AZJIO 25-12-2010 19:55 1574452

Цитата:

Цитата Vadikan
Подтверждаю, кстати. »

Отписывал, что вернул вариант не бинарного сохранения истории в реестр и написал что надо удалить историю в реестре. В предыдущей с выбором метода остался бинарный вариант, хотел оставить для примера, но видимо придётся тоже исправить на однотипное - небинарное. И ещё - сколько символов поддерживает тип REG_SZ, если нет ограничения, то окончательно оставить не бинарный вариант (тестил только до 26 пунктов истории, ограничение поставил на 50).
CHM дописал
Цитата:

Цитата Morpheus
Он нужен? »

Ну если утилита у нас русифицирована, то пускай будет.

Обновил пост, в котором код с выбором утилиты. Теперь совместимы с последним вариантом. А бинарная строка в комбобоксе - можно удалить в реестре или дождаться когда уйдёт в небытиё истории.

Morpheus 25-12-2010 20:07 1574459

Цитата:

Цитата Vadikan
Ну я не знаю даже... истории адресной строки никогда не видел что-ли? »

Конечно же нет :) Когда понятно, что это - не сбивает.
Цитата:

Цитата Vadikan
Люди же захотят открыть и посмотреть »

Нефиг :) Два exe будут путать при следующих запусках, м.б. regscanner.exe переименовать в dll?
Цитата:

Цитата AZJIO
Отписывал, что вернул вариант не бинарного сохранения истории в реестр и написал что надо удалить историю в реестре. »

Ааа, теперь всё гут.
Код:

HKCU\Software\JumpRegAzjio

AZJIO 26-12-2010 08:50 1574672

Vadikan, сделал иконку и откомпилировал ссылка (исходники с иконкой в комплекте). Для компактности использовал версию AutoIt3_v3.2.12.1 (296кб против 336кб). Опять же требуется проверить на Win7 x64.
+ Сохранение позиции окна

Vadikan 26-12-2010 10:42 1574702

Спасибо!

x64
Сохранение позиции окна работает.

Morpheus 26-12-2010 13:03 1574760

AZJIO, спасибо!
Vadikan, 404.

UPD: скомпилировал, тестирую 64. Вот такая непонятка:


UPD: на 32 то же самое.

AZJIO 26-12-2010 20:38 1575008

Morpheus, понял... я сделал функцию проверки существования методом наличия либо подраздела либо параметра, а если ни того ни другого, то выдаёт "не сществует". Стандартой проверки существования раздела реестра в AutoIt нет. Чуть позже попробую выполнить эту функцию через ком-строку, например:
Код:

REG QUERY "HKEY_CURRENT_USER\Keyboard Layout\Substitutes"
if %errorlevel%==0 Notepad.exe

получив результат из выходного потока... всё будет работать нормально.

Vadikan 26-12-2010 20:40 1575013

Поправил ссылку. Но проблему не могу воспроизвести.

madmasles 26-12-2010 21:13 1575056

Цитата:

Цитата AZJIO
Стандартой проверки существования раздела реестра в AutoIt нет. »

Я так наличие проверяю. Еще ни разу не подводило:
Код:

#include <WinAPIEx.au3>

Opt('MustDeclareVars', 1)

Global $hKey

$hKey = _WinAPI_RegOpenKey($HKEY_LOCAL_MACHINE, 'SOFTWARE\AutoIt v3\AutoIt')
If Not $hKey Then
    MsgBox(16, 'Ошибка', 'Нет раздела')
Else
    MsgBox(64, 'OK', $hKey)
EndIf


Yashied 26-12-2010 21:14 1575057

Цитата:

Цитата AZJIO
Стандартой проверки существования раздела реестра в AutoIt нет. »

Код:

RegRead('HKEY_CURRENT_USER\Keyboard Layout\Substitutes', '')
Switch @error
    Case 0
        ConsoleWrite('OK' & @CR)
    Case 1
        ConsoleWrite('Registry key not found.' & @CR)
    Case -1
        ConsoleWrite('Registry value not found.' & @CR)
;~  Case ...
;~
EndSwitch


AZJIO 26-12-2010 23:08 1575174

Morpheus, поравил
Код:

;  MerkurAlex (mod AZJIO)
; http://www.autoitscript.com/forum/topic/70203-regexists/page__view__findpost__p__514688
Func _Reg_Exists($key)
    Local $Err=RunWait('reg query "'&$key&'"','',@SW_HIDE)
    If $Err=0 Then
        Return 1
    Else
        Return 0
    Endif
EndFunc

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

Ссылки обновил, посты подправил.

Morpheus 27-12-2010 00:08 1575211

AZJIO, теперь ок, спасибо!

FlatX007 27-12-2010 08:22 1575308

На Win7 x86 - 7600, вообще никуда не прыгает, даже regedit не открывает.

Morpheus 27-12-2010 10:22 1575364

FlatX007, у всех она, всё прыгает :)
Win+Pause ---> Дополнительные параметры системы ---> Переменные среды ---> Path выглядит так?
Код:

%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\
Win+R ---> regedit - открывает?

FlatX007 27-12-2010 22:08 1575832

Win+R ---> regedit - открывает!
а - Path половина нет из этого.

Vadikan 27-12-2010 22:24 1575846

AZJIO, зарегистрируйтесь на софт-портале, плиз, и сообщите мне ID/E-mail в ПМ. Релиз будет находиться там, но скорее всего уже после нового года я этим займусь.

AZJIO 29-12-2010 04:30 1576736

Vadikan, на офсайте AutoIt3 посоветовали Registry Jumper.

Iska 29-12-2010 06:15 1576753

AZJIO, Vadikan выше давал комментарий:
читать дальше »
Цитата:

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

Цитата:

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


AZJIO 29-12-2010 21:58 1577312

Vadikan, вот ещё мелочь: после строки GUISetState() добавить строку Send('^+{HOME}') для того чтобы выделить строку при старте утилиты. Это позволяет сразу выполнить Ctrl+v и Enter.
Или можно инпут при старте делать пустой...

Vadikan 29-12-2010 22:31 1577342

AZJIO, пожалуй, стоит это сделать :) Релизить будем после НГ уже... :)

AZJIO 30-12-2010 01:56 1577421

Vadikan, Обновил, посты поправил. Инпут пустой при старте. Так как выкладывал на офсайте, то соответственно добавил англ. яз. - в зависимости от локализации Windows.

Vadikan 30-12-2010 08:48 1577492

AZJIO, спасибо. Перевод нужно править... я сделаю, но уже через неделю :)

Morpheus 03-01-2011 01:41 1579537

AZJIO, спасибо, активно пользуюсь. Всё ок.
А можно ли сделать, чтобы утилита стартовала поверх остальных окон, а то не удобно её каждый раз из фона вытаскивать.

AZJIO 03-01-2011 14:16 1579733

Morpheus, опция добавлена, обновил ссылки и посты.

Vadikan 06-01-2011 02:29 1581769

Вложений: 1
AZJIO, я прикрепил перевод с исправлениями (сорри, но там интерфейс по состоянию на конец прошлого года :))

Morpheus 06-01-2011 20:38 1582447

AZJIO, спасибо, "поверх всех окон" очень удобная функция.
После переустановки x86, программа перестала запускаться в фоне даже на старом коде. А вот на чистой x64 - по-прежнему в фоне, спасает только "поверх всех окон". Если это можно как-нибудь полечить, было бы хорошо, а если нет, "поверх всех окон" будет достаточно.

AZJIO 07-01-2011 04:54 1582705

Morpheus, нужно запустить исходник и наверно должна какая то ошибка вылетать в сообщении перед вылетом утилиты.
Я вчера справку переводил и там такой текст:
Цитата:

При работе на 64-битных Windows, если вы хотите получить значение в 64-битной среде, вы должны иметь суффикс HK ... с 64, т.е. HKLM64.
Если бы вылетала в 64-битной, то есть направление что исправить. А для x86 получается всё наоборот.

И ещё: в той системе, где вылетает раздел реестра, куда программа сохраняет корректный?

На всякий случай тестовая версия с HKCU64. Если заработает, то обновлю посты и ссылку на EXE.
добавил код проверки разрядности OS и соответственно правильный корневой раздел реестра.
Код:

Switch @OSArch
    Case 'X64'
        $HKCU='HKCU64'
        $HKCR='HKCR64'
    Case Else;'X86'
        $HKCU='HKCU'
        $HKCR='HKCR'
EndSwitch

Скомпилировал теперь на версии AutoIt3 v3.3.6.1, так как @OSArch на 3.2.12.1 не поддерживается.

Morpheus 07-01-2011 14:10 1582910

AZJIO, утилита не вылетает, в том и проблема :) Просто окно при запуске утилиты скрывается за другими открытыми.

UPD: Гоняю полдня на 64-ке, запускается как хочет. Т.е. может и под окнами, а может и поверх. Ничего уже не понимаю, зависимости абсолютно никакой...
Видимо, какие-то приколы 7-ки.
AZJIO, в утилите нельзя указать положение относительно других окон при старте?

AZJIO 08-01-2011 09:11 1583557

Morpheus, Попробуйте после строки GUISetState() (строка 210 в текущей) добавить строку
If Not WinActive($GUI) Then WinActivate($GUI)
Смысл команды: Если окно утилиты неактивно, тогда сделать его активным.

Morpheus 08-01-2011 16:42 1583842

AZJIO, к сожалению, ничего не поменялось. Забить?

Кино

Vadikan 09-01-2011 00:04 1584104

AZJIO, а как определяется язык программы? У меня английская ос с русским пакетом, и текущий язык интерфейса - русский. Мне-то все равно, конечно, и так даже больше нравится :) Но логичнее выводить русский интерфейс, а не английский. Т.е. определять по текущему языку пользователя, если это возможно, конечно.

У меня появилась идея добавить в меню Regedit запуск RegScanner. Тогда оно должно принять такой вид:
Цитата:

Add path to Favorites
Clear Favorites
--
Search with RegScanner
Выделил нбх изменения в интерфейсе.

Topmost -> Always on top
Удобно, кстати, спасибо!

AZJIO 09-01-2011 06:12 1584198

Вложений: 1
Цитата:

Цитата Vadikan
У меня английская ос с русским пакетом, и текущий язык интерфейса - русский. »

тогда нужен твик, по которому нужно определить установленный русский язык.
У меня раньше был вариант получить язык из ветки "HKCU\Keyboard Layout\Preload", первый параметр, но на многих рускоязычных сборках умолчальный английский. Тогда я сделал цикл проверки наличия русского языка в раскладках.
Код:

For $i = 1 to 5
    $LngN = RegEnumVal("HKCU\Keyboard Layout\Preload", $i)
    If @error Then ExitLoop
    If RegRead("HKCU\Keyboard Layout\Preload", $LngN) = 00000419 Then
        ; здесь языковые переменные
        $LngTitle='Моя программа'
        ExitLoop
    EndIf
Next

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

If @OSLang = 0419 Then
    ; здесь языковые переменные
    $LngTitle='Моя программа'
EndIf

к этому варианту необходимо добавить проверку MUI. На всякий случай в прикреплённый файл добавил ещё два варианта проверки локализации, проверте при выставленном англ. языке по умолчанию, возврат "Ru".

Остальное учёл, ссылки обновлены, посты поправлены.

Цитата:

Цитата Morpheus
к сожалению, ничего не поменялось. »

выложил промежуточные версии, чтоб отдетектить в какой момент появился этот глюк.

Vadikan 09-01-2011 12:15 1584306

AZJIO, я пока не проверял другие варианты, но для программных методов есть функция GetUserDefaultUILanguage Function (Windows). Пример скрипта http://www.autoitscript.com/forum/to...-os-installed/

AZJIO 09-01-2011 12:32 1584315

Vadikan, в архиве положил функции отсюда:
http://www.autoitscript.com/forum/to...ost__p__763922
от ProgAndy (GetUserDefaultLocaleName) и KaFu (GetUserDefaultLangID), в готовом виде выдающие результат...

Vadikan 09-01-2011 12:48 1584330

Цитата:

Цитата AZJIO
(GetUserDefaultLocaleName) и KaFu (GetUserDefaultLangID) »

Это UserLocale - Формат в региональных настройках. Это тоже можно использовать, но если можно определить язык интерфейса ОС у текущего пользователя, то мне кажется - это самый точный выбор для языка интерфейса программы.

AZJIO 09-01-2011 12:58 1584335

Вот переделал скрипт с офсайта с GetUserDefaultUILanguage, если у вас выдаст 0419, то используем этот вариант.
Код:

$Lang_dll = DllOpen("kernel32.dll")
$UserIntLang=DllCall ( $Lang_dll, "int", "GetUserDefaultUILanguage" )
If @error Then
    $UserIntLang="UNKNOWN"
Else
    $UserIntLang=Hex($UserIntLang[0],4);conversion en HEX
EndIf
DllClose($Lang_dll)
MsgBox(0, 'Message', $UserIntLang)

А я предыдущий пост правил )))), а нового не видел...

Vadikan 09-01-2011 13:44 1584375

Цитата:

Цитата AZJIO
если у вас выдаст 0419 »

Выдал :)

Я еще вспомнил, что хотел исправить в английской локализации:
Цитата:

$LngMs7='Error: invalid name for the root registry key'
$LngMs8='The key does not exist. The nearest key is:'
И надо как-то предусмотреть в скрипте возможность перевода на другие языки. Как я понимаю, сейчас будет выбор: если 0419 - русский, если другой - английский. Перебирать все возможные langid нет смысла, но, например, можно дать юзеру возможность прописать свой langID и соответственно добавить собственный набор строк на родном языке.

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

AZJIO 09-01-2011 17:32 1584531

Vadikan, как то сомневался в необходимости многоязыковой поддержки, но всё-таки добавил. Языки En и Ru встроены и определяются автоматически. При открытии файла из папки Lang произойдёт запись в реестр имени файла и перезапуск утилиты с указанным языком. Чтобы вернуть встроенный язык нужно удалить/переименовать файл, который использовался прежде.
Поправка: теперь в историю не попадают не существующие разделы, пустая строка и отказные при несуществовании.
Версия 0.6

Vadikan 09-01-2011 18:08 1584565

AZJIO, а какой формат ini файла?

AZJIO 09-01-2011 18:37 1584593

Vadikan, так то я постоянную ссылку обновляю.
Lang\En.ini
читать дальше »
Код:

; This is a sample file for translating JumpReg interface to other languages
; Translate all strings and save the file with a new name, for example, FR.ini for French.
; In JumpReg, open ? -> Language and choose the language file.
[lng]
Title=JumpReg
About=About
Ver=Version
Site=Site
FIT=Define Favorites starting from the next line. After a separator | you can specify a name that has meaning only when importing favorites to Regedit; otherwise, the name is the last subkey.
FIT1=Folders user
FIT2=Environment Variables
FIT3=Environment variables, current
Fav=&Favorites
EdF=Edit Favorites
His=History
Exp=Export        Ctrl+Down
Imp=Import
SzH=Size
AdF=Import Favorites to Regedit        Ctrl+Up
ClF=Clear Favorites        Ctrl+Del
TpE="Jump to the registry key in Regedit.\r\nEnter"
SWR=Search with RegScanner        Alt+\
Top=Always on top
HsIB1=History
HsIB2=The number of records in the history:
Ms1=Message
Ms2=Clear Favorites in Regedit?
Ms3=Add JumpRegFav.ini entries\r\nto Regedit Favorites?
Ms4=Exported successfully to JumpRegSet.reg\r\nin the program folder.
Ms5=Error
Ms6=JumpRegSet.reg file not found.\r\nYou can create it with the Export command.
Ms7=Error: invalid name for the root registry key
Ms8=The key does not exist. The nearest key is:
Ms9=Do you want to jump to it?
SLng=Language
NRE=Regedit in a new window        Ctrl+Enter


Morpheus 09-01-2011 22:19 1584830

Цитата:

Цитата AZJIO
выложил промежуточные версии, чтоб отдетектить в какой момент появился этот глюк. »

Я хоть и достаточно терпеливый человек, но уже подташнивает... Тема на answers: windows 7 (x64 pro) window focus issues:when i open a program/window, sometimes it opens in the background instead of the foreground
Если бы поведение не менялось от запуска к запуску, было бы проще.
Воспроизводится и в 32-битной версии в 32-битной системе, и в 64 в 64, и в 32-версии в 64-битной Windows. Проще и быстрее воспроизвести последнее, практически стабильно возникает после ребута.

Итак, эффект не достигнут в версиях 3-5-6-7 (для повышения прав ставил флажок на вкладке "совместимость"), начиная с 8 воспроизводится.

AZJIO 10-01-2011 00:03 1584919

Morpheus, сравнил скрипты, разница только в #RequireAdmin и в добавлении главного меню программы. Остальные мелочи не влияют, так как наличие новых переменных к уже существующим эффекта не даст и цикл опроса кнопок, которые не работают пока не нажать.
Проверте последнюю версию, удалив #RequireAdmin (строка 14), если нормальзуется, то добавлю опцию включения в меню программы. Ну а без главного меню уже не обойтись.

Morpheus 10-01-2011 01:29 1584959

Цитата:

Цитата AZJIO
Проверте последнюю версию, удалив #RequireAdmin (строка 14) »

Блин, блин, блин... оно... Удалил - всё пока ок. Добавил строчку в версию под №7 - стало скрываться.
С флажком в совместимости работает нормально.

Vadikan 10-01-2011 03:51 1584989

Утилита должна запускаться с полными правами, иначе переходы в регедит не будут работать, начиная со второго. Первый вызывает регедит, который запускается с полными правами. Но последующие должны переходить из ограниченного процесса в полноправный - это не будет работать. Точно так же не работает переход из ограниченного RegScanner в открытый регедит.

Флажок совместимости обеспечивает запуск с полными правами другим способом, прописывая в реестре в разделе AppCompat путь к программе. Но как-то неправильно делать совместимую с 7 утилиту за счет режима совместимости :)

SyDr 10-01-2011 10:14 1585069

AZJIO, была похожая ситуация. После закрытия дочернего окна, окно-родитель прячется за всеми остальными окнами. Сначала решал проблему в лоб, а потом нашёл решение "покрасивее":
Попробуйте после строки
Код:

GUISetState()
добавить строку
Код:

GUISetState(@SW_RESTORE)
или строки
Код:

Sleep(1)
GUISetState(@SW_RESTORE)

Если первый вариант не сработает

Morpheus 10-01-2011 12:15 1585136

Цитата:

Цитата SyDr
добавить строку »

Цитата:

Цитата SyDr
или строки »

Увы, прячется.

SyDr 10-01-2011 15:11 1585263

Хм... Тогда можно попробывать решить проблему "в лоб". Там же:
Код:

WinActivate($GUI)
Или, опять таки:
Код:

Sleep(1)
WinActivate($GUI)


Vadikan 10-01-2011 23:04 1585679

AZJIO, я тут подумал, что для релиза утилиты было бы удобнее не включать необходимые файлы и распаковывать их при первом запуске, а просто разместить их в папках параллельно утилите. Например,
\Regscanner - все файлы regscanner
\Lang - образец языкового файла (англ.)
\Source - исходники

Тогда в корневой папке останутся только утилита и ее файлы - избранное и история. Поаккуратнее будет. А в коде фактически нужно будет только поправить вызов regscanner и убрать включение доп. файлов.

Morpheus 11-01-2011 02:09 1585801

Цитата:

Цитата Vadikan
Но как-то неправильно делать совместимую с 7 утилиту за счет режима совместимости »

Ага, согласен. Но лучше пусть едет с такими шашечками, чем не едет совсем :)
SyDr, что в лоб, что полбу, всё едино. 4 раза за 5 минут.

AZJIO 11-01-2011 03:44 1585816

Vadikan, ссылку обновил, посты поправил. Языковой файл поправил, удалив у параметров начальные Lng, чтобы исключить подмены существующих переменных в скрипте путём вставки в ini одноимённых параметров.

Morpheus, оказалось директивы #RequireAdmin и т.д. нельзя вставлять внутрь условий. Поэтому невозможно добавить пункт в меню, который бы возможно было отключить (с перезапуском).

Morpheus 11-01-2011 03:59 1585820

AZJIO, в любом случае спасибо! Для себя решение теперь знаю.

SyDr 11-01-2011 09:53 1585907

AZJIO
http://autoit-script.ru/index.php/topic,2446.0.html

Код:

If Not IsAdmin() Then
    ShellExecute(@AutoItExe, $CMDLineRaw, @WorkingDir, "runas", @SW_SHOWNORMAL)
    Exit
EndIf

Собственно, скрипт с этими тремя строчками повторяет в своём поведении скрипт с #RequireAdmin, однако может быть легко модифицирован :)


Morpheus, там же , 9 часов назад:
Цитата:

JD Turner
I believe I have found the cause of this problem and possibly a cure.

I dual boot XP, Vista and Win7 and experienced this problem on all these versions of Windows. As a programmer, I decided to try to figure out what was going on and discovered that WM_KeyDown and WM_KeyUp messages were being sent (with scan code 0xFF) to the focused window/control, roughly once per second.

I considered the possibility of a bootsector-level virus and decided to swap out the disk so I needed to find out if I had SATA or a PATA drive. To do this safely, I had to disconnect the power and the battery (Dell laptop). When I reconnected the hard disk and started it up again it was fixed. (I later checked the bootsector - that was ok.)

My system was plagued by this problem for months but now it is fine. I am certain it is fine since all symptoms are now cured and the program I used to test the problem also definitively tells my system is ok. I am not absolutely certain that it was completely powering down the system that cured the problem but I definitely recommend you try it. If you have a desktop computer, consider swapping the keyboard - I figure that's where the problem was rooted.

Hope this helps.

Morpheus 11-01-2011 12:14 1586004

SyDr, дело в том, что 64-ка у меня на VirtualBox.
Пробовал ещё это, но нифига.

AZJIO 11-01-2011 12:17 1586007

SyDr, интересно, если права не будут получены, то фактически будет перезапуск в цикле. Нужно ещё предусмотреть подсчёт количества запусков через реестр за промежуток времени. Чтоб дать возможность отключить перезапуск более 3 раз. Или вставить в условие "Диалог с возможностью не перезапускать".

Morpheus
, проверь этот код вместо #RequireAdmin
Код:

If Not IsAdmin() Then
    MsgBox(0, 'Message', 'Нет прав, перезапускаем... с правами')
    ShellExecute(@AutoItExe, $CMDLineRaw, @WorkingDir, "runas", @SW_SHOWNORMAL)
    Exit
EndIf

Если будет получены права, то используем его. И может сворачивание пропадёт?

SyDr 11-01-2011 12:53 1586036

AZJIO
Цитата:

Цитата AZJIO
SyDr, интересно, если права не будут получены, то фактически будет перезапуск в цикле. »

Если права не получены, функция ShellExecute устанвливает значение флага @error не равным 0.

ИМХО, тут идеально такое поведение:
Вывести запрос UAC
Если разрешение получено - продолжить работу, как обычно.
Если не получено - продолжить работу и вывести запрос с предложением отключить автоматический запрос на повышение прав.
Только тут проблема с бесконечным перезапуском, если запускать с ограниченными правами и отключённым UAC. То есть надо проверять ещё и включён/отключён ли UAC.

Morpheus, даже не знаю. Будем продолжать мучаться? Можно попробывать активировать окно (оно ведь активно после запуска? В панели задач.), затем установить атрибут поверх всех окон, и через минмальный промежуток времени снять.
Код:

GUISetState()
GUISetState(@SW_RESTORE)
Sleep(300)
WinSetOnTop($GUI, '', 1)
Sleep(300)
WinSetOnTop($GUI, '', 0)
Sleep(300)

Как ведёт себя окно?

Morpheus 11-01-2011 13:00 1586042

AZJIO, права выдаются, но прятки продолжаются.

Цитата:

Цитата SyDr
Можно попробывать активировать окно (оно ведь активно после запуска? В панели задач.), затем установить атрибут поверх всех окон, и через минмальный промежуток времени снять. »

Была идея это предложить. Сейчас опробую.

Vadikan 11-01-2011 13:08 1586049

AZJIO, спасибо. Протестировал язык и последние изменения в структуре - все работает!

Я поправил языковой файл, добавив в него коммент в начале (пост обновлен). Я также поправил в коде
Код:

$LngAdF='Import Favorites to Regedit        Ctrl+Up'
(пост обновлен). Это мой косяк в переводе :)

В общем, все готово к релизу, только мне непонятно, мешает ли ему эта дискуссия с окном в фоне, тянущаяся последние несколько дней :)

Morpheus 11-01-2011 13:25 1586062

SyDr, аха, скрывается при старте (когда глюк проявляется) и тут же появляется.
Думаю, такое решение можно считать приемлемым. Спасибо!
P.S. Пробовал в связке с #RequireAdmin.

SyDr 11-01-2011 14:01 1586092

Morpheus, ещё не всё :)

По идее, чтобы было правильно, надо удалить вот эту часть:
Код:

$TrTop=RegRead('HKCU\Software\JumpRegAzjio', 'Topmost')
If Not @error And $TrTop=1 Then
        WinSetOnTop($GUI, '', 1)
        GUICtrlSetState($Topmost, 1)
EndIf

И всё в том же месте, где и всегда:
Код:

GUISetState()
GUISetState(@SW_RESTORE)
WinSetOnTop($GUI, '', 1)
$TrTop=RegRead('HKCU\Software\JumpRegAzjio', 'Topmost')
If Not @error And $TrTop=0 Then
        WinSetOnTop($GUI, '', 0)
        GUICtrlSetState($Topmost, 0)
EndIf

При этом окно будет поверх всех окон, если в реестре не указано противоположное.

Yashied 11-01-2011 14:51 1586135

Сделайте без всяких WinSetOnTop(), просто

Код:

$TrTop = RegRead($HKCU & '\Software\JumpRegAzjio', 'Topmost')
$GUI = GUICreate($LngTitle, 548, 84, $aPos[1], $aPos[2], 0x00040000 + 0x00020000 + 0x00010000, 8 * $TrTop) ; WS_EX_TOPMOST = 0x00000008


AZJIO 11-01-2011 14:59 1586145

SyDr, вобщем чтоб не заморачиваться, оставить как было, ведь WinSetOnTop работает через реестр и автовключать его не всем понравится. А через реестр есть выбор, у кого проблема, включит и забудет.

Vadikan, да, пора отсечку.

Morpheus 11-01-2011 16:02 1586183

Думаю, правильно будет активировать на короткое время при запуске, а "поверх всех окон" - выбор оставить.
Код будет такой?
Код:

GUICtrlSetState($comboreg, 256)
GUISetState()
GUISetState(@SW_RESTORE)
Sleep(200)
WinSetOnTop($GUI, '', 1)
WinSetOnTop($GUI, '', 0)

$TrTop=RegRead('HKCU\Software\JumpRegAzjio', 'Topmost')
If Not @error And $TrTop=1 Then
        WinSetOnTop($GUI, '', 1)
        GUICtrlSetState($Topmost, 1)
EndIf

UPD: Немного подкорректировал первоначальный вариант и потестил. Пока проблем нет.

AZJIO 11-01-2011 19:36 1586329

Morpheus, ок, обновил посты, ссылки

Vadikan 12-01-2011 00:59 1586565

Вложений: 1
Цитата:

Цитата AZJIO
ок, обновил посты, ссылки »

Цитата:

Цитата AZJIO
да, пора отсечку »

Ок, code freeze! :) Скрипты и EN.ini для версии 0.6 прикреплены в шапке.

AZJIO, скомпилируйте, пожалуйста, х86 и х64 версии и залейте к себе. Если хотите, можете сразу сформировать ZIP архивы со всем необходимым. Пожалуй, русский языковой файл для regscanner не стоит включать, иначе придется делать отдельные архивы для языковых версий... А вот readme от regscanner - обязательно, короче все, что идет в его комплекте (требования лицензии nirsoft).

Smarty сделал значок 48х48 (включает меньшие размеры). На мой взгляд, он посимпатичнее (см. шапку), хотя и потяжелее. Можете использовать его, если нравится (прикреплен).

Я потом перекину на софт-портал, сделаю описание там на двух языках и пропиарим немного :)

Morpheus 12-01-2011 01:19 1586579

Цитата:

Цитата Vadikan
Smarty сделал значок 48х48 (включает меньшие размеры). На мой взгляд, он посимпатичнее (см. шапку), хотя и потяжелее. Можете использовать его, если нравится (прикреплен). »

Меня глючит? Что-то не наблюдаю.

Vadikan 12-01-2011 01:22 1586582

Жми F5

Morpheus 12-01-2011 01:29 1586585

Vadikan, теперь верю :)

AZJIO 13-01-2011 02:41 1587409

Vadikan, выкладываю zip, проверте х64, а то я не могу проверить и терзают сомнения. Иконку всё же свою вставил, добавил 24, 32, 48, констраст по ярче, резкость поболее и цвет бирюзовый больше нравится.

Vadikan 14-01-2011 00:01 1588176

AZJIO, спасибо! х64 я снова попросил глянуть Morpheus. Если все ок, на выходных все сделаю. Архив из поста можете удалить, чтобы не тратить место. Я уже перекинул на ФТП.

С вашего позволения я для англоязычных пользователей внесу некоторые изменения в пакет (ридми и т.п.).

AZJIO 23-01-2011 05:57 1595161

Vadikan, добавил "regedit -m" по вашему совету и исправил размеры окна и координаты кнопки для Win7. Не понимаю, почему при точном указании (5) кнопка в Win7 на 1 пиксел ниже, а в WinXP нормально...
При нескольких окнах regedit команда передаётся на последнее активное окно.
Исходник с выбором утилит придётся оставить, с перезапуском regedit такой фокус не получается.

Vadikan 23-01-2011 15:11 1595414

AZJIO, спасибо! Понятно, что невозможно совместить перезапуск и открытие второго экземпляра regedit :)

Сейчас посмотрим, как она пойдет в массы, выявятся ли баги и какие хотелки объявятся. Потом выпустим обновление.

gora 04-02-2011 19:56 1604639

AZJIO
1 Скачал х64 версию, запустил - интерфейс русский. Сменил язык на английский, посмотрел, а вот назад на русский язык поменять не удалось - нет русского языкового файла. Пришлось лезть в реестр (благо есть исходники) и удалять ключ языка.
2 Не увидел ни в шапке, ни в readme описание отличий версий х86\х64. В исходниках видел переключение по @OSArch или я что-то не понял?
3 Утилита RegScanner с английским интерфейсом хотя на оф. сайте есть русский языковой файл (всего 4кБ). Может стоит его добавить в Вашу утилиту и переключать язык синхронно (JumpReg и RegScanner)?
4 Стоит ли утилите хранить свои настройки и прочее в реестре, может будет достаточно ini файла, дабы не засорять реестр?

Тестировал на Win7 x64.

AZJIO 04-02-2011 20:18 1604663

gora
1. здесь есть русский языковой файл (и немецкий). Можно не лезть в реестр, а удалить англ. файл и в реестре сбросится при отсутствии файла.
2. Разницы никакой, только в поддержке системы.
3. Опять же пункт 1, там всё есть.
4. Реестр создан, чтоб его засорять. Он в памяти, и скорость работы с ним быстрее чем с ini.

gora 04-02-2011 21:04 1604697

AZJIO
1 Почему же в шапке старая версия!?
2 Будут запускаться разные regedit.exe (x86\x64) и\или я не смогу добраться до х64 разделов реестра, если буду использовать JumpReg x86 на х64 системе? По Вашей ссылке только один вариант лежил.
3 При смене языка в JumpReg в RegScanner всегда русский, а я писал про синхронное переключение.
4 Позиция понятна, хотя я не уверен, что она верная. :)

Morpheus 04-02-2011 21:57 1604751

Цитата:

Цитата gora
1 Почему же в шапке старая версия!? »

Цитата:

Цитата Vadikan
Сейчас посмотрим, как она пойдет в массы, выявятся ли баги и какие хотелки объявятся. Потом выпустим обновление. »

---
Цитата:

Цитата gora
2 Будут запускаться разные regedit.exe (x86\x64) »

Да. [решено] Почему параметры реестра импортируются в раздел WOW6432Node
В разных версиях JumpReg разный RegScanner лежит.

Vadikan 05-02-2011 12:35 1605065

gora, язык определяется автоматически (рус/анг), и языковой английский файл там представлен в качестве образца, а не для импорта. Утилита настолько проста, что во всех остальных случаях переключение языка в интерфейсе не требуется - один раз поставил и забыл.

RegScanner - вспомогательная утилита. Размещение русского языкового файла потребовало бы два разных комплекта распространения JumpReg только по этой причине. Кому нужен RegScanner - пользуется, кому не нужен - не пользуется. Кому нужен русский - качает языковой файл. Да и без русского там все примитивно. Синхронное переключение языка усложняет JumpReg, не давая ей самой никакого дополнительного функционала, посему не нужно.

В шапке находится текущая версия. Все остальное - бета для тестирования следующего официального релиза.

Реестр - нормальный способ считывания данных. Вас же не смущает, что ОС считывает оттуда вместо файловой системы.

gora 05-02-2011 16:44 1605246

Vadikan, я написал свое мнение в свете Вашей фразы:
Цитата:

Цитата Vadikan
выявятся ли баги и какие хотелки объявятся »

1
Цитата:

Цитата Vadikan
переключение языка в интерфейсе не требуется - один раз поставил и забыл. »

Я и описал, что происходит при смене языка в выложенном варианте. Если переключение автоматическое и пользователю не надо его выбирать самостоятельно, то и пункт в настройках лишний. А так как он все же есть, то он должен корректно функционировать.
2
Цитата:

Цитата Vadikan
Размещение русского языкового файла потребовало бы два разных комплекта распространения JumpReg только по этой причине. »

Не есть истина. Убрав языковой файл для RegScanner мы превратим его снова в английский.
Цитата:

Цитата Vadikan
Синхронное переключение языка усложняет JumpReg »

Переименовать (переместить/удалить) языковый файл RegScanner для переключения его на английский интерфейс из скрипта задача элементарная (не сложная).

Vadikan 05-02-2011 16:52 1605251

Цитата:

Цитата gora
Если переключение автоматическое и пользователю не надо его выбирать самостоятельно, то и пункт в настройках лишний. А так как он все же есть, то он должен корректно функционировать. »

Переключение языка не предусмотрено. Предусмотрена возможность задать язык интерфейса, если не устраивает английский или русский. Таким образом, это не баг. А для хотелки не хватает аргументации, зачем это в реальности нужно.

Цитата:

Цитата gora
Не есть истина. Убрав языковой файл для RegScanner мы превратим его снова в английский. »

Я смотрел с точки зрения англоязычных пользователей, которым русский интерфейс намного более чужд, чем русскоязычным английский. Опять же, не считаю, что надо перегружать функционал утилиты. Максимум - добавление строки в документацию с предложением скачать русский языковой файл.

Цитата:

Цитата gora
Переименовать (переместить/удалить) языковый файл RegScanner для переключения его на английский интерфейс из скрипта задача элементарная »

Про переключение см. выше.

P.S. Если автор захочет, он внедрит эти хотелки, я просто излагаю свое видение вопроса.

Morpheus 06-02-2011 01:06 1605636

AZJIO, а можно ли в 64-битной версии предусмотреть возможность запуска 32-редактора реестра (галкой в настройках где-нибудь, например)? Нужно не часто, но вот сейчас понадобилось и пришлось запускать отдельно 32-битную утилиту.

AZJIO 07-02-2011 13:26 1606737

Morpheus, Для теста придётся попробовать конструктором собрать x64, уже к этому склоняюсь судя по тому, что многим нужна версия для x64.
Тогда придётся сделать отдельную версию скрипта x64 и добавить там пункт "Использовать x86" и две версии regscanner... так? Галочка на пункте просто подменит путь к regscanner другой версии... так?

Morpheus 07-02-2011 16:45 1606910

Цитата:

Цитата AZJIO
Тогда придётся сделать отдельную версию скрипта x64 и добавить там пункт "Использовать x86" и две версии regscanner... так? Галочка на пункте просто подменит путь к regscanner другой версии... так? »

Да. Да. :)
Цитата:

Цитата AZJIO
Для теста придётся попробовать конструктором собрать x64, уже к этому склоняюсь судя по тому, что многим нужна версия для x64. »

Попробовал сейчас запустить в 64-битной PE - работает.

murder 10-02-2011 22:57 1609755

Есть аналогичного назначения надстройка для Regedit'а - RegeditX.
Или назначение вашей программы отличается?

Morpheus 10-02-2011 23:09 1609766

Цитата:

Цитата murder
Есть аналогичного назначения надстройка для Regedit'а - RegeditX. »

Ограниченная по времени бета-версия коммерческого продукта. Спасибо, не надо.
Хотя такая интеграция очень интересна.

murder 11-02-2011 00:16 1609806

Morpheus, RegeditX не коммерческий, а RegCrawler - да. Когда-то переводил вторую бета-версию, работает вроде без глюков даже в Win7 32x. Ограничения по времени нет.
Если кому нужно - http://rghost.ru/4292959

AZJIO 13-02-2011 19:30 1612031

Morpheus, сделал, несложно, времени не было и настроя. Если что, строка 124 указан путь основной и в строке 366 пеерключение. Можно указать другие пути, сейчас RegScanner и RegScanner_x86.
читать дальше »
Код:

#AutoIt3Wrapper_Outfile=JumpReg.exe
#AutoIt3Wrapper_Icon=JumpReg.ico
#AutoIt3Wrapper_Compression=4
; #AutoIt3Wrapper_UseX64=y
#AutoIt3Wrapper_UseAnsi=y
#AutoIt3Wrapper_Res_Comment=
#AutoIt3Wrapper_Res_Description=JumpReg.exe
#AutoIt3Wrapper_Res_Fileversion=0.7.0.0
#AutoIt3Wrapper_Res_FileVersion_AutoIncrement=n
#AutoIt3Wrapper_Res_LegalCopyright=AZJIO
#AutoIt3Wrapper_Res_Language=1049
#AutoIt3Wrapper_Run_Au3check=n

;  @AZJIO 23.01.2011 (AutoIt3_v3.3.6.1)
#RequireAdmin
#NoTrayIcon
; FileInstall('RegScanner.exe', '*')
; FileInstall('RegScanner_lng.ini', '*') ;???
; FileInstall('RegScanner.chm', '*')

; En
$LngTitle='JumpReg'
$LngAbout='About'
$LngVer='Version'
$LngSite='Site'
$LngFIT='Define Favorites starting from the next line. After a separator | you can specify a name that has meaning only when importing favorites to Regedit; otherwise, the name is the last subkey.'
$LngFIT1='Folders user'
$LngFIT2='Environment Variables'
$LngFIT3='Environment variables, current'
$LngFav='&Favorites'
$LngEdF='Edit Favorites'
$LngHis='History'
$LngExp='Export        Ctrl+Down'
$LngImp='Import'
$LngSzH='Size'
$LngAdF='Import Favorites to Regedit        Ctrl+Up'
$LngClF='Clear Favorites        Ctrl+Del'
$LngTpE="Jump to the registry key in Regedit." & @CRLF & "Enter"
$LngSWR='Search with RegScanner        Alt+\'
$LngTop='Always on top'
$LngHsIB1='History'
$LngHsIB2='The number of records in the history:'
$LngMs1='Message'
$LngMs2='Clear Favorites in Regedit?'
$LngMs3='Add JumpRegFav.ini entries'&@CRLF&'to Regedit Favorites?'
$LngMs4='Exported successfully to JumpRegSet.reg'&@CRLF&'in the program folder.'
$LngMs5='Error'
$LngMs6='JumpRegSet.reg file not found.'&@CRLF&'You can create it with the Export command.'
$LngMs7='Error: invalid name for the root registry key'
$LngMs8='The key does not exist. The nearest key is:'
$LngMs9='Do you want to jump to it?'
$LngSLng='Language'
$LngNRE='Regedit in a new window        Ctrl+Enter'
$LngUtl='RegScanner x86'

$Lang_dll = DllOpen("kernel32.dll")
$UserIntLang=DllCall ( $Lang_dll, "int", "GetUserDefaultUILanguage" )
If Not @error Then $UserIntLang=Hex($UserIntLang[0],4)
DllClose($Lang_dll)

; Ru
; если русская локализация, то русский язык
If $UserIntLang = 0419 Then
        $LngTitle='Прыжок в указанный раздел реестра'
        $LngAbout='О программе'
        $LngVer='Версия'
        $LngSite='Сайт'
        $LngFIT='Указывайте Избранное, начиная с третьей строки. После разделителя | можно указать имя (имеет значение только при импорте избранного в Regedit), иначе именем становится последний подраздел.'
        $LngFIT1='Папки пользователя'
        $LngFIT2='Переменные среды'
        $LngFIT3='Переменные среды текущего'
        $LngFav='&Избранное'
        $LngEdF='Редактировать избранное'
        $LngHis='И&стория'
        $LngExp='Экспорт        Ctrl+Down'
        $LngImp='Импорт'
        $LngSzH='Размер'
        $LngAdF='Добавить в Избранное        Ctrl+Up'
        $LngClF='Очистить Избранное        Ctrl+Del'
        $LngTpE="Перейти в regedit" & @CRLF & "в указанный раздел реестра." & @CRLF & "Enter"
        $LngSWR='Поиск в RegScanner        Alt+\'
        $LngTop='Поверх всех окон'
        $LngHsIB1='История'
        $LngHsIB2='Количество записей в истории:'
        $LngMs1='Сообщение'
        $LngMs2='Очистить Избранное в Regedit?'
        $LngMs3='Добавить разделы из JumpRegFav.ini' & @CRLF & 'в Избранное Regedit?'
        $LngMs4='Экспорт выполнен в файл JumpRegSet.reg'&@CRLF&'в папку программы.'
        $LngMs5='Ошибка'
        $LngMs6='Файл JumpRegSet.reg не найден.'&@CRLF&'Его можно создать командой Экспорт.'
        $LngMs7='Ошибка имени корневого раздела'
        $LngMs8='Раздела не существует.'&@CRLF&'Ближайший доступный раздел:'
        $LngMs9='Перейти в него?'
        $LngSLng='Язык интерфейса'
        $LngNRE='Regedit в новом окне        Ctrl+Enter'
        $LngUtl='RegScanner x86'
EndIf

Switch @OSArch
    Case 'X64'
        $HKCU='HKCU64'
        $HKCR='HKCR64'
    Case Else;'X86'
        $HKCU='HKCU'
        $HKCR='HKCR'
EndSwitch

$LangPath=RegRead($HKCU&'\Software\JumpRegAzjio', 'Lang')
If Not @error Then
        If FileExists(@ScriptDir&'\Lang\'&$LangPath) Then
                $aLng = IniReadSection(@ScriptDir&'\Lang\'&$LangPath, 'lng')
                If Not @error Then
                        For $i = 1 To $aLng[0][0]
                                If StringInStr($aLng[$i][1], '\r\n') Then $aLng[$i][1]=StringReplace($aLng[$i][1],'\r\n',@CRLF)
                                If IsDeclared('Lng'&$aLng[$i][0]) Then Assign('Lng'&$aLng[$i][0],$aLng[$i][1])
                        Next
                EndIf
        Else
                RegDelete($HKCU&'\Software\JumpRegAzjio', 'Lang')
        EndIf
EndIf


Global $aRecords, $kol_item, $list='', $aPos, $TrTop=0, $TrNRE=0, $RegScanner = 'RegScanner\RegScanner.exe'
Global $Ini = @ScriptDir & '\JumpRegFav.ini'
$FileTmp=''

$kol_item=RegRead($HKCU&'\Software\JumpRegAzjio', 'HistorySize')
If @error Or StringIsDigit($kol_item)=0 Or $kol_item = '' Or $kol_item>50 Then $kol_item=26 ; количество пунктов в комбобоксе
$Xsz=90
$Xsz2=84
$Jx=5
$Js=23
Switch @OSVersion
    Case 'WIN_VISTA', 'WIN_7'
        $Xsz=91
                $Xsz2=77
                $Jx=4
                $Js=24
EndSwitch
GUIRegisterMsg(0x0024, "WM_GETMINMAXINFO")

If Not FileExists($Ini) And DriveStatus(StringLeft(@ScriptDir, 1))<>'NOTREADY' Then
$file = FileOpen($Ini,2)
FileWrite($file, '[Favorites]' & @CRLF & _
'; '&$LngFIT & @CRLF & _
'HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders|'&$LngFIT1 & @CRLF & _
'HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders|'&$LngFIT1&' 2' & @CRLF & _
'HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager\Environment|'&$LngFIT2 & @CRLF & _
'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run|Run (all)' & @CRLF & _
'HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run' & @CRLF & _
'HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\MenuExt' & @CRLF & _
'HKEY_CURRENT_USER\Environment|'&$LngFIT3 & @CRLF & _
'HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices' & @CRLF & _
'HKEY_CLASSES_ROOT\Folder' & @CRLF & _
'HKEY_CLASSES_ROOT\Directory' & @CRLF & _
'HKEY_CLASSES_ROOT\Drive' & @CRLF & _
'HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced' & @CRLF & _
'HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts')
FileClose($file)
EndIf

If Not _FileReadToArray($Ini, $aRecords) Then
        Dim $aRecords[4]=['3', '', '', 'HKEY_CURRENT_USER\Software']
Else
        $file = FileOpen($Ini, 0)
        $FileTmp = FileRead($file)
        FileClose($file)
EndIf

$Pos=RegRead($HKCU&'\Software\JumpRegAzjio', 'Pos')
If @error Or Not StringInStr($Pos, '|') Then $Pos='-1|-1'
$aPos=StringSplit($Pos, '|')
If $aPos[1] > @DesktopWidth-548 Or $aPos[2]>@DesktopHeight-$Xsz2 Then
        $aPos[1]=-1
        $aPos[2]=-1
EndIf

$GUI=GUICreate($LngTitle, 548, $Xsz2, $aPos[1], $aPos[2], 0x00040000+0x00020000+0x00010000)
If Not @compiled Then GUISetIcon('JumpReg.ico')

$FavM=GUICtrlCreateMenu($LngFav)
$runfav=GUICtrlCreateMenuitem($LngEdF, $FavM)
GUICtrlCreateMenuitem('', $FavM)

For $i = 3 To $aRecords[0]
        If StringInStr($aRecords[$i], '|') Then
                $list&=StringRegExpReplace($aRecords[$i], '(.*?\|).*', '\1')
        Else
                $list&=$aRecords[$i]&'|'
        EndIf
Next

$list=StringTrimRight($list, 1)
$tmp=StringSplit($list, '|')
Dim $aList2[$tmp[0]+1][3]
$aList2[0][0]=$tmp[0]

For $i = 1 To $aList2[0][0]
        $aList2[$i][1]=$tmp[$i]
        $aList2[$i][0]=GUICtrlCreateMenuitem($aList2[$i][1], $FavM)
Next
$tmp=''
$list=RegRead($HKCU&'\Software\JumpRegAzjio', 'History')

$HisM=GUICtrlCreateMenu($LngHis)
$Export=GUICtrlCreateMenuitem($LngExp, $HisM)
$Import=GUICtrlCreateMenuitem($LngImp, $HisM)
$HisSz=GUICtrlCreateMenuitem($LngSzH, $HisM)

$RegM=GUICtrlCreateMenu('&Regedit')
$favorites=GUICtrlCreateMenuitem($LngAdF, $RegM)
$Clean=GUICtrlCreateMenuitem($LngClF, $RegM)
GUICtrlCreateMenuitem('', $RegM)
$SearchWRS=GUICtrlCreateMenuitem($LngSWR, $RegM)
$NewREt=GUICtrlCreateMenuitem($LngNRE, $RegM)

$ActM=GUICtrlCreateMenu('?')
$About=GUICtrlCreateMenuitem($LngAbout, $ActM)
$Topmost =GUICtrlCreateMenuitem($LngTop, $ActM)
$SelLng =GUICtrlCreateMenuitem($LngSLng, $ActM)
$UtlM =GUICtrlCreateMenuitem($LngUtl, $ActM)

$Jump = GUICtrlCreateButton("E", 517, $Jx, $Js, $Js, 0x0040)
GUICtrlSetTip(-1, $LngTpE)
GUICtrlSetResizing(-1, 512 + 256 +32+ 4)
GUICtrlSetImage(-1, @SystemDir & '\shell32.dll', -138, 0)

$comboreg = GUICtrlCreateCombo("", 6, 5, 509)
GUICtrlSetResizing(-1, 2 + 4 +32)
If $list<>'' Then GUICtrlSetData(-1, '|'&$list, '')
_HisSz()

$Editor=_EXE_Path('txt')
If @error Then $Editor=@SystemDir&'\notepad.exe'

Dim $AccelKeys[6][2] = [ _
["{Enter}", $Jump], _
["^{Enter}", $NewREt], _
["^{UP}", $favorites], _
["^{DEL}", $Clean], _
["!{\}", $SearchWRS], _
["^{DOWN}", $Export]]
GUISetAccelerators($AccelKeys)

GUICtrlSetState($comboreg, 256)
GUISetState()
GUISetState(@SW_RESTORE)
Sleep(200)
WinSetOnTop($GUI, '', 1)
WinSetOnTop($GUI, '', 0)

$TrTop=RegRead('HKCU\Software\JumpRegAzjio', 'Topmost')
If Not @error And $TrTop=1 Then
        WinSetOnTop($GUI, '', 1)
        GUICtrlSetState($Topmost, 1)
EndIf

While 1
        $msg = GUIGetMsg()
        For $i = 1 To $aList2[0][0]
                If $msg = $aList2[$i][0] Then
                        _Jump($aList2[$i][1])
                EndIf
        Next
       
        Select
                Case $msg = $SelLng
                        $OpenFile = FileOpenDialog('Open', @ScriptDir&'\Lang' , "Language (*.ini)", 3, "", $Gui)
                        If @error Then ContinueLoop
                        RegWrite($HKCU&'\Software\JumpRegAzjio','Lang','REG_SZ', StringRegExpReplace($OpenFile,'(^.*)\\(.*)$','\2'))
                        _restart()
                       
                Case $msg = $SearchWRS
                        Run($RegScanner)
       
                Case $msg = $HisSz
                        $tmp = InputBox($LngHsIB1, $LngHsIB2, $kol_item, '', 200, 135)
                        If Not StringIsDigit($tmp) Then ContinueLoop
                        $kol_item=Execute($tmp)
                        If $kol_item>50 Then $kol_item=50
                        RegWrite($HKCU&'\Software\JumpRegAzjio','HistorySize','REG_SZ', $kol_item)
                        _HisSz()
       
                Case $msg = $Clean
                        If MsgBox(4, $LngMs1, $LngMs2)=7 Then ContinueLoop
                        RegDelete($HKCU&'\Software\Microsoft\Windows\CurrentVersion\Applets\Regedit\Favorites')
                        GUICtrlSetState($comboreg, 256)

                Case $msg = $favorites
                        If MsgBox(4, $LngMs1, $LngMs3)=7 Then ContinueLoop
                        For $i = 3 To $aRecords[0]
                                If StringInStr($aRecords[$i], '|') Then
                                        $aReg = StringSplit($aRecords[$i], "|")
                                Else
                                        Dim $aReg[3]
                                        $aReg[2] = StringRegExpReplace('t\\'&$aRecords[$i], "(^.*)\\(.*)$", '\2')
                                        $aReg[1] = $aRecords[$i]
                                EndIf
                                If StringLeft($aReg[1], 2)<>'HK' Then ContinueLoop
                                RegWrite($HKCU&'\Software\Microsoft\Windows\CurrentVersion\Applets\Regedit\Favorites', $aReg[2], "REG_SZ", $aReg[1])
                        Next
                        If ProcessExists("regedit.exe") Then
                                ContinueLoop
                        Else
                                Run('regedit.exe')
                        EndIf
                        GUICtrlSetState($comboreg, 256)
                       
                Case $msg = $NewREt
                        $TrNRE=1
                        ContinueCase

                Case $msg = $Jump Or $msg = $comboreg
                        $comboreg0 = GUICtrlRead($comboreg)
                        $runyes=_Jump($comboreg0)
                        If $runyes Then ContinueLoop

                        GUICtrlSendMsg($comboreg, 0x14B, 0, 0)
                        If StringInStr('|'&$list&'|', '|'&$comboreg0&'|') Then
                                $list=StringReplace('|'&$list&'|', '|'&$comboreg0&'|', '|')
                                $list=StringRegExpReplace($list, '^\|?(.*?)\|?$', '\1')
                        EndIf
                        If $list='' Then
                                $list=$comboreg0
                        Else
                                $list=$comboreg0&'|'&$list
                        EndIf
                        StringReplace($list, '|', '|')
                        If @extended>$kol_item-1 Then $list=StringRegExpReplace($list, '(^.*)\|.*$', '\1')
                        GUICtrlSetData($comboreg, $list, $comboreg0)
                        GUICtrlSetState($comboreg, 256)
                        RegWrite($HKCU&'\Software\JumpRegAzjio','History','REG_SZ',$list)

                Case $msg = $Export
                        _Pos()
                        If FileExists(@ScriptDir & '\JumpRegSet.reg') Then FileDelete(@ScriptDir & '\JumpRegSet.reg')
                        RunWait(@SystemDir&'\reg.exe export HKCU\Software\JumpRegAzjio "'&@ScriptDir & '\JumpRegSet.reg"', '', @SW_HIDE )
                        MsgBox(0, $LngMs1, $LngMs4)

                Case $msg = $Import
                        If FileExists(@ScriptDir & '\JumpRegSet.reg') Then
                                ShellExecuteWait(@ScriptDir&'\JumpRegSet.reg')
                                GUICtrlSendMsg($comboreg, 0x14B, 0, 0)
                                $list=RegRead($HKCU&'\Software\JumpRegAzjio', 'History')
                                If $list<>'' Then GUICtrlSetData(-1, $list, StringRegExpReplace($list, '(.*?)\|.*', '\1'))
                                _HisSz()
                        Else
                                MsgBox(0, $LngMs5, $LngMs6)
                        EndIf
                       
      Case $msg = $Topmost
                        $TrTop=RegRead($HKCU&'\Software\JumpRegAzjio', 'Topmost')
                        If @error Then $TrTop=0
                        If $TrTop = 0 Then
                                WinSetOnTop($GUI, '', 1)
                                RegWrite($HKCU&'\Software\JumpRegAzjio','Topmost','REG_SZ', '1')
                                GUICtrlSetState($Topmost, 1)
                        Else
                                WinSetOnTop($GUI, '', 0)
                                RegWrite($HKCU&'\Software\JumpRegAzjio','Topmost','REG_SZ', '0')
                                GUICtrlSetState($Topmost, 4)
                        EndIf
                       
      Case $msg = $UtlM
                        If $RegScanner = 'RegScanner\RegScanner.exe' Then
                                $RegScanner = 'RegScanner_x86\RegScanner.exe'
                                GUICtrlSetState($UtlM, 1)
                        Else
                                $RegScanner = 'RegScanner\RegScanner.exe'
                                GUICtrlSetState($UtlM, 4)
                        EndIf
                       
      Case $msg = $About
          _About()
               
                Case $msg = $runfav
                        Run($Editor&' '&@ScriptDir & '\JumpRegFav.ini')
                        ; Run(@SystemDir&'\notepad.exe '&@ScriptDir & '\JumpRegFav.ini')
                Case $msg = -3
                        _Pos()
                        Exit
        EndSelect
WEnd

Func _Pos()
        $GuiPos = WinGetPos($Gui)
        If $GuiPos[0] < 0 Or $GuiPos[1]< 0 Then
                $GuiPos[0]=$aPos[1]
                $GuiPos[1]=$aPos[2]
        EndIf
        RegWrite($HKCU&'\Software\JumpRegAzjio','Pos','REG_SZ',$GuiPos[0]&'|'&$GuiPos[1])
EndFunc

Func _Jump(ByRef $comboreg0)
        If StringRight($comboreg0, 1)='\' Then $comboreg0=StringTrimRight($comboreg0, 1)

        If StringInStr(';HKLM;HKU;HKCU;HKCR;HKCC;', ';' & StringRegExpReplace($comboreg0, '(.*?)\\.*', '\1') & ';') Then
                $aSmlNm = StringRegExp($comboreg0, '(^.*?)(\\.*)$', 3)
                If @error Then Dim $aSmlNm[2]=[$comboreg0, '']

                Switch $aSmlNm[0]
                        Case 'HKLM'
                                $aSmlNm[0] = 'HKEY_LOCAL_MACHINE'
                        Case 'HKU'
                                $aSmlNm[0] = 'HKEY_USERS'
                        Case 'HKCU'
                                $aSmlNm[0] = 'HKEY_CURRENT_USER'
                        Case 'HKCR'
                                $aSmlNm[0] = 'HKEY_CLASSES_ROOT'
                        Case 'HKCC'
                                $aSmlNm[0] = 'HKEY_CURRENT_CONFIG'
                EndSwitch
                $comboreg0 = $aSmlNm[0] & $aSmlNm[1]
        EndIf
       
        ;проверяем существование раздела реестра
        If Not _Reg_Exists($comboreg0) Then
                While Not _Reg_Exists($comboreg0)
                        $comboreg0=StringRegExpReplace($comboreg0, '(.*)\\.*', '\1')
                        If @Extended=0 Then
                                MsgBox(0, $LngMs5, $LngMs7)
                                Return 1
                        EndIf
                WEnd
                If MsgBox(4, $LngMs5, $LngMs8&@CRLF&$comboreg0 &@CRLF&@CRLF&$LngMs9)=7 Then Return 1
        EndIf
       
        If $TrNRE=1 Then
                $TrNRE=0
                Run('regedit -m')
                WinWaitActive('[CLASS:RegEdit_RegEdit]')
        EndIf
        Run($RegScanner&' /regedit "'&$comboreg0&'"', "", @SW_HIDE)
EndFunc

Func _HisSz()
        StringReplace($list, '|', '|')
        If @extended>$kol_item-1 Then
                $tmp=StringInStr($list, '|', 0, $kol_item)
                $list=StringMid($list, 1, $tmp-1)
                GUICtrlSendMsg($comboreg, 0x14B, 0, 0)
                GUICtrlSetData($comboreg, $list, StringRegExpReplace($list, '(.*?)\|.*', '\1'))
                RegWrite($HKCU&'\Software\JumpRegAzjio','History','REG_SZ',$list)
        EndIf
        GUICtrlSetState($comboreg, 256)
EndFunc

;  MerkurAlex (mod AZJIO)
; http://www.autoitscript.com/forum/topic/70203-regexists/page__view__findpost__p__514688
Func _Reg_Exists($key)
    Local $Err=RunWait('reg query "'&$key&'"','',@SW_HIDE)
    If $Err=0 Then
        Return 1
    Else
        Return 0
    Endif
EndFunc

Func WM_GETMINMAXINFO($hWnd, $iMsg, $wParam, $lParam)
        #forceref $iMsg, $wParam
        If $hWnd = $GUI Then
                Local $tMINMAXINFO = DllStructCreate("int;int;" & _
                                "int MaxSizeX; int MaxSizeY;" & _
                                "int MaxPositionX;int MaxPositionY;" & _
                                "int MinTrackSizeX; int MinTrackSizeY;" & _
                                "int MaxTrackSizeX; int MaxTrackSizeY", _
                                $lParam)
                DllStructSetData($tMINMAXINFO, "MaxTrackSizeX", 1280)
                DllStructSetData($tMINMAXINFO, "MaxTrackSizeY", $Xsz)
                DllStructSetData($tMINMAXINFO, "MinTrackSizeX", 300)
                DllStructSetData($tMINMAXINFO, "MinTrackSizeY", $Xsz)
                DllStructSetData($tMINMAXINFO, "MaxSizeX", 800)
                DllStructSetData($tMINMAXINFO, "MaxSizeY", $Xsz)
                DllStructSetData($tMINMAXINFO, "MaxPositionX", @DesktopWidth/2-400)
                DllStructSetData($tMINMAXINFO, "MaxPositionY", 0)
        EndIf
EndFunc

Func _EXE_Path($type)
        Local $typefile = RegRead($HKCR &'\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.'&$type, 'Progid')
        If @error Or  $typefile='' Then
                $typefile = RegRead('HKCR\.'&$type, '')
                If @error Then Return SetError(1)
        EndIf
        $typefile = RegRead($HKCR & '\' & $typefile & '\shell\open\command', '')
        If @error Then Return SetError(1)
        Local $aPath=StringRegExp($typefile, '(?i)(^.*)(\.exe.*)$', 3)
        If @error Then Return SetError(1)
        $aPath = StringReplace($aPath[0], '"', '') & '.exe'
        Opt('ExpandEnvStrings', 1)
        If FileExists($aPath) Then
                $aPath=$aPath
                Opt('ExpandEnvStrings', 0)
                Return $aPath
        EndIf
        Opt('ExpandEnvStrings', 0)
        If FileExists(@SystemDir&'\'&$aPath) Then Return @SystemDir&'\'&$aPath
EndFunc

;#include <File.au3>
Func _FileReadToArray($sFilePath, ByRef $aArray)
        Local $hFile = FileOpen($sFilePath, 0)
        If $hFile = -1 Then Return SetError(1, 0, 0)
        Local $aFile = FileRead($hFile, FileGetSize($sFilePath))
        If StringRight($aFile, 1) = @LF Then $aFile = StringTrimRight($aFile, 1)
        If StringRight($aFile, 1) = @CR Then $aFile = StringTrimRight($aFile, 1)
        FileClose($hFile)
        If StringInStr($aFile, @LF) Then
                $aArray = StringSplit(StringStripCR($aFile), @LF)
        ElseIf StringInStr($aFile, @CR) Then
                $aArray = StringSplit($aFile, @CR)
        Else
                If StringLen($aFile) Then
                        Dim $aArray[2] = [1, $aFile]
                Else
                        Return SetError(2, 0, 0)
                EndIf
        EndIf
        Return 1
EndFunc

Func _restart()
        Local $sAutoIt_File = @TempDir & "\~Au3_ScriptRestart_TempFile.au3"
        Local $sRunLine, $sScript_Content, $hFile

        $sRunLine = @ScriptFullPath
        If Not @Compiled Then $sRunLine = @AutoItExe & ' /AutoIt3ExecuteScript ""' & $sRunLine & '""'
        If $CmdLine[0] > 0 Then $sRunLine &= ' ' & $CmdLineRaw

        $sScript_Content &= '#NoTrayIcon' & @CRLF & _
                        'While ProcessExists(' & @AutoItPID & ')' & @CRLF & _
                        '  Sleep(10)' & @CRLF & _
                        'WEnd' & @CRLF & _
                        'Run("' & $sRunLine & '")' & @CRLF & _
                        'FileDelete(@ScriptFullPath)' & @CRLF

        $hFile = FileOpen($sAutoIt_File, 2)
        FileWrite($hFile, $sScript_Content)
        FileClose($hFile)

        Run(@AutoItExe & ' /AutoIt3ExecuteScript "' & $sAutoIt_File & '"', @ScriptDir, @SW_HIDE)
        Sleep(1000)
        Exit
EndFunc


Func _About()
Local $GuiPos, $y, $Gui1, $font, $url1, $url2
$GuiPos = WinGetPos($Gui)
GUISetState(@SW_DISABLE, $Gui)
$y=$GuiPos[1]+$GuiPos[3]/2-90
If $y < 0 Then $y= 0
$font="Arial"
    $Gui1 = GUICreate($LngAbout, 270, 180,$GuiPos[0]+$GuiPos[2]/2-135, $y, -1, 0x00000080,$Gui)
        GUISetBkColor (0xffca48)
        GUICtrlCreateLabel('JumpReg', 0, 0, 270, 63, 0x01+0x0200)
        GUICtrlSetFont (-1,15, 600, -1, $font)
        GUICtrlSetColor(-1,0xa13d00)
        GUICtrlSetBkColor (-1, 0xfbe13f)
        GUICtrlCreateLabel ("-", 2,64,268,1,0x10)
       
        GUISetFont (9, 600, -1, $font)
        GUICtrlCreateLabel($LngVer&' 0.7  23.01.2011', 55, 100, 210, 17)
        GUICtrlCreateLabel($LngSite&':', 55, 115, 40, 17)
        $url1=GUICtrlCreateLabel('azjio.ucoz.ru', 55, 115, 150, 15, 0x1)
        GUICtrlSetCursor(-1, 0)
        GUICtrlSetColor(-1, 0x0000ff)
        $url2=GUICtrlCreateLabel('oszone.net', 55, 130, 150, 15, 0x1)
        GUICtrlSetCursor(-1, 0)
        GUICtrlSetColor(-1, 0x0000ff)
        GUICtrlCreateLabel('Copyright AZJIO © 2009-2011', 55, 145, 210, 17)
        GUISetState(@SW_SHOW, $Gui1)
$msg = $Gui1
        While 1
          $msg = GUIGetMsg()
          Select
                Case $msg = $url1
                        ShellExecute ('http://azjio.ucoz.ru')
                Case $msg = $url2
                        ShellExecute ('http://forum.oszone.net')
                Case $msg = -3
                        $msg = $Gui
                        GUISetState(@SW_ENABLE, $Gui)
                        GUIDelete($Gui1)
                        ExitLoop
                EndSelect
    WEnd
EndFunc


Morpheus 14-02-2011 23:30 1613059

murder, спасибо, но не пойдёт. В 64-битке запускает 32-битный regedit.
AZJIO, спасибо! Всё супер!

Vadikan 20-05-2012 11:42 1919169

AZJIO, я только сейчас обратил внимание, что 64-разрядная версия утилиты запускает 32-разрядный редактор реестра (Windows 7 x64). Я думаю, что это неправильно. Потому что если запускать regedit обычным путем, система вызывает 64-разрядный редактор.

AZJIO 20-05-2012 19:08 1919363

Vadikan, Разве не от RegScanner зависит?

Vadikan 21-05-2012 01:09 1919531

AZJIO, да, все верно, видно у меня со сборкой напутано что-то... Перекачал.

AZJIO 21-05-2012 13:48 1919834

Vadikan, можно сделать без RegScanner, вот пример
Код:

; Запуск редактора реестра
Run("regedit.exe")

; Ожидание 5 секунд до появление окна редактора реестра
$hWnd = WinWait("[CLASS:RegEdit_RegEdit]", "", 5)
If Not $hWnd Then
    MsgBox(4096, 'Сообщение', 'Окно не найдено, завершаем работу скрипта')
    Exit
EndIf


; Получает дескриптор TreeView
$hControl = ControlGetHandle($hWnd, "", "[CLASS:SysTreeView32; INSTANCE:1]")

_Jump($hWnd, $hControl, 'HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run')
Sleep(1000)
_Jump($hWnd, $hControl, 'HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders')

Func _Jump($hWnd, $hControl, $sKey)
    $aKey = StringSplit($sKey, '\')
    $sKey='#0'
    For $i = 1 To $aKey[0]
        ControlTreeView ($hWnd, "", $hControl, "Expand", $sKey)
        $sKey &= '|'&$aKey[$i]
    Next
    ControlTreeView ($hWnd, "", $hControl ,  "Select", $sKey) 
EndFunc

И окно не закрывается, используется дескриптор открытого окна.

Vadikan 21-05-2012 14:44 1919876

AZJIO, спасибо! Мы вроде проходили такой вариант, но отказались от него https://www.outsidethebox.ms/11147/#whyregscanner

AZJIO 21-05-2012 16:55 1919953

Vadikan, Так это же не такой вариант. Перезапуска нет, это видно из скрипта. Выполняется функция _Jump, далее через секунду выполняется ещё раз. Это для примера, что перезапуска нет. Функция "ControlTreeView" позволяет сделать выбор в текущем дереве, но при условии что дерево развёрнуто. Поэтому параметр "Expand" разворачивает дерево в цикле, углубляясь до последнего, а параметр "Select" делает выбор.
В принципе плюс только в неиспользовании сторонних утилит. Но при условии что у RegScanner ещё и удобный поиск, то можно оставить как есть.

AZJIO 25-05-2012 03:32 1922149

Vadikan, JumpReg обновил до версии 0.8
Исходник с выбором сторонних утилит стал основным, так как переход к разделу без сторонних утилит не требует перезапуска regedit.
Выпадающий список теперь имеет размер не менее 600
В меню пункт "Добавить в избранное" (добавляет и в меню и в файл)
Все диалоговые окна теперь дочерние

И другие незначительные исправления:
При наличии RegScanner автоматически используется он. При его удалении автоматически включается "без сторонних утилит"
При запуске второго окна RegEdit убрал ошибку: если поле пустое, то не пытается автоматически перейти в раздел.
Пункт меню: "Поиск с помошью RegScanner" не появляется если его нет.
Функцию _SetCoor обновил (диалог не окажется за экраном).

На Win7 не тестил, но сменил стиль, который потребовал на 30 уменьшить высоту окна. А также стиль $WS_CLIPCHILDREN для уменшения мерцания.

В планах можно ещё добавить сохранение ширины окна.

Morpheus 25-05-2012 10:35 1922241

AZJIO, спасибо, всё отлично!
Цитата:

Цитата AZJIO
На Win7 не тестил, но сменил стиль, который потребовал на 30 уменьшить высоту окна. »

При запуске - обрезок, если окно переместить, нормальный размер возвращается.

Цитата:

Цитата AZJIO
А также стиль $WS_CLIPCHILDREN для уменшения мерцания. »

Супер!
Цитата:

Цитата AZJIO
При наличии RegScanner автоматически используется он. При его удалении автоматически включается "без сторонних утилит" »

А при возвращении RegScanner автоматически возвращаться его использование не должно?
Хотя я RegScanner уже выпилил и мне собстно пофиг :) Просто показалось, что это было бы логично.

AZJIO 25-05-2012 12:55 1922342

Ещё обновил
Добавлено сохранение ширины окна
В избранном подерживается разделитель, строка вида: <---> с любым количеством тире
В меню пункт "Открыть другой файл избранного"

Цитата:

Цитата Morpheus
При запуске - обрезок, если окно переместить, нормальный размер возвращается »

Немного странно, обычно при изменении размера может сработать функция WM_GETMINMAXINFO. Добавил сдвиг 6 пикселей как на скрине. Возможно это несоответствие зависит от темы, незнаю.

Цитата:

Цитата Morpheus
А при возвращении RegScanner автоматически возвращаться его использование не должно? »

Там может быть наличие другой из 3-х утилит. Автоматически при первом запуске, когда нет данных в реестре, то есть случай когда используем портабельно, принесли на другой комп запускаем и сразу включается нужный режим. Только для этой цели сделано. А после выбора уже автоматом нельзя менять, может у человека все три утилиты используются.
А вот в режим "без сторонних утилит" переключается в случае если человек использует RegScanner, а потом решал отказаться, то лезть в меню не обязательно, удалил и режим автоматом переключился.
В большинстве случаев я нацелил на RegScanner и "без сторонних утилит". Остальные варианты с другими утилитами вручную через меню. Я даже не стал их автоматически проверять наличие, так как путь не известен, nircmd может быть в системных папках или в каталоге программы.
Кстати команду
Run('regedit.exe')
сделал так
Run(@WindowsDir & '\regedit.exe')
Чтобы цеплялся только тот regedit.exe, который в правильном каталоге.

Morpheus 25-05-2012 13:14 1922350

AZJIO, теперь нормальный размер, спасибо!

Pozia 25-05-2012 18:22 1922589

AZJIO, хотел бы попросить вас сделать так, чтобы можно было переходить в ветку реестра при вставке кода с скобками типа []:
Windows Registry Editor Version 5.00

;Настройка Total
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\*\Shell\Open in Total Commander]
@="Откроем в Total Commander"

так удобнее (быстрее) с файла реестра скопировать и вставить

AZJIO 25-05-2012 19:22 1922616

Добавил, ссылка таже JumpReg

AZJIO 26-05-2012 01:50 1922805

Обновлено:
Если поле ввода пустое, то JumpReg ищет путь-раздел реестра в буфере обмена, причем игнорируя символы переноса строк, скобки и тире [- ]
Можно вертикально выделять строку из рег-файла.

Pozia 27-05-2012 21:23 1923554

AZJIO, а x64 версия будет?

AZJIO 27-05-2012 21:39 1923563

JumpReg - проверь, у меня нет возможности проверить. Добавил x64 в общий дистрибутив.

Morpheus 28-05-2012 20:39 1924094

Pozia, спасибо за идею, давно не хватало.
AZJIO, спасибо за обе фишки! Здорово.
А почему когда я компилирую 64-битную версию, она получается килобайт на 80 больше? От версии AutoIT зависит что ли? У меня v3.

AZJIO 29-05-2012 08:21 1924267

Morpheus, я компилирую на 3.3.6.1, вот эта сборка. Файл x86 - 293 кб, а x64 - 779 кб. Может сжатие не сработало на x64, может надо компилировать в x64 системе.

Кстати проверил разделитель "|" в реестре, он ислоьзуется, например в только в разделе
HKEY_CLASSES_ROOT\Installer\Assemblies\C:|WINDOWS|Microsoft.NET|Framework|v3.5|MSBuild.exe
Исходя из ситуации желательно изменить разделитель в JumpReg. Я вынес разделитель в переменную, чтоб его можно было поменять, попробовать табуляцию. Желательно чтобы он был виден в JumpRegFav.ini, а не сливался с текстом как пробел. Пока случай редкий поэтому не тороплюсь менять разделитель на сомнительный вариант.

gora 29-05-2012 10:22 1924314

Цитата:

Цитата AZJIO
Может сжатие не сработало на x64 »

Его не бывает для x64 файлов, т.к., UPX не поддерживает x64 файлы.

Morpheus 29-05-2012 10:36 1924322

Короче фиг знает. Даже в 32-битной XP и на этой сборке получается 851 кб.

За разделитель спасибо, но менять пока тоже не спешу, прецедентов ошибок из-за него пока не было.

Vadikan 29-05-2012 12:40 1924408

Цитата:

Цитата AZJIO
Кстати проверил разделитель "|" в реестре, он ислоьзуется, например в только в разделе »

А зачем нужен этот разделитель?

Цитата:

Цитата AZJIO
Я вынес разделитель в переменную, чтоб его можно было поменять, попробовать табуляцию. »

Это что-то для гиков. Нужно быть проще :)

Цитата:

Цитата AZJIO
Может сжатие не сработало »

Я считаю, что надо обходиться без сжатия UPX во избежание ложных срабатываний антивирусов.

Предлагаю допилить текущий вариант, обновить посты по первым трем ссылкам в шапке и скомпилировать. После чего я соберу набор для софт-портала и обновлю там утилиту.

Morpheus 29-05-2012 13:03 1924419

Цитата:

Цитата Vadikan
А зачем нужен этот разделитель? »

Для History в HKEY_CURRENT_USER\Software\JumpRegAzjio.

gora 29-05-2012 13:35 1924450

AZJIO
1 При первом запуске (с пустой историей) и нажатии выпадающего списка, наблюдаю артефакт справа:


2 Ни в шапке темы, ни в Readme_Ru.txt не ни слова о том, что утилита хранит настройки в реестре.
3 Утилита не имеет инсталлятора и деинсталлятора. Возможно он ей и не нужен, но кто-то же должен очистить реестр после удаления утилиты или хотя бы предупредить об этом пользователя.
4 Выпадающий список имеет фиксированную ширину. Лучше сделать его ширину подстраивающейся под максимальную длину пути в этом выпадающем списке, ограничив ее максимальное значение разумной величиной. Тогда и п.1 исчезнет.

AZJIO 29-05-2012 13:41 1924456

Цитата:

Цитата Vadikan
А зачем нужен этот разделитель? »

При вставке в комбо нативная функция GUICtrlCreateCombo использует разделитель данных, который не должен встречаться в самих строках иначе он будет расцениваться как разделитель, а не как текст. Даже если использовать функции из UDF, пример ниже
читать дальше »
Код:

#include <GuiComboBox.au3>

Global $hCombo, $sText

$hGUI
= GUICreate("(UDF) ComboBox Create", 450, 396)
$hCombo = GUICtrlCreateCombo("", 5, 4, 440, 296)
; $hCombo = GUICtrlGetHandle($iCombo)

$iDummy = GUICtrlCreateDummy()

Dim $AccelKeys[1][2] = [["{Enter}", $iDummy]]
GUISetAccelerators($AccelKeys)

GUISetState()

_GUICtrlComboBox_BeginUpdate($hCombo)
For $i = 1 To 10
    _GUICtrlComboBox_AddString($hCombo, $i & ' строка')
Next
_GUICtrlComboBox_EndUpdate($hCombo)

While 1
    Switch GUIGetMsg()
        Case $hCombo
            $iIndex
= _GUICtrlComboBox_GetCurSel($hCombo)
            _GUICtrlComboBox_GetLBText($hCombo, $iIndex, $sText)
            _GUICtrlComboBox_DeleteString($hCombo, $iIndex)
            _GUICtrlComboBox_InsertString($hCombo, $sText, 0)
            _GUICtrlComboBox_SetCurSel($hCombo, 0)
        Case $iDummy
            $sText
= _GUICtrlComboBox_GetEditText($hCombo)
            $iIndex = _GUICtrlComboBox_FindStringExact($hCombo, $sText)
            If $iIndex = -1 Then
                $iCount = _GUICtrlComboBox_GetCount($hCombo)
                If $iCount > 12 Then _GUICtrlComboBox_DeleteString($hCombo, $iCount - 1)
                _GUICtrlComboBox_InsertString($hCombo, $sText, 0)
            Else
                ; _GUICtrlComboBox_GetLBText($hCombo, $iIndex, $sText)
                _GUICtrlComboBox_DeleteString($hCombo, $iIndex)
                _GUICtrlComboBox_InsertString($hCombo, $sText, 0)
            EndIf
        Case
-3
            Exit
    EndSwitch
WEnd


то всё равно желательно использовать какой либо символ разделителя (не из бинарных), чтобы записывать историю в реестр одной строкой. Вообщем пока нет желания изменять, так как случай маловероятный, 1 на 10000
Цитата:

Это что-то для гиков. Нужно быть проще
Нет, просто реестра допускает использование символа в названи раздела. Например в названии файлов запрещены символы ^/:*?"<>| значит я их могу использовать для разметки, делении строки на участки, символ можно удалить/заменить, при этом путь не пострадает. Просто редкий случай, а тестировать заново все функции нет желания, тем более в регулярных выражениях он используется закомментированным. То есть я уже сделал тестовый вариант и проверил, но как всегда утилитой нужно неделю пользоваться, чтоб быть уверенным.

Цитата:

Я считаю, что надо обходиться без сжатия UPX во избежание ложных срабатываний антивирусов.
Эту версию UPX вроде ни кто не ругал, отрицательных отзывов не было. На одном копьютере правда зонтик сработал при мне.

Цитата:

Предлагаю допилить текущий вариант, обновить посты по первым трем ссылкам в шапке и скомпилировать. После чего я соберу набор для софт-портала и обновлю там утилиту.
Что именно допилить? Если есть предложения по текстам или ещё что, меня на данном этапе устраивает. На счёт компиляции в принципе исходник содержит всё необходимое, но если что могу скомпилировать без UPX, а у себя я пока буду выкладывать пожатым. Единственное желательно компилировать используя AutoIt3Wrapper + Obfuscator, потому что я в предыдущих версиях выкладывал обфуцированный вариант, а теперь если не обфуцировать то размер exe-файла может заметно возрасти за счёт #include.
читать дальше »
#include <WindowsConstants.au3>
#include <ForJumpReg.au3>
#include <GUIConstantsEx.au3>
#include <File.au3>
#include <GuiComboBox.au3>
Обфускатор удалит неиспользуемые функции из UDF перед компиляцией их в файл.

Morpheus 29-05-2012 13:49 1924460

Цитата:

Цитата gora
2 Ни в шапке темы, ни в Readme_Ru.txt не ни слова о том, что утилита хранит настройки в реестре. »

Вы много видели программ, в справке которых это расписано?
А много видели людей (ну кроме себя), которым это интересно?
Мне перпендикулярно, где чего хранит программа. Уверен, что и 99% пользователей тоже.
Цитата:

Цитата gora
3 Утилита не имеет инсталлятора и деинсталлятора. Возможно он ей и не нужен, но кто-то же должен очистить реестр после удаления утилиты или хотя бы предупредить об этом пользователя. »

Ничего чистить точно не надо. Предупредить?
Цитата:

Цитата Morpheus
А много видели людей (ну кроме себя), которым это интересно?
Мне перпендикулярно, где чего хранит программа. Уверен, что и 99% пользователей тоже. »

Если уж так интересно, то можно код почитать или тему, если чтение кода недоступно.

AZJIO 29-05-2012 14:33 1924490

gora,
Цитата:

Цитата gora
2 Ни в шапке темы, ни в Readme_Ru.txt не ни слова о том, что утилита хранит настройки в реестре »

Ни одна программа не предупреждает, будет ли она писать что-то в реестр или копировать в "Application Data", хотя само меню "Экспорт настроек реестра" даёт понять, что настройки всё же в реестре. Да и утилита для людей которые поймут это, и стоит ли лишние слова писать в Readme.

Цитата:

1 При первом запуске (с пустой историей) и нажатии выпадающего списка, наблюдаю артефакт справа:
инициализатором ))) артефакта оказалась кнопка.
читать дальше »
Код:

GUICreate('My Program', 250, 55)
$Jump = GUICtrlCreateButton(">", 233, 12, 22, 22)
$comboreg = GUICtrlCreateCombo("", 6, 5, 222)
GUISetState()
Do
Until
GUIGetMsg() = -3

Если сделать кнопку после комбо, то артефакта нет.

3. Инсталятор наверно лишнее, можно reg-файл положить для очистки.
4. Я об этом думал, как можно вычислить ширину строки в комбо? Если примитивным методом, то проверять длинну каждой строки в комбо (все 20 или все 50) при каждом прыжке. будет ли это экономичным? Я хотел добавить ширину в настройки, но показалось это лишнее. Просто этот оптимальный минимум позволит сжать утилиту компактно по ширине, не потеряв при этом видимость строк раскрывающегося списка.

Vadikan 29-05-2012 16:28 1924537

AZJIO,

С разделителем понятно.

Допилить - остановиться на каком-то наборе уже оттестированных новых функций и сделать релиз. Компиляцию я оставляю на ваше усмотрение, но все-таки лучше без UPX, размер утилиты не столь велик.

Когда будет готово, пинганите меня, я соберу набор для обновления на софт-портале.

P.S. Упоминание про хранение в реестре и деинсталлятор не нужны.

AZJIO 29-05-2012 17:21 1924559

Я ещё решил добавить поддержку горячей клавиши и ком-строки. Горячая клавиша позволит не активируя окна сделать прыжок, а ком-строка позволит выделив текст послать его назначенной в редакторе горячей клавишей послать прыжок в реестр. Последнее конечно с учётом что редактор это умеет, например Notepad++, SciTE.

Вобщем то горячая клавиша уже работает, осталось запись/чтение в реестре сделать. Но используется не HotKeySet, у него проблемы с русской раскладкой, использую GuiHotKey.au3 от rasim.

AZJIO 29-05-2012 20:59 1924701

Готово JumpReg, но глубоко не тестил.
В Notepad++ в shortcuts.xml тестил с командой
Код:

<Command name="JumpReg" Ctrl="yes" Alt="no" Shift="no" Key="112">&quot;$(NPP_DIRECTORY)\..\AutoIt3.exe&quot; &quot;$(NPP_DIRECTORY)\..\JumpReg.au3&quot; &quot;$(CURRENT_WORD)&quot;</Command>
Ctrl+F1 (удобные хоткеи заняты). Параметр обязательно в кавычках - &quot;
кавычки не отображаются.. в общем &квот;

Перезалил, отключил попытку повторной регистрации той же горячей клавиши при применении настроек. Новые тексты перенёс в языковые файлы.

Хотел сделать копирование строки Send('^{INS}') при использовании горячей клавиши, но не пойму почему не работает, может потому что вызывается из процедуры WM_HOTKEY, которая сама обрабатывает текущий HOTKEY.

Перезалил добавив x64

Morpheus 29-05-2012 22:16 1924732

AZJIO, спасибо!
Цитата:

Цитата AZJIO
Параметр обязательно в кавычках - " »

А чего так? Вроде и без них замечательно работает.

AZJIO 29-05-2012 23:43 1924761

Morpheus, всем известно что передаваемые в ком-строку параметры разделяются пробелами, если не обрамлены кавычками, соотвественно при выделении раздела в котором есть пробел у меня сразу же выдало ошибку, что раздела нет, так как часть его пути до пробела передалась. Для горячей клавиши это отношения не имеет.

перезалил добавив x64

Morpheus 29-05-2012 23:56 1924766

AZJIO, а, тогда ок. Думал, что кавычки относятся к хоткеям.
Цитата:

Цитата AZJIO
Ctrl+F1 (удобные хоткеи заняты). Параметр обязательно в кавычках - " »

Командную строку не тестил, поскольку сторонних текстовых редакторов в хозяйстве не имеется.

AZJIO 30-05-2012 00:12 1924772

Цитата:

Цитата Morpheus
Командную строку не тестил, поскольку сторонних текстовых редакторов в хозяйстве не имеется. »

а зря, теже reg-файлы с подсветкой кода воспринимаются блоками, намного легче воспринимать чем однородный текст. Ну а с учётом, что меньше требуется телодвижений, то сейчас вызов по Alt+G переход к выделенной в редакторе сторке, кажется лучше и не придумать. Идеальней было бы эмулировать Ctrl+C (Ctrl+Insert), но пока не получилось.

AZJIO 31-05-2012 04:57 1925353

Обновил JumpReg
1. Задейсвовал всё-таки Send('^{INS}'), видимо не работал из-за горячей клавиши Alt, с Ctrl+1 без проблем. То есть достаточно выделить строку в редакторе / браузере и вызвать горячую клавишу.
2. Иногда в браузере захватывает лишний пробел, чтоб не напрягаться точным выделение текста добавил в игнор все пробельные символы начала и конца.
3. Добавил разворачивание последнего раздела, чтобы в дереве видеть существование вложенных разделов.
4. Теперь возможно выделить весь reg-файл или всю страницу браузера и горячей клавишей вызвать извлечение всех строк разделов реестра с предложением открыть первую или импортировать строки в раскрывающийся список.


Перезалил, оптимизировал импорт, при импорте из reg-файлов размером мегабайт отсутствует торможение поиска, так как ищутся только количество, которое может поместиться в раскрывающийся список. И исключение дублирующих из списка импорта.

Исправил ошибку переменной при обфускации.

AZJIO 03-06-2012 06:26 1927072

Поправки:
1. При увеличении количества элементов в раскрывающемся списке отсутсвовало обновление списка при импорте строк из буфера, теперь работает.
2. Усложнил регулярное выражение. Не отлавливало пути содержащие пробел в последнем элементе пути

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

AZJIO 14-08-2012 21:24 1970325

JumpReg - тестовый вариант, который при первом запуске спрашивает где хранить настройки, в реестре или в ini-файле. Если ini-файл рядом с JumpReg.exe, то приоритет ini-файл, даже если настройки есть в реестре.
Кстати, раздел настроек в реестре поменялся. Список в комбобоксе теперь сохраняется только при выходе из программы.

Pozia 27-09-2012 22:59 1995834

AZJIO, заметил только сейчас, что на Seven x64 JumpReg запускает regedit 32bit и при физическом отсутствии искомой ветки не спрашивает перейти ли в ближайшую похожую а ломится куда попало.

AZJIO 28-09-2012 06:59 1995926

Pozia, проверь, что версия последняя "0.8.1 2012.08.22", проверь в каком режиме прыжок "без сторонних утилит"?
И проверь отдельно работу функции
Код:

MsgBox(0, '', _RegExists('HKEY_CURRENT_USER\Software\Microsoft\Windows\ShellNoRoam\MUICache'))

Func _RegExists($sKey)
    RegRead($sKey, '')
    Return Not (@error > 0)
EndFunc

Логически путь к разделу будет обрезаться пока раздел реестра не существует, и мимо цикла обрезки не пройти. Если только функция проверки существования работает неправильно. Она была заменена на более компактный и нативный вариант. Ошибки (>0) функции RegRead являются индикатором несуществования раздела и скорее всего более вероятней ожидать что функция посчитает существующий раздел несуществующим, чем несуществующий существующим. Уж не существующий 100% выдаст ошибку и будет обрезаться.
Пока предположений нет... И у меня нет Win7 x64.

Pozia 28-09-2012 08:50 1995955

AZJIO, перекачал из 167 сообщения - у меня была версия 0.8.0, хотя оттуда качал вроде. Тихо обновили что ли? ) На версии 0.8.1 все нормально.
Если еще что нужно проверить то не понял, что значит
Цитата:

Цитата AZJIO
в каком режиме прыжок "без сторонних утилит"? »

?
И как проверить отдельно функцию приведенную?

AZJIO 28-09-2012 20:38 1996320

Pozia, Если теперь работает, то проверять нет смысла. Вставить несущестующий раздел реестра и проверить правильность результата, 0 - не существует, 1 - существует. В предыдущей версии эта функция была другая. То есть была оптимизация кода, но функциональность не изменялась, поэтому я и не отписывал (об ошибках в предыдущей версии ведь никто не сообщал ). В плане функционала добавилась поддержка сохранения в ini, но так как она была нужна только одному пользователю этой программы, то я и не афишировал для всех, просто потестировал пару недель и в виду стабильности UDF _Setting.au3 окончательно оставил.
Выбор "без сторонних утилит": "Главное меню программы > ? > Настройки", но уже не важно.


Время: 07:46.

Время: 07:46.
© OSzone.net 2001-