Advertisement
AZJIO

Менеджер реестра

Jan 26th, 2012
756
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
AutoIt 26.43 KB | None | 0 0
  1. #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
  2. #AutoIt3Wrapper_Outfile=RegistryViewer.exe
  3. #AutoIt3Wrapper_Icon=RegistryViewer.ico
  4. #AutoIt3Wrapper_Compression=4
  5. #AutoIt3Wrapper_Res_Comment=-
  6. #AutoIt3Wrapper_Res_Description=RegistryViewer.exe
  7. #AutoIt3Wrapper_Res_Fileversion=0.2.0.0
  8. #AutoIt3Wrapper_Res_FileVersion_AutoIncrement=n
  9. #AutoIt3Wrapper_Res_LegalCopyright=AZJIO
  10. #AutoIt3Wrapper_Res_Language=1049
  11. #AutoIt3Wrapper_Run_Au3check=n
  12. #AutoIt3Wrapper_Res_Field=Version|0.2
  13. #AutoIt3Wrapper_Res_Field=Build|2012.09.21
  14. #AutoIt3Wrapper_Res_Field=Coded by|AZJIO
  15. #AutoIt3Wrapper_Res_Field=Compile date|%longdate% %time%
  16. #AutoIt3Wrapper_Res_Field=AutoIt Version|%AutoItVer%
  17. #AutoIt3Wrapper_Run_Obfuscator=y
  18. #Obfuscator_Parameters=/sf /sv /om /cs=0 /cn=0
  19. #AutoIt3Wrapper_Run_After=del /f /q "%scriptdir%\%scriptfile%_Obfuscated.au3"
  20. #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
  21.  
  22. #NoTrayIcon
  23. #include <WindowsConstants.au3>
  24. #include <GUIConstantsEx.au3>
  25. #include <GuiTreeView.au3>
  26. #include <GuiImageList.au3>
  27. #include <GuiListView.au3>
  28. #include <GuiStatusBar.au3>
  29. #include <EditConstants.au3>
  30. #include <_RegFunc.au3>
  31.  
  32. Opt("GUIOnEventMode", 1)
  33. Opt("GUIResizeMode", 802)
  34.  
  35. Global $PathCur, $PathClickRight, $Cur_LV_idx = -1, $ErrCount = 0
  36.  
  37. ; En
  38. $LngTitle = 'RegistryViewer'
  39. $LngJmp = 'Go'
  40. $LngLVn = 'Name'
  41. $LngLVt = 'Type'
  42. $LngLVv = 'Value'
  43. $LngDft = '(Default)'
  44. $LngTmAs = 'Access time :'
  45. $LngExp = 'Export'
  46. $LngCpP = 'Copy path-key'
  47. $LngSvAs = 'Save as...'
  48. $LngFRe = 'Registry file'
  49. $LngSec = 'sec'
  50. $LngDel = 'Delete'
  51. $LngChg = 'Change'
  52. $LngMS1 = 'Message'
  53. $LngMS2 = 'The type is not supported'
  54. $LngMS3 = 'Do you want to delete'
  55. $LngMS4 = 'Specify the name'
  56. $LngMS5 = 'name already exists'
  57. $LngGT1 = 'Edit String'
  58. $LngCnl = 'Cancel'
  59. $LngCrt = 'Create'
  60. $LngSCr = 'successfully created'
  61. $LngSDl = 'successfully deleted'
  62. $LngErC = 'Error count'
  63.  
  64. $UserIntLang = @OSLang
  65.  
  66. ; Ru
  67. ; если русская локализация, то русский язык
  68. If $UserIntLang = 0419 Then
  69.     $LngTitle = 'Просмотрщик реестра'
  70.     $LngJmp = 'Перейти'
  71.     $LngLVn = 'Параметр'
  72.     $LngLVt = 'Тип'
  73.     $LngLVv = 'Значение'
  74.     $LngDft = '(По умолчанию)'
  75.     $LngTmAs = 'Время доступа :'
  76.     $LngExp = 'Экспорт'
  77.     $LngCpP = 'Копировать путь к разделу'
  78.     $LngSvAs = 'Сохранить как ...'
  79.     $LngFRe = 'Файл реестра'
  80.     $LngSec = 'сек'
  81.     $LngDel = 'Удалить'
  82.     $LngChg = 'Изменить'
  83.     $LngMS1 = 'Сообщение'
  84.     $LngMS2 = 'Выбранный тип не поддерживается'
  85.     $LngMS3 = 'Вы хотите удалить'
  86.     $LngMS4 = 'Укажите имя параметра'
  87.     $LngMS5 = 'Параметр уже существует'
  88.     $LngGT1 = 'Изменение строкового параметра'
  89.     $LngCnl = 'Отмена'
  90.     $LngCrt = 'Создать'
  91.     $LngSCr = 'успешно создан'
  92.     $LngSDl = 'успешно удалён'
  93.     $LngErC = 'Счёт ошибок'
  94. EndIf
  95.  
  96. $hGui = GUICreate($LngTitle, 640, 560, -1, -1, $WS_OVERLAPPEDWINDOW)
  97. GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
  98. If Not @Compiled Then GUISetIcon(@ScriptDir & '\RegistryViewer.ico')
  99. Local $aParts[3] = [640-210, -1]
  100. $hStatusBar = _GUICtrlStatusBar_Create($hGui, $aParts, '', $SBARS_TOOLTIPS+$SBARS_SIZEGRIP)
  101.  
  102. $restart = GUICtrlCreateButton("R", 640 - 20, 2, 18, 20)
  103. GUICtrlSetResizing(-1, 512 + 256 + 32 + 4)
  104. GUICtrlSetOnEvent(-1, "_Restart")
  105.  
  106. $Address = GUICtrlCreateInput('', 5, 6, 570, 24)
  107. GUICtrlSetResizing(-1, 2 + 4 + 32 + 512)
  108. $go = GUICtrlCreateButton(">", 577, 6, 24, 24)
  109. GUICtrlSetResizing(-1, 4 + 32 + 256 + 512)
  110. GUICtrlSetOnEvent(-1, "_JumpRegistry")
  111. GUICtrlSetTip(-1, $LngJmp)
  112.  
  113. $TreeView = GUICtrlCreateTreeView(0, 35, 216, 500, -1, $WS_EX_CLIENTEDGE)
  114. GUICtrlSetResizing(-1, 2 + 32 + 64 + 256)
  115. $hTreeView = GUICtrlGetHandle($TreeView)
  116.  
  117. $hImage = _GUIImageList_Create(16, 16, 5, 1)
  118. _GUIImageList_AddIcon($hImage, @SystemDir & '\shell32.dll', -4)
  119. _GUIImageList_AddIcon($hImage, @SystemDir & '\shell32.dll', -5)
  120. _GUIImageList_AddIcon($hImage, @SystemDir & '\shell32.dll', 0)
  121. If @OSBuild < 5000 Then
  122.     _GUIImageList_AddIcon($hImage, @WindowsDir & '\regedit.exe', 7)
  123.     _GUIImageList_AddIcon($hImage, @WindowsDir & '\regedit.exe', 8)
  124. Else
  125.     _GUIImageList_AddIcon($hImage, @WindowsDir & '\regedit.exe', 3)
  126.     _GUIImageList_AddIcon($hImage, @WindowsDir & '\regedit.exe', 4)
  127. EndIf
  128. _GUICtrlTreeView_SetNormalImageList($hTreeView, $hImage)
  129.  
  130. $RegRoot = StringSplit('HKEY_CLASSES_ROOT,HKEY_CURRENT_USER,HKEY_LOCAL_MACHINE,HKEY_USERS,HKEY_CURRENT_CONFIG', ',')
  131. For $i = 1 To $RegRoot[0]
  132.     $hTmp = _GUICtrlTreeView_Add($hTreeView, 0, $RegRoot[$i], 0, 0)
  133.     _GUICtrlTreeView_SetChildren($hTreeView, $hTmp) ; добавляем плюсик
  134. Next
  135.  
  136. $ListView = GUICtrlCreateListView($LngLVn & '| ' & $LngLVt & '| ' & $LngLVv, 220, 35, 420, 500, $LVS_SHOWSELALWAYS, BitOR($LVS_EX_INFOTIP, $WS_EX_CLIENTEDGE, $LVS_EX_FULLROWSELECT))
  137. ; GUICtrlSendMsg($ListView, $LVM_SETEXTENDEDLISTVIEWSTYLE, $LVS_EX_TRACKSELECT, $LVS_EX_TRACKSELECT)
  138. GUICtrlSetResizing(-1, 2 + 4 + 32 + 64)
  139. GUICtrlSetBkColor(-1, 0xf0f0f0) ; 0xE0DFE3
  140. $hListView = GUICtrlGetHandle($ListView)
  141. _GUICtrlListView_SetColumnWidth($ListView, 0, 200)
  142. _GUICtrlListView_SetColumnWidth($ListView, 1, 90)
  143. _GUICtrlListView_SetColumnWidth($ListView, 2, 240)
  144. _GUICtrlListView_SetImageList($hListView, $hImage, 1)
  145.  
  146. $ReLbl = GUICtrlCreateLabel('', 216, 35, 5, 500)
  147. GUICtrlSetResizing(-1, 2 + 32 + 64 + 256)
  148. GUICtrlSetCursor(-1, 13)
  149. GUISetOnEvent($GUI_EVENT_PRIMARYDOWN, "_ResizeField")
  150.  
  151. $ContMenu = GUICtrlCreateContextMenu(GUICtrlCreateDummy())
  152. $hTVMenu = GUICtrlGetHandle($ContMenu)
  153.  
  154. GUICtrlCreateMenuItem($LngExp, $ContMenu)
  155. GUICtrlSetOnEvent(-1, "_Export")
  156.  
  157. GUICtrlCreateMenuItem($LngCpP, $ContMenu)
  158. GUICtrlSetOnEvent(-1, "_CopyPathKey")
  159.  
  160.  
  161. $ContMenuLV = GUICtrlCreateContextMenu(GUICtrlCreateDummy())
  162. $hLVMenu = GUICtrlGetHandle($ContMenuLV)
  163.  
  164. GUICtrlCreateMenuItem($LngDel, $ContMenuLV)
  165. GUICtrlSetOnEvent(-1, "_DeleteItem")
  166.  
  167. GUICtrlCreateMenuItem($LngChg, $ContMenuLV)
  168. GUICtrlSetOnEvent(-1, "_ChangeValue")
  169.  
  170. GUICtrlCreateMenuItem($LngCrt, $ContMenuLV)
  171. GUICtrlSetOnEvent(-1, "_CreateNameValue")
  172.  
  173.  
  174. $ContMenuLV2 = GUICtrlCreateContextMenu(GUICtrlCreateDummy())
  175. $hLVMenu2 = GUICtrlGetHandle($ContMenuLV2)
  176. GUICtrlCreateMenuItem($LngCrt, $ContMenuLV2)
  177. GUICtrlSetOnEvent(-1, "_CreateNameValue")
  178.  
  179.  
  180. $iDummy = GUICtrlCreateDummy()
  181. GUICtrlSetOnEvent(-1, "_ActionFocus")
  182. $iDelete = GUICtrlCreateDummy()
  183. GUICtrlSetOnEvent(-1, "_DelHK")
  184. Dim $AccelKeys[2][2] = [["{Enter}", $iDummy], ["{Del}", $iDelete]]
  185. GUISetAccelerators($AccelKeys)
  186.  
  187. GUISetState()
  188. GUIRegisterMsg($WM_NOTIFY, 'WM_NOTIFY')
  189. GUIRegisterMsg($WM_SIZE, "WM_SIZE")
  190. GUIRegisterMsg($WM_GETMINMAXINFO, "WM_GETMINMAXINFO")
  191.  
  192. While 1
  193.     Sleep(100000)
  194. WEnd
  195.  
  196. Func _Exit()
  197.     Exit
  198. EndFunc
  199.  
  200. Func _RegExists($sKey)
  201.     RegRead($sKey, '')
  202.     Return Not (@error > 0)
  203. EndFunc
  204.  
  205.  
  206. Func _ActionFocus()
  207.     ; MsgBox(0, '', ControlGetFocus($hGui))
  208.     Switch ControlGetFocus($hGui)
  209.         Case 'Edit1'
  210.             _JumpRegistry()
  211.         ; Case 'SysTreeView321'
  212.             ; _Add()
  213.         Case 'SysListView321'
  214.             _Clipboard()
  215.     EndSwitch
  216. EndFunc
  217.  
  218. Func _ResizeField()
  219.     Local $aClientSize, $aCur_Info, $aID_Pos, $dX, $tmp
  220.     $aCur_Info = GUIGetCursorInfo($hGui)
  221.     If $aCur_Info[4]=$ReLbl Then
  222.         $aID_Pos = ControlGetPos($hGui, '', $ReLbl)
  223.         $aClientSize = WinGetClientSize($hGui)
  224.         $aClientSize[1] -=60
  225.  
  226.         ; высчитываем разницу координат
  227.         $dX= $aID_Pos[0]-$aCur_Info[0]
  228.         While 1
  229.             Sleep(10)
  230.             $aCur_Info = GUIGetCursorInfo($hGui) ; получаем новую инфу
  231.             $aCur_Info[0]+=$dX
  232.            
  233.             If Not($aCur_Info[0]<60 Or $aClientSize[0]-$aCur_Info[0]<60 Or $tmp = $aCur_Info[0]) Then
  234.                 GUICtrlSetPos($ReLbl, $aCur_Info[0], 35) ; устанавливаем новые координаты
  235.                 GUICtrlSetPos($TreeView, 0, 35, $aCur_Info[0], $aClientSize[1])
  236.                 GUICtrlSetPos($ListView, $aCur_Info[0]+4, 35, $aClientSize[0]-$aCur_Info[0]-4, $aClientSize[1])
  237.                 If Not $aCur_Info[2] Then ExitLoop ; выход если курсор отпущен
  238.                 $tmp = $aCur_Info[0]
  239.             EndIf
  240.         WEnd
  241.     EndIf
  242. EndFunc
  243.  
  244. Func _CopyPathKey()
  245.     ClipPut($PathClickRight)
  246. EndFunc
  247.  
  248. Func _DelHK()
  249.     Local $idx = _GUICtrlListView_GetSelectedIndices($hListView)
  250.     If $idx Then
  251.         $Cur_LV_idx = Number($idx)
  252.         _DeleteItem()
  253.     Else
  254.         $ErrCount += 1
  255.         _GUICtrlStatusBar_SetText($hStatusBar, $LngErC & ' ' & $ErrCount)
  256.     EndIf
  257. EndFunc
  258.  
  259. Func _DeleteItem()
  260.     If $Cur_LV_idx = -1 Then Return
  261.     ; MsgBox(0, $Cur_LV_idx, $Cur_LV_idx)
  262.     Local $sText = _GUICtrlListView_GetItemText($hListView, $Cur_LV_idx)
  263.     ; MsgBox(0, $sText, $PathCur)
  264.     Local $Value = _RegRead($PathCur, $sText)
  265.     If Not @error And MsgBox(4, $LngMS1, $LngMS3 &@CRLF& _
  266.     'Key = ' & $PathCur &@CRLF& _
  267.     'Name = ' & $sText &@CRLF& _
  268.     'Value = ' & $Value, 0 , $hGui) = 6 Then
  269.         If RegDelete($PathCur, $sText) = 1 And _GUICtrlListView_DeleteItem($hListView, $Cur_LV_idx) Then _GUICtrlStatusBar_SetText($hStatusBar, $sText & ' ' & $LngSDl)
  270.     EndIf
  271.     $Cur_LV_idx = -1
  272. EndFunc
  273.  
  274. Func _Export()
  275.     $SaveFile = FileSaveDialog($LngSvAs, @DesktopDir, $LngFRe & ' (*.reg)', 24, '', $hGui)
  276.     If @error Then Return
  277.     If StringRight($SaveFile, 4) <> '.reg' Then $SaveFile &= '.reg'
  278.     _RegExport($SaveFile, $PathClickRight)
  279. EndFunc
  280.  
  281. Func WM_SIZE($hWnd, $iMsg, $iwParam, $ilParam)
  282.     _GUICtrlStatusBar_Resize ($hStatusBar)
  283.     Local $aParts[3] = [BitAND($ilParam, 0xFFFF) - 210, -1]
  284.     _GUICtrlStatusBar_SetParts ($hStatusBar, $aParts)
  285.     Return $GUI_RUNDEFMSG
  286. EndFunc   ;==>WM_SIZE
  287.  
  288. Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
  289.     Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $tmp, $aKey
  290.  
  291.     $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
  292.     $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
  293.     $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
  294.     $iCode = DllStructGetData($tNMHDR, "Code")
  295.     Switch $hWndFrom
  296.         Case $hTreeView
  297.             Switch $iCode
  298.                 Case $NM_CLICK
  299.                     ; получение хэндла кликнутого пункта и поиск его в массиве
  300.                     Local $tMPos = _WinAPI_GetMousePos(True, $hWndFrom), $tHit = _GUICtrlTreeView_HitTestEx($hWndFrom, DllStructGetData($tMPos, 1), DllStructGetData($tMPos, 2))
  301.                     Local $hItem = DllStructGetData($tHit, "Item")
  302.                     If $hItem <> -1 And $hItem <> 0x0 Then
  303.                         $tmp = _GetPathItem($hWndFrom, $hItem)
  304.                         If $PathCur = $tmp Then
  305.                             Return
  306.                         Else
  307.                             $PathCur = $tmp
  308.                         EndIf
  309.                         GUICtrlSetData($Address, $PathCur)
  310.                        
  311.                         _GUICtrlListView_BeginUpdate($hListView)
  312.                         _GUICtrlListView_DeleteAllItems($hListView)
  313.                         $timer = TimerInit()
  314.                        
  315.                         $j = 1
  316.                         $tmp = ''
  317.                         While 1
  318.                             $key = RegEnumKey($PathCur, $j)
  319.                             If @error Then ExitLoop
  320.                             $j += 1
  321.                             $tmp &= $key & '|'
  322.                         WEnd
  323.                         If $tmp Then
  324.                             $tmp = StringTrimRight($tmp, 1)
  325.                             $aKey = StringSplit($tmp, '|')
  326.                             For $i = 1 To $aKey[0]
  327.                                 _GUICtrlListView_AddItem($hListView, $aKey[$i], 0)
  328.                             Next
  329.                         Else
  330.                             Dim $aKey[1] = [0]
  331.                         EndIf
  332.                        
  333.                         $j = 1
  334.                         While 1
  335.                             $key = RegEnumVal($PathCur, $j)
  336.                             If @error Then ExitLoop
  337.                             $j += 1
  338.                             _ListView_AddItem($hListView, $key, @extended)
  339.                         WEnd
  340.                         ; авторазмер последней колонки
  341.                         GUICtrlSendMsg($ListView, $LVM_SETCOLUMNWIDTH, 2, $LVSCW_AUTOSIZE)
  342.                         GUICtrlSendMsg($ListView, $LVM_SETCOLUMNWIDTH, 2, $LVSCW_AUTOSIZE_USEHEADER)
  343.                        
  344.                         _GUICtrlListView_EndUpdate($hListView)
  345.                        
  346.                         ; $KolChild = _GUICtrlTreeView_GetChildCount($hWndFrom, $hItem)
  347.                        
  348.                         If _GUICtrlTreeView_GetChildren($hWndFrom, $hItem) And Not _GUICtrlTreeView_ExpandedOnce($hWndFrom, $hItem) Then
  349.                             For $i = 1 To $aKey[0]
  350.                                 $tmp = _GUICtrlTreeView_AddChild($hWndFrom, $hItem, $aKey[$i], 0, 0)
  351.                                 $key = RegEnumKey($PathCur & '\' & $aKey[$i], 1)
  352.                                 If Not @error Then _GUICtrlTreeView_SetChildren($hWndFrom, $tmp) ; добавляем плюсик
  353.                             Next
  354.                         EndIf
  355.                         _GUICtrlStatusBar_SetText($hStatusBar, $PathCur)
  356.                         _GUICtrlStatusBar_SetTipText($hStatusBar, 0, $PathCur)
  357.                         _GUICtrlStatusBar_SetText($hStatusBar, $LngTmAs & ' ' & Round(TimerDiff($timer) / 1000, 2) & ' ' & $LngSec, 2)
  358.                     Else
  359.                         Return
  360.                     EndIf
  361.                 Case $NM_RCLICK ; Вызов контекстного меню правой кнопкой мыши
  362.                     Local $tMPos = _WinAPI_GetMousePos(True, $hWndFrom) ; координаты относительно элемента
  363.                     Local $hItem = _GUICtrlTreeView_HitTestItem($hWndFrom, DllStructGetData($tMPos, 1), DllStructGetData($tMPos, 2)) ; получаем дескриптор пункта
  364.                     If $hItem <> -1 And $hItem <> 0x0 Then
  365.                         $PathClickRight = _GetPathItem($hWndFrom, $hItem)
  366.                         $x = MouseGetPos(0)
  367.                         $y = MouseGetPos(1)
  368.                         DllCall("user32.dll", "int", "TrackPopupMenuEx", "hwnd", $hTVMenu, "int", 0, "int", $x, "int", $y, "hwnd", $hGui, "ptr", 0)
  369.                     EndIf
  370.             EndSwitch
  371.         Case $hListView
  372.             Switch $iCode
  373.                 Case $NM_CLICK
  374.                     $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
  375.                     $iItem = DllStructGetData($tInfo, 'Index')
  376.                     If $iItem > -1 Then
  377.                         $tmp = _GUICtrlListView_GetItemText($hListView, $iItem, 2)
  378.                         GUICtrlSetData($Address, $tmp)
  379.                     EndIf
  380.                 Case $NM_DBLCLK
  381.                     $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
  382.                     $iItem = DllStructGetData($tInfo, 'Index')
  383.                     If $iItem > -1 Then
  384.                         $tmp = _GUICtrlListView_GetItemText($hListView, $iItem, 2)
  385.                         ClipPut($tmp)
  386.                     EndIf
  387.                 Case $NM_RCLICK ; Вызов контекстного меню правой кнопкой мыши
  388.                     $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
  389.                     Local $iItem = DllStructGetData($tInfo, "Index")
  390.                     $x = MouseGetPos(0)
  391.                     $y = MouseGetPos(1)
  392.                     $Cur_LV_idx = $iItem
  393.                     If $iItem=-1 Then
  394.                         DllCall("user32.dll", "int", "TrackPopupMenuEx", "hwnd", $hLVMenu2, "int", 0, "int", $x, "int", $y, "hwnd", $hGui, "ptr", 0)
  395.                     Else
  396.                         DllCall("user32.dll", "int", "TrackPopupMenuEx", "hwnd", $hLVMenu, "int", 0, "int", $x, "int", $y, "hwnd", $hGui, "ptr", 0)
  397.                     EndIf
  398.             EndSwitch
  399.     EndSwitch
  400.     Return $GUI_RUNDEFMSG
  401. EndFunc
  402.  
  403. ; создать элементы и только тогда развернуть
  404. Func _JumpRegistry()
  405.     Local $aKey, $hItem, $i, $j, $key, $KeyChild, $sKey, $sKey2
  406.     $sKey = GUICtrlRead($Address)
  407.     If StringLeft($sKey, 2)<>'HK' Then
  408.         ClipPut($sKey)
  409.         Return
  410.     EndIf
  411.     $aKey = StringSplit($sKey, '\')
  412.     $sKey = $aKey[1]
  413.     $sKey2 = $aKey[1]
  414.  
  415.     For $i = 1 To $aKey[0]
  416.         If $i > 1 Then
  417.             $sKey &= '|' & $aKey[$i]
  418.             $sKey2 &= '\' & $aKey[$i]
  419.         EndIf
  420.        
  421.         ControlTreeView($hGui, "", $hTreeView, "Select", $sKey) ; выделяет раздел
  422.         If @error Then
  423.             If $i = 1 Then
  424.                 Return
  425.             Else
  426.                 ExitLoop
  427.             EndIf
  428.         EndIf
  429.         $hItem = _GUICtrlTreeView_GetSelection($hTreeView) ; получает дескриптор
  430.  
  431.         If _GUICtrlTreeView_GetChildren($hTreeView, $hItem) And Not _GUICtrlTreeView_ExpandedOnce($hTreeView, $hItem) Then
  432.         ; If _GUICtrlTreeView_GetChildCount($hTreeView, $hItem) = -1 And _GUICtrlTreeView_GetChildren($hTreeView, $hItem) Then
  433.             $j = 1
  434.             While 1
  435.                 $key = RegEnumKey($sKey2, $j)
  436.                 If @error Then ExitLoop
  437.                 $j += 1
  438.                 $KeyChild = _GUICtrlTreeView_AddChild($hTreeView, $hItem, $key, 0, 0)
  439.                 RegEnumKey($sKey2 & '\' & $key, 1)
  440.                 If Not @error Then _GUICtrlTreeView_SetChildren($hTreeView, $KeyChild) ; добавляем плюсик
  441.             WEnd
  442.         EndIf
  443.         _GUICtrlTreeView_Expand($hTreeView, $hItem) ; разворачивает пункт
  444.     Next
  445.     _GUICtrlTreeView_ClickItem($hTreeView, $hItem, "left", False)
  446. EndFunc
  447.  
  448. Func _GetPathItem($hTreeView, $hItem)
  449.     Local $sep = Opt("GUIDataSeparatorChar", "\")
  450.     Local $sPath = _GUICtrlTreeView_GetTree($hTreeView, $hItem)
  451.     Opt("GUIDataSeparatorChar", $sep)
  452.     Return $sPath
  453. EndFunc
  454.  
  455. Func _Clipboard()
  456.     ClipPut(GUICtrlRead($Address))
  457. EndFunc
  458.  
  459. Func _ChangeValue()
  460.     If $Cur_LV_idx = -1 Then Return
  461.     Local $sName = _GUICtrlListView_GetItemText($hListView, $Cur_LV_idx)
  462.     If $sName = $LngDft Then $sName = ''
  463. ; MsgBox(0, '|'&$sName&'|', $Cur_LV_idx)
  464.     Local $Value = RegRead($PathCur, $sName)
  465.     If Not @error Then
  466.         $extended = @extended
  467.         Switch $extended
  468.             Case 1 ; REG_SZ
  469.                 $Value = _Gui_REG_SZ($sName, $Value)
  470.                 If Not @error And RegWrite($PathCur, $sName, "REG_SZ", $Value) Then
  471.                     _GUICtrlListView_SetItemText($hListView, $Cur_LV_idx, $Value, 2)
  472.                 EndIf
  473.             Case 2 ; REG_EXPAND_SZ
  474.                 $Value = _Gui_REG_SZ($sName, $Value)
  475.                 If Not @error And RegWrite($PathCur, $sName, "REG_EXPAND_SZ", $Value) Then
  476.                     _GUICtrlListView_SetItemText($hListView, $Cur_LV_idx, $Value, 2)
  477.                 EndIf
  478.             Case 4 ; REG_DWORD
  479.                 ContinueCase
  480.             Case 3 ; REG_BINARY
  481.                 ContinueCase
  482.             Case Else
  483.                 MsgBox(0, $LngMS1, $LngMS2 & ' - ' & $extended, 0 , $hGui)
  484.                 Return
  485.         EndSwitch
  486.     EndIf
  487.     $Cur_LV_idx = -1
  488. EndFunc
  489.  
  490. Func _Gui_REG_SZ($sName, $Value)
  491.     Local $iOK, $iCnl, $hGui1, $GP, $iBtnName, $iBtnValue, $tmp, $mode, $error = 1
  492.     $GP = _ChildCoor($hGui, 378, 158)
  493.     GUISetState(@SW_DISABLE, $hGui)
  494.     $mode = Opt("GUIOnEventMode", 0)
  495.  
  496.     $hGui1 = GUICreate($LngGT1, $GP[2], $GP[3], $GP[0], $GP[1], $WS_CAPTION + $WS_SYSMENU + $WS_POPUP, -1, $hGui)
  497.     GUICtrlCreateLabel($LngLVn, 9, 11, 201, 15)
  498.     $iBtnName = GUICtrlCreateInput($sName, 9, 32, 360, 23, $ES_READONLY)
  499.  
  500.     GUICtrlCreateLabel($LngLVv, 9, 66, 242, 15)
  501.     $iBtnValue = GUICtrlCreateInput($Value, 9, 86, 360, 23)
  502.  
  503.     $iOK = GUICtrlCreateButton('OK', 213, 120, 75, 26)
  504.     GUICtrlSetState(-1, $GUI_DEFBUTTON)
  505.     $iCnl = GUICtrlCreateButton($LngCnl, 294, 120, 75, 26)
  506.     GUISetState(@SW_SHOW, $hGui1)
  507.     While 1
  508.         Switch GUIGetMsg()
  509.             Case $iOK
  510.                 $tmp = GUICtrlRead($iBtnValue)
  511.                 If Not($Value==$tmp) Then
  512.                     $Value=$tmp
  513.                     $error = 0
  514.                 EndIf
  515.                 ContinueCase
  516.             Case -3, $iCnl
  517.                 GUISetState(@SW_ENABLE, $hGui)
  518.                 GUIDelete($hGui1)
  519.                 ExitLoop
  520.         EndSwitch
  521.     WEnd
  522.     Opt("GUIOnEventMode", $mode)
  523.     Return SetError($error, 0, $Value)
  524. EndFunc
  525.  
  526. Func _CreateNameValue()
  527.     Local $iOK, $iCnl, $hGui1, $GP, $iBtnName, $mode, $iType, $Radio[12][3] = [ _
  528. [0, 'REG_NONE', 0], _
  529. [0, 'REG_SZ', 1], _
  530. [0, 'REG_EXPAND_SZ', 2], _
  531. [0, 'REG_BINARY', 3], _
  532. [0, 'REG_DWORD', 4], _
  533. [0, 'REG_DWORD_BIG_ENDIAN', 5], _
  534. [0, 'REG_LINK', 6], _
  535. [0, 'REG_MULTI_SZ', 7], _
  536. [0, 'REG_RESOURCE_LIST', 8], _
  537. [0, 'REG_FULL_RESOURCE_DESCRIPTOR', 9], _
  538. [0, 'REG_RESOURCE_REQUIREMENTS_LIST', 10], _
  539. [0, 'REG_QWORD', 11]]
  540.     $GP = _ChildCoor($hGui, 378, 380)
  541.     GUISetState(@SW_DISABLE, $hGui)
  542.     $mode = Opt("GUIOnEventMode", 0)
  543.  
  544.     $hGui1 = GUICreate($LngGT1, $GP[2], $GP[3], $GP[0], $GP[1], $WS_CAPTION + $WS_SYSMENU + $WS_POPUP, -1, $hGui)
  545.     GUICtrlCreateLabel($LngLVn, 9, 11, 201, 15)
  546.    
  547.     $iBtnName = GUICtrlCreateInput('New #' & _GUICtrlListView_GetItemCount($hListView) +1, 9, 32, 360, 23)
  548.  
  549.     GUICtrlCreateGroup($LngLVt, 9, 66, 242, 272)
  550.     For $i = 0 To 11
  551.         $Radio[$i][0] = GUICtrlCreateRadio('(' & $i & ') ' & $Radio[$i][1], 20, $i*20+87, -1, 20)
  552.     Next
  553.     GUICtrlCreateGroup("", -99, -99, 1, 1)
  554.     GUICtrlSetState($Radio[1][0], $GUI_CHECKED)
  555.  
  556.     $iOK = GUICtrlCreateButton('OK', 213, 350, 75, 26)
  557.     GUICtrlSetState(-1, $GUI_DEFBUTTON)
  558.     $iCnl = GUICtrlCreateButton($LngCnl, 294, 350, 75, 26)
  559.     GUISetState(@SW_SHOW, $hGui1)
  560.     While 1
  561.         Switch GUIGetMsg()
  562.             Case $iOK
  563.                 $sName = GUICtrlRead($iBtnName)
  564.                 If $sName=='' Then
  565.                     MsgBox(0, $LngMS1, $LngMS4, 0 , $hGui1)
  566.                     ContinueLoop
  567.                 EndIf
  568.                 For $i = 0 To 11
  569.                     If GUICtrlRead($Radio[$i][0]) = $GUI_CHECKED Then
  570.                         $iType = $i
  571.                         ExitLoop
  572.                     EndIf
  573.                 Next
  574.                 RegRead($PathCur, $sName)
  575.                 If @error Then
  576.                     If RegWrite($PathCur, $sName, $Radio[$i][1], '') Then
  577.                         _ListView_AddItem($hListView, $sName, $iType)
  578.                         _GUICtrlStatusBar_SetText($hStatusBar, $sName & ' ' & $LngSCr)
  579.                     EndIf
  580.                 Else
  581.                     MsgBox(0, $LngMS1, $LngMS5, 0 , $hGui1)
  582.                     ContinueLoop
  583.                 EndIf
  584.                 ContinueCase
  585.             Case -3, $iCnl
  586.                 GUISetState(@SW_ENABLE, $hGui)
  587.                 GUIDelete($hGui1)
  588.                 ExitLoop
  589.         EndSwitch
  590.     WEnd
  591.     Opt("GUIOnEventMode", $mode)
  592. EndFunc
  593.  
  594. Func _ListView_AddItem($hListView, $key, $extended)
  595.     Local $inx, $keyItem, $tmp
  596.     If $key Then
  597.         $keyItem = $key
  598.     Else
  599.         $keyItem = $LngDft
  600.     EndIf
  601.     Switch $extended
  602.         Case 0
  603.             $inx = _GUICtrlListView_AddItem($hListView, $keyItem, 4)
  604.             _GUICtrlListView_AddSubItem($hListView, $inx, 'NONE (0)', 1)
  605.             $tmp = _RegRead($PathCur, $key)
  606.             If Not @error Then _GUICtrlListView_AddSubItem($hListView, $inx, $tmp, 2)
  607.         Case 1
  608.             $inx = _GUICtrlListView_AddItem($hListView, $keyItem, 3)
  609.             _GUICtrlListView_AddSubItem($hListView, $inx, 'SZ (1)', 1)
  610.             $tmp = RegRead($PathCur, $key)
  611.             If Not @error Then _GUICtrlListView_AddSubItem($hListView, $inx, $tmp, 2)
  612.         Case 2
  613.             $inx = _GUICtrlListView_AddItem($hListView, $keyItem, 3)
  614.             _GUICtrlListView_AddSubItem($hListView, $inx, 'EXPAND_SZ (2)', 1)
  615.             $tmp = RegRead($PathCur, $key)
  616.             If Not @error Then _GUICtrlListView_AddSubItem($hListView, $inx, $tmp, 2)
  617.         Case 3
  618.             $inx = _GUICtrlListView_AddItem($hListView, $keyItem, 4)
  619.             _GUICtrlListView_AddSubItem($hListView, $inx, 'BINARY (3)', 1)
  620.             $tmp = RegRead($PathCur, $key)
  621.             If Not @error Then _GUICtrlListView_AddSubItem($hListView, $inx, $tmp, 2)
  622.         Case 4
  623.             $inx = _GUICtrlListView_AddItem($hListView, $keyItem, 4)
  624.             _GUICtrlListView_AddSubItem($hListView, $inx, 'DWORD (4)', 1)
  625.             $tmp = RegRead($PathCur, $key)
  626.             If Not @error Then _GUICtrlListView_AddSubItem($hListView, $inx, $tmp, 2)
  627.         Case 5
  628.             $inx = _GUICtrlListView_AddItem($hListView, $keyItem, 4)
  629.             _GUICtrlListView_AddSubItem($hListView, $inx, 'DWORD_BIG_ENDIAN (5)', 1)
  630.             $tmp = _RegRead($PathCur, $key)
  631.             If Not @error Then _GUICtrlListView_AddSubItem($hListView, $inx, $tmp, 2)
  632.         Case 6
  633.             $inx = _GUICtrlListView_AddItem($hListView, $keyItem, 4)
  634.             _GUICtrlListView_AddSubItem($hListView, $inx, 'LINK (6)', 1)
  635.             $tmp = _RegRead($PathCur, $key)
  636.             If Not @error Then _GUICtrlListView_AddSubItem($hListView, $inx, $tmp, 2)
  637.         Case 7
  638.             $inx = _GUICtrlListView_AddItem($hListView, $keyItem, 3)
  639.             _GUICtrlListView_AddSubItem($hListView, $inx, 'MULTI_SZ (7)', 1)
  640.             $tmp = RegRead($PathCur, $key)
  641.             If Not @error Then _GUICtrlListView_AddSubItem($hListView, $inx, $tmp, 2)
  642.         Case 8
  643.             $inx = _GUICtrlListView_AddItem($hListView, $keyItem, 4)
  644.             _GUICtrlListView_AddSubItem($hListView, $inx, 'RESOURCE_LIST (8)', 1)
  645.             $tmp = _RegRead($PathCur, $key)
  646.             If Not @error Then _GUICtrlListView_AddSubItem($hListView, $inx, $tmp, 2)
  647.         Case 9
  648.             $inx = _GUICtrlListView_AddItem($hListView, $keyItem, 4)
  649.             _GUICtrlListView_AddSubItem($hListView, $inx, 'FULL_RESOURCE_DESCRIPTOR (9)', 1)
  650.             $tmp = _RegRead($PathCur, $key)
  651.             If Not @error Then _GUICtrlListView_AddSubItem($hListView, $inx, $tmp, 2)
  652.         Case 10
  653.             $inx = _GUICtrlListView_AddItem($hListView, $keyItem, 4)
  654.             _GUICtrlListView_AddSubItem($hListView, $inx, 'RESOURCE_REQUIREMENTS_LIST (10)', 1)
  655.             $tmp = _RegRead($PathCur, $key)
  656.             If Not @error Then _GUICtrlListView_AddSubItem($hListView, $inx, $tmp, 2)
  657.         Case 11
  658.             $inx = _GUICtrlListView_AddItem($hListView, $keyItem, 4)
  659.             _GUICtrlListView_AddSubItem($hListView, $inx, 'QWORD (11)', 1)
  660.             $tmp = _RegRead($PathCur, $key)
  661.             If Not @error Then _GUICtrlListView_AddSubItem($hListView, $inx, $tmp, 2)
  662.         Case Else
  663.             $inx = _GUICtrlListView_AddItem($hListView, $keyItem, 2)
  664.             _GUICtrlListView_AddSubItem($hListView, $inx, 'UNKNOWN (-)', 1)
  665.             $tmp = _RegRead($PathCur, $key)
  666.             If Not @error Then _GUICtrlListView_AddSubItem($hListView, $inx, $tmp, 2)
  667.     EndSwitch
  668. EndFunc
  669.  
  670. Func WM_GETMINMAXINFO($hWnd, $iMsg, $wParam, $lParam)
  671.     #forceref $iMsg, $wParam
  672.     If $hWnd = $hGui Then
  673.         Local $tMINMAXINFO = DllStructCreate("int;int;" & _
  674.                 "int MaxSizeX; int MaxSizeY;" & _
  675.                 "int MaxPositionX;int MaxPositionY;" & _
  676.                 "int MinTrackSizeX; int MinTrackSizeY;" & _
  677.                 "int MaxTrackSizeX; int MaxTrackSizeY", _
  678.                 $lParam)
  679.         DllStructSetData($tMINMAXINFO, "MinTrackSizeX", 350)
  680.         DllStructSetData($tMINMAXINFO, "MinTrackSizeY", 250)
  681.     EndIf
  682. EndFunc
  683.  
  684.  
  685.  
  686. ; вычисление координат дочернего окна
  687. ; 1 - дескриптор родительского окна
  688. ; 2 - ширина дочернего окна
  689. ; 3 - высота дочернего окна
  690. ; 4 - тип 0 - по центру, или 0 - к левому верхнему родительского окна
  691. ; 5 - отступ от краёв
  692. Func _ChildCoor($Gui, $w, $h, $c = 0, $d = 0)
  693.     Local $aWA = _WinAPI_GetWorkingArea(), _
  694.             $GP = WinGetPos($Gui), _
  695.             $wgcs = WinGetClientSize($Gui)
  696.     Local $dLeft = ($GP[2] - $wgcs[0]) / 2, _
  697.             $dTor = $GP[3] - $wgcs[1] - $dLeft
  698.     If $c = 0 Then
  699.         $GP[0] = $GP[0] + ($GP[2] - $w) / 2 - $dLeft
  700.         $GP[1] = $GP[1] + ($GP[3] - $h - $dLeft - $dTor) / 2
  701.     EndIf
  702.     If $d > ($aWA[2] - $aWA[0] - $w - $dLeft * 2) / 2 Or $d > ($aWA[3] - $aWA[1] - $h - $dLeft + $dTor) / 2 Then $d = 0
  703.     If $GP[0] + $w + $dLeft * 2 + $d > $aWA[2] Then $GP[0] = $aWA[2] - $w - $d - $dLeft * 2
  704.     If $GP[1] + $h + $dLeft + $dTor + $d > $aWA[3] Then $GP[1] = $aWA[3] - $h - $dLeft - $dTor - $d
  705.     If $GP[0] <= $aWA[0] + $d Then $GP[0] = $aWA[0] + $d
  706.     If $GP[1] <= $aWA[1] + $d Then $GP[1] = $aWA[1] + $d
  707.     $GP[2] = $w
  708.     $GP[3] = $h
  709.     Return $GP
  710. EndFunc
  711.  
  712. Func _WinAPI_GetWorkingArea()
  713.     Local Const $SPI_GETWORKAREA = 48
  714.     Local $stRECT = DllStructCreate("long; long; long; long")
  715.  
  716.     Local $SPIRet = DllCall("User32.dll", "int", "SystemParametersInfo", "uint", $SPI_GETWORKAREA, "uint", 0, "ptr", DllStructGetPtr($stRECT), "uint", 0)
  717.     If @error Then Return 0
  718.     If $SPIRet[0] = 0 Then Return 0
  719.  
  720.     Local $sLeftArea = DllStructGetData($stRECT, 1)
  721.     Local $sTopArea = DllStructGetData($stRECT, 2)
  722.     Local $sRightArea = DllStructGetData($stRECT, 3)
  723.     Local $sBottomArea = DllStructGetData($stRECT, 4)
  724.  
  725.     Local $aRet[4] = [$sLeftArea, $sTopArea, $sRightArea, $sBottomArea]
  726.     Return $aRet
  727. EndFunc
  728.  
  729. Func _Restart()
  730.     Local $sAutoIt_File = @TempDir & "\~Au3_ScriptRestart_TempFile.au3"
  731.     Local $sRunLine, $sScript_Content, $hFile
  732.  
  733.     $sRunLine = @ScriptFullPath
  734.     If Not @Compiled Then $sRunLine = @AutoItExe & ' /AutoIt3ExecuteScript ""' & $sRunLine & '""'
  735.     If $CmdLine[0] > 0 Then $sRunLine &= ' ' & $CmdLineRaw
  736.  
  737.     $sScript_Content &= '#NoTrayIcon' & @CRLF & _
  738.             'While ProcessExists(' & @AutoItPID & ')' & @CRLF & _
  739.             '   Sleep(10)' & @CRLF & _
  740.             'WEnd' & @CRLF & _
  741.             'Run("' & $sRunLine & '")' & @CRLF & _
  742.             'FileDelete(@ScriptFullPath)' & @CRLF
  743.  
  744.     $hFile = FileOpen($sAutoIt_File, 2)
  745.     FileWrite($hFile, $sScript_Content)
  746.     FileClose($hFile)
  747.  
  748.     Run(@AutoItExe & ' /AutoIt3ExecuteScript "' & $sAutoIt_File & '"', @ScriptDir, @SW_HIDE)
  749.     Sleep(1000)
  750.     Exit
  751. EndFunc
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement