purebasic.info

PureBasic forum
Текущее время: Вт мар 19, 2019 6:25 pm

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




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

Зарегистрирован: Чт фев 09, 2017 10:37 am
Сообщений: 417
Благодарил (а): 31 раз.
Поблагодарили: 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
Сообщений: 417
Благодарил (а): 31 раз.
Поблагодарили: 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
Сообщений: 11423
Благодарил (а): 4 раз.
Поблагодарили: 453 раз.
Коз запускается с правами администратора?

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


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

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


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

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11423
Благодарил (а): 4 раз.
Поблагодарили: 453 раз.
Есть функция 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
Сообщений: 417
Благодарил (а): 31 раз.
Поблагодарили: 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
Сообщений: 11423
Благодарил (а): 4 раз.
Поблагодарили: 453 раз.
AZJIO писал(а):
является ли строка указанная в коде нуль-терминированной?
В PB нультерминированные строки.

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


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

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

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


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

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

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

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


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

Зарегистрирован: Чт фев 09, 2017 10:37 am
Сообщений: 417
Благодарил (а): 31 раз.
Поблагодарили: 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
СообщениеДобавлено: Сб мар 16, 2019 8:19 pm 
Не в сети
профессор

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

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
If OpenWindow(0, 0, 0, 220, 100, "Пример...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
        ButtonGadget (1, 10, 60, 200, 30, "Закрыть")
        Delay(2000) ; нужно чтобы элементы окна появились сразу
        Repeat
                Select WaitWindowEvent()
                        Case #PB_Event_Gadget
                                Select EventGadget()
                                        Case 1
                                                CloseWindow(0)
                                                End
                                EndSelect
                        Case #PB_Event_CloseWindow
                                CloseWindow(0)
                                End
                EndSelect
        ForEver
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
f = 1
If OpenWindow(0, 0, 0, 220, 100, "Пример...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
        ButtonGadget (1, 10, 60, 200, 30, "Закрыть")
         ; нужно чтобы элементы окна появились сразу
        Repeat
                Select WaitWindowEvent()
                        Case #PB_Event_Gadget
                                Select EventGadget()
                                        Case 1
                                                CloseWindow(0)
                                                End
                                EndSelect
                        Case #PB_Event_CloseWindow
                                CloseWindow(0)
                                End
                EndSelect
                If f
                        f+1
                        If f = 17 ; у меня 17 минимально чтобы сработало
                                f = 0
                                Delay(2000)
                        EndIf
                EndIf
        ForEver
EndIf



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

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


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

Сейчас этот форум просматривают: Bing [Bot] и гости: 4


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

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