Advertisement
AZJIO

ChkDskGui

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