Получить объект Internet Explorer_Server
|
|
WQ | Дата: Пятница, 19.12.2014, 20:21 | Сообщение # 1 |
Полковник
Группа: Проверенные
Сообщений: 215
Статус: Offline
| Есть чужое окно с Internet Explorer_Server. Нужно получить объект IE для дальнейшего использования с помощью disphelper
На англоязычном форуме ничего подходящего не нашлось Нашел код здесь http://support.microsoft.com/kb/249232 но квалификации не хватает для переписывания на FB. Если удастся внедрить подобную функцию, то, наконец, программа будет завершена
Сообщение отредактировал WQ - Пятница, 19.12.2014, 20:29 |
|
| |
haav | Дата: Суббота, 20.12.2014, 00:06 | Сообщение # 2 |
![haav](/avatar/00/5416-572652.jpg) Генералиссимус
Группа: Администраторы
Сообщений: 1376
Статус: Offline
| Код #Include "window9.bi" #Include "win/oleacc.bi" Dim Shared As Integer ptr bra Dim Shared As Integer event Dim shared As hwnd hWndChild, hwnd hwnd=OpenWindow("WebGadget",10,10,800,600) : CenterWindow(hwnd) bra=WebGadget(1,10,50,760,500,"bing.com",WS_VSCROLL Or WS_HSCROLL,WS_EX_CLIENTEDGE) ButtonGadget(3,10,10,50,20,"Get")
Function EnumChildProc Cdecl( hwnd As hwnd, lparam As lParam) As bool Dim As ZString*100 buf GetClassName( hwnd, @buf, 100 ) If buf = "Internet Explorer_Server" Then hWndChild = hwnd Return FALSE Else Return TRUE EndIf End function
Do event=WaitEvent() If Event=EventClose Then End ElseIf Event=EventGadget Then Select Case EventNumber Case 3 CoInitialize( NULL ) Dim As HINSTANCE hInst = LoadLibrary("OLEACC.DLL" ) Dim msg As UINT Dim R As Integer Dim hr As HRESULT Dim spDoc As IHTMLDocument2 Ptr Dim As wString Ptr sUrl EnumChildWindows( hWnd, Cast(Any Ptr,@EnumChildProc), 0 ) msg = RegisterWindowMessage("WM_HTML_GETOBJECT") SendMessageTimeout(hWndChild, msg, 0, 0, SMTO_ABORTIFHUNG, 1000, @R) hr = ObjectFromLresult(R, @IID_IHTMLDocument, 0, @spDoc) spDoc->lpVtbl->get_url(spDoc,@sUrl) MessBox("",*sUrl) CoUninitialize() FreeLibrary( hInst) End Select EndIf Loop
Данный код получает указатель на интерфейс IHTMLDocument2 . Со своим окном все работает нормально и строка получения URL (spDoc->lpVtbl->get_url(spDoc,@sUrl)) срабатывает. Но в чужом окне программа начинает валиться на строке получения URL, хотя интерфейс IHTMLDocument2 получает. С чужими окнами надо как-то по другому. Возможно надо получать какие-то разрешения или вообще использовать другой метод. В общем чем смог, помог, лезть дальше в эти дебри неохота.
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
WQ | Дата: Суббота, 20.12.2014, 13:08 | Сообщение # 3 |
Полковник
Группа: Проверенные
Сообщений: 215
Статус: Offline
| Огромное спасибо! Все получилось. Мне url напрямую не нужен, добавил disphelper, получил объект IE, а дальше с ним можно что угодно делать. В примере ниже после запуска справки по Window9 можно перейти на произвольную страницу или изменить масштаб страницы.
Код #Include "window9.bi" #Include "win/oleacc.bi"
Dim Shared As Integer Ptr bra Dim Shared As Integer event Dim Shared As hwnd hWndChild, hwnd, hParent hwnd=OpenWindow("WebGadget",10,10,200,170) CenterWindow(hwnd) ButtonGadget(3,10,10,100,30,"Navigate") ButtonGadget(4,10,50,80,30,"Zoom +") ButtonGadget(5,100,50,80,30,"Zoom -")
Function EnumChildProc Cdecl(hwnd As hwnd, lparam As lParam) As bool Dim As ZString*100 buf GetClassName(hwnd, @buf, 100) If buf = "Internet Explorer_Server" Then hWndChild = hwnd Return FALSE Else Return TRUE EndIf End Function
#define UNICODE #Include Once "disphelper/disphelper.bi" Dim Shared As IDispatch Ptr ieApp, spParent Dim spDoc As IHTMLDocument2 Ptr dhInitialize(TRUE) dhToggleExceptions(TRUE) Dim zoom As Double = 1
CoInitialize( NULL ) Dim As HINSTANCE hInst = LoadLibrary("OLEACC.DLL" ) Dim msg As UINT Dim R As Integer Dim hr As HRESULT Dim As WString Ptr sUrl
hParent=FindWindow("HH Parent", "Window9 Gui Library")
If hParent=0 Then MessBox("","Окно справки отсутствует!") End EndIf
EnumChildWindows(hParent, Cast(Any Ptr,@EnumChildProc), 0) msg = RegisterWindowMessage("WM_HTML_GETOBJECT") SendMessageTimeout(hWndChild, msg, 0, 0, SMTO_ABORTIFHUNG, 1000, @R) hr = ObjectFromLresult(R, @IID_IHTMLDocument, 0, @spDoc) 'spDoc->lpVtbl->get_url(spDoc,@sUrl)
spDoc->lpVtbl->get_script(spDoc,@spParent) dhGetValue("%o",@ieApp,spParent,".document.parentwindow")
CoUninitialize() FreeLibrary( hInst)
If ieApp=0 Then MessBox("","Получить объект не удалось!") End EndIf
Do event=WaitEvent() If Event=EventClose Then End ElseIf Event=EventGadget Then Select Case EventNumber Case 3 Var urltext="Informationaboutthedevelopers.htm" dhCallMethod(ieApp,"Navigate(%s)",urltext) Case 4 zoom += 0.1 dhPutValue(ieApp, "document.body.style.zoom = %s", Str(zoom)) Case 5 zoom -= 0.1 dhPutValue(ieApp, "document.body.style.zoom = %s", Str(zoom)) End Select EndIf Loop В Window9 есть функции для работы с chm, но почему-то у меня они работают только на Win 7, на Win XP и Win 8 не работают.
|
|
| |
haav | Дата: Суббота, 20.12.2014, 13:51 | Сообщение # 4 |
![haav](/avatar/00/5416-572652.jpg) Генералиссимус
Группа: Администраторы
Сообщений: 1376
Статус: Offline
| Цитата WQ ( ![Ссылка на цитируемый текст](http://s54.ucoz.net/img/fr/ic/10/lastpost.gif) ) В Window9 есть функции для работы с chm, но почему-то у меня они работают только на Win 7, на Win XP и Win 8 не работают.
На win8 проверить не могу, но на XP и Win7 функции работают как задумано. Проверил на 2 компьютерах.
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
WQ | Дата: Суббота, 20.12.2014, 14:11 | Сообщение # 5 |
Полковник
Группа: Проверенные
Сообщений: 215
Статус: Offline
| Цитата haav ( ![Ссылка на цитируемый текст](http://s54.ucoz.net/img/fr/ic/10/lastpost.gif) ) На win8 проверить не могу, но на XP и Win7 функции работают как задумано. Проверил на 2 компьютерах. Тьфу! Действительно, работает, и на Win 8 тоже. Оказывается, у меня в пути до .chm была ошибка( Ну, ничего, теперь знаю как на FB к IE можно подключаться
|
|
| |
|