Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ; последнее обновление:
- ; Добавлена иконка "?" для сбойных/неизвестных дисков
- ; Игнорирование ошибок при чтении пустых картридеров
- ; Добавлено MBR/GPT
- ; Исправил двойной клик
- ; Запрет проверки файловых систем EXT3/EXT4, чекбокс скрыт
- ; Добавлено клик по пункту ставит галку в чекбокс
- ; Добавлена полоса заполненности дисков
- ; Добавлены фирменные названия дисков
- ; Правильное определение дисков с несколькими разделами
- ; Определение размера диска со сбоем в ФС
- ; Сортировка списка дисков
- ; Двойной клик по строке списка дисков открывает диск в проводнике
- ; Удалено игнорирование дисков по отсутствию файловой системы
- ; Добавление в меню дисков
- ; Добавлено обновление списка при вставке/извлечении флешки
- EnableExplicit
- ; константы и структуры MBR/GPT
- ; https://www.purebasic.fr/english/viewtopic.php?t=25663&p=220673
- #PARTITION_STYLE_MBR = 0
- #PARTITION_STYLE_GPT = 1
- #PARTITION_STYLE_RAW = 2
- #IOCTL_DISK_GET_DRIVE_LAYOUT_EX = $70050
- Structure PARTITION_INFORMATION_GPT Align #PB_Structure_AlignC
- Partitiontype.GUID
- PartitionId.GUID
- Attributes.q
- Name.b[36]
- EndStructure
- Structure PARTITION_INFORMATION_MBR Align #PB_Structure_AlignC
- PartitionType.b
- BootIndicator.b
- RecognizedPartition.b
- HiddenSectors.l
- EndStructure
- Structure DRIVE_LAYOUT_INFORMATION_GPT Align #PB_Structure_AlignC
- PartitionStyle.GUID
- StartingUsableOffset.LARGE_INTEGER
- UsableLength.LARGE_INTEGER
- MaxPartitionCount.l
- EndStructure
- Structure DRIVE_LAYOUT_INFORMATION_MBR Align #PB_Structure_AlignC
- DiskId.l
- PartitionCount.l
- EndStructure
- Structure PARTITION_INFORMATION_EX Align #PB_Structure_AlignC
- PartitionStyle.l
- StartingOffset.LARGE_INTEGER
- PartitionLength.LARGE_INTEGER
- PartitionNumber.l
- RewritePartition.b
- StructureUnion
- ppmbr.PARTITION_INFORMATION_MBR
- ppgpt.PARTITION_INFORMATION_GPT
- EndStructureUnion
- EndStructure
- Structure DRIVE_LAYOUT_INFORMATION_EX Align #PB_Structure_AlignC
- PartitionStyle.l
- PartitionCount.l
- StructureUnion
- pdmbr.DRIVE_LAYOUT_INFORMATION_MBR
- pdgpt.DRIVE_LAYOUT_INFORMATION_GPT
- EndStructureUnion
- PartitionEntry.PARTITION_INFORMATION_EX[255]
- EndStructure
- ; конец => константы и структуры MBR/GPT
- Global hListView, lvi.LV_ITEM
- Global indexSort.b = 1
- Global SortOrder.b = 1
- Structure STORAGE_PROPERTY_QUERY
- PropertyId.l
- QueryType.l
- AdditionalParameters.l
- EndStructure
- Structure STORAGE_DEVICE_DESCRIPTOR
- Version.l
- Size.l
- DeviceType.b
- DeviceTypeModifier.b
- RemovableMedia.b
- CommandQueueing.b
- VendorIdOffset.l
- ProductIdOffset.l
- ProductRevisionOffset.l
- SerialNumberOffset.l
- BusType.w
- RawPropertiesLength.l
- RawDeviceProperties.b
- Reserved.b[1024]
- EndStructure
- Import "user32.lib"
- OemToCharBuffA(*Buff,*Buff1,SizeBuff)
- CharToOemBuffA(*Buff,*Buff1,SizeBuff)
- EndImport
- ;--> Декларирование функций
- Declare HelpChkdsk() ; справка по командам chkdsk.exe
- Declare GetDrives(List Drive.s()) ; получает буквы существующих дисков
- Declare.s ComboListDrive(Drive2$) ; получает инфу о дисках
- Declare InstanceToWnd(iPid)
- ; Declare.s FormatSizeDisk(Num.q) ; делает размер в формат гигабайты
- Declare.s DriveGetNumber(DriveLetter$) ; получает номера дисков в формате [0:1]
- Declare.s DriveGetName(DriveLetter$) ; получает название дисков
- Declare.s GetComString() ; получает ком-строку
- Declare.s ReadProgramStringOem(iPid) ; читает строку и перекодирует её в Win-1251
- Declare MyWindowCallback(WindowId, Message, wParam, lParam)
- Declare.s GetCommand(fill = 0)
- Declare.s ToOem(String$)
- Declare SaveFile_Buff(File.s, *Buff, Size)
- Declare Insert_Command(d)
- Declare Del_item_LV(Mask.l)
- Declare Add_item_LV(Drive2$)
- Declare Add_item_LV_Mask(Mask.l)
- Declare align_col_LV()
- Declare RegToMenuDisk()
- Declare RegJump(valie.s)
- Declare KillProcess_hWin(hwin)
- Declare RegExistsKey()
- Declare DuplicateDriveTest()
- Declare align_Windows()
- Declare HideCheckBox(gadget, item)
- Declare.s Get_MBR_GPT(DriveNum$)
- XIncludeFile "Sort.pb"
- XIncludeFile "SetCoor.pb"
- XIncludeFile "RAW.pb"
- XIncludeFile "ListProgress.pb"
- ; Сохранение размера и координат часть 1
- Declare SaveINI() ; Сохранения в ini
- ; Для подсказок часть 1 из 3-х
- Declare AddGadgetToolTip(GadgetID.l, ToolText$, MaxWidth.l = 0, Balloon.l = 1, WindowID.l = -1)
- Global NewMap hToolTips.l()
- ; размеры неклиентской области окна (заголовок и границы окна)
- Global caption_h, BorderX, BorderY
- caption_h = GetSystemMetrics_(#SM_CYCAPTION) ; высота заголовка
- BorderX = GetSystemMetrics_(#SM_CXFRAME) * 2 ; ширина (толщина) вертикальных границ
- BorderY = GetSystemMetrics_(#SM_CYFRAME) * 2 + caption_h ; высота (толщина) горизонтальных границ + заголовок
- ; Dim DriveAr.s(0)
- Global NewList Drive.s()
- Global NewList ico()
- ; Dim ico(0)
- Global MaxDeviceNumber = 0, flReg.b = 0
- Global Dim MBR_GPT.s(0)
- ; MBR_GPT(0) = "GPT"
- Define.s DiskCur
- Global Admin.b = IsUserAdmin_()
- Define i = 0
- Global CountDisk.b, cmd$ = "cmd.exe", drives_avail
- ; компиляция взависимости от x86 или x64
- CompilerIf #PB_Compiler_Processor = #PB_Processor_x86
- Define sysdisk$ = Left(GetUserDirectory(#PB_Directory_Programs), 3)
- If FileSize(sysdisk$ + "Windows\SysWOW64\cmd64.exe") > 0
- cmd$ = "cmd64.exe"
- ElseIf FileSize(sysdisk$ + "Windows\SysWOW64\cmd.exe") > 1 And FileSize(sysdisk$ + "Windows\SysWOW64\chkdsk.exe") = -1
- cmd$ = sysdisk$ + "Windows\SysNative\cmd.exe"
- EndIf
- CompilerEndIf
- ; Создаём структуру, для выравнивания в колонке размера списка дисков
- Global ListViewSpalte.LV_COLUMN
- ListViewSpalte\mask = #LVCF_FMT
- Global ini$
- Global ignore$ = ""
- Global fINI.b = 1
- Global StartDisk.b = 2
- Global FontSize.b = 9
- Global Color$ = "1e"
- Global Font1$ = "Consolas"
- Global Font2$ = "Segoe UI"
- Global AlignWin.b = 1
- ;--> Чтение ini
- ; получаем путь к ини по имени программы
- ini$ = GetPathPart(ProgramFilename()) + GetFilePart(ProgramFilename(), #PB_FileSystem_NoExtension) + ".ini"
- ExamineDesktops()
- If FileSize(ini$) > 3 And OpenPreferences(ini$) And PreferenceGroup("set")
- StartDisk = ReadPreferenceInteger("StartDisk", 2)
- If StartDisk > 25 Or StartDisk < 0
- StartDisk = 0
- WritePreferenceInteger("StartDisk" , 0) ; Сразу исправляем неверные данные
- EndIf
- FontSize = ReadPreferenceInteger("FontSize", 9)
- If FontSize > 15 Or FontSize < 7
- FontSize = 9
- WritePreferenceInteger("FontSize" , 9)
- EndIf
- indexSort = ReadPreferenceInteger("indexSort", 1)
- If indexSort > 7 Or indexSort < -1
- indexSort = -1
- WritePreferenceInteger("indexSort" , -1)
- EndIf
- AlignWin = ReadPreferenceInteger("align", 1)
- If AlignWin > 1 Or AlignWin < 0
- AlignWin = 1
- WritePreferenceInteger("align" , 1)
- EndIf
- SortOrder = ReadPreferenceInteger("SortOrder", 1)
- If Not(SortOrder = 1 Or SortOrder = -1)
- SortOrder = 1
- WritePreferenceInteger("SortOrder" , 1)
- EndIf
- Color$ = ReadPreferenceString("Color", "1e")
- If Val("$" + Color$) > 255 Or Val("$" + Color$) < 1
- Color$ = "1e"
- WritePreferenceString("Color" , "1e")
- EndIf
- Font1$ = ReadPreferenceString("Font1", "Consolas")
- Font2$ = ReadPreferenceString("Font2", "Segoe UI")
- ignore$ = ReadPreferenceString("ignore", "")
- With cs
- \m = ReadPreferenceInteger("WinM", 0)
- \x = ReadPreferenceInteger("WinX", (DesktopWidth(0) - 692) / 2)
- \y = ReadPreferenceInteger("WinY", (DesktopHeight(0) - 210) / 2)
- \w = ReadPreferenceInteger("WinW", 692)
- \h = ReadPreferenceInteger("WinH", 210)
- EndWith
- ClosePreferences()
- ; Debug Color$
- ; Debug Val("$" + Color$)
- ; Debug FontSize
- ; Debug ini$
- ; Debug Font1$
- ; Debug Font2$
- ; Debug GUI_H
- ; MessageRequester("Координаты до", Str(cs\x) + #CRLF$ + Str(cs\y) + #CRLF$ + Str(cs\w) + #CRLF$ + Str(cs\h))
- _SetCoor(@cs, 692, 210, 3, 0, 0) ; Выравниваем если прочитали из ini
- ; MessageRequester("Координаты после", Str(cs\x) + #CRLF$ + Str(cs\y) + #CRLF$ + Str(cs\w) + #CRLF$ + Str(cs\h))
- fINI = 0
- EndIf
- ; отключаем флаг ошибок
- Define tmp
- Define hKey, Size = 4, ValueOld.i, Value.i = 2, KeyPath$ = "SYSTEM\CurrentControlSet\Control\Windows", ValueName$ = "ErrorMode"
- ; проверяем наличие ключа
- If #ERROR_SUCCESS = RegOpenKeyEx_(#HKEY_LOCAL_MACHINE, KeyPath$, 0, #KEY_ALL_ACCESS, @hKey)
- If #ERROR_SUCCESS = RegQueryValueEx_(hKey, ValueName$, 0, 0, @ValueOld, @Size)
- If ValueOld <> 2
- If #ERROR_SUCCESS = RegSetValueEx_(hKey, ValueName$, 0, #REG_DWORD, @Value, Size)
- flReg = 1 ; флаг означает что данные изменены
- EndIf
- EndIf
- EndIf
- RegCloseKey_(hKey)
- EndIf
- ; конец => отключаем флаг ошибок
- ; Запрос дисков и информации
- GetDrives(Drive()) ; добавляем буквы всех дисков
- ; ComboListDrive(Drive()) ; добавляем остальную инфу к дискам и удаляем диски если они не FIXED REMOVABLE
- ; проверка налиия дисков, мало ли вдруг только рам-диски будут в системе из-за отсутствия драйверов
- CountDisk = ListSize(Drive())
- If Not CountDisk
- MessageRequester("Ошибка", "Не найдено ни одного диска")
- End ; Выход, так как нет смысла дальнейшего выполнения скрипта
- EndIf
- If fINI
- ; DesktopW = DesktopWidth(0)
- ; DesktopH = DesktopHeight(0)
- With cs
- \h = 24 + 18 * CountDisk + 100 ; подсчитали усреднённо на Win10 при 18 - высота пункта, 24 - высота названия колонок, 100 остальное.
- ; \h = 24 + 18 * CountDisk + 58 + BorderY ; MessageRequester("Сообщение", Str(BorderY))
- \w = 692
- \x = (DesktopWidth(0) - \w) / 2
- \y = (DesktopHeight(0) - \h) / 2
- \m = 0
- EndWith
- EndIf
- Global hGUI ;, hListView
- Define k, res$, TrgS, info$, disk$, valie.s, hwnd, fMenuDisk.b
- Define SelDisk$
- ; Procedure heightLV()
- ; Protected header, rect.RECT, headerRect.RECT
- ; header = SendMessage_(hListView,#LVM_GETHEADER,0,0) ; get header control
- ; GetClientRect_(header,headerRect.RECT) ; get size of header control
- ; SendMessage_(hListView, #LVM_GETITEMRECT, 0 , @rect) ; get rect for item 0
- ; ProcedureReturn headerRect\bottom - headerRect\top + (rect\bottom - rect\top) * CountDisk
- ; ProcedureReturn rect\bottom - rect\top ; 18
- ; ProcedureReturn headerRect\bottom - headerRect\top ; 24
- ; EndProcedure
- ; Создаём окно
- ;--> GUI
- hGUI = OpenWindow(0, cs\x, cs\y, cs\w, cs\h, "ChkDskGui", #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget | #PB_Window_Invisible)
- If hGUI
- ; HideWindow(0, #True)
- ; загружаем иконки 16х16 в системный список изображений
- CatchImage(0, ?DiskFixed)
- CatchImage(1, ?DiskRem)
- CatchImage(2, ?DiskUnk)
- ; Левый столбец. Список со значками с чек-боксом, выделять однос строкой
- hListView = ListIconGadget(0, 5, 5, cs\w - 10, cs\h - 90, "-Диск-", 60, #PB_ListIcon_CheckBoxes | #PB_ListIcon_FullRowSelect)
- ; Стиль списка дисков, чёрный
- ; SetGadgetColor(0 , #PB_Gadget_BackColor , RGB(55, 55, 55))
- ; SetGadgetColor(0 , #PB_Gadget_FrontColor , RGB(180, 180, 180))
- ; Устанавливает шрифт
- If OSVersion() >= #PB_OS_Windows_7
- If LoadFont(0, Font1$, FontSize)
- SetGadgetFont(0, FontID(0))
- Else ; иначе, если Consolas не существует
- If LoadFont(0, "Courier New", FontSize)
- SetGadgetFont(0, FontID(0))
- EndIf
- EndIf
- Else
- If LoadFont(0, "Courier New", FontSize)
- SetGadgetFont(0, FontID(0))
- EndIf
- EndIf
- SetGadgetAttribute(0, #PB_ListIcon_DisplayMode, #PB_ListIcon_Report) ; вид списка - таблица
- ; Добавить ещё 5 колонок
- AddGadgetColumn(0, 1, "- № -", 50)
- AddGadgetColumn(0, 2, "-Тип-", 52)
- AddGadgetColumn(0, 3, "- Метка диска -", 125)
- AddGadgetColumn(0, 4, "-FS-", 55)
- AddGadgetColumn(0, 5, "Размер", 100)
- AddGadgetColumn(0, 6, " - Имя - ", 230)
- AddGadgetColumn(0, 7, "-", 55)
- AddGadgetColumn(0, 8, "- Занято -", 90)
- Global lpFreeBytesAvailable.q
- Global lpTotalNumberOfBytes.q
- i=0
- ForEach Drive()
- ; If Mid(Drive(), 10, 3) = "Fix" ; у этоге есть баг, если дисков будет 10, то отступ символа будет 11 вместо 10
- Select StringField(Drive(), 3, Chr(10))
- Case "Fixed"
- AddGadgetItem(0, -1, Drive(), ImageID(0))
- Case "Rem "
- AddGadgetItem(0, -1, Drive(), ImageID(1))
- Default
- AddGadgetItem(0, -1, Drive(), ImageID(2))
- EndSelect
- ; res$ = StringField(Drive(), 3, Chr(10))
- ; If res$ = "Fixed"
- ; AddGadgetItem(0, -1, Drive(), ImageID(0))
- ; ElseIf res$ = "Rem "
- ; AddGadgetItem(0, -1, Drive(), ImageID(1))
- ; Else
- ; AddGadgetItem(0, -1, Drive(), ImageID(2))
- ; EndIf
- ; перерисовка заполненности диска
- If GetDiskFreeSpaceEx_(Left(Drive(),2), @lpFreeBytesAvailable, @lpTotalNumberOfBytes, 0)
- If lpTotalNumberOfBytes>0 ; чтобы не было сбоя при неопределении диска, на 0 делить нельзя
- ; UpdateProgress(0, i, 8, (lpTotalNumberOfBytes-lpFreeBytesAvailable) * 99.9 / lpTotalNumberOfBytes)
- UpdateProgress(0, i, 8, Round((lpTotalNumberOfBytes-lpFreeBytesAvailable) *100 / lpTotalNumberOfBytes , #PB_Round_Nearest))
- Else
- UpdateProgress(0, i, 8, 1)
- EndIf
- Else
- UpdateProgress(0, i, 8, 0)
- EndIf
- If Left(GetGadgetItemText(0, i, 4) , 3) = "EXT"
- HideCheckBox(0, i)
- EndIf
- i+1
- ; конец => перерисовка заполненности диска
- Next
- align_col_LV()
- ; Вычисление ширины окна
- align_Windows()
- ; конец => Вычисление ширины окна
- ; сортировка
- UpdatelParam()
- ForceSort()
- ; сортировка конец
- ClearList(Drive())
- If LoadFont(1, Font2$, FontSize) ; шрифт для чекбоксов
- SetGadgetFont(#PB_Default, FontID(1))
- EndIf
- CheckBoxGadget(1, 10, cs\h - 80, cs\w - 190, 20, "\F - Исправление ошибок на диске") : SetGadgetState(1, #PB_Checkbox_Checked)
- CheckBoxGadget(2, 10, cs\h - 60, cs\w - 190, 20, "\R - Восстановление поврежденных секторов")
- CheckBoxGadget(3, 10, cs\h - 40, cs\w - 190, 20, "\X - Принудительное отключение тома") : SetGadgetState(3, #PB_Checkbox_Checked)
- HyperLinkGadget(4, 20, cs\h - 17, cs\w - 200, 17, "", $FF0000) ; строка состояния
- CheckBoxGadget(8, cs\w - 179, cs\h - 80, 170, 20, "Выделить все диски")
- If LoadFont(2, Font2$, FontSize+3) ; увеличенный шрифт для кнопок
- SetGadgetFont(#PB_Default, FontID(2))
- EndIf
- ButtonGadget(5, cs\w - 137, cs\h - 52, 24, 24, Chr($25BC)) ; "v"
- ButtonGadget(6, cs\w - 110, cs\h - 52, 100, 42, "Старт")
- ; ButtonGadget(7, cs\w - 179, cs\h - 52, 26, 42, "i")
- ; SetActiveGadget(6)
- SetGadgetText(4, "chkdsk.exe " + DiskCur + GetComString())
- ; Для подсказок часть 2 из 3-х
- AddGadgetToolTip(4, "Скопировать в буфер обмена для Win+R", 300, 0)
- AddGadgetToolTip(5, "Меню", 300, 0)
- ; AddGadgetToolTip(5, "Справка по ключам chkdsk.exe", 300, 0)
- AddGadgetToolTip(6, "Проверка дисков сейчас", 300, 0)
- ; AddGadgetToolTip(7, "Импорт в реестр для проверки" + #CRLF$ + "во время загрузки системы", 300, 0)
- AddGadgetToolTip(8, "Физические диски лучше" + #CRLF$ + "в разных потоках выполнить" + #CRLF$ + "экономя время", 300, 0)
- ;--> Menu
- If CreatePopupMenu(0) ; Создаёт всплывающее меню
- ; MenuItem(1, "Вставить краткую ком-строку в окно Выполнить")
- ; MenuItem(2, "Вставить полную ком-строку в окно Выполнить")
- OpenSubMenu("Копировать ком-строку")
- MenuItem(1, "Полную для Win+R")
- MenuItem(2, "Краткую для Win+R")
- MenuItem(8, "Для bat-файла")
- CloseSubMenu()
- OpenSubMenu("Реестр")
- MenuItem(6, "Проверка выбранных при загрузке ОС")
- MenuItem(4, "Посмотреть BootExecute в реестре")
- MenuItem(3, "eventvwr.exe (лог проверки)")
- fMenuDisk = RegExistsKey()
- If fMenuDisk
- MenuItem(10, "Удалить ChkDskGui в меню дисков")
- Else
- MenuItem(10, "Добавить ChkDskGui в меню дисков")
- EndIf
- CloseSubMenu()
- MenuItem(9, "Создать ini")
- MenuItem(5, "Справка chkdsk.exe")
- MenuItem(7, "Справка ChkDskGui")
- MenuItem(11, "О программе...")
- ; MenuBar()
- EndIf
- ; деактивируем если нет справки
- If FileSize(GetPathPart(ProgramFilename())+"ChkDskGui.chm") < 1
- ; DisableMenuItem(0, 7, 1)
- SetMenuItemText(0, 7, "Скачать справку ChkDskGui")
- EndIf
- If Not Admin
- SetMenuItemText(0, 6, "Проверка выбранных при загрузке ОС (админ)")
- DisableMenuItem(0, 6, 1)
- If fMenuDisk
- SetMenuItemText(0, 10, "Удалить ChkDskGui в меню дисков (админ)")
- Else
- SetMenuItemText(0, 10, "Добавить ChkDskGui в меню дисков (админ)")
- EndIf
- DisableMenuItem(0, 10, 1)
- EndIf
- ; CheckBoxGadget(8, 3, 128, 17, 17, "")
- ; Устанавливает шрифт
- ; If LoadFont(1, Font2$, FontSize)
- ; For k = 1 To 4
- ; SetGadgetFont(k, FontID(1))
- ; Next
- ; SetGadgetFont(8, FontID(1))
- ; EndIf
- ; If LoadFont(2, Font2$, FontSize+3)
- ; For k = 5 To 7
- ; SetGadgetFont(k, FontID(2))
- ; Next
- ; EndIf
- SetWindowCallback(@MyWindowCallback())
- ; ResizeWindow(0 , #PB_Ignore , #PB_Ignore , WinW , WinH)
- If cs\m ; флаг окно на весь экран
- SetWindowState(0 , #PB_Window_Maximize)
- EndIf
- ; Поддержка ком-строки
- tmp = CountProgramParameters()
- If tmp
- SelDisk$ = Left(ProgramParameter(), 2)
- For k = 0 To CountGadgetItems(0)-1
- If GetGadgetItemText(0, k) = SelDisk$
- SetGadgetItemState(0 , k , #PB_ListIcon_Checked)
- EndIf
- Next
- EndIf
- HideWindow(0, #False)
- ; Восстанавливаем флаг ошибок если был изменён
- If flReg
- If #ERROR_SUCCESS = RegOpenKeyEx_(#HKEY_LOCAL_MACHINE, KeyPath$,0,#KEY_ALL_ACCESS,@hKey)
- RegSetValueEx_(hKey, ValueName$, 0, #REG_DWORD, @ValueOld, Size)
- RegCloseKey_(hKey)
- EndIf
- EndIf
- ;--> цикл опроса
- Repeat
- Select WaitWindowEvent()
- Case #PB_Event_RightClick ; нажата правая кнопка мыши =>
- DisplayPopupMenu(0, WindowID(0)) ; покажем всплывающее Меню
- Case #PB_Event_RestoreWindow
- cs\m = 0
- Case #PB_Event_MaximizeWindow
- cs\m = 1
- Case #PB_Event_Gadget
- Select EventGadget()
- Case 0
- i = GetGadgetState(0)
- If i <> -1
- DiskCur = GetGadgetItemText(0, i)
- EndIf
- Select EventType()
- Case #PB_EventType_LeftClick
- i = GetGadgetState(0)
- If i <> -1
- tmp = 0
- If Not GetGadgetItemState(0, i) & #PB_ListIcon_Checked
- ; If Left(GetGadgetItemText(0, i, 4) , 3) = "EXT"
- ; If Left(GetGadgetItemText(0, i, 4) , 3) = "FAT"
- ; Continue
- ; EndIf
- tmp = #PB_ListIcon_Checked
- EndIf
- SetGadgetItemState(0 , i , tmp)
- EndIf
- Case #PB_EventType_LeftDoubleClick
- RunProgram("explorer.exe", DiskCur + "\", "")
- EndSelect
- SetGadgetText(4, "chkdsk.exe " + DiskCur + GetComString())
- Case 1
- If GetGadgetState(1) = #PB_Checkbox_Unchecked
- SetGadgetState(2, #PB_Checkbox_Unchecked)
- SetGadgetState(3, #PB_Checkbox_Unchecked)
- EndIf
- SetGadgetText(4, "chkdsk.exe " + DiskCur + GetComString())
- Case 2
- SetGadgetState(1, #PB_Checkbox_Checked)
- SetGadgetText(4, "chkdsk.exe " + DiskCur + GetComString())
- Case 3
- If GetGadgetState(3) = #PB_Checkbox_Checked
- SetGadgetState(1, #PB_Checkbox_Checked)
- EndIf
- SetGadgetText(4, "chkdsk.exe " + DiskCur + GetComString())
- ; Case 4
- ;
- Case 4
- SetClipboardText(cmd$ + " /c (" + GetGadgetText(4) + " & Pause)")
- Case 5 ; ?
- DisplayPopupMenu(0, WindowID(0)) ; покажем всплывающее Меню
- Case 6 ; Старт
- res$ = GetCommand(0)
- If Not Bool(res$)
- Continue
- EndIf
- ; SetClipboardText("cmd.exe /c (Title Check Disk " + info$ + " & @Echo off & @Echo. & Color " + Color$ + " & chkdsk.exe " + disk$ + GetComString() + " & set /p Ok=^>^>)")
- ; cmd.exe /c (Title Check Disk "тут инфа о диске" & @Echo off & @Echo. & Color f0 & chkdsk.exe Z: /F /X & set /p Ok=^>^>)
- ; MessageRequester("Выбранные", res$)
- RunProgram(cmd$, "/c (" + res$ + " set /p Ok=^>^>)", GetPathPart(ProgramFilename()))
- ; Delay(500)
- ; WindowName.s="Check Disk " + info$
- ; handle=FindWindow_(0,WindowName)
- ; If handle
- ; MoveWindow_(handle, 5, 210+5, 800, 600, 0)
- ; MessageRequester("???", "сработало ли условие")
- ; EndIf
- ; MoveWindow_(hGUI, 5, 5, 480, 210, 0)
- ;
- ; ThreadID=RunProgram("cmd.exe","","",#PB_Program_Open)
- ; Sleep_(2000)
- ; iPid=ProgramID(ThreadID)
- ; hWnd=InstanceToWnd(iPid)
- ; MoveWindow_(hWnd, 5, 5, 480, 210, 0)
- ; Sleep_(2000)
- ; MoveWindow_(hWnd, 5, 5, 210, 480, 0)
- ; Sleep_(2000)
- ; MoveWindow_(hWnd, 200, 200, 480, 210, 0)
- ; Sleep_(2000)
- ; MoveWindow_(hWnd, 200, 200, 640, 480, 0)
- Case 8
- tmp = 0
- If GetGadgetState(8) = #PB_Checkbox_Checked
- tmp = #PB_ListIcon_Checked
- EndIf
- For k = 0 To CountGadgetItems(0)-1
- SetGadgetItemState(0 , k , tmp)
- Next
- EndSelect
- Case #PB_Event_Menu ; кликнут элемент всплывающего Меню
- Select EventMenu() ; получим кликнутый элемент Меню...
- Case 1
- Insert_Command(1)
- Case 2
- Insert_Command(2)
- Case 3
- RunProgram("eventvwr.exe")
- SetClipboardText("Wininit")
- Case 4 ; посмотреть в реестре
- RegJump("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager")
- Case 5
- HelpChkdsk()
- Case 6 ; i импорт рег-данных
- TrgS = 0
- info$ = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
- For k = 0 To CountGadgetItems(0)-1
- If (GetGadgetItemState(0, k) & #PB_ListIcon_Checked)
- info$ = ReplaceString(info$, Left(GetGadgetItemText(0, k), 1), "")
- TrgS + 1
- ; MessageRequester("Сообщение", info$)
- EndIf
- Next
- If Not TrgS And Not Admin
- MessageRequester("Сообщение", "Запустите от админа и выберите диск")
- Continue
- ElseIf Not Admin
- MessageRequester("Сообщение", "Запустите от админа")
- Continue
- ElseIf Not TrgS
- MessageRequester("Сообщение", "Нужно выбрать диск")
- Continue
- EndIf
- ; MessageRequester("Сообщение", info$)
- If #ERROR_SUCCESS = RegOpenKeyEx_(#HKEY_LOCAL_MACHINE, "SYSTEM\CurrentControlSet\Control\Session Manager", 0, #KEY_WRITE, @hKey)
- valie.s = "autocheck autochk /p /K:" + info$ + " *"
- ; res$="autocheck autochk /p \??\C:"
- RegSetValueEx_(hKey, @"BootExecute", 0, #REG_EXPAND_SZ, @valie, StringByteLength(valie, #PB_Unicode))
- RegCloseKey_(hKey)
- MessageRequester("Сообщение", "Добавлено в реестр:" + #CRLF$ + #CRLF$ + valie.s)
- Else
- MessageRequester("Сообщение", "Не удаётся добавить в реестр")
- EndIf
- Case 7
- res$ = GetPathPart(ProgramFilename())+"ChkDskGui.chm"
- If FileSize(res$) > 11
- RunProgram("hh.exe", res$ + "::/html/control.htm", GetPathPart(ProgramFilename()))
- ; SetMenuItemText(0, 7, "Справка ChkDskGui")
- Else
- ; DisableMenuItem(0, 7, 1)
- RunProgram("https://yadi.sk/d/XFgMC4xByJKRiA")
- ; SetMenuItemText(0, 7, "Скачать справку")
- EndIf
- Case 8
- res$ = GetCommand(3)
- If Not Bool(res$)
- Continue
- EndIf
- res$ + "set /p Ok=^>^>"
- res$ = ReplaceString(res$, "&", #CRLF$)
- ; ReplaceString(res$, "Гб", "ѓЎ")
- res$ = ToOem(res$)
- ; CharToOem_(String$, String$)
- ; OemToChar_(String$, String$)
- SetClipboardText(res$)
- Case 9
- If FileSize(ini$) <> -1
- If #PB_MessageRequester_No = MessageRequester("Сообщение", "Перезаписать ini?", #MB_YESNO | #MB_ICONQUESTION | #MB_DEFBUTTON2)
- Continue
- EndIf
- EndIf
- SaveFile_Buff(ini$, ?ini, ?iniend - ?ini)
- Case 10
- RegToMenuDisk()
- Case 11
- If MessageRequester("О программе", "Автор AZJIO" + #CRLF$ + "Версия 4.1 от 16.06.2020" + #CRLF$ + #CRLF$ + "Хотите посетить тему обсуждения" + #CRLF$ + "и узнать об обновлениях?", #MB_OKCANCEL) = #IDOK
- RunProgram("https://usbtor.ru/viewtopic.php?t=1478")
- EndIf
- ; MessageRequester("Размеры окна", Str(WindowHeight(0, #PB_Window_FrameCoordinate)) + " " + Str(WindowWidth(0, #PB_Window_FrameCoordinate)))
- EndSelect
- Case #PB_Event_CloseWindow
- SaveINI()
- End
- EndSelect
- ForEver
- EndIf
- End
- Procedure RegExistsKey()
- Protected hKey
- If #ERROR_SUCCESS = RegOpenKeyEx_(#HKEY_CLASSES_ROOT, "Drive\shell\ChkDskGui\command", 0, #KEY_READ, @hKey)
- RegCloseKey_(hKey)
- ProcedureReturn 1
- Else
- ProcedureReturn 0
- EndIf
- EndProcedure
- Procedure RegJump(valie.s)
- Protected hKey
- If #ERROR_SUCCESS = RegOpenKeyEx_(#HKEY_CURRENT_USER, "Software\Microsoft\Windows\CurrentVersion\Applets\Regedit", 0, #KEY_WRITE, @hKey)
- RegSetValueEx_(hKey, @"LastKey", 0, #REG_SZ, @valie, StringByteLength(valie, #PB_Unicode))
- RegCloseKey_(hKey)
- hKey = FindWindowEx_(0, 0, "RegEdit_RegEdit", 0)
- If hKey
- KillProcess_hWin(hKey)
- EndIf
- RunProgram("regedit.exe")
- EndIf
- EndProcedure
- Procedure KillProcess_hWin(hwin)
- Protected phandle, result, PID
- GetWindowThreadProcessId_(hwin,@PID)
- phandle = OpenProcess_(#PROCESS_TERMINATE, #False, PID)
- If phandle <> #Null
- result = TerminateProcess_(phandle, 1) ; успех <> 0
- CloseHandle_(phandle)
- EndIf
- ProcedureReturn result
- EndProcedure
- Procedure Insert_Command(d)
- Protected res$, hwnd, k
- res$ = GetCommand(d)
- If Not Bool(res$)
- ProcedureReturn
- EndIf
- SetClipboardText(cmd$ + " /c (" + res$ + " set /p Ok=^>^>)")
- hwnd = FindWindow_("Shell_TrayWnd","")
- If hwnd
- SendMessage_(hwnd,#WM_COMMAND,$191,0)
- Else
- RunProgram("RUNDLL32", "SHELL32.DLL,#61", "")
- EndIf
- ; Вот так мы ищем окно с шагом 60 мсек 30 раз
- k = 0
- Repeat
- hwnd = FindWindowEx_(0, 0, "#32770", "Выполнить") ; Запуск программы
- Delay(60)
- k + 1
- If k > 30
- Break
- EndIf
- Until hwnd
- If hwnd
- ; SendMessage_(GetDlgItem_(hwnd, 12298),#WM_SETTEXT,0, res$)
- hwnd = FindWindowEx_(hwnd, 0, "ComboBox", 0)
- SendMessage_(hwnd, #WM_SETTEXT,0, cmd$ + " /c (" + res$ + " set /p Ok=^>^>)")
- ; SendMessage_(hwnd, #WM_SETTEXT,0, Str(GetDlgCtrlID_(hwnd))) ; получить идентификатор
- EndIf
- ; SendMessage_(0, #WM_KEYDOWN, #VK_LWIN, 0)
- ; SendMessage_(0, #WM_KEYDOWN, $52, 0)
- ; SendMessage_(0, #WM_KEYUP, $52, 0)
- ; SendMessage_(0, #WM_KEYUP, #VK_LWIN, 0)
- EndProcedure
- Procedure RegToMenuDisk()
- Protected hKey, KeyInfo, valie.s
- If RegExistsKey() ; если существует, то удаляем
- If #ERROR_SUCCESS = RegDeleteKey_(#HKEY_CLASSES_ROOT, "Drive\shell\ChkDskGui\command")
- If #ERROR_SUCCESS = RegDeleteKey_(#HKEY_CLASSES_ROOT, "Drive\shell\ChkDskGui")
- ; MessageRequester("Сообщение","Запись удалена",0)
- SetMenuItemText(0, 10, "Добавить ChkDskGui в меню дисков")
- EndIf
- EndIf
- Else ; иначе добавляем
- If #ERROR_SUCCESS = RegCreateKeyEx_(#HKEY_CLASSES_ROOT, "Drive\shell\ChkDskGui", 0, 0, #REG_OPTION_NON_VOLATILE, #KEY_ALL_ACCESS, 0, @hKey, @KeyInfo)
- valie = "ChkDskGui"
- RegSetValueEx_(hKey, @"", 0, #REG_SZ, @valie, StringByteLength(valie, #PB_Unicode))
- valie = Chr(34) + ProgramFilename() + Chr(34)
- RegSetValueEx_(hKey, @"Icon", 0, #REG_SZ, @valie, StringByteLength(valie, #PB_Unicode))
- RegCloseKey_(hKey)
- EndIf
- If #ERROR_SUCCESS = RegCreateKeyEx_(#HKEY_CLASSES_ROOT, "Drive\shell\ChkDskGui\command", 0, 0, #REG_OPTION_NON_VOLATILE, #KEY_ALL_ACCESS, 0, @hKey, @KeyInfo)
- valie = Chr(34) + ProgramFilename() + Chr(34) + " " + Chr(34) + "%1" + Chr(34)
- RegSetValueEx_(hKey, @"", 0, #REG_SZ, @valie, StringByteLength(valie, #PB_Unicode))
- RegCloseKey_(hKey)
- SetMenuItemText(0, 10, "Удалить ChkDskGui в меню дисков")
- EndIf
- EndIf
- EndProcedure
- Procedure SaveFile_Buff(File.s, *Buff, Size)
- Protected Result = #False
- Protected ID = CreateFile(#PB_Any, File)
- If ID
- If WriteData(ID, *Buff, Size) = Size
- Result = #True
- EndIf
- CloseFile(ID)
- EndIf
- ProcedureReturn Result
- EndProcedure
- Procedure.s GetCommand(fill = 0)
- Protected res$ = "", TrgS = 0, k, info$, disk$
- For k = 0 To CountGadgetItems(0)-1
- info$ = ""
- If GetGadgetItemState(0, k) & #PB_ListIcon_Checked
- disk$ = GetGadgetItemText(0, k)
- info$ = disk$ + " " + GetGadgetItemText(0, k, 1) + " " + GetGadgetItemText(0, k, 2) + " " + GetGadgetItemText(0, k, 3) + " " + GetGadgetItemText(0, k, 4) + " " + GetGadgetItemText(0, k, 5)
- Select fill
- Case 0
- res$ + "Title Check Disk " + info$ + " & @Echo off & @Echo. & @Echo. & @Echo ====================================================== & @Echo Test " + info$ + " & @Echo ====================================================== & @Echo. & @Echo. & Color " + Color$ + " & chkdsk.exe " + disk$ + GetComString() + "&"
- Case 1
- res$ + "Title " + info$ + " & @Echo off & @Echo." + info$ + " & @Echo. & Color " + Color$ + " & chkdsk.exe " + disk$ + GetComString() + "&"
- Case 2
- res$ + "@Echo off & @Echo." + info$ + " & @Echo. & Color " + Color$ + " & chkdsk.exe " + disk$ + GetComString() + "&"
- Case 3
- res$ + "Title Check Disk " + info$ + " & @Echo off & @Echo. & @Echo. & @Echo ====================================================== & @Echo Test " + info$ + " & @Echo ====================================================== & @Echo. & @Echo. & Color " + Color$ + " & chkdsk.exe " + disk$ + GetComString() + "&"
- ; Default
- ; MessageRequester("Сообщение", Text$)
- EndSelect
- TrgS + 1
- EndIf
- Next
- If Not TrgS
- MessageRequester("Сообщение", "Нужно выбрать диск")
- res$ = ""
- EndIf
- ProcedureReturn res$
- EndProcedure
- Procedure Add_item_LV(Drive2$)
- Drive2$ = ComboListDrive(Drive2$)
- If Drive2$ <> "-"
- ; If Mid(Drive2$, 10, 3) = "Fix"
- ; AddGadgetItem(0, -1, Drive2$, ImageID(0))
- ; Else
- ; AddGadgetItem(0, -1, Drive2$, ImageID(1))
- ; EndIf
- ; If StringField(Drive2$, 3, Chr(10)) = "Fixed"
- ; AddGadgetItem(0, -1, Drive2$, ImageID(0))
- ; Else
- ; AddGadgetItem(0, -1, Drive2$, ImageID(1))
- ; EndIf
- Select StringField(Drive2$, 3, Chr(10))
- Case "Fixed"
- AddGadgetItem(0, -1, Drive2$, ImageID(0))
- Case "Rem "
- AddGadgetItem(0, -1, Drive2$, ImageID(1))
- Default
- AddGadgetItem(0, -1, Drive2$, ImageID(2))
- EndSelect
- ; перерисовка заполненности диска
- Protected i = SendMessage_(hListView, #LVM_GETITEMCOUNT, 0, 0) -1
- If GetDiskFreeSpaceEx_(Left(Drive2$,2), @lpFreeBytesAvailable, @lpTotalNumberOfBytes, 0)
- If lpTotalNumberOfBytes>0 ; чтобы не было сбоя при неопределении диска, на 0 делить нельзя
- ; UpdateProgress(0, i, 8, (lpTotalNumberOfBytes-lpFreeBytesAvailable) *100 / lpTotalNumberOfBytes)
- UpdateProgress(0, i, 8, Round((lpTotalNumberOfBytes-lpFreeBytesAvailable) *100 / lpTotalNumberOfBytes , #PB_Round_Nearest))
- Else
- UpdateProgress(0, i, 8, 1)
- EndIf
- Else
- UpdateProgress(0, i, 8, 0)
- EndIf
- ; конец => перерисовка заполненности диска
- EndIf
- EndProcedure
- Procedure Add_item_LV_Mask(Mask.l)
- Protected i, letter.s, title.s
- For i = StartDisk To 25
- If ((Mask >> i) & 1) ; проверить каждый флаг
- letter = Chr(i + 65)
- title + letter + ": "
- Add_item_LV(letter) ; получить букву и отправить на добавление
- EndIf
- Next
- DuplicateDriveTest()
- align_col_LV()
- align_Windows()
- SetWindowTitle(0 , "ChkDskGui (подключен " + title + ")")
- ; сортировка
- UpdatelParam()
- SortOrder = -SortOrder
- ForceSort()
- EndProcedure
- Procedure DuplicateDriveTest()
- Protected k, letter.s
- Protected NewMap Disk.i()
- For k = 0 To CountGadgetItems(0)-1
- letter = GetGadgetItemText(0, k, 0)
- If FindMapElement(Disk(), letter)
- RemoveGadgetItem(0, k)
- Else
- AddMapElement(Disk(), letter)
- EndIf
- Next
- EndProcedure
- ; Procedure DuplicateDriveTest()
- ; Protected k, letter.s, LastLetter.s
- ; For k = 0 To CountGadgetItems(0)-1
- ; letter = GetGadgetItemText(0, k, 0)
- ; If letter = LastLetter
- ; RemoveGadgetItem(0, k)
- ; Else
- ; LastLetter = letter
- ; EndIf
- ; Next
- ; EndProcedure
- Procedure Del_item_LV(Mask.l)
- Protected k, Count, letter.s, title.s;, z
- Count = CountGadgetItems(0)
- For k = Count-1 To 0 Step -1
- ; If GetGadgetItemText(0 , k) = Drive2$+":" Or (drives_avail >> Asc(Left(GetGadgetItemText(0 , k), 1)) - 65) & 0
- ; Debug Str(Asc(Left(GetGadgetItemText(0 , k), 1)) - 65)
- letter = Left(GetGadgetItemText(0 , k), 1)
- If (Mask >> (Asc(letter) - 65)) & 1
- RemoveGadgetItem(0 , k)
- title + letter + ": "
- ; z + 1
- EndIf
- Next
- SetWindowTitle(0 , "ChkDskGui (отключен " + title + ")")
- ; CountDisk - z ; потому что не используем по коду
- align_col_LV()
- align_Windows()
- EndProcedure
- Procedure align_col_LV()
- Protected k
- ListViewSpalte\fmt = #LVCFMT_RIGHT ; Указываем в поле fmt структуры константу для выравнивания
- SendMessage_(hListView, #LVM_SETCOLUMN, 5, @ListViewSpalte) ; Выслать сообщение, где 5 - индекс колонки
- ; Выровнять ширину колонок, чтобы уместился текст
- For k = 0 To 7
- If k = 3 ; кроме колонки "Метка диска"
- Continue
- EndIf
- SetGadgetItemAttribute(0 , 2 , #PB_ListIcon_ColumnWidth , #LVSCW_AUTOSIZE, k)
- Next
- ; If Not Admin ; для колонки "MBR/GPT" без админа ширина 0
- ; SetGadgetItemAttribute(0 , 2 , #PB_ListIcon_ColumnWidth , 0, 7)
- ; EndIf
- ; SetGadgetItemAttribute(0 , 2 , #PB_ListIcon_ColumnWidth , #LVSCW_AUTOSIZE_USEHEADER, 7)
- EndProcedure
- Procedure align_Windows()
- Protected i, Height, ColumnWidth = 0
- Height = 24 + 18 * SendMessage_(hListView, #LVM_GETITEMCOUNT, 0, 0) -1 + 100
- ; If Not fINI Or AlignWin ; если нет ini или выравнивание=1, то
- ; If Not fINI And AlignWin ; если нет ini и выравнивание=1, то
- If AlignWin
- For i = 0 To 8
- ColumnWidth + SendMessage_(hListView, #LVM_GETCOLUMNWIDTH, i, 0)
- Next
- ColumnWidth + 10
- ResizeGadget(0, #PB_Ignore, #PB_Ignore, ColumnWidth, #PB_Ignore)
- ColumnWidth + 10
- ; ResizeWindow(0, #PB_Ignore, #PB_Ignore, ColumnWidth, Height)
- ResizeWindow(0, (DesktopWidth(0) - ColumnWidth) / 2, (DesktopHeight(0) - Height) / 2, ColumnWidth, Height)
- PostMessage_(hGUI, #WM_SIZE, 0, 0)
- EndIf
- EndProcedure
- ; MessageRequester("Размеры окна", Str(WindowHeight(0, #PB_Window_FrameCoordinate)) + " " + Str(WindowWidth(0, #PB_Window_FrameCoordinate)))
- Procedure HideCheckBox(gadget, item)
- Protected lvi.LVITEM
- lvi\iItem = item
- lvi\mask = #LVIF_STATE
- lvi\stateMask = #LVIS_STATEIMAGEMASK
- SendMessage_(GadgetID(0), #LVM_SETITEM, 0, @lvi)
- EndProcedure
- Procedure MyWindowCallback(WindowId, Message, wParam, lParam)
- Protected Result = #PB_ProcessPureBasicEvents, Mask, Drive.s, GUI_H, GUI_W, *pDBHDR.DEV_BROADCAST_HDR, *pDBV.DEV_BROADCAST_VOLUME
- Protected *ptr.MINMAXINFO
- Protected tmp
- Protected *msg.NMHDR, *pnmv.NM_LISTVIEW ; для сортировки
- Protected row, col
- Protected *LVCDHeader.NMLVCUSTOMDRAW ; прогресс заполнения дисков
- Select Message
- Case #WM_NOTIFY ; для сортировки
- *msg.NMHDR = lParam
- Select *msg\code
- Case #LVN_COLUMNCLICK
- If *msg\hwndFrom = hListView
- *pnmv.NM_LISTVIEW = lParam
- If indexSort<>*pnmv\iSubItem
- SortOrder = 1
- EndIf
- indexSort = *pnmv\iSubItem
- ForceSort()
- EndIf
- ; При изменении пункта с типом файловой системы EXT3/EXT4, пункт теряет галку и скрывается
- Case #LVN_ITEMCHANGED
- If *msg\hwndFrom = hListView
- *pnmv.NM_LISTVIEW = lParam
- If Left(GetGadgetItemText(0, *pnmv\iItem, 4) , 3) = "EXT"
- ; Нет необходимости диактивировать пункт, так как после скрытия он не обслуживается
- ; If GetGadgetItemState(0, *pnmv\iItem) & #PB_ListIcon_Checked
- ; SetGadgetItemState(0 , *pnmv\iItem , 0)
- ; EndIf
- HideCheckBox(0, *pnmv\iItem)
- EndIf
- EndIf
- ; перерисовка заполненности диска
- Case #NM_CUSTOMDRAW
- *LVCDHeader.NMLVCUSTOMDRAW = lParam
- row = *LVCDHeader\nmcd\dwItemSpec
- col = *LVCDHeader\iSubItem
- If col = 8
- Select *LVCDHeader\nmcd\dwDrawStage
- Case #CDDS_PREPAINT
- Result = #CDRF_NOTIFYITEMDRAW
- Case #CDDS_ITEMPREPAINT
- Result = #CDRF_NOTIFYSUBITEMDRAW
- Case #CDDS_SUBITEMPREPAINT
- DrawProgressBar(lParam)
- Result = #CDRF_SKIPDEFAULT
- EndSelect
- EndIf
- EndSelect
- ; конец => перерисовка заполненности диска
- Case #WM_DEVICECHANGE ; Изменение при подключении внешних дисков.
- Result = #True
- Select wParam
- Case #DBT_DEVICEARRIVAL, #DBT_DEVICEREMOVECOMPLETE
- *pDBHDR.DEV_BROADCAST_HDR=lParam
- If *pDBHDR\dbch_devicetype = #DBT_DEVTYP_VOLUME
- *pDBV.DEV_BROADCAST_VOLUME=lParam
- Mask = *pDBV\dbcv_unitmask
- Select wParam
- Case #DBT_DEVICEARRIVAL
- ; Debug Bin(drives_avail)
- ; Debug Bin(Mask)
- tmp = drives_avail
- drives_avail | Mask
- If tmp <> drives_avail
- Add_item_LV_Mask(Mask)
- EndIf
- Case #DBT_DEVICEREMOVECOMPLETE
- drives_avail ! (Mask & drives_avail)
- Del_item_LV(Mask)
- EndSelect
- EndIf
- EndSelect
- Case #WM_GETMINMAXINFO ; Минимальный, максимальный размера окна. Смотреть WindowBounds
- Result = 0
- *ptr.MINMAXINFO = lParam
- *ptr\ptMinTrackSize\y = 160 + BorderY ;42
- *ptr\ptMinTrackSize\x = 480 + BorderX ;16
- Case #WM_EXITSIZEMOVE ; Изменение размера окна и перемещение после события.
- If Not cs\m ; если окно не на весь экран, то кешируем массив
- cs\x = WindowX(0, #PB_Window_FrameCoordinate)
- cs\y = WindowY(0, #PB_Window_FrameCoordinate)
- cs\w = WindowWidth(0) ; Новая ширина окна.
- cs\h = WindowHeight(0) ; Новая высота окна.
- EndIf
- Case #WM_SIZE ; Изменение размера окна.
- GUI_W = WindowWidth(0) ; Новая ширина окна.
- GUI_H = WindowHeight(0) ; Новая высота окна.
- ResizeGadget(0, 5, 5, GUI_W - 10, GUI_H - 90)
- ResizeGadget(1, 10, GUI_H - 80, GUI_W - 190, 20)
- ResizeGadget(2, 10, GUI_H - 60, GUI_W - 190, 20)
- ResizeGadget(3, 10, GUI_H - 40, GUI_W - 190, 20)
- ResizeGadget(4, 20, GUI_H - 17, GUI_W - 200, 17)
- ; ResizeGadget(5, GUI_W - 150, GUI_H - 52, 37, 42)
- ResizeGadget(5, GUI_W - 137, GUI_H - 52, 24, 24)
- ResizeGadget(6, GUI_W - 110, GUI_H - 52, 100, 42)
- ; ResizeGadget(7, GUI_W - 179, GUI_H - 52, 26, 42)
- ResizeGadget(8, GUI_W - 179, GUI_H - 80, 170, 20)
- ; SetGadgetItemAttribute(0 , 2 , #PB_ListIcon_ColumnWidth , -1, 3)
- EndSelect
- ProcedureReturn Result
- EndProcedure
- Procedure InstanceToWnd(iPid)
- Protected hWnd = FindWindow_(0,0)
- Protected iPid1, ThreadID
- While hWnd <> 0
- If GetParent_(hWnd) = 0
- ThreadID = GetWindowThreadProcessId_(hWnd, @iPid1)
- If iPid1 = iPid
- Break
- EndIf
- EndIf
- hWnd = GetWindow_(hWnd, #GW_HWNDNEXT)
- Wend
- ProcedureReturn hWnd
- EndProcedure
- ; Получить буквы дисков
- Procedure GetDrives(List Drive.s())
- Protected i, Drive2$
- drives_avail = GetLogicalDrives_()
- ; игнорирование дисков
- Protected Dim Arr.s{1}(0)
- Protected LenStr, Mask = 0
- If ignore$
- ; ignore$ = UCase(ignore$)
- LenStr = Len(ignore$)
- ReDim Arr(LenStr - 1)
- PokeS(Arr(), UCase(ignore$), -1, #PB_String_NoZero)
- For i = 0 To LenStr - 1
- Mask + (1 << (Asc(Arr(i)) - 65))
- Next
- EndIf
- ; Mask & drives_avail ; убираем из маски лишние флаги (1 в 0), т.е. в маске остаются только существующие диски
- ; drives_avail ! Mask ; одинаковые флаги (1 и 1) в масках сбрасываются в 0
- drives_avail ! (Mask & drives_avail) ; игнор одним выражением
- ; игнорирование дисков => конец
- For i = StartDisk To 25
- If ((drives_avail >> i) & 1)
- Drive2$ = ComboListDrive(Chr(i + 65))
- If Drive2$ <> "-"
- AddElement(Drive())
- Drive() = Drive2$
- EndIf
- EndIf
- Next
- EndProcedure
- Procedure TestVirtual(Drive2$)
- Protected lpDeviceName.s, lpTargetPath.s
- lpDeviceName = Mid(Drive2$, 1, 2)
- lpTargetPath = Space(#MAX_PATH)
- QueryDosDevice_(@lpDeviceName, @lpTargetPath, #MAX_PATH)
- If Left(lpTargetPath, 7) <> "\Device" Or (Left(lpTargetPath, 15) = "\Device\Ramdisk" And lpDeviceName = "X:")
- ProcedureReturn 1
- Else
- ProcedureReturn 0
- EndIf
- EndProcedure
- Procedure.s ComboListDrive(Drive2$)
- Protected.l type, i
- Protected.s Lfwrk, FileSystem, VolName, r = Chr(10)
- Protected.q total_bytes
- Lfwrk=Drive2$+":\"
- type =GetDriveType_(Lfwrk)
- FileSystem = Space(256)
- VolName= Space(256)
- Select type
- Case #DRIVE_REMOVABLE
- Drive2$+":" + r + "[" + DriveGetNumber(Drive2$ + ":") + "]" + r + "Rem "
- Case #DRIVE_FIXED
- Drive2$+":" + r + "[" + DriveGetNumber(Drive2$ + ":") + "]" + r + "Fixed"
- Case #DRIVE_REMOTE, #DRIVE_CDROM, #DRIVE_RAMDISK
- ProcedureReturn "-"
- Case #DRIVE_NO_ROOT_DIR
- ProcedureReturn Drive2$+":" + r + "[" + DriveGetNumber(Drive2$ + ":") + "]" + r + "No_Root_Dir"
- Case #DRIVE_UNKNOWN
- ProcedureReturn Drive2$+":" + r + "[" + DriveGetNumber(Drive2$ + ":") + "]" + r + "Unknown"
- Default
- ProcedureReturn Drive2$+":" + r + "[" + DriveGetNumber(Drive2$ + ":") + "]" + r + "---"
- EndSelect
- If Mid(Drive2$, 5, 3) = "?:?" And TestVirtual(Drive2$)
- ProcedureReturn "-"
- EndIf
- If GetVolumeInformation_(@Lfwrk, @VolName, 255, 0, 0, 0, @FileSystem, 255)
- Drive2$ + r + VolName + r + FileSystem
- ; Drive2$ = DriveGetNumber(Left(Drive2$,1) + ":") + " " + Drive2$
- If (GetDiskFreeSpaceEx_(Lfwrk, 0, @total_bytes, 0))
- ; Drive2$ + " "+ Str(total_bytes/1048576)+ " Мб"
- Drive2$ + r + StrF(ValF(StrF(total_bytes/1024)) /1048576,3)
- Else
- Drive2$ + r + "---"
- EndIf
- Else
- Drive2$ + r + "---" + r + "---"
- If OSVersion() < #PB_OS_Windows_Vista
- total_bytes = GetDriveSize(Left(Drive2$,2))
- If total_bytes
- Drive2$ + r + StrF(ValF(StrF(total_bytes/1024)) /1048576,3)
- Else
- Drive2$ + r + "---"
- EndIf
- Else
- Drive2$ + r + "---"
- EndIf
- EndIf
- Drive2$ + r + DriveGetName(Left(Drive2$,2))
- Drive2$ + r + Get_MBR_GPT(StringField(Drive2$, 2, Chr(10)))
- ; Debug Drive2$
- ProcedureReturn Drive2$
- EndProcedure
- ;Получение номера диска и раздела, из буквы раздела
- Procedure.s Get_MBR_GPT(DriveNum$)
- Protected tmp, res$
- tmp = FindString(DriveNum$, ":", 2, #PB_String_CaseSensitive)
- res$ = Mid(DriveNum$, 2, tmp - 2)
- If res$ = "?"
- ProcedureReturn "---"
- EndIf
- tmp = Val(res$)
- If MBR_GPT(tmp) <> ""
- ProcedureReturn MBR_GPT(tmp)
- EndIf
- res$ = "---"
- Protected pdl.DRIVE_LAYOUT_INFORMATION_EX, Bytes.l, hDrive
- hDrive = CreateFile_("\\.\PhysicalDrive" + tmp, 0, #FILE_SHARE_READ | #FILE_SHARE_WRITE, 0, #OPEN_EXISTING, 0, 0)
- ; hDrive = CreateFile_("\\.\PhysicalDrive" + tmp, #GENERIC_READ, #FILE_SHARE_READ | #FILE_SHARE_WRITE, 0, #OPEN_EXISTING, 0, 0)
- If hDrive <> #INVALID_HANDLE_VALUE
- If DeviceIoControl_(hDrive, #IOCTL_DISK_GET_DRIVE_LAYOUT_EX, 0, 0, @pdl, SizeOf(pdl), @Bytes, 0)
- Select pdl\PartitionStyle
- Case #PARTITION_STYLE_MBR
- res$="MBR"
- Case #PARTITION_STYLE_GPT
- res$="GPT"
- Case #PARTITION_STYLE_RAW
- res$="RAW"
- EndSelect
- EndIf
- CloseHandle_(hDrive)
- EndIf
- MBR_GPT(tmp) = res$
- ProcedureReturn res$
- EndProcedure
- ;Получение номера диска и раздела, из буквы раздела
- Procedure.s DriveGetNumber(DriveLetter$)
- Protected DriveInfo.STORAGE_DEVICE_NUMBER, Nul , Ret$="?:?", hDevice
- hDevice = CreateFile_("\\.\" + DriveLetter$, 0, 0, 0, #OPEN_EXISTING, #FILE_ATTRIBUTE_NORMAL, #NUL)
- If hDevice <> #INVALID_HANDLE_VALUE
- If DeviceIoControl_(hDevice,#IOCTL_STORAGE_GET_DEVICE_NUMBER, 0, 0, DriveInfo, SizeOf(STORAGE_DEVICE_NUMBER), @Nul, #NUL)
- Ret$=Str(DriveInfo\DeviceNumber) + ":" + Str(DriveInfo\PartitionNumber)
- If DriveInfo\DeviceNumber > MaxDeviceNumber
- MaxDeviceNumber = DriveInfo\DeviceNumber
- ReDim MBR_GPT(MaxDeviceNumber)
- EndIf
- EndIf
- CloseHandle_(hDevice)
- EndIf
- ProcedureReturn Ret$
- EndProcedure
- ;Получение названия диска
- Procedure.s DriveGetName(DriveLetter$)
- #IOCTL_STORAGE_QUERY_PROPERTY = $2D1400
- Protected dwOutBytes, hDevice, p, Ret$
- Protected udtQuery.STORAGE_PROPERTY_QUERY
- Protected udtOut.STORAGE_DEVICE_DESCRIPTOR
- hDevice = CreateFile_("\\.\" + DriveLetter$, 0, #FILE_SHARE_READ | #FILE_SHARE_WRITE, 0, #OPEN_EXISTING, #NUL, #NUL)
- ; hDevice = CreateFile_("\\.\" + DriveLetter$, #GENERIC_READ, #FILE_SHARE_READ | #FILE_SHARE_WRITE, 0, #OPEN_EXISTING, #NUL, #NUL)
- If hDevice <> #INVALID_HANDLE_VALUE
- For p=0 To 1023
- udtOut\Reserved[p]=0
- Next p
- If DeviceIoControl_(hDevice, #IOCTL_STORAGE_QUERY_PROPERTY, udtQuery, SizeOf(udtQuery), @udtOut, SizeOf(udtout), @dwOutBytes, 0)
- ; Debug "udtOut\RemovableMedia = " + Str(udtOut\RemovableMedia) ; 1 = диск может быть извлечён
- ; Debug "udtOut\Bustype = " + Str(udtOut\Bustype) ; тип шины, к которой подключено устройство, т.е. флешка = #BusTypeUsb, обычный hdd = #BusTypeSata
- ; If udtOut\SerialNumberOffset
- ; Debug "SerialNumber = " + LTrim(PeekS(udtOut + udtOut\SerialNumberOffset, -1, #PB_Ascii))
- ; EndIf
- If udtOut\VendorIdOffset
- Ret$ + Trim(PeekS(udtOut + udtOut\VendorIdOffset, -1, #PB_Ascii)) + " "
- EndIf
- If udtOut\ProductIdOffset
- Ret$ + Trim(PeekS(udtOut + udtOut\ProductIdOffset, -1, #PB_Ascii))
- EndIf
- ; If udtOut\ProductRevisionOffset
- ; Debug "ProductRevision = " + PeekS(udtOut + udtOut\ProductRevisionOffset, -1, #PB_Ascii)
- ; EndIf
- EndIf
- CloseHandle_(hDevice)
- EndIf
- ProcedureReturn Ret$
- EndProcedure
- Procedure.s GetComString()
- Protected.s ComStr = ""
- If GetGadgetState(1)
- ComStr + " /F"
- EndIf
- If GetGadgetState(2)
- ComStr + " /R"
- EndIf
- If GetGadgetState(3)
- ComStr + " /X"
- EndIf
- ProcedureReturn ComStr
- EndProcedure
- ; X:\Windows\System32\
- Procedure HelpChkdsk()
- Protected Prog = RunProgram("chkdsk.exe", "/?", "", #PB_Program_Open | #PB_Program_Read | #PB_Program_Hide)
- Protected Output$ = ""
- If Prog
- While ProgramRunning(Prog)
- Output$ + ReadProgramStringOem(Prog)
- Wend
- CloseProgram(Prog)
- EndIf
- Output$=ReplaceString(Output$, #CRLF$ + #CRLF$ + #CRLF$, #CRLF$ + #CRLF$) ; чтобы на экран умещалось
- Output$=ReplaceString(Output$, #CRLF$ + " ", " ") ; чтобы на экран умещалось
- If Len(Output$) > 20
- MessageRequester("Справка", Output$)
- Else
- RunProgram(cmd$, "/c (Title Check Disk Help & @Echo off & Color " + Color$ + " & chkdsk.exe /? & set /p Ok=^>^>)", "")
- EndIf
- EndProcedure
- Procedure.s ReadProgramStringOem(iPid)
- Protected Ret$="", *Buff, SizeBuff=AvailableProgramOutput(iPid)
- If SizeBuff>0
- *Buff=AllocateMemory(SizeBuff)
- ReadProgramData(iPid,*Buff,SizeBuff)
- OemToCharBuffA(*Buff,*Buff,SizeBuff) ; 866 в Windows1251
- Ret$=PeekS(*Buff,SizeBuff,#PB_Ascii)
- FreeMemory(*Buff)
- EndIf
- ProcedureReturn Ret$
- EndProcedure
- ; Windows1251 в 866
- Procedure.s ToOem(String$)
- Protected Ret$="", *Buff, SizeBuff=Len(String$)
- If SizeBuff>0
- *Buff=AllocateMemory(SizeBuff+1)
- PokeS(*Buff, String$, SizeBuff, #PB_Ascii)
- CharToOemBuffA(*Buff, *Buff, SizeBuff)
- Ret$=PeekS(*Buff, SizeBuff, #PB_Ascii)
- FreeMemory(*Buff)
- EndIf
- ProcedureReturn Ret$
- EndProcedure
- DataSection
- DiskFixed:
- IncludeBinary "Fixed.ico"
- DiskFixedend:
- DiskRem:
- IncludeBinary "Rem.ico"
- DiskRemend:
- DiskUnk:
- IncludeBinary "Unk.ico"
- DiskUnkend:
- ini:
- IncludeBinary "sample.ini"
- iniend:
- EndDataSection
- ; Для подсказок часть 3 из 3-х
- Procedure AddGadgetToolTip(GadgetID.l, ToolText$, MaxWidth.l = 0, Balloon.l = 1, WindowID.l = -1)
- Protected cWndFlags.l = #TTS_NOPREFIX | #TTS_BALLOON
- Protected hToolTip, tti.TOOLINFO
- If WindowID = -1 And IsGadget(GadgetID) ; Позволяет вводить либо PB-#Gadget, либо Gadget-ID
- GadgetID = GadgetID(GadgetID)
- If hToolTips(Str(GadgetID)) <> 0 : DestroyWindow_(hToolTips(Str(GadgetID))) : EndIf
- ElseIf WindowID > -1 And IsWindow(WindowID)
- WindowID = WindowID(WindowID)
- EndIf
- ;--> Удаляет флаг #TTS_BALLOON если вы хотите прямоугольную всплывающую подсказку, в соответствии с переменной Balloon.
- If Balloon = 0 : cWndFlags = #TTS_NOPREFIX : EndIf
- hToolTip = CreateWindowEx_(0, "ToolTips_Class32", "", cWndFlags, 0, 0, 0, 0, 0, 0, GetModuleHandle_(0), 0)
- hToolTips(Str(GadgetID)) = hToolTip
- ; Назначаем цвета в соответствии со стандартным цветом в ОС
- SendMessage_(hToolTip, #TTM_SETTIPTEXTCOLOR, GetSysColor_(#COLOR_INFOTEXT), 0)
- SendMessage_(hToolTip, #TTM_SETTIPBKCOLOR, GetSysColor_(#COLOR_INFOBK), 0)
- tti.TOOLINFO\cbSize = SizeOf(TOOLINFO)
- tti\uFlags = #TTF_SUBCLASS | #TTF_IDISHWND
- ;--> Вот где многострочный текст вступает в игру, установив maxWidth
- SendMessage_(hToolTip, #TTM_SETMAXTIPWIDTH, 0, MaxWidth)
- tti\hWnd = GadgetID
- tti\uId = GadgetID
- tti\hinst = 0
- tti\lpszText = @Tooltext$
- If WindowID <> -1
- tti\hWnd = WindowID
- tti\uFlags = #TTF_SUBCLASS
- GetClientRect_(WindowID, @tti\rect)
- EndIf
- SendMessage_(hToolTip, #TTM_ADDTOOL, 0, tti)
- SendMessage_(hToolTip, #TTM_SETDELAYTIME, #TTDT_AUTOPOP, 15000)
- SendMessage_(hToolTip, #TTM_UPDATE , 0, 0)
- EndProcedure
- Procedure SaveINI()
- If OpenPreferences(ini$) And PreferenceGroup("set")
- With cs
- WritePreferenceInteger("WinM" , \m)
- WritePreferenceInteger("WinX" , \x)
- WritePreferenceInteger("WinY" , \y)
- WritePreferenceInteger("WinW" , \w)
- WritePreferenceInteger("WinH" , \h)
- EndWith
- WritePreferenceInteger("SortOrder", -SortOrder)
- WritePreferenceInteger("indexSort", indexSort)
- ClosePreferences()
- EndIf
- EndProcedure
- ; IDE Options = PureBasic 5.70 LTS (Windows - x86)
- ; CursorPosition = 371
- ; FirstLine = 341
- ; Folding = ---fx
- ; EnableXP
- ; DPIAware
- ; UseIcon = ChkDskGui.ico
- ; Executable = ChkDskGui_x64.exe
- ; DisableCompileCount = 4
- ; EnableBuildCount = 0
- ; EnableExeConstant
- ; IncludeVersionInfo
- ; VersionField0 = 4.2.0.%BUILDCOUNT
- ; VersionField2 = AZJIO
- ; VersionField3 = ChkDskGui
- ; VersionField4 = 4.2
- ; VersionField6 = ChkDskGui
- ; VersionField9 = AZJIO
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement