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

Показать сообщение отдельно

Аватара для Yashied

Старожил


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

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


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



Код: Выделить весь код
#Include <GUIComboBox.au3>
#Include <GUIConstantsEx.au3>
#Include <WinAPIEx.au3>

Global Const $MRU_MAX_SIZE = 26

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

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

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

Func _AddPath($sPath)

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

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

Func _LoadMRUList()

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

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

Func _RegJump($sKey)

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

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

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

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

Func _SaveMRUList()

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

    For $i = $Count - 1 To 0 Step -1
        _GUICtrlComboBox_GetLBText($Combo, $i, $Path)
        _WinAPI_AddMRUString($hMRU, $Path)
    Next
    _GUICtrlComboBox_GetLBText($Combo, _GUICtrlComboBox_GetCurSel($Combo), $Path)
    _WinAPI_AddMRUString($hMRU, $Path)
    _WinAPI_FreeMRUList($hMRU)
EndFunc   ;==>_SaveMRUList
История сохраняется в HKEY_CURRENT_USER\Software\Vadikan\MRU

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

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

P.S

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

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