Advertisement
AZJIO

ChkDskGui

May 7th, 2018 (edited)
4,106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ;- TOP
  2. ; Author AZJIO
  3. ; ChkDskGui v4.3  (07.11.2024)
  4.  
  5. ; последнее обновление:
  6. ; Улучшение читаемости кода: числа в гаджетах, окнах, меню, пунктах, шрифтах, изображениях сделал именованными константами.
  7. ; Для x86 сделал отключение перенаправления в системную папку в случае если в SysWOW64 отсутствует chkdsk. Запускает x64.
  8.  
  9. ; игнор ошибок работает с SEM_FAILCRITICALERRORS
  10. ; байтовые флаги заменил на integer
  11. ; причесал исходник по отступам и убрал неиспользуемы переменные
  12. ; Добавлена иконка "?" для сбойных/неизвестных дисков
  13. ; Игнорирование ошибок при чтении пустых картридеров
  14. ; Добавлено MBR/GPT
  15. ; Исправил двойной клик
  16. ; Запрет проверки файловых систем EXT3/EXT4, чекбокс скрыт
  17. ; Добавлено клик по пункту ставит галку в чекбокс
  18. ; Добавлена полоса заполненности дисков
  19. ; Добавлены фирменные названия дисков
  20. ; Правильное определение дисков с несколькими разделами
  21. ; Определение размера диска со сбоем в ФС
  22. ; Сортировка списка дисков
  23. ; Двойной клик по строке списка дисков открывает диск в проводнике
  24. ; Удалено игнорирование дисков по отсутствию файловой системы
  25. ; Добавление в меню дисков
  26. ; Добавлено обновление списка при вставке/извлечении флешки
  27.  
  28. EnableExplicit
  29.  
  30.  
  31. Define *Lang, UserIntLang, ForceLang, Lang_ini$
  32. If OpenLibrary(0, "kernel32.dll")
  33.     *Lang = GetFunction(0, "GetUserDefaultUILanguage")
  34.     If *Lang And CallFunctionFast(*Lang) = 1049 ; ru
  35.         UserIntLang = 1
  36.     EndIf
  37.     CloseLibrary(0)
  38. EndIf
  39.  
  40.  
  41. ;- ● En
  42. #CountStrLang = 55
  43. Global Dim Lng.s(#CountStrLang)
  44. Lng(1) = "Error"
  45. Lng(2) = "No disc found"
  46. Lng(3) = "-Disk-"
  47. Lng(4) = "- N -"
  48. Lng(5) = "Type"
  49. Lng(6) = "- Disc label -"
  50. Lng(7) = "- FS -"
  51. Lng(8) = "Size"
  52. Lng(9) = "- Name -"
  53. Lng(10) = "- Usage -"
  54. Lng(11) = "\F - Fix disk errors"
  55. Lng(12) = "\R - Recovery of bad sectors"
  56. Lng(13) = "\X - Forced volume disconnection"
  57. Lng(14) = "Select all drives"
  58. Lng(15) = "Start"
  59. Lng(16) = "Copy to clipboard for Win+R"
  60. Lng(17) = "Menu"
  61. Lng(18) = "Check drives now"
  62. Lng(19) = "Physical disks are better"
  63. Lng(20) = "checked in different streams,"
  64. Lng(21) = "saving time"
  65. Lng(22) = "Copy command line"
  66. Lng(23) = "Full line for Win+R"
  67. Lng(24) = "Short line for Win+R"
  68. Lng(25) = "For bat file"
  69. Lng(26) = "Registry"
  70. Lng(27) = "Checking the selected drives when booting the OS"
  71. Lng(28) = "View BootExecute in the registry"
  72. Lng(29) = "eventvwr.exe (check log)"
  73. Lng(30) = "Delete ChkDskGui in the disk menu"
  74. Lng(31) = "Add ChkDskGui to the disc menu"
  75. Lng(32) = "(admin)"
  76. Lng(33) = "Create ini"
  77. Lng(34) = "Help chkdsk.exe"
  78. Lng(35) = "Help ChkDskGui"
  79. Lng(36) = "Download ChkDskGui Help"
  80. Lng(37) = "Message"
  81. Lng(38) = "Run from admin and select drive"
  82. Lng(39) = "Run from admin"
  83. Lng(40) = "Need to select a drive"
  84. Lng(41) = "Added to the registry:"
  85. Lng(42) = "Cannot add to registry"
  86. Lng(43) = "Overwrite ini?"
  87. Lng(44) = "Run"
  88. Lng(45) = "ChkDskGui (connected -"
  89. Lng(46) = "ChkDskGui (disconnected -"
  90. Lng(47) = "Help"
  91. Lng(48) = "About"
  92. Lng(49) = "Author"
  93. Lng(50) = "Version"
  94. Lng(51) = "Want to visit the topic for updates?"
  95. Lng(52) = "Open in Explorer"
  96. Lng(53) = "Continue?"
  97. Lng(54) = "Fixed"
  98. Lng(55) = "Rem  "
  99.  
  100.  
  101. ;- # Constants
  102.  
  103. #Desktop = 0
  104. #Window = 0
  105.  
  106. Enumeration
  107.     #Menu0
  108.     #Menu1
  109. EndEnumeration
  110.  
  111. Enumeration
  112.     #Font0
  113.     #Font1
  114.     #Font2
  115. EndEnumeration
  116.  
  117. Enumeration
  118.     #img0
  119.     #img1
  120.     #img2
  121. EndEnumeration
  122.  
  123. Enumeration
  124.     #LIG
  125.     #chF
  126.     #chR
  127.     #chX
  128.     #StatusBar
  129.     #btnMenu
  130.     #btnStart
  131.     #btnNot ; удалить
  132.     #chAll
  133. EndEnumeration
  134.  
  135. Enumeration
  136.     #mStart
  137.     #mComLineFull
  138.     #mComLineBrief
  139.     #mEventvwr
  140.     #mBootExecute
  141.     #mHelpChkdsk
  142.     #mCheckingSel
  143.     #mHelpGUI
  144.     #mBatFile
  145.     #mCreateINI
  146.     #mDiscMenu
  147.     #mAbout
  148.     #mOpen
  149. EndEnumeration
  150.  
  151. ; константы и структуры MBR/GPT
  152. ; https://www.purebasic.fr/english/viewtopic.php?t=25663&p=220673
  153.  
  154. #PARTITION_STYLE_MBR = 0
  155. #PARTITION_STYLE_GPT = 1
  156. #PARTITION_STYLE_RAW = 2
  157. #IOCTL_DISK_GET_DRIVE_LAYOUT_EX = $70050
  158.  
  159. ;- ● Structure
  160.  
  161. Structure PARTITION_INFORMATION_GPT Align #PB_Structure_AlignC
  162.     Partitiontype.GUID
  163.     PartitionId.GUID
  164.     Attributes.q
  165.     Name.b[36]
  166. EndStructure
  167.  
  168. Structure PARTITION_INFORMATION_MBR Align #PB_Structure_AlignC
  169.     PartitionType.b
  170.     BootIndicator.b
  171.     RecognizedPartition.b
  172.     HiddenSectors.l
  173. EndStructure
  174.  
  175. Structure DRIVE_LAYOUT_INFORMATION_GPT Align #PB_Structure_AlignC
  176.     PartitionStyle.GUID
  177.     StartingUsableOffset.LARGE_INTEGER
  178.     UsableLength.LARGE_INTEGER
  179.     MaxPartitionCount.l
  180. EndStructure
  181.  
  182. Structure DRIVE_LAYOUT_INFORMATION_MBR Align #PB_Structure_AlignC
  183.     DiskId.l
  184.     PartitionCount.l
  185. EndStructure
  186.  
  187. Structure PARTITION_INFORMATION_EX Align #PB_Structure_AlignC
  188.     PartitionStyle.l
  189.     StartingOffset.LARGE_INTEGER
  190.     PartitionLength.LARGE_INTEGER
  191.     PartitionNumber.l
  192.     RewritePartition.b
  193.     StructureUnion
  194.         ppmbr.PARTITION_INFORMATION_MBR
  195.         ppgpt.PARTITION_INFORMATION_GPT
  196.     EndStructureUnion
  197. EndStructure
  198.  
  199. Structure DRIVE_LAYOUT_INFORMATION_EX Align #PB_Structure_AlignC
  200.     PartitionStyle.l
  201.     PartitionCount.l
  202.     StructureUnion
  203.         pdmbr.DRIVE_LAYOUT_INFORMATION_MBR
  204.         pdgpt.DRIVE_LAYOUT_INFORMATION_GPT
  205.     EndStructureUnion
  206.     PartitionEntry.PARTITION_INFORMATION_EX[255]
  207. EndStructure
  208. ; конец => константы и структуры MBR/GPT
  209.  
  210. Global hListView, lvi.LV_ITEM
  211. Global indexSort = 1
  212. Global SortOrder = 1
  213.  
  214. Structure STORAGE_PROPERTY_QUERY
  215.     PropertyId.l
  216.     QueryType.l
  217.     AdditionalParameters.l
  218. EndStructure
  219.  
  220. Structure STORAGE_DEVICE_DESCRIPTOR
  221.     Version.l
  222.     Size.l
  223.     DeviceType.b
  224.     DeviceTypeModifier.b
  225.     RemovableMedia.b
  226.     CommandQueueing.b
  227.     VendorIdOffset.l
  228.     ProductIdOffset.l
  229.     ProductRevisionOffset.l
  230.     SerialNumberOffset.l
  231.     BusType.w
  232.     RawPropertiesLength.l
  233.     RawDeviceProperties.b
  234.     Reserved.b[1024]
  235. EndStructure
  236.  
  237. Import "user32.lib"
  238.     OemToCharBuffA(*Buff, *Buff1, SizeBuff)
  239.     CharToOemBuffA(*Buff, *Buff1, SizeBuff)
  240. EndImport
  241.  
  242. ;- ● Declare
  243. Declare HelpChkdsk() ; справка по командам chkdsk.exe
  244. Declare GetDrives(List Drive.s()) ; получает буквы существующих дисков
  245. Declare.s ComboListDrive(Drive2$) ; получает инфу о дисках
  246. Declare InstanceToWnd(iPid)
  247. ; Declare.s FormatSizeDisk(Num.q) ; делает размер в формат гигабайты
  248. Declare.s DriveGetNumber(DriveLetter$) ; получает номера дисков в формате [0:1]
  249. Declare.s DriveGetName(DriveLetter$)   ; получает название дисков
  250. Declare.s GetComString()      ; получает ком-строку
  251. Declare.s ReadProgramStringOem(iPid)   ; читает строку и перекодирует её в Win-1251
  252. Declare MyWindowCallback(WindowId, Message, wParam, lParam)
  253. Declare.s GetCommand(fill = 0)
  254. Declare.s ToOem(String$)
  255. Declare SaveFile_Buff(File.s, *Buff, Size)
  256. Declare Insert_Command(d)
  257. Declare Del_item_LV(Mask.l)
  258. Declare Add_item_LV(Drive2$)
  259. Declare Add_item_LV_Mask(Mask.l)
  260. Declare align_col_LV()
  261. Declare RegToMenuDisk()
  262. Declare RegJump(valie.s)
  263. Declare KillProcess_hWin(hwin)
  264. Declare RegExistsKey()
  265. Declare DuplicateDriveTest()
  266. Declare align_Windows()
  267. Declare HideCheckBox(gadget, item)
  268. Declare.s Get_MBR_GPT(DriveNum$)
  269.  
  270. ;- ● IncludeFile
  271. XIncludeFile "Sort.pb"
  272. XIncludeFile "SetCoor.pb"
  273. XIncludeFile "RAW.pb"
  274. XIncludeFile "ListProgress.pb"
  275.  
  276. ; Сохранение размера и координат часть 1
  277. Declare SaveINI() ; Сохранения в ini
  278.                   ; Для подсказок часть 1 из 3-х
  279. Declare AddGadgetToolTip(GadgetID.l, ToolText$, MaxWidth.l = 0, Balloon.l = 1, WindowID.l = -1)
  280. ;- ● Global
  281. Global NewMap hToolTips.l()
  282.  
  283. ; размеры неклиентской области окна (заголовок и границы окна)
  284. Global caption_h, BorderX, BorderY
  285. caption_h = GetSystemMetrics_(#SM_CYCAPTION) ; высота заголовка
  286. BorderX = GetSystemMetrics_(#SM_CXFRAME) * 2 ; ширина (толщина) вертикальных границ
  287. BorderY = GetSystemMetrics_(#SM_CYFRAME) * 2 + caption_h ; высота (толщина) горизонтальных границ + заголовок
  288.  
  289. Global NewList Drive.s()
  290. Global MaxDeviceNumber = 0
  291. Global Dim MBR_GPT.s(0)
  292. ; MBR_GPT(0) = "GPT"
  293. Define DiskCur$
  294. Global Admin = IsUserAnAdmin_()
  295.  
  296.  
  297. Define i
  298. Global CountDisk, cmd$ = "cmd.exe", drives_avail
  299.  
  300. ; добавил код перенаправления Wow64DisableWow64FsRedirection.
  301. ; Исправить получение системного диска, так как каталог юзера может находится не на диске с папкой Windows.
  302. ; компиляция взависимости от x86 или x64 (костыли для кривых WinPE)
  303. CompilerIf #PB_Compiler_Processor = #PB_Processor_x86 ; если ChkDskGui-x86
  304.     Global hKrnDLL, *Func, RedirectRequired
  305.    
  306.     Procedure Is64BitOS()
  307.         Protected HDLL, IsWow64Process_, Is64BitOS
  308.        
  309.         If SizeOf(Integer) = 8
  310.             Is64BitOS = 1   ; this is a 64 bit exe
  311.         Else
  312.             HDll = OpenLibrary(#PB_Any, "kernel32.dll")
  313.             If HDll
  314.                 IsWow64Process_ = GetFunction(HDll, "IsWow64Process")
  315.                 If IsWow64Process_
  316.                     CallFunctionFast(IsWow64Process_, GetCurrentProcess_(), @Is64BitOS)
  317.                 EndIf
  318.                 CloseLibrary(HDll)
  319.             EndIf
  320.         EndIf
  321.        
  322.         ProcedureReturn Is64BitOS
  323.     EndProcedure
  324.    
  325.     Procedure GetCmdPath()
  326.         Protected sysdisk$, IsWow64ProcessFlag
  327.         hKrnDLL = OpenLibrary(#PB_Any, "Kernel32.dll")
  328.         If hKrnDLL
  329.             *Func = GetFunction(hKrnDLL, "IsWow64Process")
  330.             If *Func
  331.                 CallFunctionFast(*Func, GetCurrentProcess_(), @IsWow64ProcessFlag)
  332.                 *Func = 0
  333.                 If IsWow64ProcessFlag And SizeOf(Integer) = 4
  334.                     *Func = GetFunction(hKrnDLL, "Wow64DisableWow64FsRedirection")
  335.                     If *Func
  336.                         sysdisk$ = Left(GetUserDirectory(#PB_Directory_Programs), 3) + "Windows\"
  337.                         CallFunctionFast(*Func, 0) ; отключили перенаправление
  338.                         If FileSize(sysdisk$ + "SysWOW64\cmd.exe") > 1 And FileSize(sysdisk$ + "SysWOW64\chkdsk.exe") > 1
  339.                             ; cmd$ = "cmd.exe" ; по факту будет использоваться нативный x32 и ничего делать не нужно
  340.                             ProcedureReturn
  341.                         ElseIf FileSize(sysdisk$ + "System32\cmd.exe") > 1 And FileSize(sysdisk$ + "System32\chkdsk.exe") > 1
  342. ;                           если нативный способ урезан, то запускаем x64
  343.                             cmd$ = sysdisk$ + "System32\cmd.exe"
  344.                             RedirectRequired = 1 ; требуется перенаправление, так как x86 запускает 64-битную версию cmd.exe
  345.                         ElseIf FileSize(sysdisk$ + "SysWOW64\cmd64.exe") > 0 ; костыль для какой то WinPE
  346.                             cmd$ = "cmd64.exe"
  347.                         EndIf
  348.                         If RedirectRequired = 0
  349.                             CallFunctionFast(*Func, 1) ; включили перенаправление
  350.                         EndIf
  351.                     EndIf
  352.                 EndIf
  353.             EndIf
  354.            
  355.             If RedirectRequired = 0
  356.                 CloseLibrary(hKrnDLL)
  357.             EndIf
  358.            
  359.         EndIf
  360.     EndProcedure
  361.  
  362.     If Is64BitOS() And OSVersion() >= #PB_OS_Windows_Vista ; если запущен на Windpws-x64
  363.         GetCmdPath()
  364.     EndIf
  365. CompilerEndIf
  366.  
  367. ; Debug RedirectRequired
  368. ; Debug cmd$
  369.  
  370. ; Создаём структуру, для выравнивания в колонке размера списка дисков
  371. Global ListViewSpalte.LV_COLUMN
  372. ListViewSpalte\mask = #LVCF_FMT
  373.  
  374.  
  375. Global ini$
  376. Global ignore$ = ""
  377. Global fINI = 1
  378. Global StartDisk = 2
  379. Global FontSize = 9
  380. Global Color$ = "1e"
  381. Global Font1$ = "Consolas"
  382. Global Font2$ = "Segoe UI"
  383. Global AlignWin = 1
  384.  
  385. ; без копирования
  386. Procedure Limit(*Value.integer, Min, Max)
  387.     Protected res
  388.     If *Value\i < Min
  389.         *Value\i = Min
  390.         res = 1
  391.     ElseIf *Value\i > Max
  392.         *Value\i = Max
  393.         res = 1
  394.     EndIf
  395.     ProcedureReturn res
  396. EndProcedure
  397.  
  398. ;- ● ini
  399. ; получаем путь к ини по имени программы
  400. ; ini$ = GetPathPart(ProgramFilename()) + GetFilePart(ProgramFilename(), #PB_FileSystem_NoExtension) + ".ini"
  401. ; ini$ = ReplaceString(ProgramFilename(), ".exe", ".ini")
  402. ini$ = Left(ProgramFilename(), Len(ProgramFilename()) - 3) + "ini"
  403. ExamineDesktops()
  404. If FileSize(ini$) > 3 And OpenPreferences(ini$) And PreferenceGroup("set")
  405.     StartDisk = ReadPreferenceInteger("StartDisk", 2)
  406.     If Limit(@StartDisk, 0, 25)
  407.         WritePreferenceInteger("StartDisk" , StartDisk) ; Сразу исправляем неверные данные
  408.     EndIf
  409.     FontSize = ReadPreferenceInteger("FontSize", 9)
  410.     If Limit(@FontSize, 7, 15)
  411.         WritePreferenceInteger("FontSize" , FontSize)
  412.     EndIf
  413.     indexSort = ReadPreferenceInteger("indexSort", 1)
  414.     If Limit(@indexSort, -1, 7)
  415.         WritePreferenceInteger("indexSort" , indexSort)
  416.     EndIf
  417.     AlignWin = ReadPreferenceInteger("align", 1)
  418.     If Limit(@AlignWin, 0, 1)
  419.         WritePreferenceInteger("align" , AlignWin)
  420.     EndIf
  421.     SortOrder = ReadPreferenceInteger("SortOrder", 1)
  422.     If Not(SortOrder = 1 Or SortOrder = -1)
  423.         SortOrder = 1
  424.         WritePreferenceInteger("SortOrder" , 1)
  425.     EndIf
  426.     Color$ = ReadPreferenceString("Color", "1e")
  427.     If Val("$" + Color$) > 255 Or Val("$" + Color$) < 1
  428.         Color$ = "1e"
  429.         WritePreferenceString("Color" , "1e")
  430.     EndIf
  431.     Font1$ = ReadPreferenceString("Font1", "Consolas")
  432.     Font2$ = ReadPreferenceString("Font2", "Segoe UI")
  433.  
  434.     ignore$ = ReadPreferenceString("ignore", "")
  435.     ForceLang = ReadPreferenceInteger("ForceLang", ForceLang)
  436.  
  437.  
  438.     With cs
  439.         \m = ReadPreferenceInteger("WinM", 0)
  440.         \x = ReadPreferenceInteger("WinX", (DesktopWidth(#Desktop) - 692) / 2)
  441.         \y = ReadPreferenceInteger("WinY", (DesktopHeight(#Desktop) - 210) / 2)
  442.         \w = ReadPreferenceInteger("WinW", 692)
  443.         \h = ReadPreferenceInteger("WinH", 210)
  444.     EndWith
  445.  
  446.     ClosePreferences()
  447.     ;   Debug Color$
  448.     ;   Debug Val("$" + Color$)
  449.     ;   Debug FontSize
  450.     ;   Debug ini$
  451.     ;   Debug Font1$
  452.     ;   Debug Font2$
  453.     ;   Debug GUI_H
  454.     ;   MessageRequester("Координаты до", Str(cs\x) + #CRLF$ + Str(cs\y) + #CRLF$ + Str(cs\w) + #CRLF$ + Str(cs\h))
  455.     _SetCoor(@cs, 692, 210, 3, 0, 0) ; Выравниваем если прочитали из ini
  456.                                      ;  MessageRequester("Координаты после", Str(cs\x) + #CRLF$ + Str(cs\y) + #CRLF$ + Str(cs\w) + #CRLF$ + Str(cs\h))
  457.     fINI = 0
  458. EndIf
  459.  
  460.  
  461.  
  462. ; Здесь нужно прочитать флаг из ini-файла определяющий принудительный язык, где
  463. ; 0 - автоматически
  464. ; -1 - принудительно первый
  465. ; 1 - принудительно второй
  466. ; Тем самым будучи в России можно выбрать англ язык или будучи в союзных республиках выбрать русский язык
  467. If ForceLang = 1
  468.     UserIntLang = 0
  469. ElseIf ForceLang = 2
  470.     UserIntLang = 1
  471. EndIf
  472.  
  473. Procedure SetLangTxt(PathLang$)
  474.     Protected file_id, Format, i, tmp$
  475.    
  476.     file_id = ReadFile(#PB_Any, PathLang$)
  477.     If file_id ; Если удалось открыть дескриптор файла, то
  478.         Format = ReadStringFormat(file_id) ;  перемещаем указатель после метки BOM
  479.         i=0
  480.         While Eof(file_id) = 0        ; Цикл, пока не будет достигнут конец файла. (Eof = 'Конец файла')
  481.             tmp$ =  ReadString(file_id, Format) ; читаем строку
  482.                                   ; If Left(tmp$, 1) = ";"
  483.                                   ; Continue
  484.                                   ; EndIf
  485. ;           tmp$ = ReplaceString(tmp$ , #CR$ , "") ; коррекция если в Windows
  486.             tmp$ = RTrim(tmp$ , #CR$) ; коррекция если в Windows
  487.             If Asc(tmp$) And Asc(tmp$) <> ';'
  488.                 i+1
  489.                 If i > #CountStrLang ; массив Lng() уже задан, но если строк больше нужного, то не разрешаем лишнее
  490.                     Break
  491.                 EndIf
  492. ;               Lng(i) = UnescapeString(tmp$) ; позволяет в строке иметь экранированные метасимволы, \n \t и т.д.
  493.                 Lng(i) = ReplaceString(tmp$, "\n", #LF$) ; В ini-файле проблема только с переносами, поэтому заменяем только \n
  494.             Else
  495.                 Continue
  496.             EndIf
  497.         Wend
  498.         CloseFile(file_id)
  499.     EndIf
  500.     ; Else
  501.     ; SaveFile_Buff(PathLang$, ?LangFile, ?LangFileend - ?LangFile)
  502. EndProcedure
  503.  
  504. ; Если языковой файл существует, то использует его
  505. ; Lang_ini$ = GetPathPart(ProgramFilename()) + "Lang.ini"
  506. ; Lang_ini$ = GetPathPart(ProgramFilename()) + GetFilePart(ProgramFilename(), #PB_FileSystem_NoExtension) + "_Lang.ini"
  507. Lang_ini$ = Left(ProgramFilename(), Len(ProgramFilename()) - 4) + "_Lang.ini"
  508. If FileSize(Lang_ini$) > 100
  509.     UserIntLang = 0
  510.     SetLangTxt(Lang_ini$)
  511. EndIf
  512.  
  513. ;- ● Ru
  514. If UserIntLang
  515.     Lng(1) = "Ошибка"
  516.     Lng(2) = "Не найдено ни одного диска"
  517.     Lng(3) = "-Диск-"
  518.     Lng(4) = "- № -"
  519.     Lng(5) = "-Тип-"
  520.     Lng(6) = "- Метка диска -"
  521.     Lng(7) = "-FS-"
  522.     Lng(8) = "Размер"
  523.     Lng(9) = "     - Имя - "
  524.     Lng(10) = "- Занято -"
  525.     Lng(11) = "\F - Исправление ошибок на диске"
  526.     Lng(12) = "\R - Восстановление поврежденных секторов"
  527.     Lng(13) = "\X - Принудительное отключение тома"
  528.     Lng(14) = "Выделить все диски"
  529.     Lng(15) = "Старт"
  530.     Lng(16) = "Скопировать в буфер обмена для Win+R"
  531.     Lng(17) = "Меню"
  532.     Lng(18) = "Проверка дисков сейчас"
  533.     Lng(19) = "Физические диски лучше"
  534.     Lng(20) = "в разных потоках выполнить"
  535.     Lng(21) = "экономя время"
  536.     Lng(22) = "Копировать ком-строку"
  537.     Lng(23) = "Полную для Win+R"
  538.     Lng(24) = "Краткую для Win+R"
  539.     Lng(25) = "Для bat-файла"
  540.     Lng(26) = "Реестр"
  541.     Lng(27) = "Проверка выбранных при загрузке ОС"
  542.     Lng(28) = "Посмотреть BootExecute в реестре"
  543.     Lng(29) = "eventvwr.exe (лог проверки)"
  544.     Lng(30) = "Удалить ChkDskGui в меню дисков"
  545.     Lng(31) = "Добавить ChkDskGui в меню дисков"
  546.     Lng(32) = "(админ)"
  547.     Lng(33) = "Создать ini"
  548.     Lng(34) = "Справка chkdsk.exe"
  549.     Lng(35) = "Справка ChkDskGui"
  550.     Lng(36) = "Скачать справку ChkDskGui"
  551.     Lng(37) = "Сообщение"
  552.     Lng(38) = "Запустите от админа и выберите диск"
  553.     Lng(39) = "Запустите от админа"
  554.     Lng(40) = "Нужно выбрать диск"
  555.     Lng(41) = "Добавлено в реестр:"
  556.     Lng(42) = "Не удаётся добавить в реестр"
  557.     Lng(43) = "Перезаписать ini?"
  558.     Lng(44) = "Выполнить"
  559.     Lng(45) = "ChkDskGui (подключен "
  560.     Lng(46) = "ChkDskGui (отключен "
  561.     Lng(47) = "Справка"
  562.     Lng(48) = "О программе"
  563.     Lng(49) = "Автор"
  564.     Lng(50) = "Версия"
  565.     Lng(51) = "Хотите посетить тему обсуждения" + #CRLF$ + "и узнать об обновлениях?"
  566.     Lng(52) = "Открыть в Проводнике"
  567.     Lng(53) = "Продолжить?"
  568.     Lng(54) = "Fixed"
  569.     Lng(55) = "Rem  "
  570. EndIf
  571.  
  572. ; отключаем флаг ошибок
  573. Define tmp
  574. Define hKey
  575. ; отключаем мессаги с выводом ошибок перед тем как сканировать диски
  576. SetErrorMode_(#SEM_FAILCRITICALERRORS)
  577.  
  578. ; Запрос дисков и информации
  579. GetDrives(Drive()) ; добавляем буквы всех дисков
  580.                    ; ComboListDrive(Drive()) ; добавляем остальную инфу к дискам и удаляем диски если они не FIXED REMOVABLE
  581.  
  582. ; проверка налиия дисков, мало ли вдруг только рам-диски будут в системе из-за отсутствия драйверов
  583.  
  584. CountDisk = ListSize(Drive())
  585. If Not CountDisk
  586.     MessageRequester(Lng(1), Lng(2))
  587.     End ; Выход, так как нет смысла дальнейшего выполнения скрипта
  588. EndIf
  589.  
  590. If fINI
  591.     ;   DesktopW = DesktopWidth(#Desktop)
  592.     ;   DesktopH = DesktopHeight(#Desktop)
  593.     With cs
  594.         \h = 24 + 18 * CountDisk + 100 ; подсчитали усреднённо на Win10 при 18 - высота пункта, 24 - высота названия колонок, 100 остальное.
  595.                                        ;        \h = 24 + 18 * CountDisk + 58 + BorderY ; MessageRequester(Lng(37), Str(BorderY))
  596.         \w = 692
  597.         \x = (DesktopWidth(#Desktop) - \w) / 2
  598.         \y = (DesktopHeight(#Desktop) - \h) / 2
  599.         \m = 0
  600.     EndWith
  601. EndIf
  602.  
  603. Global hGUI ;, hListView
  604. Define k, res$, TrgS, info$, disk$, valie.s, hwnd, fMenuDisk
  605. Define SelDisk$
  606.  
  607. ; Procedure heightLV()
  608. ;   Protected header, rect.RECT, headerRect.RECT
  609. ;     header = SendMessage_(hListView,#LVM_GETHEADER,0,0)                 ; get header control
  610. ;     GetClientRect_(header,headerRect.RECT)                                     ; get size of header control
  611. ;     SendMessage_(hListView, #LVM_GETITEMRECT, 0, @rect)                  ; get rect for item 0
  612. ;     ProcedureReturn headerRect\bottom - headerRect\top + (rect\bottom - rect\top) * CountDisk
  613. ;     ProcedureReturn rect\bottom - rect\top ; 18
  614. ;     ProcedureReturn headerRect\bottom - headerRect\top ; 24
  615. ; EndProcedure
  616.  
  617. ; Создаём окно
  618. ;-┌──GUI──┐
  619. hGUI = OpenWindow(#Window, cs\x, cs\y, cs\w, cs\h, "ChkDskGui", #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget | #PB_Window_Invisible)
  620.  
  621.  
  622.  
  623.  
  624. If hGUI
  625. ;   HideWindow(#Window, #True)
  626.     ;   загружаем иконки 16х16 в системный список изображений
  627.     CatchImage(#img0, ?DiskFixed)
  628.     CatchImage(#img1, ?DiskRem)
  629.     CatchImage(#img2, ?DiskUnk)
  630.     ; Левый столбец. Список со значками с чек-боксом, выделять однос строкой
  631.     hListView = ListIconGadget(#LIG, 5, 5, cs\w - 10, cs\h - 90, Lng(3), 60, #PB_ListIcon_CheckBoxes | #PB_ListIcon_FullRowSelect)
  632.  
  633.     ;   Стиль списка дисков, чёрный
  634.     ;   SetGadgetColor(#LIG, #PB_Gadget_BackColor , RGB(55, 55, 55))
  635.     ;   SetGadgetColor(#LIG, #PB_Gadget_FrontColor , RGB(180, 180, 180))
  636.  
  637.     ; Устанавливает шрифт
  638.     If OSVersion() >= #PB_OS_Windows_7
  639.         If LoadFont(#Font0, Font1$, FontSize)
  640.             SetGadgetFont(#LIG, FontID(#Font0))
  641.         Else ; иначе, если Consolas не существует
  642.             If LoadFont(#Font0, "Courier New", FontSize)
  643.                 SetGadgetFont(#LIG, FontID(#Font0))
  644.             EndIf
  645.         EndIf
  646.     Else
  647.         If LoadFont(#Font0, "Courier New", FontSize)
  648.             SetGadgetFont(#LIG, FontID(#Font0))
  649.         EndIf
  650.     EndIf
  651.  
  652.     SetGadgetAttribute(#LIG, #PB_ListIcon_DisplayMode, #PB_ListIcon_Report) ; вид списка - таблица
  653.                                                                          ; Добавить ещё 5 колонок
  654.     AddGadgetColumn(#LIG, 1, Lng(4), 50)
  655.     AddGadgetColumn(#LIG, 2, Lng(5), 52)
  656.     AddGadgetColumn(#LIG, 3, Lng(6), 125)
  657.     AddGadgetColumn(#LIG, 4, Lng(7), 55)
  658.     AddGadgetColumn(#LIG, 5, Lng(8), 100)
  659.     AddGadgetColumn(#LIG, 6, Lng(9), 230)
  660.     AddGadgetColumn(#LIG, 7, "-", 55)
  661.     AddGadgetColumn(#LIG, 8, Lng(10), 90)
  662.  
  663.     Global lpFreeBytesAvailable.q
  664.     Global lpTotalNumberOfBytes.q
  665.     i = 0
  666.     ForEach Drive()
  667. ;       If Mid(Drive(), 10, 3) = "Fix" ; у этоге есть баг, если дисков будет 10, то отступ символа будет 11 вместо 10
  668.         Select StringField(Drive(), 3, Chr(10))
  669.             Case Lng(54)
  670.                 AddGadgetItem(#LIG, -1, Drive(), ImageID(#img0))
  671.             Case Lng(55)
  672.                 AddGadgetItem(#LIG, -1, Drive(), ImageID(#img1))
  673.             Default
  674.                 AddGadgetItem(#LIG, -1, Drive(), ImageID(#img2))
  675.         EndSelect
  676. ;       res$ = StringField(Drive(), 3, Chr(10))
  677. ;       If res$ = Lng(54)
  678. ;           AddGadgetItem(#LIG, -1, Drive(), ImageID(#img0))
  679. ;       ElseIf res$ = Lng(55)
  680. ;           AddGadgetItem(#LIG, -1, Drive(), ImageID(#img1))
  681. ;       Else
  682. ;           AddGadgetItem(#LIG, -1, Drive(), ImageID(#img2))
  683. ;       EndIf
  684.         ; перерисовка заполненности диска
  685.         If GetDiskFreeSpaceEx_(Left(Drive(), 2), @lpFreeBytesAvailable, @lpTotalNumberOfBytes, 0)
  686.             If lpTotalNumberOfBytes > 0 ; чтобы не было сбоя при неопределении диска, на 0 делить нельзя
  687. ;               UpdateProgress(#LIG, i, 8, (lpTotalNumberOfBytes-lpFreeBytesAvailable) * 99.9 / lpTotalNumberOfBytes)
  688.                 UpdateProgress(#LIG, i, 8, Round((lpTotalNumberOfBytes - lpFreeBytesAvailable) * 100 / lpTotalNumberOfBytes , #PB_Round_Nearest))
  689.             Else
  690.                 UpdateProgress(#LIG, i, 8, 1)
  691.             EndIf
  692.         Else
  693.             UpdateProgress(#LIG, i, 8, 0)
  694.         EndIf
  695.  
  696.         If Left(GetGadgetItemText(#LIG, i, 4) , 3) = "EXT"
  697.             HideCheckBox(#LIG, i)
  698.         EndIf
  699.         i + 1
  700.         ; конец => перерисовка заполненности диска
  701.     Next
  702.  
  703.     align_col_LV()
  704.  
  705.     ;   Вычисление ширины окна
  706.     align_Windows()
  707. ;   конец => Вычисление ширины окна
  708.  
  709.  
  710.     ; сортировка
  711.     UpdatelParam()
  712.     ForceSort()
  713.     ; сортировка конец
  714.  
  715.     ClearList(Drive())
  716.  
  717.     If LoadFont(#Font1, Font2$, FontSize) ; шрифт для чекбоксов
  718.         SetGadgetFont(#PB_Default, FontID(#Font1))
  719.     EndIf
  720.    
  721.  
  722. ;- ├ CheckBox / Button
  723.     CheckBoxGadget(#chF, 10, cs\h - 80, cs\w - 190, 20, Lng(11)) : SetGadgetState(#chF, #PB_Checkbox_Checked)
  724.     CheckBoxGadget(#chR, 10, cs\h - 60, cs\w - 190, 20, Lng(12))
  725.     CheckBoxGadget(#chX, 10, cs\h - 40, cs\w - 190, 20, Lng(13)) : SetGadgetState(#chX, #PB_Checkbox_Checked)
  726.     HyperLinkGadget(#StatusBar, 20, cs\h - 17, cs\w - 200, 17, "", $FF0000) ; строка состояния
  727.     CheckBoxGadget(#chAll, cs\w - 179, cs\h - 80, 170, 20, Lng(14))
  728.  
  729.     If LoadFont(#Font2, Font2$, FontSize + 3) ; увеличенный шрифт для кнопок
  730.         SetGadgetFont(#PB_Default, FontID(#Font2))
  731.     EndIf
  732.     ButtonGadget(#btnMenu, cs\w - 137, cs\h - 52, 24, 24, Chr($25BC)) ; "v"
  733.     ButtonGadget(#btnStart, cs\w - 110, cs\h - 52, 100, 42, Lng(15))
  734.     ;   ButtonGadget(7, cs\w - 179, cs\h - 52, 26, 42, "i")
  735.     ;   SetActiveGadget(6)
  736.     SetGadgetText(#StatusBar, "chkdsk.exe " + DiskCur$ + GetComString())
  737.  
  738.     ; Для подсказок часть 2 из 3-х
  739.     AddGadgetToolTip(#StatusBar, Lng(16), 300, 0)
  740.     AddGadgetToolTip(#btnMenu, Lng(17), 300, 0)
  741.     ;   AddGadgetToolTip(5, "Справка по ключам chkdsk.exe", 300, 0)
  742.     AddGadgetToolTip(#btnStart, Lng(18), 300, 0)
  743.     ;   AddGadgetToolTip(7, "Импорт в реестр для проверки" + #CRLF$ + "во время загрузки системы", 300, 0)
  744.     AddGadgetToolTip(#chAll, Lng(19) + #CRLF$ + Lng(20) + #CRLF$ + Lng(21), 300, 0)
  745.  
  746. ;- ├ Menu
  747.     If CreatePopupMenu(#Menu0) ; Создаёт всплывающее меню
  748.                           ;         MenuItem(1, "Вставить краткую ком-строку в окно Выполнить")
  749.                           ;         MenuItem(2, "Вставить полную ком-строку в окно Выполнить")
  750.         OpenSubMenu(Lng(22))
  751.         MenuItem(#mComLineFull, Lng(23) + #TAB$ + "Ctrl+Shift+C")
  752.         MenuItem(#mComLineBrief, Lng(24))
  753.         MenuItem(#mBatFile, Lng(25))
  754.         CloseSubMenu()
  755.         OpenSubMenu(Lng(26))
  756.         MenuItem(#mCheckingSel, Lng(27))
  757.         MenuItem(#mBootExecute, Lng(28))
  758.         MenuItem(#mEventvwr, Lng(29))
  759.  
  760.         fMenuDisk = RegExistsKey()
  761.         If fMenuDisk
  762.             MenuItem(#mDiscMenu, Lng(30))
  763.         Else
  764.             MenuItem(#mDiscMenu, Lng(31))
  765.         EndIf
  766.         CloseSubMenu()
  767.         MenuItem(#mCreateINI, Lng(33))
  768.         MenuItem(#mHelpChkdsk, Lng(34) + #TAB$ + "F2")
  769.         MenuItem(#mHelpGUI, Lng(35) + #TAB$ + "F1")
  770.         MenuItem(#mAbout, Lng(48))
  771.         ;       MenuBar()
  772.     EndIf
  773.  
  774.     ;   деактивируем если нет справки
  775.     If FileSize(GetPathPart(ProgramFilename()) + "ChkDskGui.chm") < 1
  776.         ;       DisableMenuItem(#Menu0, 7, 1)
  777.         SetMenuItemText(#Menu0, #mHelpGUI, Lng(36))
  778.     EndIf
  779.     If Not Admin
  780.         SetMenuItemText(#Menu0, #mCheckingSel, Lng(27) + " " + Lng(32))
  781.         DisableMenuItem(#Menu0, #mCheckingSel, 1)
  782.         If fMenuDisk
  783.             SetMenuItemText(#Menu0, #mDiscMenu, Lng(30) + " " + Lng(32))
  784.         Else
  785.             SetMenuItemText(#Menu0, #mDiscMenu, Lng(31) + " " + Lng(32))
  786.         EndIf
  787.  
  788.         DisableMenuItem(#Menu0, #mDiscMenu, 1)
  789.     EndIf
  790.     If CreatePopupMenu(#Menu1) ; Создаёт всплывающее меню
  791.         MenuItem(#mOpen, Lng(52))
  792.     EndIf
  793.     ;   CheckBoxGadget(#chAll, 3, 128, 17, 17, "")
  794.  
  795.     ; Устанавливает шрифт
  796.     ;   If LoadFont(1, Font2$, FontSize)
  797.     ;       For k = 1 To 4
  798.     ;           SetGadgetFont(k, FontID(1))
  799.     ;       Next
  800.     ;       SetGadgetFont(8, FontID(1))
  801.     ;   EndIf
  802.     ;   If LoadFont(2, Font2$, FontSize+3)
  803.     ;       For k = 5 To 7
  804.     ;           SetGadgetFont(k, FontID(2))
  805.     ;       Next
  806.     ;   EndIf
  807.  
  808.  
  809.  
  810.     SetWindowCallback(@MyWindowCallback())
  811.     ;   ResizeWindow(#Window, #PB_Ignore , #PB_Ignore , WinW , WinH)
  812.     If cs\m ; флаг окно на весь экран
  813.         SetWindowState(#Window, #PB_Window_Maximize)
  814.     EndIf
  815.  
  816.     ;   Поддержка ком-строки
  817.     tmp = CountProgramParameters()
  818.     If tmp
  819.         SelDisk$ = Left(ProgramParameter(), 2)
  820.         For k = 0 To CountGadgetItems(#LIG) - 1
  821.             If GetGadgetItemText(#LIG, k) = SelDisk$
  822.                 SetGadgetItemState(#LIG , k , #PB_ListIcon_Checked)
  823.             EndIf
  824.         Next
  825.     EndIf
  826.     HideWindow(#Window, #False)
  827.    
  828.     AddKeyboardShortcut(#Window, #PB_Shortcut_F1, #mHelpGUI) ; F1
  829.     AddKeyboardShortcut(#Window, #PB_Shortcut_F2, #mHelpChkdsk) ; F2
  830.     AddKeyboardShortcut(#Window, #PB_Shortcut_Control | #PB_Shortcut_Shift | #PB_Shortcut_C, #mComLineFull) ; Ctrl+Shift+C
  831. ;   AddKeyboardShortcut(#Window, #PB_Shortcut_Control | #PB_Shortcut_E, #mOpen) ; Ctrl+E
  832.     AddKeyboardShortcut(#Window, #PB_Shortcut_Return, #mStart) ; Enter
  833.  
  834.  
  835. ;-┌──Loop──┐
  836.     Repeat
  837.         Select WaitWindowEvent()
  838.             Case #PB_Event_RightClick       ; нажата правая кнопка мыши =>
  839.                 DisplayPopupMenu(#Menu0, WindowID(#Window))  ; покажем всплывающее Меню
  840.             Case #PB_Event_RestoreWindow
  841.                 cs\m = 0
  842.             Case #PB_Event_MaximizeWindow
  843.                 cs\m = 1
  844.  
  845. ;- ├ Gadget
  846.             Case #PB_Event_Gadget
  847.                 Select EventGadget()
  848.                     Case #LIG
  849.                         i = GetGadgetState(#LIG)
  850.                         If i <> -1
  851.                             DiskCur$ = GetGadgetItemText(#LIG, i)
  852.                         EndIf
  853.                         Select EventType()
  854.                             Case #PB_EventType_RightClick
  855.                                 DisplayPopupMenu(#Menu1, WindowID(#Window))  ; покажем всплывающее Меню
  856.                             Case #PB_EventType_LeftClick
  857.                                 i = GetGadgetState(#LIG)
  858.                                 If i <> -1
  859.                                     tmp = 0
  860.                                     If Not GetGadgetItemState(#LIG, i) & #PB_ListIcon_Checked
  861. ;                                       If Left(GetGadgetItemText(#LIG, i, 4) , 3) = "EXT"
  862. ;                                       If Left(GetGadgetItemText(#LIG, i, 4) , 3) = "FAT"
  863. ;                                           Continue
  864. ;                                       EndIf
  865.                                         tmp = #PB_ListIcon_Checked
  866.                                     EndIf
  867.                                     SetGadgetItemState(#LIG , i , tmp)
  868.                                 EndIf
  869.                             Case #PB_EventType_LeftDoubleClick
  870.                                 RunProgram("explorer.exe", DiskCur$ + "\", "")
  871.                         EndSelect
  872.                         SetGadgetText(#StatusBar, "chkdsk.exe " + DiskCur$ + GetComString())
  873.                     Case #chF
  874.                         If GetGadgetState(#chF) = #PB_Checkbox_Unchecked
  875.                             SetGadgetState(#chR, #PB_Checkbox_Unchecked)
  876.                             SetGadgetState(#chX, #PB_Checkbox_Unchecked)
  877.                         EndIf
  878.                         SetGadgetText(#StatusBar, "chkdsk.exe " + DiskCur$ + GetComString())
  879.                     Case #chR
  880.                         SetGadgetState(#chF, #PB_Checkbox_Checked)
  881.                         SetGadgetText(#StatusBar, "chkdsk.exe " + DiskCur$ + GetComString())
  882.                     Case #chX
  883.                         If GetGadgetState(#chX) = #PB_Checkbox_Checked
  884.                             SetGadgetState(#chF, #PB_Checkbox_Checked)
  885.                         EndIf
  886.                         SetGadgetText(#StatusBar, "chkdsk.exe " + DiskCur$ + GetComString())
  887.                         ;               Case #StatusBar
  888.                         ;
  889.                     Case #StatusBar
  890.                         SetClipboardText(cmd$ + " /c (" + GetGadgetText(#StatusBar) + " & Pause)")
  891.                     Case #btnMenu ; ?
  892.                         DisplayPopupMenu(#Menu0, WindowID(#Window))  ; покажем всплывающее Меню
  893.                     Case #btnStart          ; Старт
  894.                         res$ = GetCommand(0)
  895.                         If Not Asc(res$)
  896.                             Continue
  897.                         EndIf
  898.                         ; SetClipboardText("cmd.exe /c (Title Check Disk " + info$ + " & @Echo off & @Echo. & Color " + Color$ + " & chkdsk.exe " + disk$ + GetComString() + " & set /p Ok=^>^>)")
  899.                         ; cmd.exe /c (Title Check Disk "тут инфа о диске" & @Echo off & @Echo. & Color f0 & chkdsk.exe Z: /F /X & set /p Ok=^>^>)
  900.                         ; MessageRequester("Выбранные", res$)
  901.  
  902.                         RunProgram(cmd$, "/c (" + res$ + " set /p Ok=^>^>)", GetPathPart(ProgramFilename()))
  903.                         ; Delay(500)
  904.                         ; WindowName.s="Check Disk " + info$
  905.                         ; handle=FindWindow_(0,WindowName)
  906.                         ; If handle
  907.                         ;   MoveWindow_(handle, 5, 210+5, 800, 600, 0)
  908.                         ;   MessageRequester("???", "сработало ли условие")
  909.                         ; EndIf
  910.                         ; MoveWindow_(hGUI, 5, 5, 480, 210, 0)
  911.  
  912.                         ;
  913.                         ; ThreadID=RunProgram("cmd.exe","","",#PB_Program_Open)
  914.                         ; Sleep_(2000)
  915.                         ; iPid=ProgramID(ThreadID)
  916.                         ; hWnd=InstanceToWnd(iPid)
  917.                         ; MoveWindow_(hWnd, 5, 5, 480, 210, 0)
  918.                         ; Sleep_(2000)
  919.                         ; MoveWindow_(hWnd, 5, 5, 210, 480, 0)
  920.                         ; Sleep_(2000)
  921.                         ; MoveWindow_(hWnd, 200, 200, 480, 210, 0)
  922.                         ; Sleep_(2000)
  923.                         ; MoveWindow_(hWnd, 200, 200, 640, 480, 0)
  924.                     Case #chAll
  925.                         tmp = 0
  926.                         If GetGadgetState(#chAll) = #PB_Checkbox_Checked
  927.                             tmp = #PB_ListIcon_Checked
  928.                         EndIf
  929.                         For k = 0 To CountGadgetItems(#LIG) - 1
  930.                             SetGadgetItemState(#LIG, k , tmp)
  931.                         Next
  932.                 EndSelect
  933.  
  934.  
  935.  
  936.  
  937.  
  938. ;- ├ Menu
  939.             Case #PB_Event_Menu        ; кликнут элемент всплывающего Меню
  940.                 Select EventMenu()    ; получим кликнутый элемент Меню...
  941.                     Case #mStart
  942.                         res$ = GetCommand(0)
  943.                         If Not Asc(res$)
  944.                             Continue
  945.                         EndIf
  946.                         RunProgram(cmd$, "/c (" + res$ + " set /p Ok=^>^>)", GetPathPart(ProgramFilename()))
  947.                     Case #mComLineFull
  948.                         Insert_Command(1)
  949.                     Case #mComLineBrief
  950.                         Insert_Command(2)
  951.                     Case #mEventvwr
  952.                         RunProgram("eventvwr.exe")
  953.                         SetClipboardText("Wininit")
  954.                     Case #mBootExecute ; посмотреть в реестре
  955.                         RegJump("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager")
  956.                     Case #mHelpChkdsk
  957.                         HelpChkdsk()
  958.                     Case #mCheckingSel ; i импорт рег-данных
  959.                         TrgS = 0
  960.                         info$ = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  961.                         For k = 0 To CountGadgetItems(#LIG) - 1
  962.                             If (GetGadgetItemState(#LIG, k) & #PB_ListIcon_Checked)
  963.                                 info$ = ReplaceString(info$, Left(GetGadgetItemText(#LIG, k), 1), "")
  964.                                 TrgS + 1
  965.                                 ;                   MessageRequester(Lng(37), info$)
  966.                             EndIf
  967.                         Next
  968.                         If Not TrgS And Not Admin
  969.                             MessageRequester(Lng(37), Lng(38))
  970.                             Continue
  971.                         ElseIf Not Admin
  972.                             MessageRequester(Lng(37), Lng(39))
  973.                             Continue
  974.                         ElseIf Not TrgS
  975.                             MessageRequester(Lng(37), Lng(40))
  976.                             Continue
  977.                         EndIf
  978.                         ;                   MessageRequester(Lng(37), info$)
  979.                         If #ERROR_SUCCESS = RegOpenKeyEx_(#HKEY_LOCAL_MACHINE, "SYSTEM\CurrentControlSet\Control\Session Manager", 0, #KEY_WRITE, @hKey)
  980.                             valie.s = "autocheck autochk /p /K:" + info$ + " *"
  981.                             ;  res$="autocheck autochk /p \??\C:"
  982.                             RegSetValueEx_(hKey, @"BootExecute", 0, #REG_EXPAND_SZ, @valie, StringByteLength(valie, #PB_Unicode))
  983.                             RegCloseKey_(hKey)
  984.                             MessageRequester(Lng(37), Lng(41) + #CRLF$ + #CRLF$ + valie.s)
  985.                         Else
  986.                             MessageRequester(Lng(37), Lng(42))
  987.                         EndIf
  988.                     Case #mHelpGUI
  989.                         res$ = GetPathPart(ProgramFilename()) + "ChkDskGui.chm"
  990.                         If FileSize(res$) > 11
  991.                             RunProgram("hh.exe", res$ + "::/html/control.htm", GetPathPart(ProgramFilename()))
  992.                             ; SetMenuItemText(#Menu0, 7, Lng(35))
  993.                         Else
  994.                             ; DisableMenuItem(#Menu0, 7, 1)
  995.                             If MessageRequester(Lng(36), Lng(53), #PB_MessageRequester_YesNo) = #PB_MessageRequester_Yes
  996.                                 RunProgram("https://yadi.sk/d/XFgMC4xByJKRiA")
  997.                             EndIf
  998.                            
  999.                             ; SetMenuItemText(#Menu0, 7, "Скачать справку")
  1000.                         EndIf
  1001.                     Case #mBatFile
  1002.                         res$ = GetCommand(3)
  1003.                         If Not Bool(res$)
  1004.                             Continue
  1005.                         EndIf
  1006.                         res$ + "set /p Ok=^>^>"
  1007.                         res$ = ReplaceString(res$, "&", #CRLF$)
  1008.                         ;                       ReplaceString(res$, "Гб", "ѓЎ")
  1009.                         res$ = ToOem(res$)
  1010.                         ;                       CharToOem_(String$, String$)
  1011.                         ;                       OemToChar_(String$, String$)
  1012.                         SetClipboardText(res$)
  1013.                     Case #mCreateINI
  1014.                         If FileSize(ini$) <> -1
  1015.                             If #PB_MessageRequester_No = MessageRequester(Lng(37), Lng(43), #MB_YESNO | #MB_ICONQUESTION | #MB_DEFBUTTON2)
  1016.                                 Continue
  1017.                             EndIf
  1018.                         EndIf
  1019.                         SaveFile_Buff(ini$, ?ini, ?iniend - ?ini)
  1020.                     Case #mDiscMenu
  1021.                         RegToMenuDisk()
  1022.                     Case #mOpen
  1023.                         i = GetGadgetState(#LIG)
  1024.                         If i <> -1
  1025.                             DiskCur$ = GetGadgetItemText(#LIG, i)
  1026.                             RunProgram("explorer.exe", DiskCur$ + "\", "")
  1027.                         EndIf
  1028.                     Case #mAbout
  1029.                         If MessageRequester(Lng(48), Lng(49) + " AZJIO" + #CRLF$ + Lng(50) + " 4.3  (07.11.2024)" + #CRLF$ + #CRLF$ + Lng(51), #MB_OKCANCEL) = #IDOK
  1030.                             RunProgram("https://usbtor.ru/viewtopic.php?t=1478")
  1031.                         EndIf
  1032. ;                       MessageRequester("Размеры окна", Str(WindowHeight(#Window, #PB_Window_FrameCoordinate)) + " " + Str(WindowWidth(#Window, #PB_Window_FrameCoordinate)))
  1033.                 EndSelect
  1034.             Case #PB_Event_CloseWindow
  1035.                 SaveINI()
  1036.                 CompilerIf #PB_Compiler_Processor = #PB_Processor_x86 ; если ChkDskGui-x86
  1037.                     If RedirectRequired
  1038.                         CallFunctionFast(*Func, 1) ; включили перенаправление
  1039.                         CloseLibrary(hKrnDLL)
  1040.                     EndIf
  1041.                 CompilerEndIf
  1042.                 End
  1043.         EndSelect
  1044.     ForEver
  1045. ;-└──Loop──┘
  1046. EndIf
  1047.  
  1048. End
  1049.  
  1050. Procedure RegExistsKey()
  1051.     Protected hKey
  1052.     If #ERROR_SUCCESS = RegOpenKeyEx_(#HKEY_CLASSES_ROOT, "Drive\shell\ChkDskGui\command", 0, #KEY_READ, @hKey)
  1053.         RegCloseKey_(hKey)
  1054.         ProcedureReturn 1
  1055.     Else
  1056.         ProcedureReturn 0
  1057.     EndIf
  1058. EndProcedure
  1059.  
  1060. Procedure RegJump(valie.s)
  1061.     Protected hKey
  1062.     If #ERROR_SUCCESS = RegOpenKeyEx_(#HKEY_CURRENT_USER, "Software\Microsoft\Windows\CurrentVersion\Applets\Regedit", 0, #KEY_WRITE, @hKey)
  1063.         RegSetValueEx_(hKey, @"LastKey", 0, #REG_SZ, @valie, StringByteLength(valie, #PB_Unicode))
  1064.         RegCloseKey_(hKey)
  1065.         hKey = FindWindowEx_(0, 0, "RegEdit_RegEdit", 0)
  1066.         If hKey
  1067.             KillProcess_hWin(hKey)
  1068.         EndIf
  1069.         RunProgram("regedit.exe")
  1070.     EndIf
  1071. EndProcedure
  1072.  
  1073. Procedure KillProcess_hWin(hwin)
  1074.     Protected phandle, result, PID
  1075.     GetWindowThreadProcessId_(hwin, @PID)
  1076.     phandle = OpenProcess_(#PROCESS_TERMINATE, #False, PID)
  1077.     If phandle <> #Null
  1078.         result = TerminateProcess_(phandle, 1) ; успех <> 0
  1079.         CloseHandle_(phandle)
  1080.     EndIf
  1081.     ProcedureReturn result
  1082. EndProcedure
  1083.  
  1084. Procedure Insert_Command(d)
  1085.     Protected res$, hwnd, k
  1086.     res$ = GetCommand(d)
  1087.     If Not Bool(res$)
  1088.         ProcedureReturn
  1089.     EndIf
  1090.     SetClipboardText(cmd$ + " /c (" + res$ + " set /p Ok=^>^>)")
  1091.     hwnd = FindWindow_("Shell_TrayWnd", "")
  1092.     If hwnd
  1093.         SendMessage_(hwnd, #WM_COMMAND, $191, 0)
  1094.     Else
  1095.         RunProgram("RUNDLL32", "SHELL32.DLL,#61", "")
  1096.     EndIf
  1097.     ; Вот так мы ищем окно с шагом 60 мсек 30 раз
  1098.     k = 0
  1099.     Repeat
  1100.         hwnd = FindWindowEx_(0, 0, "#32770", Lng(44)) ; Запуск программы
  1101.         Delay(60)
  1102.         k + 1
  1103.         If k > 30
  1104.             Break
  1105.         EndIf
  1106.     Until hwnd
  1107.     If hwnd
  1108.         ;   SendMessage_(GetDlgItem_(hwnd, 12298),#WM_SETTEXT,0, res$)
  1109.         hwnd = FindWindowEx_(hwnd, 0, "ComboBox", 0)
  1110.         SendMessage_(hwnd, #WM_SETTEXT, 0, cmd$ + " /c (" + res$ + " set /p Ok=^>^>)")
  1111.         ;   SendMessage_(hwnd, #WM_SETTEXT,0, Str(GetDlgCtrlID_(hwnd))) ; получить идентификатор
  1112.     EndIf
  1113.     ; SendMessage_(0, #WM_KEYDOWN, #VK_LWIN, 0)
  1114.     ; SendMessage_(0, #WM_KEYDOWN, $52, 0)
  1115.     ; SendMessage_(0, #WM_KEYUP, $52, 0)
  1116.     ; SendMessage_(0, #WM_KEYUP, #VK_LWIN, 0)
  1117. EndProcedure
  1118.  
  1119. Procedure RegToMenuDisk()
  1120.     Protected hKey, KeyInfo, valie.s
  1121.     If RegExistsKey() ; если существует, то удаляем
  1122.         If #ERROR_SUCCESS = RegDeleteKey_(#HKEY_CLASSES_ROOT, "Drive\shell\ChkDskGui\command")
  1123.             If #ERROR_SUCCESS = RegDeleteKey_(#HKEY_CLASSES_ROOT, "Drive\shell\ChkDskGui")
  1124.                 ;               MessageRequester(Lng(37),"Запись удалена",0)
  1125.                 SetMenuItemText(#Menu0, #mDiscMenu, Lng(31))
  1126.             EndIf
  1127.         EndIf
  1128.     Else ; иначе добавляем
  1129.         If #ERROR_SUCCESS = RegCreateKeyEx_(#HKEY_CLASSES_ROOT, "Drive\shell\ChkDskGui", 0, 0, #REG_OPTION_NON_VOLATILE, #KEY_ALL_ACCESS, 0, @hKey, @KeyInfo)
  1130.             valie = "ChkDskGui"
  1131.             RegSetValueEx_(hKey, @"", 0, #REG_SZ, @valie, StringByteLength(valie, #PB_Unicode))
  1132.             valie = Chr(34) + ProgramFilename() + Chr(34)
  1133.             RegSetValueEx_(hKey, @"Icon", 0, #REG_SZ, @valie, StringByteLength(valie, #PB_Unicode))
  1134.             RegCloseKey_(hKey)
  1135.         EndIf
  1136.  
  1137.         If #ERROR_SUCCESS = RegCreateKeyEx_(#HKEY_CLASSES_ROOT, "Drive\shell\ChkDskGui\command", 0, 0, #REG_OPTION_NON_VOLATILE, #KEY_ALL_ACCESS, 0, @hKey, @KeyInfo)
  1138.             valie = Chr(34) + ProgramFilename() + Chr(34) + " " + Chr(34) + "%1" + Chr(34)
  1139.             RegSetValueEx_(hKey, @"", 0, #REG_SZ, @valie, StringByteLength(valie, #PB_Unicode))
  1140.             RegCloseKey_(hKey)
  1141.             SetMenuItemText(#Menu0, #mDiscMenu, Lng(30))
  1142.         EndIf
  1143.     EndIf
  1144. EndProcedure
  1145.  
  1146. Procedure SaveFile_Buff(File.s, *Buff, Size)
  1147.     Protected Result = #False
  1148.     Protected ID = CreateFile(#PB_Any, File)
  1149.     If ID
  1150.         If WriteData(ID, *Buff, Size) = Size
  1151.             Result = #True
  1152.         EndIf
  1153.         CloseFile(ID)
  1154.     EndIf
  1155.     ProcedureReturn Result
  1156. EndProcedure
  1157.  
  1158. Procedure.s GetCommand(fill = 0)
  1159.     Protected res$ = "", TrgS = 0, k, info$, disk$
  1160.     For k = 0 To CountGadgetItems(#LIG) - 1
  1161.         info$ = ""
  1162.         If GetGadgetItemState(#LIG, k) & #PB_ListIcon_Checked
  1163.             disk$ = GetGadgetItemText(#LIG, k)
  1164.             info$ = disk$ + "  " + GetGadgetItemText(#LIG, k, 1) + "  " + GetGadgetItemText(#LIG, k, 2) + "  " + GetGadgetItemText(#LIG, k, 3) + "  " + GetGadgetItemText(#LIG, k, 4) + "  " + GetGadgetItemText(#LIG, k, 5)
  1165.  
  1166.             Select fill
  1167.                 Case 0
  1168.                     res$ + "Title Check Disk " + info$ + " & @Echo off & @Echo. & @Echo. & @Echo ====================================================== & @Echo Test " + info$ + " & @Echo ====================================================== & @Echo. & @Echo. & Color " + Color$ + " & chkdsk.exe " + disk$ + GetComString() + "&"
  1169.                 Case 1
  1170.                     res$ + "Title " + info$ + " & @Echo off & @Echo." + info$ + " & @Echo. & Color " + Color$ + " & chkdsk.exe " + disk$ + GetComString() + "&"
  1171.                 Case 2
  1172.                     res$ + "@Echo off & @Echo." + info$ + " & @Echo. & Color " + Color$ + " & chkdsk.exe " + disk$ + GetComString() + "&"
  1173.                 Case 3
  1174.                     res$ + "Title Check Disk " + info$ + " & @Echo off & @Echo. & @Echo. & @Echo ====================================================== & @Echo Test " + info$ + " & @Echo ====================================================== & @Echo. & @Echo. & Color " + Color$ + " & chkdsk.exe " + disk$ + GetComString() + "&"
  1175.  
  1176.                     ;               Default
  1177.                     ;                   MessageRequester(Lng(37), Text$)
  1178.             EndSelect
  1179.  
  1180.             TrgS + 1
  1181.         EndIf
  1182.     Next
  1183.     If Not TrgS
  1184.         MessageRequester(Lng(37), Lng(40))
  1185.         res$ = ""
  1186.     EndIf
  1187.     ProcedureReturn res$
  1188. EndProcedure
  1189.  
  1190. Procedure Add_item_LV(Drive2$)
  1191.     Drive2$ = ComboListDrive(Drive2$)
  1192.     If Drive2$ <> "-"
  1193. ;       If Mid(Drive2$, 10, 3) = "Fix"
  1194. ;           AddGadgetItem(#LIG, -1, Drive2$, ImageID(#img0))
  1195. ;       Else
  1196. ;           AddGadgetItem(#LIG, -1, Drive2$, ImageID(#img1))
  1197. ;       EndIf
  1198. ;       If StringField(Drive2$, 3, Chr(10)) = Lng(54)
  1199. ;           AddGadgetItem(#LIG, -1, Drive2$, ImageID(#img0))
  1200. ;       Else
  1201. ;           AddGadgetItem(#LIG, -1, Drive2$, ImageID(#img1))
  1202. ;       EndIf
  1203.         Select StringField(Drive2$, 3, Chr(10))
  1204.             Case Lng(54)
  1205.                 AddGadgetItem(#LIG, -1, Drive2$, ImageID(#img0))
  1206.             Case Lng(55)
  1207.                 AddGadgetItem(#LIG, -1, Drive2$, ImageID(#img1))
  1208.             Default
  1209.                 AddGadgetItem(#LIG, -1, Drive2$, ImageID(#img2))
  1210.         EndSelect
  1211.  
  1212.         ; перерисовка заполненности диска
  1213.         Protected i = SendMessage_(hListView, #LVM_GETITEMCOUNT, 0, 0) - 1
  1214.         If GetDiskFreeSpaceEx_(Left(Drive2$, 2), @lpFreeBytesAvailable, @lpTotalNumberOfBytes, 0)
  1215.             If lpTotalNumberOfBytes > 0 ; чтобы не было сбоя при неопределении диска, на 0 делить нельзя
  1216. ;               UpdateProgress(#LIG, i, 8, (lpTotalNumberOfBytes-lpFreeBytesAvailable) *100 / lpTotalNumberOfBytes)
  1217.                 UpdateProgress(#LIG, i, 8, Round((lpTotalNumberOfBytes - lpFreeBytesAvailable) * 100 / lpTotalNumberOfBytes , #PB_Round_Nearest))
  1218.             Else
  1219.                 UpdateProgress(#LIG, i, 8, 1)
  1220.             EndIf
  1221.         Else
  1222.             UpdateProgress(#LIG, i, 8, 0)
  1223.         EndIf
  1224.         ; конец => перерисовка заполненности диска
  1225.     EndIf
  1226. EndProcedure
  1227.  
  1228. Procedure Add_item_LV_Mask(Mask.l)
  1229.     Protected i, letter.s, title.s
  1230.     For i = StartDisk To 25
  1231.         If ((Mask >> i) & 1) ; проверить каждый флаг
  1232.             letter = Chr(i + 65)
  1233.             title + letter + ": "
  1234.             Add_item_LV(letter) ; получить букву и отправить на добавление
  1235.         EndIf
  1236.     Next
  1237.     DuplicateDriveTest()
  1238.     align_col_LV()
  1239.     align_Windows()
  1240.     SetWindowTitle(#Window, Lng(45) + title + ")")
  1241.  
  1242.     ;   сортировка
  1243.     UpdatelParam()
  1244.     SortOrder = -SortOrder
  1245.     ForceSort()
  1246. EndProcedure
  1247.  
  1248. Procedure DuplicateDriveTest()
  1249.     Protected k, letter.s
  1250.     Protected NewMap Disk.i()
  1251.     For k = 0 To CountGadgetItems(#LIG) - 1
  1252.         letter = GetGadgetItemText(#LIG, k, 0)
  1253.         If FindMapElement(Disk(), letter)
  1254.             RemoveGadgetItem(#LIG, k)
  1255.         Else
  1256.             AddMapElement(Disk(), letter)
  1257.         EndIf
  1258.     Next
  1259. EndProcedure
  1260.  
  1261. ; Procedure DuplicateDriveTest()
  1262. ;   Protected k, letter.s, LastLetter.s
  1263. ;   For k = 0 To CountGadgetItems(#LIG)-1
  1264. ;       letter = GetGadgetItemText(#LIG, k, 0)
  1265. ;       If letter = LastLetter
  1266. ;           RemoveGadgetItem(#LIG, k)
  1267. ;       Else
  1268. ;           LastLetter = letter
  1269. ;       EndIf
  1270. ;   Next
  1271. ; EndProcedure
  1272.  
  1273. Procedure Del_item_LV(Mask.l)
  1274.     Protected k, Count, letter.s, title.s;, z
  1275.     Count = CountGadgetItems(#LIG)
  1276.     For k = Count - 1 To 0 Step -1
  1277.         ;       If GetGadgetItemText(#LIG, k) = Drive2$+":" Or (drives_avail >> Asc(Left(GetGadgetItemText(#LIG, k), 1)) - 65) & 0
  1278.         ;       Debug Str(Asc(Left(GetGadgetItemText(#LIG, k), 1)) - 65)
  1279.         letter = Left(GetGadgetItemText(#LIG, k), 1)
  1280.         If (Mask >> (Asc(letter) - 65)) & 1
  1281.             RemoveGadgetItem(#LIG, k)
  1282.             title + letter + ": "
  1283.             ;           z + 1
  1284.         EndIf
  1285.     Next
  1286.     SetWindowTitle(#Window, Lng(46) + title + ")")
  1287.     ;   CountDisk - z ; потому что не используем по коду
  1288.     align_col_LV()
  1289.     align_Windows()
  1290. EndProcedure
  1291.  
  1292.  
  1293. Procedure align_col_LV()
  1294.     Protected k
  1295.     ListViewSpalte\fmt = #LVCFMT_RIGHT ; Указываем в поле fmt структуры константу для выравнивания
  1296.     SendMessage_(hListView, #LVM_SETCOLUMN, 5, @ListViewSpalte) ; Выслать сообщение, где 5 - индекс колонки
  1297.     ;   Выровнять ширину колонок, чтобы уместился текст
  1298.     For k = 0 To 7
  1299.         If k = 3 ; кроме колонки "Метка диска"
  1300.             Continue
  1301.         EndIf
  1302.         SetGadgetItemAttribute(#LIG, 2, #PB_ListIcon_ColumnWidth , #LVSCW_AUTOSIZE, k)
  1303.     Next
  1304. ;   If Not Admin ; для колонки "MBR/GPT" без админа ширина 0
  1305. ;       SetGadgetItemAttribute(#LIG, 2, #PB_ListIcon_ColumnWidth , 0, 7)
  1306. ;   EndIf
  1307. ;   SetGadgetItemAttribute(#LIG, 2, #PB_ListIcon_ColumnWidth , #LVSCW_AUTOSIZE_USEHEADER, 7)
  1308. EndProcedure
  1309.  
  1310. Procedure align_Windows()
  1311.     Protected i, Height, ColumnWidth = 0
  1312.     Height = 24 + 18 * SendMessage_(hListView, #LVM_GETITEMCOUNT, 0, 0) - 1 + 100
  1313. ;   If Not fINI Or AlignWin ; если нет ini или выравнивание=1, то
  1314. ;   If Not fINI And AlignWin ; если нет ini и выравнивание=1, то
  1315.     If AlignWin
  1316.         For i = 0 To 8
  1317.             ColumnWidth + SendMessage_(hListView, #LVM_GETCOLUMNWIDTH, i, 0)
  1318.         Next
  1319.         ColumnWidth + 10
  1320.         ResizeGadget(#LIG, #PB_Ignore, #PB_Ignore, ColumnWidth, #PB_Ignore)
  1321.         ColumnWidth + 10
  1322. ;       ResizeWindow(#Window, #PB_Ignore, #PB_Ignore, ColumnWidth, Height)
  1323.         ResizeWindow(#Window, (DesktopWidth(#Desktop) - ColumnWidth) / 2, (DesktopHeight(#Desktop) - Height) / 2, ColumnWidth, Height)
  1324.         PostMessage_(hGUI, #WM_SIZE, 0, 0)
  1325.     EndIf
  1326. EndProcedure
  1327.  
  1328. ; MessageRequester("Размеры окна", Str(WindowHeight(#Window, #PB_Window_FrameCoordinate)) + " " + Str(WindowWidth(#Window, #PB_Window_FrameCoordinate)))
  1329.  
  1330. Procedure HideCheckBox(gadget, item)
  1331.     Protected lvi.LVITEM
  1332.     lvi\iItem = item
  1333.     lvi\mask = #LVIF_STATE
  1334.     lvi\stateMask = #LVIS_STATEIMAGEMASK
  1335.     SendMessage_(GadgetID(#LIG), #LVM_SETITEM, 0, @lvi)
  1336. EndProcedure
  1337.  
  1338. Procedure MyWindowCallback(WindowId, Message, wParam, lParam)
  1339. ;-┌──MyWindowCallback──┐
  1340.     Protected Result = #PB_ProcessPureBasicEvents, Mask, Drive.s, h, w, *pDBHDR.DEV_BROADCAST_HDR, *pDBV.DEV_BROADCAST_VOLUME
  1341.     Protected *ptr.MINMAXINFO
  1342.     Protected tmp
  1343.     Protected *msg.NMHDR, *pnmv.NM_LISTVIEW ; для сортировки
  1344.     Protected row, col
  1345.     Protected *LVCDHeader.NMLVCUSTOMDRAW ; прогресс заполнения дисков
  1346.     Select Message
  1347. ;- ├ WM_NOTIFY
  1348.         Case #WM_NOTIFY ; для сортировки
  1349.             *msg.NMHDR = lParam
  1350.             Select *msg\code
  1351.                 Case #LVN_COLUMNCLICK
  1352.                     If *msg\hwndFrom = hListView
  1353.                         *pnmv.NM_LISTVIEW = lParam
  1354.                         If indexSort <> *pnmv\iSubItem
  1355.                             SortOrder = 1
  1356.                         EndIf
  1357.                         indexSort = *pnmv\iSubItem
  1358.                         ForceSort()
  1359.                     EndIf
  1360. ;               При изменении пункта с типом файловой системы EXT3/EXT4, пункт теряет галку и скрывается
  1361.                 Case #LVN_ITEMCHANGED
  1362.                     If *msg\hwndFrom = hListView
  1363.                         *pnmv.NM_LISTVIEW = lParam
  1364.                         If Left(GetGadgetItemText(#LIG, *pnmv\iItem, 4) , 3) = "EXT"
  1365. ;                           Нет необходимости диактивировать пункт, так как после скрытия он не обслуживается
  1366. ;                           If GetGadgetItemState(#LIG, *pnmv\iItem) & #PB_ListIcon_Checked
  1367. ;                               SetGadgetItemState(#LIG, *pnmv\iItem , 0)
  1368. ;                           EndIf
  1369.                             HideCheckBox(#LIG, *pnmv\iItem)
  1370.                         EndIf
  1371.                     EndIf
  1372.  
  1373.  
  1374. ; перерисовка заполненности диска
  1375. ;- ├ NM_CUSTOMDRAW
  1376.                 Case #NM_CUSTOMDRAW
  1377.                     *LVCDHeader.NMLVCUSTOMDRAW = lParam
  1378.                     row = *LVCDHeader\nmcd\dwItemSpec
  1379.                     col = *LVCDHeader\iSubItem
  1380.                     If col = 8
  1381.                         Select *LVCDHeader\nmcd\dwDrawStage
  1382.                             Case #CDDS_PREPAINT
  1383.                                 Result = #CDRF_NOTIFYITEMDRAW
  1384.                             Case #CDDS_ITEMPREPAINT
  1385.                                 Result = #CDRF_NOTIFYSUBITEMDRAW
  1386.                             Case #CDDS_SUBITEMPREPAINT
  1387.                                 DrawProgressBar(lParam)
  1388.                                 Result = #CDRF_SKIPDEFAULT
  1389.                         EndSelect
  1390.                     EndIf
  1391.             EndSelect
  1392. ; конец => перерисовка заполненности диска
  1393.  
  1394.  
  1395. ;- ├ WM_DEVICECHANGE
  1396.         Case #WM_DEVICECHANGE ; Изменение при подключении внешних дисков.
  1397.             Result = #True
  1398.             Select wParam
  1399.                 Case #DBT_DEVICEARRIVAL, #DBT_DEVICEREMOVECOMPLETE
  1400.                     *pDBHDR.DEV_BROADCAST_HDR = lParam
  1401.                     If *pDBHDR\dbch_devicetype = #DBT_DEVTYP_VOLUME
  1402.                         *pDBV.DEV_BROADCAST_VOLUME = lParam
  1403.                         Mask = *pDBV\dbcv_unitmask
  1404.  
  1405.                         Select wParam
  1406.                             Case #DBT_DEVICEARRIVAL
  1407.                                 ; Debug Bin(drives_avail)
  1408.                                 ; Debug Bin(Mask)
  1409.                                 tmp = drives_avail
  1410.                                 drives_avail | Mask
  1411.                                 If tmp <> drives_avail
  1412.                                     Add_item_LV_Mask(Mask)
  1413.                                 EndIf
  1414.                             Case #DBT_DEVICEREMOVECOMPLETE
  1415.                                 drives_avail ! (Mask & drives_avail)
  1416.                                 Del_item_LV(Mask)
  1417.                         EndSelect
  1418.                     EndIf
  1419.             EndSelect
  1420.         Case #WM_GETMINMAXINFO ; Минимальный, максимальный размера окна. Смотреть WindowBounds
  1421.             Result = 0
  1422.             *ptr.MINMAXINFO = lParam
  1423.             *ptr\ptMinTrackSize\y = 160 + BorderY ;42
  1424.             *ptr\ptMinTrackSize\x = 480 + BorderX ;16
  1425.         Case #WM_EXITSIZEMOVE       ; Изменение размера окна и перемещение после события.
  1426.             If Not cs\m         ; если окно не на весь экран, то кешируем массив
  1427.                 cs\x = WindowX(#Window, #PB_Window_FrameCoordinate)
  1428.                 cs\y = WindowY(#Window, #PB_Window_FrameCoordinate)
  1429.                 cs\w = WindowWidth(#Window)     ; Новая ширина окна.
  1430.                 cs\h = WindowHeight(#Window)     ; Новая высота окна.
  1431.             EndIf
  1432. ;- ├ WM_SIZE
  1433.         Case #WM_SIZE         ; Изменение размера окна.
  1434.             w = WindowWidth(#Window)      ; Новая ширина окна.
  1435.             h = WindowHeight(#Window)      ; Новая высота окна.
  1436.             ResizeGadget(#LIG, #PB_Ignore, #PB_Ignore, w - 10, h - 90)
  1437.             ResizeGadget(#chF, #PB_Ignore, h - 80, w - 190, #PB_Ignore)
  1438.             ResizeGadget(#chR, #PB_Ignore, h - 60, w - 190, #PB_Ignore)
  1439.             ResizeGadget(#chX, #PB_Ignore, h - 40, w - 190, #PB_Ignore)
  1440.             ResizeGadget(#StatusBar, #PB_Ignore, h - 17, w - 200, #PB_Ignore)
  1441.             ;           ResizeGadget(5, w - 150, h - 52, 37, 42)
  1442.             ResizeGadget(#btnMenu, w - 137, h - 52, 24, #PB_Ignore)
  1443.             ResizeGadget(#btnStart, w - 110, h - 52, 100, #PB_Ignore)
  1444.             ;           ResizeGadget(7, w - 179, h - 52, 26, 42)
  1445.             ResizeGadget(#chAll, w - 179, h - 80, 170, #PB_Ignore)
  1446. ;           SetGadgetItemAttribute(#LIG, 0, #PB_ListIcon_ColumnWidth, w - 530, 3)
  1447.     EndSelect
  1448.     ProcedureReturn Result
  1449. ;-└──MyWindowCallback──┘
  1450. EndProcedure
  1451.  
  1452. Procedure InstanceToWnd(iPid)
  1453.     Protected hWnd = FindWindow_(0, 0)
  1454.     Protected iPid1, ThreadID
  1455.     While hWnd <> 0
  1456.         If GetParent_(hWnd) = 0
  1457.             ThreadID = GetWindowThreadProcessId_(hWnd, @iPid1)
  1458.             If iPid1 = iPid
  1459.                 Break
  1460.             EndIf
  1461.         EndIf
  1462.         hWnd = GetWindow_(hWnd, #GW_HWNDNEXT)
  1463.     Wend
  1464.     ProcedureReturn hWnd
  1465. EndProcedure
  1466.  
  1467. ; Получить буквы дисков
  1468. Procedure GetDrives(List Drive.s())
  1469.     Protected i, Drive2$
  1470.     drives_avail = GetLogicalDrives_()
  1471.  
  1472.     ;   игнорирование дисков
  1473.     Protected Dim Arr.s{1}(0)
  1474.     Protected LenStr, Mask = 0
  1475.     If ignore$
  1476.         ;       ignore$ = UCase(ignore$)
  1477.         LenStr = Len(ignore$)
  1478.         ReDim Arr(LenStr - 1)
  1479.         PokeS(Arr(), UCase(ignore$), -1, #PB_String_NoZero)
  1480.         For i = 0 To LenStr - 1
  1481.             Mask + (1 << (Asc(Arr(i)) - 65))
  1482.         Next
  1483.     EndIf
  1484.     ;   Mask & drives_avail ; убираем из маски лишние флаги (1 в 0), т.е. в маске остаются только существующие диски
  1485.     ;   drives_avail ! Mask ; одинаковые флаги (1 и 1) в масках сбрасываются в 0
  1486.     drives_avail ! (Mask & drives_avail) ; игнор одним выражением
  1487.                                          ;  игнорирование дисков => конец
  1488.  
  1489.     For i = StartDisk To 25
  1490.         If ((drives_avail >> i) & 1)
  1491.             Drive2$ = ComboListDrive(Chr(i + 65))
  1492.             If Drive2$ <> "-"
  1493.                 AddElement(Drive())
  1494.                 Drive() = Drive2$
  1495.             EndIf
  1496.         EndIf
  1497.     Next
  1498. EndProcedure
  1499.  
  1500. Procedure TestVirtual(Drive2$)
  1501.     Protected lpDeviceName.s, lpTargetPath.s
  1502.     lpDeviceName = Mid(Drive2$, 1, 2)
  1503.     lpTargetPath = Space(#MAX_PATH)
  1504.     QueryDosDevice_(@lpDeviceName, @lpTargetPath, #MAX_PATH)
  1505.     If Left(lpTargetPath, 7) <> "\Device" Or (Left(lpTargetPath, 15) = "\Device\Ramdisk" And lpDeviceName = "X:")
  1506.         ProcedureReturn 1
  1507.     Else
  1508.         ProcedureReturn 0
  1509.     EndIf
  1510. EndProcedure
  1511.  
  1512. Procedure.s ComboListDrive(Drive2$)
  1513.     Protected.l type, i
  1514.     Protected.s Lfwrk, FileSystem, VolName, r = Chr(10)
  1515.     Protected.q total_bytes
  1516.     Lfwrk = Drive2$ + ":\"
  1517.     type = GetDriveType_(Lfwrk)
  1518.     FileSystem = Space(256)
  1519.     VolName = Space(256)
  1520.     Select type
  1521.         Case #DRIVE_REMOVABLE
  1522.             Drive2$ + ":" + r + "[" + DriveGetNumber(Drive2$ + ":") + "]" + r + Lng(55)
  1523.         Case #DRIVE_FIXED
  1524.             Drive2$ + ":" + r + "[" + DriveGetNumber(Drive2$ + ":") + "]" + r + Lng(54)
  1525.         Case #DRIVE_REMOTE, #DRIVE_CDROM, #DRIVE_RAMDISK
  1526.             ProcedureReturn "-"
  1527.         Case #DRIVE_NO_ROOT_DIR
  1528.             ProcedureReturn Drive2$ + ":" + r + "[" + DriveGetNumber(Drive2$ + ":") + "]" + r + "No_Root_Dir"
  1529.         Case #DRIVE_UNKNOWN
  1530.             ProcedureReturn Drive2$ + ":" + r + "[" + DriveGetNumber(Drive2$ + ":") + "]" + r + "Unknown"
  1531.         Default
  1532.             ProcedureReturn Drive2$ + ":" + r + "[" + DriveGetNumber(Drive2$ + ":") + "]" + r + "---"
  1533.     EndSelect
  1534.  
  1535.     If Mid(Drive2$, 5, 3) = "?:?" And TestVirtual(Drive2$)
  1536.         ProcedureReturn "-"
  1537.     EndIf
  1538.  
  1539.     If GetVolumeInformation_(@Lfwrk, @VolName, 255, 0, 0, 0, @FileSystem, 255)
  1540.         Drive2$ + r + VolName + r + FileSystem
  1541.         ;       Drive2$ = DriveGetNumber(Left(Drive2$,1) + ":") + "  " + Drive2$
  1542.         If (GetDiskFreeSpaceEx_(Lfwrk, 0, @total_bytes, 0))
  1543.             ; TO DO FormatNumber() Done
  1544.             ; Drive2$ + "  "+  Str(total_bytes/1048576)+ " Мб"
  1545. ;           Drive2$ + r + StrF(ValF(StrF(total_bytes / 1024)) / 1048576, 3)
  1546.             Drive2$ + r + FormatNumber(total_bytes / 1073741824, 3, ".", "")
  1547.         Else
  1548.             Drive2$ + r + "---"
  1549.         EndIf
  1550.     Else
  1551.         Drive2$ + r + "---" + r + "---"
  1552.         If OSVersion() < #PB_OS_Windows_Vista
  1553.             total_bytes = GetDriveSize(Left(Drive2$, 2))
  1554.             If total_bytes
  1555.                 Drive2$ + r + FormatNumber(total_bytes / 1073741824, 3, ".", "")
  1556.             Else
  1557.                 Drive2$ + r + "---"
  1558.             EndIf
  1559.         Else
  1560.             Drive2$ + r + "---"
  1561.         EndIf
  1562.     EndIf
  1563.     Drive2$ + r + DriveGetName(Left(Drive2$, 2))
  1564.     Drive2$ + r + Get_MBR_GPT(StringField(Drive2$, 2, Chr(10)))
  1565. ;   Debug Drive2$
  1566.  
  1567.     ProcedureReturn Drive2$
  1568. EndProcedure
  1569.  
  1570. ;Получение номера диска и раздела, из буквы раздела
  1571. Procedure.s Get_MBR_GPT(DriveNum$)
  1572.     Protected tmp, res$
  1573.     tmp = FindString(DriveNum$, ":", 2, #PB_String_CaseSensitive)
  1574.     res$ = Mid(DriveNum$, 2, tmp - 2)
  1575.     If res$ = "?"
  1576.         ProcedureReturn "---"
  1577.     EndIf
  1578.     tmp = Val(res$)
  1579.     If MBR_GPT(tmp) <> ""
  1580.         ProcedureReturn MBR_GPT(tmp)
  1581.     EndIf
  1582.  
  1583.     res$ = "---"
  1584.     Protected pdl.DRIVE_LAYOUT_INFORMATION_EX, Bytes.l, hDrive
  1585.     hDrive = CreateFile_("\\.\PhysicalDrive" + tmp, 0, #FILE_SHARE_READ | #FILE_SHARE_WRITE, 0, #OPEN_EXISTING, 0, 0)
  1586. ;   hDrive = CreateFile_("\\.\PhysicalDrive" + tmp, #GENERIC_READ, #FILE_SHARE_READ | #FILE_SHARE_WRITE, 0, #OPEN_EXISTING, 0, 0)
  1587.     If hDrive <> #INVALID_HANDLE_VALUE
  1588.         If DeviceIoControl_(hDrive, #IOCTL_DISK_GET_DRIVE_LAYOUT_EX, 0, 0, @pdl, SizeOf(pdl), @Bytes, 0)
  1589.             Select pdl\PartitionStyle
  1590.                 Case #PARTITION_STYLE_MBR
  1591.                     res$ = "MBR"
  1592.                 Case #PARTITION_STYLE_GPT
  1593.                     res$ = "GPT"
  1594.                 Case #PARTITION_STYLE_RAW
  1595.                     res$ = "RAW"
  1596.             EndSelect
  1597.         EndIf
  1598.         CloseHandle_(hDrive)
  1599.     EndIf
  1600.     MBR_GPT(tmp) = res$
  1601.     ProcedureReturn res$
  1602. EndProcedure
  1603.  
  1604. ;Получение номера диска и раздела, из буквы раздела
  1605. Procedure.s DriveGetNumber(DriveLetter$)
  1606.     Protected DriveInfo.STORAGE_DEVICE_NUMBER, Nul , Ret$ = "?:?", hDevice
  1607.     hDevice = CreateFile_("\\.\" + DriveLetter$, 0, 0, 0, #OPEN_EXISTING, #FILE_ATTRIBUTE_NORMAL, #NUL)
  1608.     If hDevice <> #INVALID_HANDLE_VALUE
  1609.         If DeviceIoControl_(hDevice, #IOCTL_STORAGE_GET_DEVICE_NUMBER, 0, 0, DriveInfo, SizeOf(STORAGE_DEVICE_NUMBER), @Nul, #NUL)
  1610.             Ret$ = Str(DriveInfo\DeviceNumber) + ":" + Str(DriveInfo\PartitionNumber)
  1611.             If DriveInfo\DeviceNumber > MaxDeviceNumber
  1612.                 MaxDeviceNumber = DriveInfo\DeviceNumber
  1613.                 ReDim MBR_GPT(MaxDeviceNumber)
  1614.             EndIf
  1615.         EndIf
  1616.         CloseHandle_(hDevice)
  1617.     EndIf
  1618.     ProcedureReturn Ret$
  1619. EndProcedure
  1620.  
  1621. ;Получение названия диска
  1622. Procedure.s DriveGetName(DriveLetter$)
  1623.  
  1624.     #IOCTL_STORAGE_QUERY_PROPERTY = $2D1400
  1625.  
  1626.     Protected dwOutBytes, hDevice, p, Ret$
  1627.     Protected udtQuery.STORAGE_PROPERTY_QUERY
  1628.     Protected udtOut.STORAGE_DEVICE_DESCRIPTOR
  1629.  
  1630.     hDevice = CreateFile_("\\.\" + DriveLetter$, 0, #FILE_SHARE_READ | #FILE_SHARE_WRITE, 0, #OPEN_EXISTING, #NUL, #NUL)
  1631. ;   hDevice = CreateFile_("\\.\" + DriveLetter$, #GENERIC_READ, #FILE_SHARE_READ | #FILE_SHARE_WRITE, 0, #OPEN_EXISTING, #NUL, #NUL)
  1632.     If hDevice <> #INVALID_HANDLE_VALUE
  1633.         For p = 0 To 1023
  1634.             udtOut\Reserved[p] = 0
  1635.         Next p
  1636.  
  1637.         If DeviceIoControl_(hDevice, #IOCTL_STORAGE_QUERY_PROPERTY, udtQuery, SizeOf(udtQuery), @udtOut, SizeOf(udtout), @dwOutBytes, 0)
  1638.             ; Debug "udtOut\RemovableMedia = " + Str(udtOut\RemovableMedia) ; 1 = диск может быть извлечён
  1639.             ; Debug "udtOut\Bustype = " + Str(udtOut\Bustype) ; тип шины, к которой подключено устройство, т.е. флешка = #BusTypeUsb, обычный hdd = #BusTypeSata
  1640.             ;           If udtOut\SerialNumberOffset
  1641.             ;               Debug "SerialNumber = " + LTrim(PeekS(udtOut + udtOut\SerialNumberOffset, -1, #PB_Ascii))
  1642.             ;           EndIf
  1643.             If udtOut\VendorIdOffset
  1644.                 Ret$ + Trim(PeekS(udtOut + udtOut\VendorIdOffset, -1, #PB_Ascii)) + " "
  1645.             EndIf
  1646.             If udtOut\ProductIdOffset
  1647.                 Ret$ + Trim(PeekS(udtOut + udtOut\ProductIdOffset, -1, #PB_Ascii))
  1648.             EndIf
  1649.             ;           If udtOut\ProductRevisionOffset
  1650.             ;               Debug "ProductRevision = " + PeekS(udtOut + udtOut\ProductRevisionOffset, -1, #PB_Ascii)
  1651.             ;           EndIf
  1652.         EndIf
  1653.         CloseHandle_(hDevice)
  1654.     EndIf
  1655.     ProcedureReturn Ret$
  1656. EndProcedure
  1657.  
  1658. Procedure.s GetComString()
  1659.     Protected.s ComStr = ""
  1660.     If GetGadgetState(1)
  1661.         ComStr + " /F"
  1662.     EndIf
  1663.     If GetGadgetState(2)
  1664.         ComStr + " /R"
  1665.     EndIf
  1666.     If GetGadgetState(3)
  1667.         ComStr + " /X"
  1668.     EndIf
  1669.     ProcedureReturn ComStr
  1670. EndProcedure
  1671.  
  1672. ; X:\Windows\System32\
  1673. Procedure HelpChkdsk()
  1674.     Protected Prog = RunProgram("chkdsk.exe", "/?", "", #PB_Program_Open | #PB_Program_Read | #PB_Program_Hide)
  1675.     Protected Output$ = ""
  1676.     If Prog
  1677.         While ProgramRunning(Prog)
  1678.             Output$ + ReadProgramStringOem(Prog)
  1679.         Wend
  1680.         CloseProgram(Prog)
  1681.     EndIf
  1682.     Output$ = ReplaceString(Output$, #CRLF$ + #CRLF$ + #CRLF$, #CRLF$ + #CRLF$) ; чтобы на экран умещалось
  1683.     Output$ = ReplaceString(Output$, #CRLF$ + "                      ", " ")   ; чтобы на экран умещалось
  1684.  
  1685.     If Len(Output$) > 20
  1686.         MessageRequester(Lng(47), Output$)
  1687.     Else
  1688.         RunProgram(cmd$, "/c (Title Check Disk Help & @Echo off & Color " + Color$ + " & chkdsk.exe /? & set /p Ok=^>^>)", "")
  1689.     EndIf
  1690. EndProcedure
  1691.  
  1692.  
  1693. Procedure.s ReadProgramStringOem(iPid)
  1694.     Protected Ret$ = "", *Buff, SizeBuff = AvailableProgramOutput(iPid)
  1695.     If SizeBuff > 0
  1696.         *Buff = AllocateMemory(SizeBuff)
  1697.         ReadProgramData(iPid, *Buff, SizeBuff)
  1698.         OemToCharBuffA(*Buff, *Buff, SizeBuff) ; 866 в Windows1251
  1699.         Ret$ = PeekS(*Buff, SizeBuff, #PB_Ascii)
  1700.         FreeMemory(*Buff)
  1701.     EndIf
  1702.     ProcedureReturn Ret$
  1703. EndProcedure
  1704.  
  1705. ; Windows1251 в 866
  1706. Procedure.s ToOem(String$)
  1707.     Protected Ret$ = "", *Buff, SizeBuff = Len(String$)
  1708.     If SizeBuff > 0
  1709.         *Buff = AllocateMemory(SizeBuff + 1)
  1710.         PokeS(*Buff, String$, SizeBuff, #PB_Ascii)
  1711.         CharToOemBuffA(*Buff, *Buff, SizeBuff)
  1712.         Ret$ = PeekS(*Buff, SizeBuff, #PB_Ascii)
  1713.         FreeMemory(*Buff)
  1714.     EndIf
  1715.     ProcedureReturn Ret$
  1716. EndProcedure
  1717.  
  1718. DataSection
  1719.     DiskFixed:
  1720.     IncludeBinary "Fixed.ico"
  1721.  
  1722.     DiskRem:
  1723.     IncludeBinary "Rem.ico"
  1724.  
  1725.     DiskUnk:
  1726.     IncludeBinary "Unk.ico"
  1727.  
  1728.     ini:
  1729.     IncludeBinary "sample.ini"
  1730.     iniend:
  1731. EndDataSection
  1732.  
  1733. ; Для подсказок часть 3 из 3-х
  1734. Procedure AddGadgetToolTip(GadgetID.l, ToolText$, MaxWidth.l = 0, Balloon.l = 1, WindowID.l = -1)
  1735.     Protected cWndFlags.l = #TTS_NOPREFIX | #TTS_BALLOON
  1736.     Protected hToolTip, tti.TOOLINFO
  1737.  
  1738.     If WindowID = -1 And IsGadget(GadgetID) ; Позволяет вводить либо PB-#Gadget, либо Gadget-ID
  1739.         GadgetID = GadgetID(GadgetID)
  1740.  
  1741.         If hToolTips(Str(GadgetID)) <> 0 : DestroyWindow_(hToolTips(Str(GadgetID))) : EndIf
  1742.  
  1743.     ElseIf WindowID > -1 And IsWindow(WindowID)
  1744.         WindowID = WindowID(WindowID)
  1745.     EndIf
  1746.  
  1747.     ;--> Удаляет флаг #TTS_BALLOON если вы хотите прямоугольную всплывающую подсказку, в соответствии с переменной Balloon.
  1748.     If Balloon = 0 : cWndFlags = #TTS_NOPREFIX : EndIf
  1749.  
  1750.     hToolTip = CreateWindowEx_(0, "ToolTips_Class32", "", cWndFlags, 0, 0, 0, 0, 0, 0, GetModuleHandle_(0), 0)
  1751.  
  1752.     hToolTips(Str(GadgetID)) = hToolTip
  1753.     ;   Назначаем цвета в соответствии со стандартным цветом в ОС
  1754.     SendMessage_(hToolTip, #TTM_SETTIPTEXTCOLOR, GetSysColor_(#COLOR_INFOTEXT), 0)
  1755.     SendMessage_(hToolTip, #TTM_SETTIPBKCOLOR, GetSysColor_(#COLOR_INFOBK), 0)
  1756.     tti.TOOLINFO\cbSize = SizeOf(TOOLINFO)
  1757.     tti\uFlags = #TTF_SUBCLASS | #TTF_IDISHWND
  1758.     ;--> Вот где многострочный текст вступает в игру, установив maxWidth
  1759.     SendMessage_(hToolTip, #TTM_SETMAXTIPWIDTH, 0, MaxWidth)
  1760.  
  1761.     tti\hWnd = GadgetID
  1762.     tti\uId = GadgetID
  1763.     tti\hinst = 0
  1764.     tti\lpszText = @Tooltext$
  1765.  
  1766.     If WindowID <> -1
  1767.         tti\hWnd = WindowID
  1768.         tti\uFlags = #TTF_SUBCLASS
  1769.         GetClientRect_(WindowID, @tti\rect)
  1770.     EndIf
  1771.  
  1772.     SendMessage_(hToolTip, #TTM_ADDTOOL, 0, tti)
  1773.  
  1774.     SendMessage_(hToolTip, #TTM_SETDELAYTIME, #TTDT_AUTOPOP, 15000)
  1775.     SendMessage_(hToolTip, #TTM_UPDATE , 0, 0)
  1776. EndProcedure
  1777.  
  1778.  
  1779.  
  1780. Procedure SaveINI()
  1781.     If OpenPreferences(ini$) And PreferenceGroup("set")
  1782.         With cs
  1783.             WritePreferenceInteger("WinM" , \m)
  1784.             WritePreferenceInteger("WinX" , \x)
  1785.             WritePreferenceInteger("WinY" , \y)
  1786.             WritePreferenceInteger("WinW" , \w)
  1787.             WritePreferenceInteger("WinH" , \h)
  1788.         EndWith
  1789.         WritePreferenceInteger("SortOrder", -SortOrder)
  1790.         WritePreferenceInteger("indexSort", indexSort)
  1791.         ClosePreferences()
  1792.     EndIf
  1793. EndProcedure
  1794.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement