purebasic.info

PureBasic forum
Текущее время: Пн мар 25, 2019 3:47 pm

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




Начать новую тему Ответить на тему  [ Сообщений: 16 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: ChkDskGui
СообщениеДобавлено: Ср авг 22, 2018 9:17 am 
Не в сети
профессор

Зарегистрирован: Чт фев 09, 2017 10:37 am
Сообщений: 422
Благодарил (а): 32 раз.
Поблагодарили: 46 раз.
Пункты репутации: 0
ChkDskGui - утилитка для проверки жёстких дисков с помощью chkdsk.exe

Изображение

yadi.sk
исходник

может есть идеи? или советы по оптимизации...


Последний раз редактировалось AZJIO Вт фев 26, 2019 10:13 am, всего редактировалось 12 раз(а).

Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: ChkDskGui
СообщениеДобавлено: Чт янв 10, 2019 8:43 pm 
Не в сети
профессор

Зарегистрирован: Чт фев 09, 2017 10:37 am
Сообщений: 422
Благодарил (а): 32 раз.
Поблагодарили: 46 раз.
Пункты репутации: 0
Хочу для текущей системы активировать проверку дисков, но не могу ввести данные в реестр. Есть идеи?
Код:
1
2
3
4
5
6
7
8
9
Global hKey.l = 0
Handle = RegOpenKeyEx_(#HKEY_LOCAL_MACHINE, "SYSTEM\CurrentControlSet\Control\Session Manager", 0, #KEY_WRITE, @hKey)
If Handle = #ERROR_SUCCESS
        MessageRequester("Ура", "Ключ открыт")
        param.s="BootExecute"
        res.s = "autocheck autochk /K:C *"
        RegSetValueEx_(hKey, @param, 0, #REG_EXPAND_SZ, @res, Len(res))
        RegCloseKey_(hKey)
EndIf


Судя по всему у меня не работает доступ по правам, так как в другой раздел работает. Запуск от админа работает, тогда нужно сообщение типа "Запусти от админа" в случае ошибки?


Последний раз редактировалось AZJIO Чт янв 10, 2019 9:00 pm, всего редактировалось 1 раз.

Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: ChkDskGui
СообщениеДобавлено: Чт янв 10, 2019 8:59 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11425
Благодарил (а): 4 раз.
Поблагодарили: 454 раз.
Коз запускается с правами администратора?

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: ChkDskGui
СообщениеДобавлено: Чт янв 10, 2019 9:02 pm 
Не в сети
профессор

Зарегистрирован: Чт фев 09, 2017 10:37 am
Сообщений: 422
Благодарил (а): 32 раз.
Поблагодарили: 46 раз.
Пункты репутации: 0
Да запускается и работает, уже проверил... Нужно тогда запрос админа.
Единсвенное пока Len(res) умножаю на два иначе вводится пол строки.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: ChkDskGui
СообщениеДобавлено: Чт янв 10, 2019 9:49 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11425
Благодарил (а): 4 раз.
Поблагодарили: 454 раз.
Есть функция IsUserAdmin. https://docs.microsoft.com/en-us/window ... seranadmin
Вернет не 0 если у приложения права администратора.
Код:
1
Debug IsUserAdmin_()

AZJIO писал(а):
Единсвенное пока Len(res) умножаю на два иначе вводится пол строки.
Код:
1
Debug StringByteLength("1234", #PB_Unicode)


_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: ChkDskGui
СообщениеДобавлено: Вс янв 13, 2019 7:47 am 
Не в сети
профессор

Зарегистрирован: Чт фев 09, 2017 10:37 am
Сообщений: 422
Благодарил (а): 32 раз.
Поблагодарили: 46 раз.
Пункты репутации: 0
Пётр
Код:
1
Debug StringByteLength("1234", #PB_Unicode)


является ли строка указанная в коде нуль-терминированной? Мы обсуждали что MSDN говорит
Цитата:
if the data is of type REG_SZ, REG_EXPAND_SZ, or REG_MULTI_SZ, cbData must include the size of the terminating null character or characters
то есть строка должна содержать NULL в конце, не смотря на то что работает и без него, добавляет сам. То есть добавлять ли 2 байта к StringByteLength(valie, #PB_Unicode), не захватит ли он при это мусор который не является NULL?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: ChkDskGui
СообщениеДобавлено: Вс янв 13, 2019 11:59 am 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 780
Благодарил (а): 2 раз.
Поблагодарили: 37 раз.
Пункты репутации: 9
AZJIO писал(а):
Пётр
Код:
1
Debug StringByteLength("1234", #PB_Unicode)


является ли строка указанная в коде нуль-терминированной? Мы обсуждали что MSDN говорит
Цитата:
if the data is of type REG_SZ, REG_EXPAND_SZ, or REG_MULTI_SZ, cbData must include the size of the terminating null character or characters
то есть строка должна содержать NULL в конце, не смотря на то что работает и без него, добавляет сам. То есть добавлять ли 2 байта к StringByteLength(valie, #PB_Unicode), не захватит ли он при это мусор который не является NULL?


0 это обозначение конца строки asci в юникоде utf16 два 00 служат в винде для указания конца строк
Функция RegSetValueExA
lpData

Данные для хранения.

Для строковых типов, таких как REG_SZ, строка должна иметь нулевое значение . С типом данных REG_MULTI_SZ строка должна заканчиваться двумя нулевыми символами.

Обратите внимание, что lpData, указывающее нулевое значение, является действительным, однако, если это так, cbData должен быть установлен в «0».
cbData

Размер информации, на которую указывает параметр lpData , в байтах. Если данные имеют тип REG_SZ, REG_EXPAND_SZ или REG_MULTI_SZ, cbData должен включать размер завершающего нулевого символа или символов.

из чего следует что если компилишь прогу как юникодную то твоя строка в ней utf16 с двумя 00 и
len() считает количество 16 битных(word=2 байта на символ) юникодных символов без 00 ,и если их нужно для этой функции учитывать в размере то прибавь 2 в байтах будет len()*2+2. :roll:
PS:Обрати внимание что байты в юникоде считать как asci символы нельзя так как в нём может быть в символе в старшем байте 0 что будет расценено как конец строки. :roll:
Утилита chkdsk вроде ещё с доса и наверное работает с asci строкой?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: ChkDskGui
СообщениеДобавлено: Вс янв 13, 2019 12:47 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11425
Благодарил (а): 4 раз.
Поблагодарили: 454 раз.
AZJIO писал(а):
является ли строка указанная в коде нуль-терминированной?
В PB нультерминированные строки.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: ChkDskGui
СообщениеДобавлено: Пн янв 14, 2019 11:50 am 
Не в сети
профессор

Зарегистрирован: Чт фев 09, 2017 10:37 am
Сообщений: 422
Благодарил (а): 32 раз.
Поблагодарили: 46 раз.
Пункты репутации: 0
Что-то бъюсь сколько времени безрезультатно (скачать временную версию)
Код:
1
2
3
If LoadFont(1, Font2$, FontSize)
        SetGadgetFont(#PB_Default, FontID(1))
EndIf


пробую всякие шрифты, какой нибудь заметный "Comic Sans MS", а он упрямо не применяется.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: ChkDskGui
СообщениеДобавлено: Пн янв 14, 2019 2:56 pm 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6503
Благодарил (а): 28 раз.
Поблагодарили: 211 раз.
Пункты репутации: 57
AZJIO писал(а):
пробую всякие шрифты, какой нибудь заметный "Comic Sans MS", а он упрямо не применяется.

Да вроде без проблем
Изображение

_________________
read-only ¯\_(ツ)_/¯


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: ChkDskGui
СообщениеДобавлено: Пн янв 14, 2019 6:09 pm 
Не в сети
профессор

Зарегистрирован: Чт фев 09, 2017 10:37 am
Сообщений: 422
Благодарил (а): 32 раз.
Поблагодарили: 46 раз.
Пункты репутации: 0
kvitaliy писал(а):
Да вроде без проблем
Напрямую работает, но я проверяю при чтении с ini. Я уже ini во всех кодировках попробовал, дебаг выдаёт имя шрифта без проблем.

Заработало, я в ini убрал кавычки. В ini от Windws при обработке значений содержащих пробелы нужно заключать значение в кавычки. Я уже вроде второй раз с этим пролетаю.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: ChkDskGui
СообщениеДобавлено: Вт янв 15, 2019 7:18 am 
Не в сети
профессор

Зарегистрирован: Вт май 13, 2014 4:12 am
Сообщений: 784
Благодарил (а): 76 раз.
Поблагодарили: 23 раз.
Пункты репутации: 5
AZJIO писал(а):
Заработало, я в ini убрал кавычки. В ini от Windws при обработке значений содержащих пробелы нужно заключать значение в кавычки. Я уже вроде второй раз с этим пролетаю

первый раз о таком слышу, в моих программах работает, все пути с пробелами, аж полез посмотрел

было дело когда в строке первым символом был пробел, вот его пришлось шифровать, при чтении дешифрировать, иначе его просто выбрасывало, а без него никак нельзя было


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: ChkDskGui
СообщениеДобавлено: Сб мар 09, 2019 1:16 am 
Не в сети
профессор

Зарегистрирован: Чт фев 09, 2017 10:37 am
Сообщений: 422
Благодарил (а): 32 раз.
Поблагодарили: 46 раз.
Пункты репутации: 0
Как лучше удалить пункт из меню, если он не имеет необходимости? Допустим нет файла справки, тогда можно было бы убрать пункт при запуске программы, но событие то остаётся. Теоретически оно не сработает, если нет пункта его активирующего. Получается убирать из цикла событий не обязательно.

И ещё, при вызове справки получаю из консоли текст и отправляю в мессагу, но ширина мессаги почему то у всех разная и много переносов и не умещается по высоте. Может сделать калбэк на мессагу чтобы сделать её шире? Где-то я видел использование калбэка.

переоборудовал один из примеров
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
; Автор: Unbekannt
 
EnableExplicit
 
#IDOK = 1
#IDCANCEL = 2
#IDABORT = 3
#IDRETRY = 4
#IDIGNORE = 5
#IDYES = 6
#IDNO = 7
#IDPROMPT = $FFFF
#StringSpace = 100
 
Global hHook
Global mbtitle$, mbmsg$, mbopt1$, mbopt2$, mbopt3$
Define Result
 
Procedure MsgBoxHookProc (uMsg, wParam, lParam)
  If uMsg = #HCBT_ACTIVATE
    SetWindowText_ (wParam, mbtitle$)
    SetDlgItemText_ (wParam, #IDABORT, mbopt1$)
    SetDlgItemText_ (wParam, #IDRETRY, mbopt2$)
    SetDlgItemText_ (wParam, #IDIGNORE, mbopt3$)
    SetDlgItemText_ (wParam, #IDPROMPT, mbmsg$)
    SetWindowPos_(wParam,0,0,0,1000,500,0)
    UnhookWindowsHookEx_ (hHook)
  EndIf
  ProcedureReturn #False
EndProcedure
 
Procedure MessageBoxH (parentWindow, title$, message$, button1$, button2$, button3$)
  Protected hInstance, hThreadId
 
  mbtitle$ = title$
  mbmsg$ = message$
  mbopt1$ = button1$
  mbopt2$ = button2$
  mbopt3$ = button3$
  hInstance = GetModuleHandle_ (0)
  hThreadId = GetCurrentThreadId_ ()
  hHook = SetWindowsHookEx_ (#WH_CBT, @MsgBoxHookProc (), hInstance, hThreadId)
 
  ProcedureReturn MessageBox_ (parentWindow, Space (#StringSpace), Space (#StringSpace), #MB_ABORTRETRYIGNORE | #MB_ICONQUESTION)
EndProcedure
 
Result = MessageBoxH (0, "Поиск программы на...", "Пожалуйста, ищите на диске...", "Поиск на C:\", "Поиск на D:\", "Отмена")
If Result = #IDABORT
  MessageRequester("","Был выбран диск C:\")
ElseIf Result = #IDRETRY
  MessageRequester("","Был выбран диск D:\")
ElseIf Result = #IDIGNORE
  MessageRequester("","Была выбрана отмена")
EndIf



ничего не удаётся, кнопка посреди окна
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
EnableExplicit
 
#IDOK = 1
#IDCANCEL = 2
#IDABORT = 3
#IDRETRY = 4
#IDIGNORE = 5
#IDYES = 6
#IDNO = 7
#IDPROMPT = $FFFF
#StringSpace = 100
 
Global hHook
Global mbtitle$, mbmsg$, mbopt1$, mbopt2$, mbopt3$
Define Result
 
Procedure MsgBoxHookProc (uMsg, wParam, lParam)
        If uMsg = #HCBT_ACTIVATE
                SetWindowText_ (wParam, mbtitle$)
                ;     SetDlgItemText_ (wParam, #IDABORT, mbopt1$)
                ;     SetDlgItemText_ (wParam, #IDRETRY, mbopt2$)
                ;     SetDlgItemText_ (wParam, #IDIGNORE, mbopt3$)
                SetDlgItemText_ (wParam, #IDPROMPT, mbmsg$)
                SetWindowPos_(wParam,#HWND_TOPMOST,0,0,1000,700,0)
                UnhookWindowsHookEx_ (hHook)
        EndIf
        ProcedureReturn #False
EndProcedure
 
Procedure MessageBoxH (parentWindow, title$, message$)
        Protected hInstance, hThreadId
 
        mbtitle$ = title$
        mbmsg$ = message$
        hInstance = GetModuleHandle_ (0)
        hThreadId = GetCurrentThreadId_ ()
        hHook = SetWindowsHookEx_ (#WH_CBT, @MsgBoxHookProc (), hInstance, hThreadId)
 
        ProcedureReturn MessageBox_ (parentWindow, Space (#StringSpace), Space (#StringSpace), #MB_OK)
EndProcedure
 
Import "user32.lib"
        OemToCharBuffA(*Buff,*Buff1,SizeBuff)
EndImport
 
Procedure.s ReadProgramStringOem(iPid)
        Protected Ret$="", *Buff, SizeBuff=AvailableProgramOutput(iPid)
        If SizeBuff>0
                *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$ = "", Color$
        If Prog
                While ProgramRunning(Prog)
                        Output$ + ReadProgramStringOem(Prog)
                Wend
                CloseProgram(Prog)
        EndIf
        Output$=ReplaceString(Output$, #CRLF$ + #CRLF$ + #CRLF$, #CRLF$ + #CRLF$) ; чтобы на экран умещалось
        Output$=ReplaceString(Output$, #CRLF$ + "                      ", " ")    ; чтобы на экран умещалось
                                                                                                                                                          ;     Output$ = ""
        If Bool(Output$)
                ;               MessageRequester("Справка", Output$)
                ;               MessageBoxH (0, "Справка", "ага")
                MessageBoxH (0, "Справка", Output$)
        EndIf
EndProcedure
 
HelpChkdsk()
 


в принципе в AutoIt3 варианте тоже нет манипуляции с размером, только с позиционированием. Похоже это просто не работает.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: ChkDskGui
СообщениеДобавлено: Сб мар 09, 2019 1:57 pm 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 780
Благодарил (а): 2 раз.
Поблагодарили: 37 раз.
Пункты репутации: 9
Сделай своё всплывающее окно с текстовым гаджетом заместо мессаги. :roll:


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: ChkDskGui
СообщениеДобавлено: Пт мар 22, 2019 11:01 am 
Не в сети
профессор

Зарегистрирован: Чт фев 09, 2017 10:37 am
Сообщений: 422
Благодарил (а): 32 раз.
Поблагодарили: 46 раз.
Пункты репутации: 0
Если есть желание посмотрите временную версию
Ранее я написал:
Цитата:
Прога медленно запускается если диски раскручиваются. Как сделать чтобы окно со всем интерфейсом появилось сразу, а диски в него добавлялись?

Теперь удалил тот код, потому что решение было сделать второй поток, который добавляет диски. Из-за этого переписал почти весь код, проблема в том что функция GetVolumeInformation при обращении к дискам хотя бы к одному принуждает раскручиваться и окно всё равно наполняется не по одному диску останавливаясь на тех которые раскручиваются, а ждёт пока все не раскрутятся потом разом все добавляет. В итоге сделал пшик. Может я чего не так делаю, у кого есть такие диски проверьте. Можно индивидуально проверить этот код, может там CreateFile принуждает раскручиваться, но похоже от этого не избавиться, потому что урезать функционал ради этого нет смысла, можно только добавить окно "Подождите идёт сканирование дисков".


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 16 ]  На страницу 1, 2  След.

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


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9


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

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB