Пришлось использовать хакерские методы
Не очень понятно содержание сие кода. Наверно придется оставить все как есть и не запрещать всплывающее меню
PureBasic - форум |
Привет, Гость! Войдите или зарегистрируйтесь.
Вы здесь » PureBasic - форум » Вопросы по PureBasic » Вопросы новичка
Пришлось использовать хакерские методы
Не очень понятно содержание сие кода. Наверно придется оставить все как есть и не запрещать всплывающее меню
Не очень понятно содержание сие кода.
Если в двух словах, то этот код перехватывает и блокирует нажатия и отпускания правой кнопки мышки в WebGadget'е.
WebGadget даже не "подозревает" что по нему кликнули правой кнопкой мышки, т. к. до него эти сообщения ОС не доходят.
Собственно перехват осуществляется в процедуре Web_WndProc
Процедура enumChildren нужна для поиска окна IE, имеющего класс Internet Explorer_Server установки перехвата на хендл IE.
Причём поиск нужно начинать не сразу, а через некоторое время (2 секунды вполне достаточно), а иначе, мы получим не текущий хендл IE.
Я на 100% доверяю тебе Петр, но спрошу, если я даже поставлю данную фичу в свою прогу, она точно заработает и не даст ошибок в критический (незапланированный) момент? И будет ли данная техника влиять как то на скорость работы программы?
если я даже поставлю данную фичу в свою прогу, она точно заработает и не даст ошибок в критический (незапланированный) момент
Если в винде не будет косяков, то всё должно работать нормально. 
На скрость работы проги это почти не повлияет, по крайней мере, не будет заметно даже на слабых компах.
Если интересно, поиск дочерних окон с помощью API функции EnumChildWindows (она вызывает процедуру enumChildren) обсуждался здесь http://purebasic.info/phpBB2/viewtopic. … t=30#16828
Перехват сообщений винды для гаджета, обсуждался здесь http://purebasic.info/phpBB2/viewtopic.php?t=797
Спасибо, значит бояться нечего. Меня интересует такой вопрос: я создал txt файлы и назначил им свой формат (mf). Как мне всем этим файлам с данным форматом прикрепить свою иконку программы? И что бы они не отображались как txt иконки?
Прошу прощения что так много вопросов, просто что то замордовал меня этот браузер. Посмотрите что не так делаю. Мне нужно по клику записи списка открывать (загружать в браузер) определенный файл - тот, по имени которого я кликнул. Делаю следующее:
Case #Listview_5
If EventType()=#PB_EventType_LeftClick
WebOpen()
EndIfгде WebOpen() это:
Procedure WebOpen();процедура загрузки в браузер zap.s=GetGadgetText(#ListIcon_5) SetGadgetText(#Web_1,"file://"+GetPathPart(ProgramFilename())+"data\help\muscules\"+zap+".mht") EndProcedure
после SetGadgetText(#Web_1,"file://"+GetPathPart(ProgramFilename())+"data\help\muscules\"+zap+".mht")
надо перезагрузить браузер
SetGadgetState(#Web_1, #PB_Web_Refresh)
Отредактировано mirashic (02.05.2010 22:55:47)
Как мне всем этим файлам с данным форматом прикрепить свою иконку программы?
В библиотеке Droopy Library есть функция AssociateFile, которая ассоциирует расширение файла с программой.
Вот с её помощью можно установить желаемую иконку для требуемого расширения файла.
Делаю следующее:
А что при этом происходит?
Вставь в конец процедуры эту строку и посмотри правильно ли генерируется путь к файлу.
Debug GetPathPart(ProgramFilename())+"data\help\muscules\"+zap+".mht"
надо перезагрузить браузер
очень хорошее замечание. Учту
Вставь в конец процедуры эту строку и посмотри правильно ли генерируется путь к файлу.
при проверки выяснил, что не появляется окно отладчика, видимо на данное событие и действие вообще не реагирует. Странно
что не появляется окно отладчика
Отладчик включён?
Поставь точку остановки (кнопка F9) на одну из строк процедуры.
Если отладчик включён и будет выполняться код процедуры, работа программы остановится при достижении строки с точкой остановки.
Отладчик включён?
Включен. Ставлю F9 на начало (первую строчку)процедуры и ничего. Видимо она вообще не открывается. Странно. Может событие не правильно прописал для ListIconGadget?
PS: проблема решилось сама. Ругаем невнимательность))
Отредактировано daiomik (03.05.2010 13:18:46)
Привет !
Вопрос по потокам...
В процедуру можно передать только один параметр и то число ?
А как передать строку ?
Можно объявить их глобальными и тогда получается, а если не объявлять ?
Enumeration
#Window_0
#but
EndEnumeration
;Global URL.s
Procedure LSDH(*x)
Debug *x
Debug URL.s
EndProcedure
OpenWindow (#Window_0,0,0,380,200,"Окно",#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
ButtonGadget(#but, 15, 70,90, 20,"Загрузить")
Repeat
Event = WaitWindowEvent()
Window = EventWindow()
Gadget = EventGadget()
Select Event
Case #PB_Event_Gadget
Select EventGadget()
Case #but
If IsThread(ThreadID)= 0
URL.s= "http://195.5.125.6:8000/"
ThreadID=CreateThread(@LSDH(), 23)
Else
MessageRequester("", "Программа занята!", #MB_OK|#MB_ICONWARNING)
EndIf
EndSelect
EndSelect
If Event = #PB_Event_CloseWindow
Break
EndIf
ForEverОтредактировано mirashic (03.05.2010 21:34:53)
В процедуру можно передать только один параметр и то число ?
Подумай что будет если передать не просто число, а указатель на что-либо, скажем на строку или на структуру (так можно передать сразу несколько параметров)?
В итоге получим желаемый результат. 
Enumeration
#Window_0
#but
EndEnumeration
;Global URL.s
Procedure LSDH(*x)
Debug PeekS(*x)
EndProcedure
OpenWindow (#Window_0,0,0,380,200,"Окно",#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
ButtonGadget(#but, 15, 70,90, 20,"Загрузить")
Repeat
Event = WaitWindowEvent()
Window = EventWindow()
Gadget = EventGadget()
Select Event
Case #PB_Event_Gadget
Select EventGadget()
Case #but
If IsThread(ThreadID)= 0
URL.s= "http://195.5.125.6:8000/"
ThreadID=CreateThread(@LSDH(), @URL)
Else
MessageRequester("", "Программа занята!", #MB_OK|#MB_ICONWARNING)
EndIf
EndSelect
EndSelect
If Event = #PB_Event_CloseWindow
Break
EndIf
ForEver!!! Спасибо.
Объявить много разных параметров - глобальными, для меня понятней.
На что это влияет, это плохо ?
Отредактировано mirashic (03.05.2010 21:57:48)
На что это влияет, это плохо ?
Ну я бы не сказал бы.
С указателями часто работаю и глюков как правило нет.
Про указатели можно прочитать здесь http://pure-basic.narod.ru/docs/point.html
Добавил поток в FM плеер, теперь появилась возможность перетягивать окно пока идёт загрузка
и появилась возможность добавить примитивную индикацию загрузки.
Повесил "поток" на три кнопки с разным кодом, Всё работает.
Потом для уменьшения строк кода, решил вынести код "потока" в отдельную процедуру,
и получается при быстром нажатии на разные кнопки вызываются несколько одновременно работающих процедур...
Отказался от сокращения строк кода...
Не знаю понятна ли мысль...
Получается одну и туже процедуру можно вызывать одновременно несколько раз.
Объявить много разных параметров - глобальными, для меня понятней.На что это влияет, это плохо ?
Насколько я понимаю, программисты уменьшают кол-во глобальных переменных только из расчета уменьшения расходуемой памяти приложением. То есть локальная после выхода из функции ликвидируется и после первой же записи в стек освобождает занимаемую ей память. Глобальная же будет занимать память постоянно, пока работает приложение. если программа нересурсоемкая, то такой вещи как глобальная переменная, вообще не стоит уделять внимание(сколько надо, столько и использовать).
Получается одну и туже процедуру можно вызывать одновременно несколько раз
Да.
Причём процедура может вызывать саму себя и всё будет нормально работать.
Вот прмер вызова процедуры и неё же.
Global v=0
Procedure x(Directory$)
If Right(Directory$,1)<>"\":Directory$ + "\":EndIf
z=ExamineDirectory(#PB_Any, Directory$, "*.*")
v=v+1
If v>1000 ; Это чтобы не сканировать весь диск - долго очень
End
EndIf
If z
While NextDirectoryEntry(z)
EntryName.s=DirectoryEntryName(z)
If EntryName = "." Or EntryName = ".."
Continue
EndIf
If DirectoryEntryType(z) = #PB_DirectoryEntry_Directory
x(Directory$+EntryName) ; Процедура вызывает сама себя **************************
EndIf
Debug Directory$+" "+DirectoryEntryName(z)
Wend
FinishDirectory(z)
EndIf
EndProcedure
x("C:\")Подскажите как в данной программе ПРАВИЛЬНО и грамотно отразить содержание папок в ListIconGadget. Суть такая: пользователь кликает 2 раза по ExplorerTreeGadget, а в ListIconGadget отображаются папки вложенные внутрь каталога ExplorerTreeGadget по которому кликнули.(сам еле понял что сказал
)
Я так понял данную задачу нужно осуществить с помощью функций каталогов, то есть сначала узнать содержание и количество котологов, находящихся внутри папки по которой кликнули. Затем с помощью цикла и команды AddGadgetItem() добавлять строки в ListIconGadget.
PS. код забыл прикрепить)
; PureBasic Visual Designer v3.95 build 1485 (PB4Code)
;- Window Constants
;
Enumeration
#Window_0
EndEnumeration
;- MenuBar Constants
;
Enumeration
#MenuBar_0
EndEnumeration
Enumeration
#MENU_1
#MENU_2
#MENU_4
EndEnumeration
;- Gadget Constants
;
Enumeration
#ExplorerTree_0
#ListIcon_0
EndEnumeration
Procedure Open_Window_0()
If OpenWindow(#Window_0, 263, 81, 409, 284, "Papki", #PB_Window_SystemMenu | #PB_Window_TitleBar | #PB_Window_ScreenCentered )
If CreateMenu(#MenuBar_0, WindowID(#Window_0))
MenuTitle("Файл")
MenuItem(#MENU_1, "О программе")
MenuBar()
MenuItem(#MENU_2, "Выход")
EndIf
If CreateGadgetList(WindowID(#Window_0))
ExplorerTreeGadget(#ExplorerTree_0, 5, 5, 190, 255, "")
ListIconGadget(#ListIcon_0, 200, 5, 205, 255, "Название папки", 200,#PB_ListIcon_GridLines)
EndIf
EndIf
EndProcedure
Open_Window_0()
Repeat
event=WaitWindowEvent()
gadget=EventGadget()
type=EventType()
If event=#PB_Event_Gadget And gadget=#ExplorerTree_0
If type=#PB_EventType_LeftDoubleClick
path.s=GetGadgetText(#ExplorerTree_0)
SetGadgetItemText(#ListIcon_0,-1,path)
EndIf
EndIf
Until event=#PB_Event_CloseWindowОтредактировано daiomik (20.06.2010 14:21:01)
Я так понял что нужно отобразить только папки без файлов.
; PureBasic Visual Designer v3.95 build 1485 (PB4Code)
;- Window Constants
;
Enumeration
#Window_0
EndEnumeration
;- MenuBar Constants
;
Enumeration
#MenuBar_0
EndEnumeration
Enumeration
#MENU_1
#MENU_2
#MENU_4
EndEnumeration
;- Gadget Constants
;
Enumeration
#ExplorerTree_0
#ListIcon_0
EndEnumeration
Procedure Open_Window_0()
If OpenWindow(#Window_0, 263, 81, 409, 284, "Papki", #PB_Window_SystemMenu | #PB_Window_TitleBar | #PB_Window_ScreenCentered )
If CreateMenu(#MenuBar_0, WindowID(#Window_0))
MenuTitle("Файл")
MenuItem(#MENU_1, "О программе")
MenuBar()
MenuItem(#MENU_2, "Выход")
EndIf
If CreateGadgetList(WindowID(#Window_0))
ExplorerTreeGadget(#ExplorerTree_0, 5, 5, 190, 255, "")
ListIconGadget(#ListIcon_0, 200, 5, 205, 255, "Название папки", 200,#PB_ListIcon_GridLines)
EndIf
EndIf
EndProcedure
Open_Window_0()
Repeat
event=WaitWindowEvent()
gadget=EventGadget()
type=EventType()
If event=#PB_Event_Gadget And gadget=#ExplorerTree_0
If type=#PB_EventType_LeftDoubleClick
path.s=GetGadgetText(#ExplorerTree_0)
SetGadgetItemText(#ListIcon_0,-1,path)
If FileSize(path) = -2 ; Это папка
ClearGadgetItems(#ListIcon_0) ; Очистка таблицы
If ExamineDirectory(0, path, "*.*") ; Сканируем папку
While NextDirectoryEntry(0)
If DirectoryEntryType(0) = #PB_DirectoryEntry_Directory ; Нашли вложеную папку
Name.s=DirectoryEntryName(0)
If Name<>"." And Name<>".."
AddGadgetItem(#ListIcon_0, -1, Name)
EndIf
EndIf
Wend
FinishDirectory(0)
EndIf
EndIf
EndIf
EndIf
Until event=#PB_Event_CloseWindowСпасибо!
Я так понял что нужно отобразить только папки без файлов.
совершенно верно. Просто хотелось понять суть. А что разе с файлами сложнее будет. Верней суть не такая же?
Для файлов нужно наверно это указывать:
If ExamineDirectory(0, Directory$, "*.*")
While NextDirectoryEntry(0)
If DirectoryEntryType(0) = [b]#PB_DirectoryEntry_File[/b]
Type$ = " [File] "
Else
Type$ = " [Sub-Dir] "
EndIf
Debug DirectoryEntryName(0) + Type$ + "- Size in byte: " + Str(DirectoryEntrySize(0))
Wend
FinishDirectory(0)
EndIfОтредактировано daiomik (20.06.2010 15:03:17)
А что разе с файлами сложнее будет
Нет.
Просто сейчас проверяется файл это или папка.
Если нужно отображать то и другое, то нет смысла в этой проверке.
то нет смысла в этой проверке
Точно! Жаль что сразу не сообразил. Это получается, если немного (точнее больше чем немного) помучиться, то можно создать слабенький аналог ТоталКомандера?
можно создать слабенький аналог ТоталКомандера
Можно.
А можно сделать полноценный аналог, правда, для этого понадобится много помучится (вмысле много кода написать).
Но в этом случае, логичнее будет использовать ExplorerListGadget
If OpenWindow(0, 0, 0, 700, 400, "ExplorerListGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) ExplorerListGadget(0, 10, 10, 680, 380, "*.*", #PB_Explorer_MultiSelect) Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow EndIf
Как упростить выбор время в программе. То есть мне нужно что бы пользователь выбрал конкретное время, например: 08:30 или 12:00 и тп. Возможно через SpinGadget или еще как? Главное свести на нет, что бы пользователь что то набирал в StringGadget во избежания ошибок. Надеюсь понятно выразился)
Нужен именно формат ЧЧ:ММ, или достаточно запретить вводить всё кроме чисел и двоеточия?
Но в любом случае, нужно будет ставить фильтр на StringGadget http://purebasic.info/phpBB2/viewtopic.php?t=797
было бы красиво если пользователь работал с ЧЧ:ММ, но и с запретом тоже можно. Не принципиально. Главное, что бы пользователь не ввел вместо 08:00 скажем 08;00 или 8:0 и тп
Со временем решил. А не подскажете как в ListIconGadget добавлять колонки не в первый столбик, а во второй, третий и тп. А то при использовании AddGadgetItem(#ListIcon_0,1,XXX) добавление происходит только в первый столбик
PS: Разобрался сам. Нужно было использовать символ Chr(10). Все работает, но только я не сильно пойму его значение. Вывел сие символ в отладчик и там загогулина появилась типа []
Отредактировано daiomik (20.06.2010 19:09:01)
добавлять колонки не в первый столбик, а во второй, третий и тп
Для этого используется функция SetGadgetItemText.
Второй её аргумент - номер строки, а четвёртый - номер колонки.
If OpenWindow(0, 100, 100, 300, 100, "ListIcon Example", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
ListIconGadget(0, 5, 5, 290, 90, "1", 50, #PB_ListIcon_FullRowSelect|#PB_ListIcon_AlwaysShowSelection|#PB_ListIcon_GridLines)
AddGadgetColumn(0, 1, "2", 50)
AddGadgetColumn(0, 2, "3", 50)
AddGadgetColumn(0, 3, "4", 50)
AddGadgetItem(0, -1, "1")
AddGadgetItem(0, -1, "2")
SetGadgetItemText(0,0,"3",1)
SetGadgetItemText(0,1,"4",1)
SetGadgetItemText(0,0,"5",2)
SetGadgetItemText(0,1,"6",2)
SetGadgetItemText(0,0,"7",3)
SetGadgetItemText(0,1,"8",3)
Repeat
Event = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow
EndIf| Вопросы новичка (продолжение…) | Вопросы по PureBasic | 29.06.2024 |
| Скорее, это теоретический вопрос о правах в директории. | OffTop | 16.09.2022 |
| Вопрос по отладке | Вопросы по PureBasic | 26.01.2017 |
| Три вопроса по созданию браузера. | Вопросы по PureBasic | 01.11.2010 |
| вопрос о точности типов данных | Вопросы по PureBasic | 20.05.2021 |
Вы здесь » PureBasic - форум » Вопросы по PureBasic » Вопросы новичка