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