Как отловить событие OnClick на компоненте WebBrowser
От: DDS  
Дата: 25.03.05 20:35
Оценка:
Как отловить событие OnClick на компоненте WebBrowser
челкнул и OnClick сработал
Re: Как отловить событие OnClick на компоненте WebBrowser
От: DDS  
Дата: 27.03.05 09:06
Оценка:
Здравствуйте, DDS, Вы писали:

DDS>Как отловить событие OnClick на компоненте WebBrowser

DDS>челкнул и OnClick сработал

Ну кто-нить ответьте!!!!!!!!!
Re: Как отловить событие OnClick на компоненте WebBrowser
От: alive Россия  
Дата: 29.03.05 08:23
Оценка:
Здравствуйте, DDS, Вы писали:

DDS>Как отловить событие OnClick на компоненте WebBrowser

DDS>челкнул и OnClick сработал

Если нужно на самом компоненте то как-нибудь так (скажем спасибо Ihor Osovyak)

//В объявлении формы
....
private
  { Private declarations }
  OldWBWndProc: TWndMethod;
  procedure WBWndProc(var Message: TMessage);
public
  { Public declarations }
  procedure AfterConstruction; override;
end;

implementation

....

procedure TWbForm.AfterConstruction;
begin
  inherited;
  if not (csDesigning in ComponentState) then
  begin
    OldWBWndProc:= WebBrowser.WindowProc;
    WebBrowser.WindowProc:= WBWndProc;
  end;
end;

procedure TWbForm.WBWndProc(var Message: TMessage);
begin
  if Message.Msg = WM_LBUTTONDOWN then
  begin
    //Тут делай что хочешь
    MessageBox(Handle,'Mouse down', 'Test', MB_OK);
  end
  else
    OldWBWndProc(Message);
end;
... << RSDN@Home 1.1.4 beta 4 rev 360 >> <<LED ZEPPELIN — [IN THROUGH THE OUT DOOR] South Bound Saurez>>
Keep yourself alive
Re[2]: Как отловить событие OnClick на компоненте WebBrowser
От: _GIZMO  
Дата: 29.03.05 11:03
Оценка: 3 (1) +1
Здравствуйте, DDS, Вы писали:

DDS>Здравствуйте, DDS, Вы писали:


DDS>>Как отловить событие OnClick на компоненте WebBrowser

DDS>>челкнул и OnClick сработал

DDS>Ну кто-нить ответьте!!!!!!!!!

BCB ...
#define MainH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <OleCtrls.hpp>
#include <Menus.hpp>
#include "mshtml.h"
#include "SHDocVw_OCX.h"
#include "mshtmdid.h"
//#include "import\MSHTML_TLB.h"
#include <ExtCtrls.hpp>
//---------------------------------------------------------------------------
typedef void __fastcall (__closure *TOnEventDispatcher)(DISPID idEvent);
//---------------------------------------------------------------------------
class TDocumentEventsSink :
   public TEventDispatcher<TDocumentEventsSink, &/*Mshtml_tlb::*/DIID_HTMLDocumentEvents2>
{
protected:
  TOnEventDispatcher FOnEventDispatcher;
protected:
  HRESULT InvokeEvent(DISPID id, TVariant* params) {
      if (FOnEventDispatcher != NULL)
        FOnEventDispatcher(id);
      return S_OK;
  }

  CComPtr<IUnknown> m_pSender;

public:
  TDocumentEventsSink() : m_pSender(NULL) {}

  virtual ~TDocumentEventsSink() {Disconnect();}

  void Connect(IUnknown* pSender) {
     if (pSender != m_pSender)
        m_pSender = pSender;
     if (NULL != m_pSender)
       ConnectEvents(m_pSender);
  }

  void Disconnect() {
    if (NULL != m_pSender)
    {
      DisconnectEvents(m_pSender);
      m_pSender = NULL;
    }
  }
public:
  __property TOnEventDispatcher OnEventDispatcher = {read = FOnEventDispatcher, write = FOnEventDispatcher};
};
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
void __fastcall TForm1::OnEventDispatcher(DISPID idEvent)
{
    WideString bsName;
    WideString bsType;
    long cx;
    long cy;

    CComQIPtr<IHTMLDocument2> pDoc;
    CppWebBrowser1->Document->QueryInterface(IID_IHTMLDocument2, (LPVOID*)&pDoc);
    CComQIPtr<IHTMLWindow2> pWin;
    CComQIPtr<IHTMLEventObj> pEvent;
    pDoc->get_parentWindow( &pWin);
    pWin->get_event( &pEvent);

    if (pEvent)
    {
        CComQIPtr<IHTMLElement> pElem;
        pEvent->get_srcElement( &pElem);
        if (pElem)
        {
            pElem->get_tagName( &bsName);
        }

        pEvent->get_clientX( &cx);
        pEvent->get_clientY( &cy);
        pEvent->get_type( &bsType);
    }

    String StrEvent;
    switch (idEvent)
    {
    case DISPID_HTMLELEMENTEVENTS2_ONCLICK:
        if (bsName == WideString("A"))
        {
            StrEvent = "<BR>!!! Íåëüçÿ õîäèòü ïî ññûëêàì !!!";
            pEvent->put_returnValue(TVariant(false));
            //pVarResult->vt = VT_BOOL;
            //pVarResult->boolVal = VARIANT_FALSE;

        }
        break;
    case DISPID_HTMLELEMENTEVENTS2_ONCONTEXTMENU:
        StrEvent = "<BR>!!! Íåëüçÿ îòêðûòü êîíòåêñòíîå ìåíþ !!!";
        pEvent->put_returnValue(TVariant(false));
        /*pVarResult->vt = VT_BOOL;
        pVarResult->boolVal = VARIANT_FALSE;*/
        break;
    default:
        break;
    }

    String Str;
    Str.printf("on%s, &lt; %s&gt;, (%d:%d)%s<BR>", String(bsType).c_str(), String(bsName).c_str(), cx,cy, StrEvent.c_str());

    Memo1->Lines->Add( Str);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
    //Ïîäêëþ÷åíèå ÷åðåç m_DocumentEventsSink
    m_DocumentEventsSink = new TDocumentEventsSink();
    m_DocumentEventsSink->OnEventDispatcher = OnEventDispatcher;
    CComPtr<IHTMLDocument2> pHtmlDoc;
    CppWebBrowser1->Document->QueryInterface(IID_IHTMLDocument2, (LPVOID*)&pHtmlDoc);
    m_DocumentEventsSink->Connect(pHtmlDoc);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button4Click(TObject *Sender)
{
    //Îòêëþ÷åíèå ÷åðåç m_DocumentEventsSink
    m_DocumentEventsSink->Disconnect();
    delete m_DocumentEventsSink;
}
_GIZMO
Re[3]: Как отловить событие OnClick на компоненте WebBrowser
От: DDS  
Дата: 29.03.05 13:19
Оценка:
Спасибо конечно, но только не на СИ, я на Делфе прогу пишу.
Re[4]: Как отловить событие OnClick на компоненте WebBrowser
От: _GIZMO  
Дата: 30.03.05 05:30
Оценка:
Здравствуйте, DDS, Вы писали:

DDS>Спасибо конечно, но только не на СИ, я на Делфе прогу пишу.

Ну извини...
_GIZMO
Re[5]: Как отловить событие OnClick на компоненте WebBrowser
От: Vodyamba Россия  
Дата: 30.03.05 10:36
Оценка:
Да я такой же...

Для меня код на С++ очень тяжело... только элементарный понимаю.... А надо бы видать нам учиться... переводить....
Re[6]: Как отловить событие OnClick на компоненте WebBrowser
От: _GIZMO  
Дата: 31.03.05 05:23
Оценка:
Здравствуйте, Vodyamba, Вы писали:

V>Да я такой же...


V>Для меня код на С++ очень тяжело... только элементарный понимаю.... А надо бы видать нам учиться... переводить....

Элементарней некуда. Самое сложное при переводе будут конструкции типа CComQIPtr<IHTMLDocument2> pDoc;
Это ATL его в паскале нет. Заменит на связку QueryInterface() — Release(), а остальное мелочи "=" будет ":=", "->" будет ".", "{" — BEGIN и т.д. Я Delphi тоже не знаю, но исходники VCL смотрю постоянно.
_GIZMO
Re[2]: Как отловить событие OnClick на компоненте WebBrowser
От: Аноним  
Дата: 31.03.05 07:17
Оценка:
Здравствуйте, alive, Вы писали:

A>Здравствуйте, DDS, Вы писали:


DDS>>Как отловить событие OnClick на компоненте WebBrowser

DDS>>челкнул и OnClick сработал

A>Если нужно на самом компоненте то как-нибудь так (скажем спасибо Ihor Osovyak)


A>
A>//В объявлении формы
A>....
A>private
A>  { Private declarations }
A>  OldWBWndProc: TWndMethod;
A>  procedure WBWndProc(var Message: TMessage);
A>public
A>  { Public declarations }
A>  procedure AfterConstruction; override;
A>end;

A>implementation

A>....

A>procedure TWbForm.AfterConstruction;
A>begin
A>  inherited;
A>  if not (csDesigning in ComponentState) then
A>  begin
A>    OldWBWndProc:= WebBrowser.WindowProc;
A>    WebBrowser.WindowProc:= WBWndProc;
A>  end;
A>end;

A>procedure TWbForm.WBWndProc(var Message: TMessage);
A>begin
A>  if Message.Msg = WM_LBUTTONDOWN then
A>  begin
A>    //Тут делай что хочешь
A>    MessageBox(Handle,'Mouse down', 'Test', MB_OK);
A>  end
A>  else
A>    OldWBWndProc(Message);
A>end;
A>


У WebBrowser три дочерних окна, вложенных друг в друга
Re[7]: Как отловить событие OnClick на компоненте WebBrowser
От: alive Россия  
Дата: 31.03.05 07:22
Оценка:
Здравствуйте, _GIZMO, Вы писали:

_GI>Элементарней некуда. Самое сложное при переводе будут конструкции типа CComQIPtr<IHTMLDocument2> pDoc;

_GI>Это ATL его в паскале нет. Заменит на связку QueryInterface() — Release(), а остальное мелочи "=" будет ":=", "->" будет ".", "{" — BEGIN и т.д. Я Delphi тоже не знаю, но исходники VCL смотрю постоянно.

Общие идеи как это писать на Delphi можно посмотреть здесь. Правда там для самописного сервера.
Сложность в переводе будет еще и в том, что в Borland не удосужился перевести mshtmdid.h
Keep yourself alive
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.