Отлавливание событий в WebGadget
|
|
haav | Дата: Четверг, 25.10.2012, 13:24 | Сообщение # 1 |
Генералиссимус
Группа: Администраторы
Сообщений: 1373
Статус: Offline
| Отлавливание событий в WebGadget
Я понимаю что эта тема может висеть очень долго без ответа. Скорее всего ответа так и не дождусь, но кто знает вдруг волшебник с голубым вертолетом заглянет на вечеринку. В сети на этот вопрос ответа не нашел. Вообще пришел к выводу что в сети можно найти ответы только на легкие вопросы или вопросы ниже средней сложности Наверное это из-за качества сегодняшних людей/программистов.
К самому вопросу: окно создается на базе библиотеки ATL. То есть это окошко по сути браузер Internet Explorer . Как отловить события поступающие в него и изменить данные? К примеру перед тем как загрузится страница, нужно отловить ее адрес и изменить. Понял что это как-то связано с обработчиком DWebBrowserEvents2, но вот на этом и тупик. Этот вопрос я задавал на оф. сайте freebasic, еще на одном форуме по freebasic, но безрезультатно.
Для тех кто не знаком с моей библиотекой, пишу независимый от моей библиотеки код WebGadget и простой пример его использования:
Code #Include Once "windows.bi" #Include "win/exdisp.bi"
Dim Shared IWebBrowser As IWebBrowser2Vtbl Ptr Dim Shared As HWND hwndmain Dim msg As MSG Dim As WNDCLASSEX wc Dim As String NameClass="MyClass" Dim As HINSTANCE Hinst=GetModuleHandle(0)
Function WebGadget(ByVal Gadget As Integer,ByVal x As Integer,ByVal y As Integer,ByVal Width_ As Integer,ByVal Height_ As Integer,ByVal URL As String=" ",ByVal par1 As Integer=0,ByVal par2 As Integer=0) As Integer Ptr Export Dim i As Integer Dim pIWebBrowser As Integer Ptr Dim AtlAxWinInit As Function As Boolean Dim AtlAxGetControl As Function (ByVal hWin As HWND,ByRef pp As Integer Ptr) As Integer Dim pIUnknown As Integer Ptr Dim IUnknown As IUnknownVtbl Ptr Var hDll=LoadLibrary("atl.dll") If hDll Then AtlAxWinInit=Cast(Any Ptr,GetProcAddress(hDll,"AtlAxWinInit")) AtlAxGetControl=Cast(Any Ptr,GetProcAddress(hDll,"AtlAxGetControl")) If AtlAxWinInit() Then Var hWeb=CreateWindowEx(par2,"AtlAxWin",URL,WS_CHILD Or WS_VISIBLE Or par1,x,y,width_,height_,hwndMain,Cast(HMENU,gadget),0,0) AtlAxGetControl(hWeb,pIUnknown) IUnknown=Cast(IUnknownVtbl Ptr,*pIUnknown) i=IUnknown->AddRef(Cast(IUnknown Ptr,pIUnknown)) i=IUnknown->QueryInterface(Cast(IUnknown Ptr,pIUnknown),@IID_IWebBrowser2,@pIWebBrowser) IWebBrowser=Cast(IWebBrowser2Vtbl Ptr,*pIWebBrowser) i=IWebBrowser->AddRef(Cast(IWebBrowser2 Ptr,pIWebBrowser)) i=IUnknown->Release(Cast(IUnknown Ptr,pIUnknown)) Return pIWebBrowser EndIf EndIf End Function
Function WebGadgetNavigate(ByVal pIWebBrowser As Integer Ptr,ByVal URL As WString Ptr) As Integer Export If *URL<>"" Then Return IWebBrowser->Navigate(Cast(IWebBrowser2 Ptr,pIWebBrowser),Cast(BSTR,URL),NULL,NULL,NULL,NULL) EndIf End Function
Function wndproc(hwnd As HWND, msg As UInteger,_ wparam As WPARAM, lparam As LPARAM) As Integer Select Case msg Case WM_DESTROY PostQuitMessage(0) End Select Return DefWindowProc(hwnd,msg,wparam,lparam) End Function
With wc .cbSize=SizeOf(WNDCLASSEX) .style=CS_HREDRAW Or CS_VREDRAW .lpfnWndProc=@wndproc .hInstance=Hinst .hIcon=LoadIcon(0,IDI_QUESTION) .hCursor=LoadCursor(0,IDC_ARROW) .hbrBackground=Cast(HBRUSH,COLOR_WINDOWFRAME) .lpszClassName=StrPtr(NameClass) .hIconSm=.hIcon End With
If RegisterClassEx(@wc)=0 Then Print "Register error, press any key" Sleep End EndIf
hwndmain = CreateWindowEx(0,NameClass,"",_ WS_VISIBLE Or WS_OVERLAPPEDWINDOW,100,100,500,350,0,0,Hinst,0) WebGadget(1,10,10,480,300,"www.ya.ru")
While GetMessage(@msg,0,0,0) TranslateMessage(@msg) DispatchMessage(@msg) Wend
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
ShadEx | Дата: Четверг, 15.11.2012, 23:06 | Сообщение # 2 |
Лейтенант
Группа: Проверенные
Сообщений: 51
Статус: Offline
| Тут чистым ATL не обойтись, так как это MFC, а не ВинАпи, здесь нужно через IDispatch-интерфейс ловить события - вот нашел в гугле по словосочетанию "basic +DWebBrowserEvents2":
http://purebasic.info/phpBB2/viewtopic.php?p=15988 (код в последнем посте)
|
|
| |
haav | Дата: Пятница, 16.11.2012, 08:58 | Сообщение # 3 |
Генералиссимус
Группа: Администраторы
Сообщений: 1373
Статус: Offline
| Quote (ShadEx) Тут чистым ATL не обойтись, так как это MFC, а не ВинАпи, здесь нужно через IDispatch-интерфейс ловить события - вот нашел в гугле по словосочетанию "basic +DWebBrowserEvents2": http://purebasic.info/phpBB2/viewtopic.php?p=15988 (код в последнем посте)
Спасибо большое вам, судя по всему это как раз то, что я искал. Сейчас позапускал код, события ловятся. Там правда баги с вылетами в программе, но меня они мало интересуют , самое главное в коде есть принцип отлова событий. Можно сказать этот вопрос решен
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
ShadEx | Дата: Пятница, 16.11.2012, 22:14 | Сообщение # 4 |
Лейтенант
Группа: Проверенные
Сообщений: 51
Статус: Offline
|
Мы же вроде условились - не "вам", а "тебе"
Quote Там правда баги с вылетами в программе
Сам по себе этот объект IE достаточно глюкавый - он продолжает висеть в памяти не только при неожиданном вылете программы, но даже при обычном иногда, так что после 5 запусков/закрытий окна программы могут остаться в памяти 2-3 лишних процесса "IEXPLORE.EXE"...
Сообщение отредактировал ShadEx - Пятница, 16.11.2012, 22:15 |
|
| |
haav | Дата: Суббота, 17.11.2012, 08:01 | Сообщение # 5 |
Генералиссимус
Группа: Администраторы
Сообщений: 1373
Статус: Offline
| Quote (ShadEx) Мы же вроде условились - не "вам", а "тебе"
Пардон, я забыл. На разных форумах , разные люди требуют разного рода отношение к себе. И ведь некоторые настолько "взрослые" , что обижаются , когда к ним обращаются на ТЫ
Quote (ShadEx) Сам по себе этот объект IE достаточно глюкавый - он продолжает висеть в памяти не только при неожиданном вылете программы, но даже при обычном иногда, так что после 5 запусков/закрытий окна программы могут остаться в памяти 2-3 лишних процесса "IEXPLORE.EXE"...
Это ты говоришь о всех версиях IE , или о определенном? Я практически никогда IE не пользуюсь. Для меня всегда была актуальна OPERA. Привык к ней как-то, хотя все версии >10 тоже содержат немало глюков. Но что поделаешь, без глюков видно ничего не бывает .
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
ShadEx | Дата: Суббота, 17.11.2012, 15:24 | Сообщение # 6 |
Лейтенант
Группа: Проверенные
Сообщений: 51
Статус: Offline
| Quote (haav) Это ты говоришь о всех версиях IE , или о определенном?
Я говорю о самом объекте iWebBrowser, который встраивает IE в приложение.
Quote (haav) Но что поделаешь, без глюков видно ничего не бывает
Ну почему - посл. версии Огнелиса и Хрома работают очень стабильно, - лично я ни разу не замечал чтоб их процессы полностью вышибло из памяти по неизвестной причине... Ну про встраивание Огнелиса можно забыть (они еще два года назад прекратили разработку эмбеддед движка), а вот Хром очень даже встраиваемый и даже есть отдельная библиотека с полным описанием АПИ(правда, под С++) - http://www.awesomium.com
|
|
| |
haav | Дата: Воскресенье, 18.11.2012, 08:36 | Сообщение # 7 |
Генералиссимус
Группа: Администраторы
Сообщений: 1373
Статус: Offline
| Quote (ShadEx) а вот Хром очень даже встраиваемый и даже есть отдельная библиотека с полным описанием АПИ(правда, под С++) - http://www.awesomium.com
Спасибо за наводку
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
haav | Дата: Понедельник, 26.11.2012, 08:33 | Сообщение # 8 |
Генералиссимус
Группа: Администраторы
Сообщений: 1373
Статус: Offline
| Код отлова событий WebGadget разместил ЗДЕСЬ.
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
|