FreeBasic
Главная
Вход
Регистрация
Понедельник, 30.12.2024, 19:54Приветствую Вас Гость | RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Отлавливание событий в WebGadget
haavДата: Четверг, 25.10.2012, 13:24 | Сообщение # 1
Генералиссимус
Группа: Администраторы
Сообщений: 1373
Репутация: 50
Статус: Offline
Отлавливание событий в WebGadget


Я понимаю что эта тема может висеть очень долго без ответа. Скорее всего ответа так и не дождусь, но кто знает вдруг волшебник с голубым вертолетом заглянет на вечеринку. В сети на этот вопрос ответа не нашел. Вообще пришел к выводу что в сети можно найти ответы только на легкие вопросы или вопросы ниже средней сложности cool Наверное это из-за качества сегодняшних людей/программистов.

К самому вопросу: окно создается на базе библиотеки 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
Репутация: 1
Статус: Offline
Тут чистым ATL не обойтись, так как это MFC, а не ВинАпи, здесь нужно через IDispatch-интерфейс ловить события - вот нашел в гугле по словосочетанию "basic +DWebBrowserEvents2":

http://purebasic.info/phpBB2/viewtopic.php?p=15988 (код в последнем посте)
 
haavДата: Пятница, 16.11.2012, 08:58 | Сообщение # 3
Генералиссимус
Группа: Администраторы
Сообщений: 1373
Репутация: 50
Статус: Offline
Quote (ShadEx)
Тут чистым ATL не обойтись, так как это MFC, а не ВинАпи, здесь нужно через IDispatch-интерфейс ловить события - вот нашел в гугле по словосочетанию "basic +DWebBrowserEvents2": http://purebasic.info/phpBB2/viewtopic.php?p=15988 (код в последнем посте)


Спасибо большое вам, судя по всему это как раз то, что я искал. Сейчас позапускал код, события ловятся. Там правда баги с вылетами в программе, но меня они мало интересуют , самое главное в коде есть принцип отлова событий. Можно сказать этот вопрос решен booze


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
ShadExДата: Пятница, 16.11.2012, 22:14 | Сообщение # 4
Лейтенант
Группа: Проверенные
Сообщений: 51
Репутация: 1
Статус: Offline
Quote
Спасибо большое вам


Мы же вроде условились - не "вам", а "тебе" smile

Quote
Там правда баги с вылетами в программе


Сам по себе этот объект IE достаточно глюкавый - он продолжает висеть в памяти не только при неожиданном вылете программы, но даже при обычном иногда, так что после 5 запусков/закрытий окна программы могут остаться в памяти 2-3 лишних процесса "IEXPLORE.EXE"...


Сообщение отредактировал ShadEx - Пятница, 16.11.2012, 22:15
 
haavДата: Суббота, 17.11.2012, 08:01 | Сообщение # 5
Генералиссимус
Группа: Администраторы
Сообщений: 1373
Репутация: 50
Статус: Offline
Quote (ShadEx)
Мы же вроде условились - не "вам", а "тебе"


Пардон, я забыл. На разных форумах , разные люди требуют разного рода отношение к себе. И ведь некоторые настолько "взрослые" , что обижаются , когда к ним обращаются на ТЫ dry

Quote (ShadEx)
Сам по себе этот объект IE достаточно глюкавый - он продолжает висеть в памяти не только при неожиданном вылете программы, но даже при обычном иногда, так что после 5 запусков/закрытий окна программы могут остаться в памяти 2-3 лишних процесса "IEXPLORE.EXE"...


Это ты говоришь о всех версиях IE , или о определенном? Я практически никогда IE не пользуюсь. Для меня всегда была актуальна OPERA. Привык к ней как-то, хотя все версии >10 тоже содержат немало глюков. Но что поделаешь, без глюков видно ничего не бывает biggrin .


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
ShadExДата: Суббота, 17.11.2012, 15:24 | Сообщение # 6
Лейтенант
Группа: Проверенные
Сообщений: 51
Репутация: 1
Статус: Offline
Quote (haav)
Это ты говоришь о всех версиях IE , или о определенном?


Я говорю о самом объекте iWebBrowser, который встраивает IE в приложение.

Quote (haav)
Но что поделаешь, без глюков видно ничего не бывает


Ну почему - посл. версии Огнелиса и Хрома работают очень стабильно, - лично я ни разу не замечал чтоб их процессы полностью вышибло из памяти по неизвестной причине...
Ну про встраивание Огнелиса можно забыть (они еще два года назад прекратили разработку эмбеддед движка), а вот Хром очень даже встраиваемый и даже есть отдельная библиотека с полным описанием АПИ(правда, под С++) - http://www.awesomium.com
 
haavДата: Воскресенье, 18.11.2012, 08:36 | Сообщение # 7
Генералиссимус
Группа: Администраторы
Сообщений: 1373
Репутация: 50
Статус: Offline
Quote (ShadEx)
а вот Хром очень даже встраиваемый и даже есть отдельная библиотека с полным описанием АПИ(правда, под С++) - http://www.awesomium.com


Спасибо за наводку


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
haavДата: Понедельник, 26.11.2012, 08:33 | Сообщение # 8
Генералиссимус
Группа: Администраторы
Сообщений: 1373
Репутация: 50
Статус: Offline
Код отлова событий WebGadget разместил ЗДЕСЬ.

Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
  • Страница 1 из 1
  • 1
Поиск: