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

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

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

(*.*)


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


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

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




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

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

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



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

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




Код: Выделить весь код
; Simple GUI wrapper for regjump http://technet.microsoft.com/en-us/sysinternals/bb963880
; regjump must reside in %path%
; Run the script elevated when UAC is on

#include <GUIConstantsEx.au3>

Opt("GUIOnEventMode", 1)  ; Change to OnEvent mode 
$mainwindow = GUICreate("JumpReg", 400, 100)
GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEClicked")
GUICtrlCreateLabel ("Путь к разделу реестра:", 20, 10)
$path = GUICtrlCreateInput("", 20, 30, 360, 20)
$jumpbtn = GUICtrlCreateButton("Jump", 170, 60, 60) ;Registry path input field
GUICtrlSetOnEvent($jumpbtn, "OKButton")
GUISetState(@SW_SHOW)
$exe = "regjump.exe "

While 1
  Sleep(1000)  ; Idle around
WEnd

Func OKButton()
  $jump = $exe & GUICtrlRead($path)
  Run(@ComSpec & " /c " & $jump, "", @SW_HIDE)
 ;Run("regjump.exe" & " " & GUICtrlRead($path), "", @SW_SHOW) ;works, but shows cmd window

EndFunc

Func CLOSEClicked()
  Exit
EndFunc
На большее моих знаний AutoIt и программирования в целом не хватает Но все-таки хотелось бы сделать так, чтобы после ввода раздела реестра в поле активной становилась кнопка. Это позволит просто нажимать Enter, вместо TAB+Enter.

Подскажете, как это сделать?

Спасибо.

P.S. Скрипт нужно запускать с полными правами.

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

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

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

 

Аватара для AZJIO

Старожил


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

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


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

Последний раз редактировалось AZJIO, 11-01-2011 в 19:35. Причина: fix проблемы сворачивания

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

Отправлено: 16:58, 24-12-2010 | #31



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

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


(*.*)


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

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


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 тут. В итоге получится интересный вариант от всех инициативных лиц

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


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


Аватара для AZJIO

Старожил


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

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


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

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

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

Последний раз редактировалось AZJIO, 25-12-2010 в 04:32.


Отправлено: 02:03, 25-12-2010 | #33


Аватара для Morpheus

Ветеран


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

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


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

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

Отправлено: 04:30, 25-12-2010 | #34


Аватара для AZJIO

Старожил


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

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


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 в реестре? Сейчас то я изменил это, но могу назад вернуть.

Последний раз редактировалось AZJIO, 25-12-2010 в 12:30.


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


Аватара для Morpheus

Ветеран


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

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


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

Отправлено: 12:49, 25-12-2010 | #36


(*.*)


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

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


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

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

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

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

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

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


Отправлено: 13:34, 25-12-2010 | #37


Аватара для AZJIO

Старожил


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

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


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

Последний раз редактировалось AZJIO, 23-01-2011 в 05:47. Причина: Добавлено "regedit -m"


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


(*.*)


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

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


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

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


Последний раз редактировалось Vadikan, 25-12-2010 в 17:25. Причина: убран код прилипания к regedit


Отправлено: 16:44, 25-12-2010 | #39


Аватара для AZJIO

Старожил


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

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


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

Отправлено: 17:08, 25-12-2010 | #40



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

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

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




 
Переход