AZJIO
- Стаж: 6 лет 8 месяцев
- Сообщений: 1322
- Репутация:127[+] [-]
|
ChkDskGui (PureBasic)
Исходник + EXE, v4.2 (x86, x64)Скачать yadi.sk upload.eeвременная версия
Последний раз редактировалось: AZJIO (2024-11-07 09:05), всего редактировалось 44 раз(а)
|
Отправлено: 10-Май-2018 11:35
(спустя 1 день 2 часа)
Joker-2013
- Стаж: 9 лет 5 месяцев
- Сообщений: 2053
- Репутация:120[+] [-]
- Откуда: из прошлого
|
53558 Не надо добавлять Chr(13) , читается не строка, а поток, в нем уже есть эти символы, и для совместимости с OemA2Ansi(Str$) читать надо поток надо в Raw виде, без преобразований. Код: Output$ + ReadProgramString(Prog,#PB_Unicode) В данном случае не умещается в сообщение и оно выходит за пределы окна... Хотя, по мне так, проще создать новое окно и разместить в нем инфу с прокруткой... Не только проще, а прямо необходимо, ибо из сообщения неудобно копировать ключи (или всё или ничего)
Последний раз редактировалось: Joker-2013 (2018-05-10 11:43), всего редактировалось 1 раз
|
Joker-2013
- Стаж: 9 лет 5 месяцев
- Сообщений: 2053
- Репутация:120[+] [-]
- Откуда: из прошлого
|
Или использовать свой вывод Так то интереснее, если не будет проблем с кодировками...
|
nikzzzz
- Стаж: 9 лет 9 месяцев
- Сообщений: 3114
- Репутация:127[+] [-]
|
53611Так то интереснее, если не будет проблем с кодировками... С кодировками не будет, но для красоты вывода иногда добавляются спец символы, их надо фильтровать, что в общем-то не составляет проблему. Как вариант, можно поменять кодовую страницу на 1251, но не все программы ее используют, некоторые могут просто проигнорировать, поэтому вариант с OemA2Ansi универсальнее.
|
Joker-2013
- Стаж: 9 лет 5 месяцев
- Сообщений: 2053
- Репутация:120[+] [-]
- Откуда: из прошлого
|
Чуть я поигрался:
Дополнительная информация; тест ChkDskGui ;IncludeFile "RUSCOD.PBI" Declare.s OemA2Ansi(Str$) Declare ComboListDrive(List Drive.s()) Declare GetDrives(List Drive.s()) Declare HelpChkdsk() Declare RunProg(*Value) Declare.s FormatStr(Sring$) Declare.s FormatStrFS(Sring$) Declare.s FormatSizeDisk(Num.q) Declare.s GetComString() Declare.s DriveGetNumber(Sring$) Define.s strexe NewList Drive.s() If OpenWindow(0, 100, 200, 440, 130, "ChkDskGui", #PB_Window_MinimizeGadget) ComboBoxGadget(0, 20, 16, 400, 25, #PB_ComboBox_Image) ; Создаёт раскрывающийся список GetDrives(Drive()) ComboListDrive(Drive()) ; Получение списка дисков FIXED REMOVABLE i=1 Handle = GetModuleHandle_(0) ForEach Drive.s() Text.s= Drive.s() Letter.s =LSet(Text,1)+":" hIco=ExtractAssociatedIcon_(Handle, @Letter, @i) AddGadgetItem(0, -1, Drive.s(), hIco) Next SetGadgetState(0, 0) ; Выбирает первый элемент списка If LoadFont(0,"Courier New",9) SetGadgetFont(0, FontID(0)) ; Установить загруженный шрифт Courier 10 как новый стандарт EndIf CheckBoxGadget(1, 20, 45, 280, 20, "\F - Исправление ошибок на диске") : SetGadgetState(1, #PB_Checkbox_Checked) CheckBoxGadget(2, 20, 65, 280, 20, "\R - Восстановление поврежденных секторов") CheckBoxGadget(3, 20, 85, 280, 20, "\X - Принудительное отключение тома") : SetGadgetState(3, #PB_Checkbox_Checked) ; StringGadget(4, 20, 110, 420, 17, "") TextGadget(4, 20, 110, 420, 17, "тест дисков") ; ButtonGadget(5, 300, 77, 27, 32, "?", #PB_Button_Default) ; не работает Default, не нажимается по Enter ButtonGadget(5, 300, 77, 27, 32, "?") ButtonGadget(6, 330, 77, 90, 32, "Старт") ; GadgetToolTip(1,"подсказка") ; SetActiveGadget(5) ; не работает Active, не нажимается по Enter SetGadgetText(4, GetComString()) SetGadgetState(6, 0) ; While #True ; Select WaitWindowEvent() ; Case #PB_Event_CloseWindow Repeat Event = WaitWindowEvent() If Event = #PB_Event_Gadget Select EventGadget() Case 5 ; ? HelpChkdsk() Case 6 ; Старт ; DisableGadget(5, 1) ; это работает не в порядке очереди, поэтому скрываем HideGadget(5, 1) HideGadget(6, 1) ; даёт невозможность поставить в очередь клики ; Delay(3000) ; MessageRequester("Тест", "/c (Title Check Disk & @Echo off & Color 1e & cls & " + GetComString() + " & set /p Ok=^>^>)", 0) CreateThread(@RunProg(), 1) ; DisableGadget(5, 0) HideGadget(5, 0) HideGadget(6, 0) Case 0 SetGadgetText(4, GetComString()) Case 1 If GetGadgetState(1) = #PB_Checkbox_Unchecked SetGadgetState(2, #PB_Checkbox_Unchecked) SetGadgetState(3, #PB_Checkbox_Unchecked) EndIf SetGadgetText(4, GetComString()) Case 2 SetGadgetState(1, #PB_Checkbox_Checked) SetGadgetText(4, GetComString()) Case 3 If GetGadgetState(3) = #PB_Checkbox_Checked SetGadgetState(1, #PB_Checkbox_Checked) EndIf SetGadgetText(4, GetComString()) EndSelect ElseIf Event = #PB_Event_CloseWindow And GetActiveWindow()=1 HideWindow(1,0) EndIf Until Event = #PB_Event_CloseWindow And GetActiveWindow()=0 EndIf End Procedure RunProg(*Value) RunProgram("cmd.exe", "/c (Title Check Disk & @Echo off & Color 1e & cls & " + GetComString() + " & set /p Ok=^>^>)", "") EndProcedure Procedure.s GetComString() Define.s ComStr ComStr = "chkdsk.exe " ComStr + RSet(GetGadgetText(0), 1) + ":" If GetGadgetState(1) ComStr + " /F" EndIf If GetGadgetState(2) ComStr + " /R" EndIf If GetGadgetState(3) ComStr + " /X" EndIf ProcedureReturn ComStr EndProcedure Procedure.s OemA2Ansi(Str$) user32_dll=OpenLibrary(#PB_Any, "user32.dll") CallFunction(user32_dll,"OemToCharA",@Str$,@Str$) CloseLibrary(user32_dll) ProcedureReturn PeekS(@Str$,-1,#PB_Ascii) EndProcedure Procedure HelpChkdsk() Prog = RunProgram("chkdsk.exe", "/?", "", #PB_Program_Open | #PB_Program_Read | #PB_Program_Hide) Output$ = "" If Prog While ProgramRunning(Prog) If AvailableProgramOutput(Prog) Output$ + Output$ + ReadProgramString(Prog,#PB_Unicode) EndIf Wend CloseProgram(Prog) ; Close the connection to the program EndIf ; Output$ = RUSCOD(Output$, #DosToWin) Output$=OemA2Ansi(Output$) ;Output$=ReplaceString(Output$, #CR$ + " ", "") ; чтобы на экран умещалось ; If CreateRegularExpression(0, "\A\s+") ; не удалил пустые строки в начале, только добавил 60 кб к EXE ; If CreateRegularExpression(0, "\s+\z") ; Output$ = ReplaceRegularExpression(0, Output$, "") ; EndIf ; If OpenWindow(1, 100, 200, 440, 130, "Справка", #PB_Window_MinimizeGadget | #PB_Window_WindowCentered) ; EndIf MessageRequester("Справка", Output$) EndProcedure ; Получить буквы дисков Procedure GetDrives(List Drive.s()) Define.i drives_avail drives_avail = GetLogicalDrives_() For i = 0 To 31 If ((drives_avail >> i) & 1) AddElement(Drive()) Drive() = Chr(i + 65)+":" EndIf Next EndProcedure ;Получение номера диска и раздела, из буквы раздела Procedure.s DriveGetNumber(DriveLetter$) Protected DriveInfo.STORAGE_DEVICE_NUMBER, Ret$="", hDevice = CreateFile_("\\.\" + DriveLetter$, 0, 0, 0, #OPEN_EXISTING, #FILE_ATTRIBUTE_NORMAL, #NUL) If hDevice If DeviceIoControl_(hDevice,#IOCTL_STORAGE_GET_DEVICE_NUMBER, 0, 0, DriveInfo, SizeOf(STORAGE_DEVICE_NUMBER), #NUL, #NUL) Ret$=Str(DriveInfo\DeviceNumber) + ":" + Str(DriveInfo\PartitionNumber) EndIf CloseHandle_(hDevice) EndIf ProcedureReturn Ret$ EndProcedure Procedure ComboListDrive(List Drive.s()) Define.l Serial, type, i Define.s Lfwrk, FileSystem, VolName Define.q total_bytes ForEach Drive.s() Lfwrk=Drive.s()+"\" type =GetDriveType_(Lfwrk) FileSystem = Space(256) VolName= Space(256) GetVolumeInformation_(@Lfwrk, @VolName, 255, @Serial, 0, 0, @FileSystem, 255) Select type Case 2 Drive()+" ["+DriveGetNumber(Drive()) + "] REM " Case 3 Drive()+" ["+DriveGetNumber(Drive())+"] FIXED " Default DeleteElement(Drive()) Continue EndSelect Drive() +FormatStr(VolName)+" "+FormatStrFS(FileSystem) If (GetDiskFreeSpaceEx_(Lfwrk, 0, @total_bytes, 0)) Drive() + Space(2) + FormatSizeDisk(total_bytes) EndIf Next EndProcedure ; форматирует число в формат "0,5 Гб", "500 Гб" Procedure.s FormatSizeDisk(Num.q) Define.s snum Define.f total_gb snum = StrF(Num/1024) total_gb = ValF(snum) total_gb = total_gb/1048576 snum =StrF(total_gb,3) snum =RSet(snum, 7) + " Гб" ; Debug Len(snum) ProcedureReturn snum EndProcedure Procedure.s FormatStr(Sring$) Define.l LenSring LenSring = Len(Sring$) If LenSring >15 Sring$ = LSet(Sring$,12) + "..." ElseIf LenSring < 15 Sring$ = LSet(Sring$,15) EndIf ProcedureReturn Sring$ EndProcedure Procedure.s FormatStrFS(Sring$) Define.l LenSring LenSring = Len(Sring$) If LenSring < 5 Sring$ = LSet(Sring$,5) EndIf ProcedureReturn Sring$ EndProcedure Но что то надоело... Для добавления окон, нужно переделать цикл событий, а что то лень...
|
AZJIO
- Стаж: 6 лет 8 месяцев
- Сообщений: 1322
- Репутация:127[+] [-]
|
53610В данном случае не умещается в сообщение и оно выходит за пределы окна... На AutoIt3-версии справка выводится в новое окно с Edit. Упирается во время.53618Для добавления окон, нужно переделать цикл событий На AutoIt3, когда окно делаешь дочерним цикл переделывать не надо, родительское само перестаёт обрабатывать события и не имеет доступа, а в дочернем свой цикл.53558Не надо добавлять Chr(13) Ну во первых код я взял целиком из примера в справке, во вторых, без Chr(13) у меня всё в одной строке, всё в куче. Joker-2013 Иконки пока думаю лишнее. С точки зрения системы в LiveCD иконки будут разделятся на несъёмный и съёмный, в обычной винде добавится иконка системного диска, ну и если принудительно иконки сменяны то они. У нас Rem и Fixed определяют тип, иконками только это определяется. В общем не несут они ничего, если только сделать свои 2 иконки на эти два типа и назначать взависимости от типа. Обновил ссылку на пастбин, добавил номера дисков
|
Joker-2013
- Стаж: 9 лет 5 месяцев
- Сообщений: 2053
- Репутация:120[+] [-]
- Откуда: из прошлого
|
53622На AutoIt3, когда окно делаешь дочерним цикл переделывать не надо, родительское само перестаёт обрабатывать события и не имеет доступа, а в дочернем свой цикл. в пьюрике всё в куче. Переделывать то не много, точнее совсем малость... обработку закрытия окон. У меня есть хорошее решение, которое обрабатывает все события, но в моей проге...
|
Joker-2013
- Стаж: 9 лет 5 месяцев
- Сообщений: 2053
- Репутация:120[+] [-]
- Откуда: из прошлого
|
53622Обновил ссылку на пастбин, добавил номера дисков и испортил подсказку по параметрам... Добавь событие:Case 0 SetGadgetText(4, GetComString())
|
AZJIO
- Стаж: 6 лет 8 месяцев
- Сообщений: 1322
- Репутация:127[+] [-]
|
Joker-2013, проверь дочернее окно (на пастбине), я попробовал как это делается в AutoIt3. Но дочерность не присвоилась, пока ковыряю
|
Отправлено: 10-Май-2018 15:39
(спустя 1 час 3 минуты)
Joker-2013
- Стаж: 9 лет 5 месяцев
- Сообщений: 2053
- Репутация:120[+] [-]
- Откуда: из прошлого
|
AZJIO,Repeat Event = WaitWindowEvent() Until Event = #PB_Event_CloseWindow Не ну опрос, в общем цикле... по номеру гаджета... Дочернее окно сделать просто, есть в справке... нужно указать ID основного окна и всё...
|
AZJIO
- Стаж: 6 лет 8 месяцев
- Сообщений: 1322
- Репутация:127[+] [-]
|
Joker-2013 на счёт WS_POPUP ждём
|
Joker-2013
- Стаж: 9 лет 5 месяцев
- Сообщений: 2053
- Репутация:120[+] [-]
- Откуда: из прошлого
|
AZJIO, из меня подсказчик плохой... Но всё предельно просто. Окна не блокируются, можно заблокировать вручную. События обрабатываются в основном цикле, по номеру гаджета... Вот как у меня реализовано: Я бы дал пример, но мне его создавать долго, может кто более продвинутый, поможет... Дочернее окно, не имеет своего значка в панели задач. Как я заметил, у вас возникают сложности, из за знания AutoIT и попытки делать код по подобию... А язык то отличается... Вот у nikzzzz таких проблем не возникает, он у нас, многозадачный...
|
AZJIO
- Стаж: 6 лет 8 месяцев
- Сообщений: 1322
- Репутация:127[+] [-]
|
53664Как я заметил, у вас возникают сложности, из за знания AutoIT и попытки делать код по подобию... У AutoIt3 нет проблем создать любой вид окна и дочернее без блокировки и дочернее с одним циклом и переключением между окнами и перебросом данных из одного в другое и самостоятельные окна с взаимодействием (разные скрипты) и сделать чужое окно дочерним по отношению к окну AutoIt3. Но!!! я обсуждаю вариант, который нужен мне, а не и ситуации что я не могу по иному. Во первых существует порядок/иерархия окон, допустим ты закрыл родительское, как поступать с дочерним? Оно должно закрыться или остаться, что если там данные о которых ты вспомнил когда закрыл родительское?
|
Отправлено: 10-Май-2018 23:42
(спустя 1 час 22 минуты)
Joker-2013
- Стаж: 9 лет 5 месяцев
- Сообщений: 2053
- Репутация:120[+] [-]
- Откуда: из прошлого
|
AZJIO, Дождался... Я там тебе ответил... Такой цикл обработки событий, по моему мнению, оптимальный, я до него дошел, не сразу... Обновил код, по моему, отличный пример получился, можно расширить и выложить. Для новичков, просто находка. AZJIO, так я и писал про подход... В пьюрике всё вполне просто, но наверное чуть по другому чем в AutoIT...
|
Отправлено: 11-Май-2018 01:55
(спустя 2 часа 12 минут)
AZJIO
- Стаж: 6 лет 8 месяцев
- Сообщений: 1322
- Репутация:127[+] [-]
|
53664Как я заметил, у вас возникают сложности, из за знания AutoIT и попытки делать код по подобию.. 53672AZJIO, так я и писал про подход... В пьюрике всё вполне просто, но наверное чуть по другому чем в AutoIT... Ну в итоге то по подобию. И знание AutoIt3 в этом помогает. Они же оба используют виндовые функции, ресурсы винды и принцип чтобы это повторить одинаковый. В принципе я искал название аналогов функций и способ передачи дескриптора родительского окна дочернему, что не всегда может быть дескриптором, а внутренним номером связанным с дескриптором. В AutoIt3 к примеру когда получает дескриптор открытого файла возвращает порядковый номер, казалось бы как такое может быть, а причина что он внутри движка содержит именные списки-таблицы для связи идентификаторов с дескрипторами и при завершении автоматом закрывает ресурсы зная сколько элементов в таблице. Но в автоите передаёшь дескриптор для окна, а тут он через внутренний список, подобно файловым дескрипторам в AutoIt3.
|
nikzzzz
- Стаж: 9 лет 9 месяцев
- Сообщений: 3114
- Репутация:127[+] [-]
|
AZJIO, В принципе, не принципиально на чем писать, все зависит от библиотек, когда их не хватает, возникают проблемы, Autoit имеет огромное преимущество, там только один тип данных - Variant, это позволяет не думать ни о преобразовании типов, ни долго их описывать. Но я ничего не понял из твоего поста, в принципе отличия не большие, приведи простой пример на Autoit, я не понимаю, в чем проблема.
|
Страница 2 из 34
Текущее время: 24-Ноя 01:14
Часовой пояс: UTC + 3
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете прикреплять файлы к сообщениям Вы можете скачивать файлы
|
|