[Цитировать]

    AZJIO
  • 17953
  • Стаж: 6 лет 1 месяц
  • Сообщений: 1284
  • Репутация:126

    [+] [-]
ChkDskGui (PureBasic) Исходник + EXE, v4.2 (x86, x64)Скачать yadi.sk upload.eeвременная версия


Последний раз редактировалось: AZJIO (2023-01-25 16:21), всего редактировалось 43 раз(а)

[Цитировать]

    AZJIO
  • 17953
  • Стаж: 6 лет 1 месяц
  • Сообщений: 1284
  • Репутация:126

    [+] [-]
Можно ещё задействовать WM_DEVICECHANGE (AutoIt3), чтобы обновлять список при подключении USB-съёмных носителей.
Нашёл PureBasic-версию WM_DEVICECHANGE

[Цитировать]

    nikzzzz
  • 215
  • Стаж: 9 лет 2 месяца
  • Сообщений: 3114
  • Репутация:127

    [+] [-]
AZJIO,
53840Можно ещё задействовать WM_DEVICECHANGE, чтобы обновлять список при подключении USB-съёмных носителей.
В WinPe (возможно не во всех) не работает, лучше с интервалом 1-2 секунды опрашивать диски и если они изменились, обновлять.

[Цитировать]

    AZJIO
  • 17953
  • Стаж: 6 лет 1 месяц
  • Сообщений: 1284
  • Репутация:126

    [+] [-]
nikzzzz
Наверно не будет работать там, где при вставке флешки она автоматом не подключается, то есть на старых сборках XP да ещё для внешнего жёсткого диска (не флешки). Если эксплорер увидел подключенное устройство, получается что функция работает, вроде как высокая вероятность работы.

[Цитировать]

    Joker-2013
  • 1039
  • Стаж: 8 лет 10 месяцев
  • Сообщений: 2053
  • Репутация:120

    [+] [-]
  • Откуда: из прошлого
AZJIO, У меня есть процедура детекта, работала во всех пешках...
Ну кроме одной, сильно урезанной, я там добавил библиотеку и всё пошло...
В принципе, ту процедуру и использую...
53845лучше с интервалом 1-2 секунды опрашивать диски и если они изменились, обновлять.
В контексте данной утилиты, детект и не к чему....
Выбираем раздел, происходит событие, проверяем на наличие выбранный раздел, и если его нет, удаляем в списке.

[Цитировать]

    AZJIO
  • 17953
  • Стаж: 6 лет 1 месяц
  • Сообщений: 1284
  • Репутация:126

    [+] [-]
Joker-2013
Суть же не в проверке наличия, а в том что если открыта прога и ты вставляешь флешку для проверки, а она не появляется в списке автоматически, хотя должна, как это происходит в проводнике.

[Цитировать]

    nikzzzz
  • 215
  • Стаж: 9 лет 2 месяца
  • Сообщений: 3114
  • Репутация:127

    [+] [-]
53848 Если эксплорер увидел подключенное устройство, получается что функция работает, вроде как высокая вероятность работы.
Нет, проблема возникла начиная с семерочных сборок, и от этого не зависит.
Событие WM_DEVICECHANGE почему-то не отрабатывается, хотя в полноценной системе все нормально.
По всей видимости в WinPe монтирование новых устройств происходит по другому.
53849В контексте данной утилиты, детект и не к чему....
Ну, например внешний HDD проверить, да и в общем, ChkDsk не самоцель, чисто для обучения, да и полезные решения в будущем не помешают.

[Цитировать]

    Joker-2013
  • 1039
  • Стаж: 8 лет 10 месяцев
  • Сообщений: 2053
  • Репутация:120

    [+] [-]
  • Откуда: из прошлого
53851да и полезные решения в будущем не помешают
Это да...
У меня процедурка отлично работает везде...

[Цитировать]

    nikzzzz
  • 215
  • Стаж: 9 лет 2 месяца
  • Сообщений: 3114
  • Репутация:127

    [+] [-]
AZJIO,
Еще рекомендую поправить Help
Import "user32.lib"
  OemToCharBuffA(*Buff,*Buff1,SizeBuff)
EndImport
Procedure.s ReadProgramStringOem(iPid)
  Protected Ret$=""
  Protected SizeBuff=AvailableProgramOutput(iPid)
  If SizeBuff>0
    Protected *Buff=AllocateMemory(SizeBuff)
    ReadProgramData(iPid,*Buff,SizeBuff)
    OemToCharBuffA(*Buff,*Buff,SizeBuff)
    Ret$=PeekS(*Buff,SizeBuff,#PB_Ascii)
    FreeMemory(*Buff)
  EndIf
  ProcedureReturn Ret$
EndProcedure
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) ; Close the connection to the program
  EndIf
  MessageRequester("Справка", Output$)
EndProcedure
OemA2Ansi(Str$) не нужен.

[Цитировать]

    AZJIO
  • 17953
  • Стаж: 6 лет 1 месяц
  • Сообщений: 1284
  • Репутация:126

    [+] [-]
nikzzzz
Посмотрел вариант ini, там ReadPreferenceString не имеет ни файла ни группы, как я понял файл один открытый, а группы методом Next, пока не будет найдена.
По поводу перемещения окон тоже не вижу функций по работе с внешним окном.

[Цитировать]

    nikzzzz
  • 215
  • Стаж: 9 лет 2 месяца
  • Сообщений: 3114
  • Репутация:127

    [+] [-]
53854По поводу перемещения окон тоже не вижу функций по работе с внешним окном.
Посмотри исходник моей утилиты.

[Цитировать]

    AZJIO
  • 17953
  • Стаж: 6 лет 1 месяц
  • Сообщений: 1284
  • Репутация:126

    [+] [-]
nikzzzz
При выполнении
hwnd = GetConsoleWindow()
выводит 0
а если будет 2 консоли? нужно наверно PID использовать?
шапку обновил, новый скрин, новые задачи.

[Цитировать]

    nikzzzz
  • 215
  • Стаж: 9 лет 2 месяца
  • Сообщений: 3114
  • Репутация:127

    [+] [-]
AZJIO,
53858если будет 2 консоли? нужно наверно PID использовать?
Утилиту я привел только как пример работы с окнами, она использует хэндл окна консоли, из которого она запущена, и соответственно работает только с ним.

[Цитировать]

    nikzzzz
  • 215
  • Стаж: 9 лет 2 месяца
  • Сообщений: 3114
  • Репутация:127

    [+] [-]
AZJIO,
Да, и еще в процедурах лучше объявлять локальные переменные с помощью Protected (аналог Local в Autoit), Define просто определяет переменную, это поможет избежать многих ошибок.

[Цитировать]

    AZJIO
  • 17953
  • Стаж: 6 лет 1 месяц
  • Сообщений: 1284
  • Репутация:126

    [+] [-]
nikzzzz
Тест показывает что вызов функции не изменяет переменную объявленную вне, а в описании как то непонятно. Ну да, Protected даже в описании указано как Local. Но с Define я тоже брал сложные примеры, которые вряд ли могут быть написаны новичками.
Declare variable_visibility_test()
Define.i var = 5
variable_visibility_test()
Debug var
Procedure variable_visibility_test()
  Define.i var = 6
EndProcedure
такой ответ нашёл
Я думаю, что у вас проблема с порядком #include
#define виден во всех строчках, что ниже определения
#include просто подставляет текст включаемого файла вместо этой строчки.
Соотвественно, .h с #define должен включаться перед .h, его использующим.
Как я ранее читал в AutoIt3 2 области глобальная, в которой хоть Local используй, хоть ничего, всё равно она в корне и будет глобальной. И локальная область - внутри функций с Local. А в других языках по крайне мере 4 области, область файла, область всех файлов (тут наверно имеется ввиду Define), область функций-процедур и область циклов (счётчик), естественно под-область видить все над-области любого уровня, а над-области не видят ближайшую под-область.

[Цитировать]

    Joker-2013
  • 1039
  • Стаж: 8 лет 10 месяцев
  • Сообщений: 2053
  • Репутация:120

    [+] [-]
  • Откуда: из прошлого
AZJIO, мне понравилось, что прецедуры у тя в конце кода...
Они объявлены только в начале...
Я когда начинал писать прогу, задолбался, пишет что нет процедуры, приходилось их как карты тасовать...
В итоге, хрен поймешь как расположены...

Страница 7 из 34


Показать сообщения:    

Текущее время: 24-Апр 05:50

Часовой пояс: UTC + 3


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы можете скачивать файлы