PDA

Показать полную графическую версию : [решено] Утилита для перехода в заданный раздел реестра


Страниц : 1 [2] 3 4 5 6 7 8 9

AZJIO
22-12-2010, 12:43
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
AZJIO, да, потребность в утилите есть :) Идея с избранным, интересна, конечно, если на флэшке таскать.

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

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

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

Vadikan
23-12-2010, 13:21
AZJIO, Так работает скрипт, конечно. Но есть несколько замечаний/пожеланий, если есть желание довести до ума и выпустить "в люди".

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

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

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

Что думаете?

AZJIO
23-12-2010, 18:20
Vadikan,
Первые два пункта выполнил.

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

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

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

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

Vadikan
23-12-2010, 21:43
Прыжок сейчас осуществляется за счёт того, что при закрытии реестра он сохраняет последний открытый раздел и открывает в том же месте. »
Понятно, я не обратил внимания, что Yashied сделал так же - я-то использовал regjump. Ну это не критично тогда.хотелось бы избранное иметь и отдельно историю »
Да, но у вас сейчас в INI файл есть возможность сохранить только всю историю, а не выборочно. Я предлагаю разграничить и вообще не хранить ее в INI, оставив его только для избранного. И галочка отдельная не нужна. Тем более, что А в утилите первый раздел ini как бы и есть избранное. »

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

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

Неассоциированность ini уже есть функция... откроется в том редакторе, в котором ассоциирован txt »У меня предложило выбрать приложение...

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

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

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

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

Ждем-с :)

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

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

Vadikan
24-12-2010, 11:47
AZJIO,

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

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

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

AZJIO
24-12-2010, 16:58
Vadikan, вот сделал поправки, это уже было не сложно. Предыдущий вариант тоже оставил в предыдущем посте, чтоб выбор был. Смысл прекреплять сверху в том, что regedit откроется чуть ниже, ведь при каждом старте сдвигать утилиту приходится вверх.
3. У меня не моргал курсор, хотя подозреваю срабатывание функции из WinAPI.au3 - _SendMessage, которая предназначена для перетаскивания окна за само окно, но теперь это убрал. Видимо изменялся курсор для перетаскивания.
Что касается JumpRegFav.ini, то не очень понятно, для чего нужно имя после разделителя » Да, имя нужно только для избранного в Regedit, хотя не обязательно, без него в качестве имени используется имя раздела реестра, но как пример оставил в конфиге. Может кому то захочется иметь осмысленные имена.

* Убрал сообщение создания JumpRegFav.ini при первом старте.
+ опция установки размера истории. У меня история укладывается в 600 пиксель (высота экрана нетбука), т.е. в 2 раза можно увеличить для моего монитора.
+ при клике на заголовке развёртывание в ширину на 800 пиксель и перемещение к верху экрана.
+ Выбор метода, требуются указанные утилиты regjump.exe (http://technet.microsoft.com/en-us/sysinternals/bb963880), regscanner.exe (http://www.nirsoft.net/utils/regscanner.html), nircmd.exe (http://www.nirsoft.net/utils/nircmd.html).

С выбором утилиты.
#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
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 тут (http://forum.oszone.net/post-1569794-18.html). В итоге получится интересный вариант от всех инициативных лиц :)

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

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

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

Morpheus
25-12-2010, 04:30
Vadikan, вместо тулы Марка, предлагаю использовать regscanner.exe /regedit (http://www.nirsoft.net/utils/regscanner.html), она есть 64. Кстати ключ /clipregedit тоже очень интересный :)
З.Ы. Скомпилил #31 (http://forum.oszone.net/post-1573691-31.html) в чистом виде в 64 - история работает.

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

AZJIO
25-12-2010, 11:19
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
в чистом виде в 64 - история работает. » то есть когда был ещё без бинарной конвертации параметра History в реестре? Сейчас то я изменил это, но могу назад вернуть.

Morpheus
25-12-2010, 12:49
но не выделяет найденный раздел в дереве »
На первый взгляд этого достаточно, но подумать ещё, не помешает :)
то есть когда был ещё без бинарной конвертации параметра History в реестре? »
Ага. В чистом - без регджампа и пр. модификаций.
Новый вариант тоже работает.
Добавил »
Уже? :) Этот ещё не пробовал :)

Vadikan
25-12-2010, 13:34
всё работает, но не выделяет найденный раздел в дереве, как делает 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
Vadikan, версию с выбором утилит оставляю, теперь вариант для компиляции.
1. Вернул параметр реестра не бинарный, лишняя конвертация никчему (нужно подчистить бинарный параметр в реестре).
2. Убрал выбор утилит, теперь только RegScanner.exe
3. Для компиляции нужны файлы RegScanner.exe и RegScanner_lng.ini
4. Добавил примагничивание regedit к нижнему краю утилиты. Удалил, не понравилось.
В Win7 проверил...
О программе - выдает ошибку » у меня тоже выдавала, потом два раза обновил уже с поправкой...

#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
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
Vadikan, ну и я тогда поправил тексты на ваш вариант. Ещё заменил "начиная со второй строки" на "начиная с третьей строки". И в вашем посте код с примагничиванием, в своём посте убрал. Вроде можно считать окончательным вариантом.




© OSzone.net 2001-2012