Пришлось использовать хакерские методы
Не очень понятно содержание сие кода. Наверно придется оставить все как есть и не запрещать всплывающее меню
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 » Вопросы новичка